rubylog 2.0.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. data/Gemfile +2 -0
  2. data/Gemfile.lock +10 -0
  3. data/README.rdoc +1 -1
  4. data/RELEASE_NOTES.rdoc +7 -4
  5. data/VERSION +1 -1
  6. data/{examples → benchmark}/benchmark.rb +1 -0
  7. data/{examples → benchmark}/benchmark/compiled_not_indexed.rb +0 -0
  8. data/{examples → benchmark}/benchmark/compiled_sequence_indexed.rb +0 -0
  9. data/{examples → benchmark}/benchmark/indexed_procedure.rb +0 -0
  10. data/{examples → benchmark}/benchmark/prolog.rb +0 -0
  11. data/benchmark/benchmark/pure.rb +28 -0
  12. data/bin/rubylog +14 -0
  13. data/examples/a_plus_b.rb +2 -2
  14. data/examples/dcg.rb +22 -26
  15. data/examples/dcg2.rb +25 -30
  16. data/examples/divisors.rb +1 -3
  17. data/examples/factorial.rb +8 -15
  18. data/examples/file_search.rb +14 -13
  19. data/examples/hanoi.rb +1 -3
  20. data/examples/hu/csaladfa.rb +0 -4
  21. data/examples/n_queens.rb +17 -22
  22. data/examples/palindrome_detection.rb +1 -2
  23. data/examples/parsing.rb +19 -23
  24. data/examples/permutation.rb +1 -3
  25. data/examples/primality_by_division.rb +2 -2
  26. data/examples/sieve_of_eratosthenes.rb +2 -2
  27. data/examples/string_interpolation.rb +0 -3
  28. data/examples/tracing.rb +0 -4
  29. data/lib/rubylog/builtins/assumption.rb +2 -1
  30. data/lib/rubylog/builtins/file_system.rb +1 -1
  31. data/lib/rubylog/default_context.rb +3 -5
  32. data/lib/rubylog/mixins/kernel.rb +9 -1
  33. data/lib/rubylog/rubylog_files.rb +7 -0
  34. data/rubylog.gemspec +17 -22
  35. data/spec/inriasuite_spec.rb +851 -847
  36. data/spec/integration/dsl_spec.rb +32 -29
  37. data/spec/rspec/rubylog_spec.rb +46 -52
  38. data/spec/rubylog/assertable_spec.rb +92 -90
  39. data/spec/rubylog/builtins/arithmetics_spec.rb +92 -90
  40. data/spec/rubylog/builtins/assumption_spec.rb +59 -57
  41. data/spec/rubylog/builtins/ensure_spec.rb +6 -4
  42. data/spec/rubylog/builtins/file_system_spec.rb +41 -39
  43. data/spec/rubylog/builtins/logic_spec.rb +308 -306
  44. data/spec/rubylog/builtins/reflection_spec.rb +31 -29
  45. data/spec/rubylog/builtins/term_spec.rb +62 -60
  46. data/spec/rubylog/context_modules/demonstration_spec.rb +108 -106
  47. data/spec/rubylog/context_modules/predicates_spec.rb +29 -27
  48. data/spec/rubylog/context_modules/thats_spec.rb +77 -75
  49. data/spec/rubylog/dsl/array_splat_spec.rb +11 -9
  50. data/spec/rubylog/dsl/indicators_spec.rb +23 -21
  51. data/spec/rubylog/dsl/primitives_spec.rb +30 -28
  52. data/spec/rubylog/errors_spec.rb +13 -11
  53. data/spec/rubylog/interfaces/term_spec.rb +78 -76
  54. data/spec/rubylog/mixins/array_spec.rb +60 -58
  55. data/spec/rubylog/mixins/composite_term_spec.rb +55 -53
  56. data/spec/rubylog/mixins/proc_spec.rb +48 -46
  57. data/spec/rubylog/mixins/string_spec.rb +45 -43
  58. data/spec/rubylog/mixins/symbol_spec.rb +7 -5
  59. data/spec/rubylog/procedure_spec.rb +8 -6
  60. data/spec/rubylog/rule_spec.rb +10 -8
  61. data/spec/rubylog/structure_spec.rb +73 -71
  62. data/spec/rubylog/term_spec.rb +5 -3
  63. data/spec/rubylog/tracing_spec.rb +35 -33
  64. data/spec/rubylog/variable_spec.rb +249 -247
  65. data/spec/spec_helper.rb +4 -0
  66. metadata +54 -43
  67. data/examples/benchmark/pure.rb +0 -26
  68. data/examples/checkmate.rb +0 -88
  69. data/examples/combination.rb +0 -17
  70. data/examples/directory_structure_logic.rb +0 -17
  71. data/examples/dirlist.rb +0 -4
  72. data/examples/enumerators.rb +0 -30
  73. data/examples/hello.rb +0 -17
  74. data/examples/mice.rb +0 -92
  75. data/examples/mice2.rb +0 -37
  76. data/examples/object_oriented.rb +0 -14
  77. data/examples/prefix.rb +0 -13
  78. data/examples/primitives.rb +0 -26
  79. data/examples/sudoku.rb +0 -17
  80. data/spec/integration/theory_as_module_spec.rb +0 -20
  81. data/spec/integration/theory_as_module_with_include_spec.rb +0 -14
@@ -1,6 +1,5 @@
1
- require "rubylog"
2
- extend Rubylog::Context
3
1
  predicate_for Array, ".permutation()"
2
+ # Permutation of a list
4
3
 
5
4
  [].permutation! []
6
5
  [*FRONT, A, *BACK].permutation([A,*REST]).if [*FRONT,*BACK].permutation(REST)
@@ -9,4 +8,3 @@ predicate_for Array, ".permutation()"
9
8
  p P
10
9
  end
11
10
 
12
-
@@ -1,5 +1,5 @@
1
- require "rubylog"
2
- extend Rubylog::Context
1
+
2
+ # Primality check
3
3
 
4
4
  predicate_for Integer, ".prime .odd .divides()"
5
5
 
@@ -1,5 +1,5 @@
1
- require "rubylog"
2
- extend Rubylog::Context
1
+
2
+ # Sieve of Eratosthenes
3
3
 
4
4
  predicate_for Integer, ".sieve .prime .nonprime .multiple_of(N,Limit)"
5
5
 
@@ -1,4 +1 @@
1
- require "rubylog"
2
- extend Rubylog::Context
3
-
4
1
  solve S.is("Mary had a #{X} lamb.").and X.is("little").and { puts S }
data/examples/tracing.rb CHANGED
@@ -1,7 +1,3 @@
1
- $:.unshift File.dirname(__FILE__)+"/../lib"
2
- require "rubylog"
3
- extend Rubylog::Context
4
-
5
1
  # no trace
6
2
  solve S.is("Hello #{X}!").and X.is("no Trace") do puts S end
7
3
 
@@ -1,4 +1,5 @@
1
- rubylog do
1
+ module Rubylog::DefaultContext
2
+
2
3
  predicate_for ::Rubylog::Assertable, ".assumed", ".rejected", ".revoked", ".assumed_if()", ".assumed_unless()", ".rejected_if()", ".rejected_unless()"
3
4
 
4
5
  # Asserts a rule with head H and body B in the predicate of H. It retracts it
@@ -1,4 +1,4 @@
1
- rubylog do
1
+ module Rubylog::DefaultContext
2
2
  predicate_for String, ".filename_in()", ".dirname_in()", ".file_in()", ".dir_in()"
3
3
 
4
4
  # If D is not a variable, succeeds if D is a name of an existing directory and
@@ -1,9 +1,7 @@
1
1
  module Rubylog
2
- DefaultContext = Object.new
3
-
4
- # create the context
5
- class << DefaultContext
6
- include Rubylog::Context
2
+ module DefaultContext
3
+ extend Rubylog::Context
7
4
  end
8
5
 
6
+
9
7
  end
@@ -1,6 +1,14 @@
1
1
  module Kernel
2
2
  # Calls the given block within the default Rubylog context (::Rubylog)
3
3
  def rubylog &block
4
- Rubylog::DefaultContext.instance_exec &block
4
+ Rubylog::DefaultContext.class_exec &block
5
5
  end
6
+
7
+ # requires a Rublog file in a Rubylog context
8
+ def load_rubylog filename, context=Rubylog::DefaultContext
9
+ require "rubylog/rubylog_files"
10
+ source = File.read(filename)
11
+ source = Rubylog::RubylogFiles.convert_source(source)
12
+ eval(source, TOPLEVEL_BINDING, filename, 1)
13
+ end
6
14
  end
@@ -0,0 +1,7 @@
1
+ module Rubylog
2
+ module RubylogFiles
3
+ def self.convert_source source, context = Rubylog::DefaultContext
4
+ "module #{context};#{source};end"
5
+ end
6
+ end
7
+ end
data/rubylog.gemspec CHANGED
@@ -5,13 +5,14 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "rubylog"
8
- s.version = "2.0.1"
8
+ s.version = "2.1.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Bern\u{e1}t Kall\u{f3}"]
12
- s.date = "2013-05-16"
12
+ s.date = "2013-06-25"
13
13
  s.description = "Rubylog is a Prolog-like DSL for Ruby."
14
14
  s.email = "kallo.bernat@gmail.com"
15
+ s.executables = ["rubylog"]
15
16
  s.extra_rdoc_files = [
16
17
  "LICENSE.txt",
17
18
  "README.rdoc"
@@ -27,39 +28,28 @@ Gem::Specification.new do |s|
27
28
  "Rakefile",
28
29
  "TODO.txt",
29
30
  "VERSION",
31
+ "benchmark/benchmark.rb",
32
+ "benchmark/benchmark/compiled_not_indexed.rb",
33
+ "benchmark/benchmark/compiled_sequence_indexed.rb",
34
+ "benchmark/benchmark/indexed_procedure.rb",
35
+ "benchmark/benchmark/prolog.rb",
36
+ "benchmark/benchmark/pure.rb",
37
+ "bin/rubylog",
30
38
  "examples/a_plus_b.rb",
31
- "examples/benchmark.rb",
32
- "examples/benchmark/compiled_not_indexed.rb",
33
- "examples/benchmark/compiled_sequence_indexed.rb",
34
- "examples/benchmark/indexed_procedure.rb",
35
- "examples/benchmark/prolog.rb",
36
- "examples/benchmark/pure.rb",
37
- "examples/checkmate.rb",
38
- "examples/combination.rb",
39
39
  "examples/dcg.rb",
40
40
  "examples/dcg2.rb",
41
- "examples/directory_structure_logic.rb",
42
- "examples/dirlist.rb",
43
41
  "examples/divisors.rb",
44
- "examples/enumerators.rb",
45
42
  "examples/factorial.rb",
46
43
  "examples/file_search.rb",
47
44
  "examples/hanoi.rb",
48
- "examples/hello.rb",
49
45
  "examples/hu/csaladfa.rb",
50
- "examples/mice.rb",
51
- "examples/mice2.rb",
52
46
  "examples/n_queens.rb",
53
- "examples/object_oriented.rb",
54
47
  "examples/palindrome_detection.rb",
55
48
  "examples/parsing.rb",
56
49
  "examples/permutation.rb",
57
- "examples/prefix.rb",
58
50
  "examples/primality_by_division.rb",
59
- "examples/primitives.rb",
60
51
  "examples/sieve_of_eratosthenes.rb",
61
52
  "examples/string_interpolation.rb",
62
- "examples/sudoku.rb",
63
53
  "examples/tracing.rb",
64
54
  "lib/rspec/rubylog.rb",
65
55
  "lib/rubylog.rb",
@@ -100,6 +90,7 @@ Gem::Specification.new do |s|
100
90
  "lib/rubylog/predicate.rb",
101
91
  "lib/rubylog/primitive.rb",
102
92
  "lib/rubylog/procedure.rb",
93
+ "lib/rubylog/rubylog_files.rb",
103
94
  "lib/rubylog/rule.rb",
104
95
  "lib/rubylog/structure.rb",
105
96
  "lib/rubylog/term.rb",
@@ -176,8 +167,6 @@ Gem::Specification.new do |s|
176
167
  "spec/inriasuite_spec.rb",
177
168
  "spec/integration/custom_classes_spec.rb",
178
169
  "spec/integration/dsl_spec.rb",
179
- "spec/integration/theory_as_module_spec.rb",
180
- "spec/integration/theory_as_module_with_include_spec.rb",
181
170
  "spec/rspec/rubylog_spec.rb",
182
171
  "spec/rubylog/assertable_spec.rb",
183
172
  "spec/rubylog/builtins/arithmetics_spec.rb",
@@ -226,6 +215,8 @@ Gem::Specification.new do |s|
226
215
  s.add_development_dependency(%q<bundler>, [">= 1.0.0"])
227
216
  s.add_development_dependency(%q<jeweler>, [">= 1.8.3"])
228
217
  s.add_development_dependency(%q<simplecov>, [">= 0"])
218
+ s.add_development_dependency(%q<guard>, [">= 0"])
219
+ s.add_development_dependency(%q<guard-rspec>, [">= 0"])
229
220
  else
230
221
  s.add_dependency(%q<ruby-prof>, [">= 0"])
231
222
  s.add_dependency(%q<rspec>, ["< 3", ">= 2.8.0"])
@@ -233,6 +224,8 @@ Gem::Specification.new do |s|
233
224
  s.add_dependency(%q<bundler>, [">= 1.0.0"])
234
225
  s.add_dependency(%q<jeweler>, [">= 1.8.3"])
235
226
  s.add_dependency(%q<simplecov>, [">= 0"])
227
+ s.add_dependency(%q<guard>, [">= 0"])
228
+ s.add_dependency(%q<guard-rspec>, [">= 0"])
236
229
  end
237
230
  else
238
231
  s.add_dependency(%q<ruby-prof>, [">= 0"])
@@ -241,6 +234,8 @@ Gem::Specification.new do |s|
241
234
  s.add_dependency(%q<bundler>, [">= 1.0.0"])
242
235
  s.add_dependency(%q<jeweler>, [">= 1.8.3"])
243
236
  s.add_dependency(%q<simplecov>, [">= 0"])
237
+ s.add_dependency(%q<guard>, [">= 0"])
238
+ s.add_dependency(%q<guard-rspec>, [">= 0"])
244
239
  end
245
240
  end
246
241
 
@@ -1,908 +1,912 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "inriasuite", :rubylog=>true do
4
-
5
- describe "abolish", :pending=>"Not supported in Rubylog" do
6
- specify %([abolish(abolish/1), permission_error(modify,static_procedure,abolish/1)].)
7
- specify %([abolish(foo/a), type_error(integer,a)].)
8
- specify %([abolish(foo/(-1)), domain_error(not_less_than_zero,-1)].)
9
- specify %([(current_prolog_flag(max_arity,A), X is A + 1, abolish(foo/X)), )
10
- specify %( representation_error(max_arity)]. )
11
- specify %( [abolish(5/2), type_error(atom,5)].)
12
- end
13
-
14
- describe "and" do
15
- specify "[','(X=1, var(X)), failure]." do
16
- X.is(1).and{X.is_a? Rubylog::Variable}.to_a.should == []
17
- end
18
- specify "[','(var(X), X=1), [[X <-- 1]]]." do
19
- proc{X.is_a? Rubylog::Variable}.and(X.is(1)).map{X}.should == [1]
20
- end
21
- specify "[','(fail, call(3)), failure]." do
22
- :fail.and(proc{raise StopIteration}).true?.should be_false
23
- end
24
- specify "[','(nofoo(X), call(X)), existence_error(procedure, nofoo/1)]." do
25
- lambda { X.is{proc{raise StopIteration}}.and(X).true? }.should raise_error StopIteration
26
- end
27
- specify "[','(X = true, call(X)), [[X <-- true]]]." do
28
- X.is(:true).and(X).map{X}.should == [:true]
29
- end
30
- end
3
+ module RubylogSpec
31
4
 
32
- describe "arg", :pending => "Not supported in Rubylog. Use s.structure(predicate, functor, args)" do
33
- specify "[arg(1,foo(a,b),a), success]."
34
- specify "[arg(1,foo(a,b),X), [[X <-- a]]]."
35
- specify "[arg(1,foo(X,b),a), [[X <-- a]]]."
36
- specify "[arg(2,foo(a, f(X,b), c), f(a, Y)), [[X <-- a, Y <-- b]]]."
37
- specify "[arg(1,foo(X,b),Y), [[Y <-- X]]]."
38
- specify "[arg(1,foo(a,b),b), failure]."
39
- specify "[arg(0,foo(a,b),foo), failure]."
40
- specify "[arg(3,foo(3,4),N), failure]."
41
- specify "[arg(X,foo(a,b),a), instantiation_error]."
42
- specify "[arg(1,X,a), instantiation_error]."
43
- specify "[arg(0,atom,A), type_error(compound, atom)]."
44
- specify "[arg(0,3,A), type_error(compound, 3)]. "
45
- specify "[arg(-3,foo(a,b),A), domain_error(not_less_than_zero,-3)]. "
46
- specify "[arg(a,foo(a,b),X), type_error(integer, a)]."
47
- end
5
+ describe "inriasuite", :rubylog=>true do
48
6
 
49
- describe "arith_diff" do
50
- specify "['=\\\\='(0,1), success]." do
51
- proc{0 != 1}.true?.should be_true
52
- end
53
- specify "['=\\\\='(1.0,1), failure]." do
54
- proc{1.0 != 1}.true?.should be_false
7
+ describe "abolish", :pending=>"Not supported in Rubylog" do
8
+ specify %([abolish(abolish/1), permission_error(modify,static_procedure,abolish/1)].)
9
+ specify %([abolish(foo/a), type_error(integer,a)].)
10
+ specify %([abolish(foo/(-1)), domain_error(not_less_than_zero,-1)].)
11
+ specify %([(current_prolog_flag(max_arity,A), X is A + 1, abolish(foo/X)), )
12
+ specify %( representation_error(max_arity)]. )
13
+ specify %( [abolish(5/2), type_error(atom,5)].)
55
14
  end
56
- specify "['=\\\\='(3 * 2,7 - 1), failure]." do
57
- proc{3*2 != 7-1}.true?.should be_false
58
- end
59
- specify "['=\\\\='(N,5), instantiation_error].", :pending=> "this is not an error in Rubylog"
60
- specify "['=\\\\='(floot(1),5), type_error(evaluable, floot/1)].", :pending=> "this is not an error in Rubylog"
61
- end
62
15
 
63
- describe "arith_eq" do
64
- specify %(['=:='(0,1), failure].) do
65
- proc{0 == 1}.true?.should be_false
66
- end
67
- specify %(['=:='(1.0,1), success].) do
68
- proc{1.0 == 1}.true?.should be_true
69
- end
70
- specify %(['=:='(3 * 2,7 - 1), success].) do
71
- proc{3*2 == 7-1}.true?.should be_true
72
- end
73
- specify %(['=:='(N,5), instantiation_error].), :pending=> "this is not an error in Rubylog"
74
- specify %(['=:='(floot(1),5), type_error(evaluable, floot/1)].), :pending=> "this is not an error in Rubylog"
75
- specify %([0.333 =:= 1/3, failure].) do
76
- proc{0.333 == 1/3}.true?.should be_false
16
+ describe "and" do
17
+ specify "[','(X=1, var(X)), failure]." do
18
+ X.is(1).and{X.is_a? Rubylog::Variable}.to_a.should == []
19
+ end
20
+ specify "[','(var(X), X=1), [[X <-- 1]]]." do
21
+ proc{X.is_a? Rubylog::Variable}.and(X.is(1)).map{X}.should == [1]
22
+ end
23
+ specify "[','(fail, call(3)), failure]." do
24
+ :fail.and(proc{raise StopIteration}).true?.should be_false
25
+ end
26
+ specify "[','(nofoo(X), call(X)), existence_error(procedure, nofoo/1)]." do
27
+ lambda { X.is{proc{raise StopIteration}}.and(X).true? }.should raise_error StopIteration
28
+ end
29
+ specify "[','(X = true, call(X)), [[X <-- true]]]." do
30
+ X.is(:true).and(X).map{X}.should == [:true]
31
+ end
77
32
  end
78
- end
79
33
 
80
- describe "arith_gt" do
81
- specify %(['>'(0,1), failure].) do
82
- proc{0 > 1}.true?.should be_false
83
- end
84
- specify %(['>'(1.0,1), failure].) do
85
- proc{1.0 > 1}.true?.should be_false
86
- end
87
- specify %(['>'(3*2,7-1), failure].) do
88
- proc{3*2 > 7-1}.true?.should be_false
89
- end
90
- specify %(['>'(X,5), instantiation_error].) do
91
- proc { proc{X > 5}.true? }.should raise_error NoMethodError
92
- end
93
- specify %(['>'(2 + floot(1),5), type_error(evaluable, floot/1)].) do
94
- proc { proc{2+4.is(4) > 5}.true? }.should raise_error TypeError
34
+ describe "arg", :pending => "Not supported in Rubylog. Use s.structure(predicate, functor, args)" do
35
+ specify "[arg(1,foo(a,b),a), success]."
36
+ specify "[arg(1,foo(a,b),X), [[X <-- a]]]."
37
+ specify "[arg(1,foo(X,b),a), [[X <-- a]]]."
38
+ specify "[arg(2,foo(a, f(X,b), c), f(a, Y)), [[X <-- a, Y <-- b]]]."
39
+ specify "[arg(1,foo(X,b),Y), [[Y <-- X]]]."
40
+ specify "[arg(1,foo(a,b),b), failure]."
41
+ specify "[arg(0,foo(a,b),foo), failure]."
42
+ specify "[arg(3,foo(3,4),N), failure]."
43
+ specify "[arg(X,foo(a,b),a), instantiation_error]."
44
+ specify "[arg(1,X,a), instantiation_error]."
45
+ specify "[arg(0,atom,A), type_error(compound, atom)]."
46
+ specify "[arg(0,3,A), type_error(compound, 3)]. "
47
+ specify "[arg(-3,foo(a,b),A), domain_error(not_less_than_zero,-3)]. "
48
+ specify "[arg(a,foo(a,b),X), type_error(integer, a)]."
49
+ end
50
+
51
+ describe "arith_diff" do
52
+ specify "['=\\\\='(0,1), success]." do
53
+ proc{0 != 1}.true?.should be_true
54
+ end
55
+ specify "['=\\\\='(1.0,1), failure]." do
56
+ proc{1.0 != 1}.true?.should be_false
57
+ end
58
+ specify "['=\\\\='(3 * 2,7 - 1), failure]." do
59
+ proc{3*2 != 7-1}.true?.should be_false
60
+ end
61
+ specify "['=\\\\='(N,5), instantiation_error].", :pending=> "this is not an error in Rubylog"
62
+ specify "['=\\\\='(floot(1),5), type_error(evaluable, floot/1)].", :pending=> "this is not an error in Rubylog"
95
63
  end
96
- end
97
64
 
98
- describe "arith_gt=" do
99
- specify %(['>='(0,1), failure].) do
100
- proc{0 >= 1}.true?.should be_false
101
- end
102
- specify %(['>='(1.0,1), success].) do
103
- proc{1.0 >= 1}.true?.should be_true
104
- end
105
- specify %(['>='(3*2,7-1), success].) do
106
- proc{3*2 >= 7-1}.true?.should be_true
107
- end
108
- specify %(['>='(X,5), instantiation_error].) do
109
- proc { proc{X >= 5}.true? }.should raise_error NoMethodError
110
- end
111
- specify %(['>='(2 + floot(1),5), type_error(evaluable, floot/1)].) do
112
- proc { proc{2+4.is(4) >= 5}.true? }.should raise_error TypeError
65
+ describe "arith_eq" do
66
+ specify %(['=:='(0,1), failure].) do
67
+ proc{0 == 1}.true?.should be_false
68
+ end
69
+ specify %(['=:='(1.0,1), success].) do
70
+ proc{1.0 == 1}.true?.should be_true
71
+ end
72
+ specify %(['=:='(3 * 2,7 - 1), success].) do
73
+ proc{3*2 == 7-1}.true?.should be_true
74
+ end
75
+ specify %(['=:='(N,5), instantiation_error].), :pending=> "this is not an error in Rubylog"
76
+ specify %(['=:='(floot(1),5), type_error(evaluable, floot/1)].), :pending=> "this is not an error in Rubylog"
77
+ specify %([0.333 =:= 1/3, failure].) do
78
+ proc{0.333 == 1/3}.true?.should be_false
79
+ end
113
80
  end
114
- end
115
81
 
116
- describe "arith_lt" do
117
- specify %(['<'(0,1), success].) do
118
- proc{0 < 1}.true?.should be_true
119
- end
120
- specify %(['<'(1.0,1), failure].) do
121
- proc{1.0 < 1}.true?.should be_false
122
- end
123
- specify %(['<'(3*2,7-1), failure].) do
124
- proc{3*2 < 7-1}.true?.should be_false
125
- end
126
- specify %(['<'(X,5), instantiation_error].) do
127
- proc { proc{X < 5}.true? }.should raise_error NoMethodError
128
- end
129
- specify %(['<'(2 + floot(1),5), type_error(evaluable, floot/1)].) do
130
- proc { proc{2+4.is(4) < 5}.true? }.should raise_error TypeError
82
+ describe "arith_gt" do
83
+ specify %(['>'(0,1), failure].) do
84
+ proc{0 > 1}.true?.should be_false
85
+ end
86
+ specify %(['>'(1.0,1), failure].) do
87
+ proc{1.0 > 1}.true?.should be_false
88
+ end
89
+ specify %(['>'(3*2,7-1), failure].) do
90
+ proc{3*2 > 7-1}.true?.should be_false
91
+ end
92
+ specify %(['>'(X,5), instantiation_error].) do
93
+ proc { proc{X > 5}.true? }.should raise_error NoMethodError
94
+ end
95
+ specify %(['>'(2 + floot(1),5), type_error(evaluable, floot/1)].) do
96
+ proc { proc{2+4.is(4) > 5}.true? }.should raise_error TypeError
97
+ end
131
98
  end
132
- end
133
99
 
134
- describe "arith_lt=" do
135
- specify %(['=<'(0,1), success].) do
136
- proc{0 <= 1}.true?.should be_true
137
- end
138
- specify %(['=<'(1.0,1), success].) do
139
- proc{1.0 <= 1}.true?.should be_true
140
- end
141
- specify %(['=<'(3*2,7-1), success].) do
142
- proc{3*2 <= 7-1}.true?.should be_true
143
- end
144
- specify %(['=<'(X,5), instantiation_error].) do
145
- proc { proc{X <= 5}.true? }.should raise_error NoMethodError
146
- end
147
- specify %(['=<'(2 + floot(1),5), type_error(evaluable, floot/1)].) do
148
- proc { proc{2+4.is(4) <= 5}.true? }.should raise_error TypeError
100
+ describe "arith_gt=" do
101
+ specify %(['>='(0,1), failure].) do
102
+ proc{0 >= 1}.true?.should be_false
103
+ end
104
+ specify %(['>='(1.0,1), success].) do
105
+ proc{1.0 >= 1}.true?.should be_true
106
+ end
107
+ specify %(['>='(3*2,7-1), success].) do
108
+ proc{3*2 >= 7-1}.true?.should be_true
109
+ end
110
+ specify %(['>='(X,5), instantiation_error].) do
111
+ proc { proc{X >= 5}.true? }.should raise_error NoMethodError
112
+ end
113
+ specify %(['>='(2 + floot(1),5), type_error(evaluable, floot/1)].) do
114
+ proc { proc{2+4.is(4) >= 5}.true? }.should raise_error TypeError
115
+ end
149
116
  end
150
- end
151
-
152
- describe "asserta", :pending => "Not supported in Rubylog." do
153
- specify %([(asserta((bar(X) :- X)), clause(bar(X), B)), [[B <-- call(X)]]].)
154
- specify %([asserta(_), instantiation_error].)
155
- specify %([asserta(4), type_error(callable, 4)]. )
156
- specify %([asserta((foo :- 4)), type_error(callable, 4)]. )
157
- specify %([asserta((atom(_) :- true)), permission_error(modify,static_procedure,atom/1)].)
158
- end
159
-
160
- describe "assertz", :pending => "Not supported in Rubylog." do
161
- specify %([assertz((foo(X) :- X -> call(X))), success].)
162
- specify %([assertz(_), instantiation_error].)
163
- specify %([assertz(4), type_error(callable, 4)].)
164
- specify %([assertz((foo :- 4)), type_error(callable, 4)].)
165
- specify %([assertz((atom(_) :- true)), )
166
- specify %( permission_error(modify,static_procedure,atom/1)].)
167
- end
168
-
169
- describe "atom", :pending=>"Not supported in Rubylog. Use #is_a?(String) or #is_a?(Symbol)" do
170
- specify %([atom(atom), success].)
171
- specify %([atom('string'), success].)
172
- specify %([atom(a(b)), failure].)
173
- specify %([atom(Var), failure].)
174
- specify %([atom([]), success].)
175
- specify %([atom(6), failure].)
176
- specify %([atom(3.3), failure].)
177
- end
178
-
179
- describe "atom_chars", :pending => "Not supported in Rubylog." do
180
- specify %([atom_chars('',L), [[L <-- []]]].)
181
- specify %([atom_chars([],L), [[L <-- ['[',']']]]].)
182
- specify %([atom_chars('''',L), [[L <-- ['''']]]].)
183
- specify %([atom_chars('iso',L), [[L <-- ['i','s','o']]]].)
184
- specify %([atom_chars(A,['p','r','o','l','o','g']), [[A <-- 'prolog']]].)
185
- specify %([atom_chars('North',['N'|X]), [[X <-- ['o','r','t','h']]]].)
186
- specify %([atom_chars('iso',['i','s']), failure].)
187
- specify %([atom_chars(A,L), instantiation_error].)
188
- specify %([atom_chars(A,[a,E,c]), instantiation_error].)
189
- specify %([atom_chars(A,[a,b|L]), instantiation_error].)
190
- specify %([atom_chars(f(a),L), type_error(atom,f(a))].)
191
- specify %([atom_chars(A,iso), type_error(list,iso)].)
192
- specify %([atom_chars(A,[a,f(b)]), type_error(character,f(b))].)
193
- specify %([(atom_chars(X,['1','2']), Y is X + 1), type_error(evaluable, '12'/0)].)
194
- end
195
-
196
- describe "atom_codes", :pending => "Not supported in Rubylog." do
197
- specify %([atom_codes('',L), [[L <-- []]]].)
198
- specify %([atom_codes([],L), [[L <-- [ 0'[, 0'] ]]]].)
199
- specify %([atom_codes('''',L), [[L <-- [ 39 ]]]].)
200
- specify %([atom_codes('iso',L), [[L <-- [ 0'i, 0's, 0'o ]]]].)
201
- specify %([atom_codes(A,[ 0'p, 0'r, 0'o, 0'l, 0'o, 0'g]), [[A <-- 'prolog']]].)
202
- specify %([atom_codes('North',[0'N | L]), [[L <-- [0'o, 0'r, 0't, 0'h]]]].)
203
- specify %([atom_codes('iso',[0'i, 0's]), failure].)
204
- specify %([atom_codes(A,L), instantiation_error].)
205
- specify %([atom_codes(f(a),L), type_error(atom,f(a))].)
206
- specify %([atom_codes(A, 0'x), type_error(list,0'x)].)
207
- specify %([atom_codes(A,[ 0'i, 0's, 1000]), representation_error(character_code)]. % 1000 not a code)
208
- end
209
-
210
- describe "atom_concat" do
211
- specify %([atom_concat('hello',' world',A), [[A <-- 'hello world']]].) do
212
- A.is("#{"hello"}#{" world"}").map{A}.should eql ['hello world']
213
- end
214
- specify %([atom_concat(T,' world','small world'), [[T <-- 'small']]].) do
215
- "small world".is("#{T} world").map{T}.should eql ['small']
216
- end
217
- specify %([atom_concat('hello',' world','small world'), failure].) do
218
- "small world".is("#{"hello"}#{" world"}").true?.should be_false
219
- end
220
- specify %([atom_concat(T1,T2,'hello'),
221
- [[T1 <-- '',T2 <-- 'hello'],
222
- [T1 <-- 'h',T2 <-- 'ello'],
223
- [T1 <-- 'he',T2 <-- 'llo'],
224
- [T1 <-- 'hel',T2 <-- 'lo'],
225
- [T1 <-- 'hell',T2 <-- 'o'],
226
- [T1 <-- 'hello',T2 <-- '']]]. ) do
227
- "hello".is("#{A}#{B}").map{[A,B]}.should eql [
228
- ['','hello'],
229
- ['h','ello'],
230
- ['he','llo'],
231
- ['hel','lo'],
232
- ['hell','o'],
233
- ['hello','']]
234
- end
235
- specify %( [atom_concat(A1,'iso',A3), instantiation_error].), :pending=>"This is not an error in Rubylog"
236
- specify %( [atom_concat('iso',A2,A3), instantiation_error].), :pending=>"This is not an error in Rubylog"
237
- specify %( [atom_concat(f(a),'iso',A3), type_error(atom,f(a))].), :pending=>"This is not an error in Rubylog"
238
- specify %( [atom_concat('iso',f(a),A3), type_error(atom,f(a))].), :pending=>"This is not an error in Rubylog"
239
- specify %( [atom_concat(A1,A2,f(a)), type_error(atom,f(a))].), :pending=>"This is not an error in Rubylog"
240
- end
241
-
242
- describe "atom_length", :pending=>"Not supported in Rubylog" do
243
- specify %([atom_length('enchanted evening', N), [[N <-- 17]]].)
244
- #specify %(%[atom_length('enchanted\)
245
- #evening', N), [[N <-- 17]]].)
246
- specify %([atom_length('', N), [[N <-- 0]]].)
247
- specify %([atom_length('scarlet', 5), failure].)
248
- specify %([atom_length(Atom, 4), instantiation_error]. % Culprit Atom)
249
- specify %([atom_length(1.23, 4), type_error(atom, 1.23)].)
250
- specify %([atom_length(atom, '4'), type_error(integer, '4')].)
251
- end
252
-
253
- describe "atomic", :pending=>"There is no such feature in Rubylog. Use !is_a?(Rubylog::CompoundTerm)" do
254
- specify %([atomic(atom), success].)
255
- specify %([atomic(a(b)), failure].)
256
- specify %([atomic(Var), failure].)
257
- specify %([atomic([]), success].)
258
- specify %([atomic(6), success].)
259
- specify %([atomic(3.3), success].)
260
- end
261
117
 
262
- describe "bagof" do
263
- specify %([bagof(X,(X=1;X=2),L), [[L <-- [1, 2]]]].) do
264
- X.is(1).or(X.is(2)).map{X}.should eql [1,2]
265
- end
266
- specify %([bagof(X,(X=1;X=2),X), [[X <-- [1, 2]]]].), :pending=>"This does not work in Rubylog because of dynamic and static contexts"
267
- specify %([bagof(X,(X=Y;X=Z),L), [[L <-- [Y, Z]]]].), :pending=>"This does not work in Rubylog because of dynamic and static contexts"
268
- specify %([bagof(X,fail,L), failure].), :pending=>"This does not work in Rubylog because of dynamic and static contexts"
269
- specify %([bagof(1,(Y=1;Y=2),L), [[L <-- [1], Y <-- 1], [L <-- [1], Y <-- 2]]].), :pending=>"This does not work in Rubylog because of dynamic and static contexts"
270
- specify %([bagof(f(X,Y),(X=a;Y=b),L), [[L <-- [f(a, _), f(_, b)]]]].) do
271
- X.is('a').or(Y.is('b')).map{[X,Y]}.should eql [['a',Y],[X,'b']]
272
- end
273
- specify %([bagof(X,Y^((X=1,Y=1);(X=2,Y=2)),S), [[S <-- [1, 2]]]].)
274
- specify %([bagof(X,Y^((X=1;Y=1);(X=2,Y=2)),S), [[S <-- [1, _, 2]]]].)
275
- specify %([(set_prolog_flag(unknown, warning),
276
- bagof(X,(Y^(X=1;Y=1);X=3),S)), [[S <-- [3]]]].)
277
- specify %( [bagof(X,(X=Y;X=Z;Y=1),L), [[L <-- [Y, Z]], [L <-- [_], Y <-- 1]]].)
278
- specify %( [bagof(X,Y^Z,L), instantiation_error].)
279
- specify %( [bagof(X,1,L), type_error(callable, 1)].)
280
- specify %( [findall(X,call(4),S),type_error(callable, 4)].)
281
- end
282
-
283
- describe "call" do
284
- specify %([call(!),success].) do
285
- A.is(:cut!).and(A).true?.should be_true
286
- end
287
- specify %([call(fail), failure].) do
288
- A.is(:fail).and(A).true?.should be_false
289
- end
290
- specify %([call((fail, X)), failure].) do
291
- A.is(:fail.and(X)).and(A).true?.should be_false
292
- end
293
- specify %([call((fail, call(1))), failure].) do
294
- A.is(:fail.and(X.is(1).and(X))).and(A).true?.should be_false
295
- end
296
- specify %([call((write(3), X)), instantiation_error].) do
297
- lambda { A.is(proc{p 3; true}.and(X)).and(A).true? }.should raise_error Rubylog::InstantiationError
298
- end
299
- specify %([call((write(3), call(1))), type_error(callable,1)].) do
300
- lambda { A.is(proc{p 3; true}.and(X.is(1).and(X))).and(A).true? }.should raise_error NoMethodError
301
- end
302
- specify %([call(X), instantiation_error].) do
303
- lambda { A.true? }.should raise_error Rubylog::InstantiationError
304
- end
305
- specify %([call(1), type_error(callable,1)].) do
306
- lambda { A.is(1).and(A).true? }.should raise_error NoMethodError
307
- end
308
- specify %([call((fail, 1)), type_error(callable,(fail,1))].), :pending=>"Not an error in Rubylog"
309
- specify %([call((write(3), 1)), type_error(callable,(write(3), 1))].) do
310
- lambda { A.is(proc{p 3; true}.and(1)).and(A).true? }.should raise_error NoMethodError
311
- end
312
- specify %([call((1; true)), type_error(callable,(1; true))].) do
313
- lambda { A.is(Rubylog::Structure.new(A.or(B).predicate, :or, 1, :true)).and(A).true? }.should raise_error NoMethodError
118
+ describe "arith_lt" do
119
+ specify %(['<'(0,1), success].) do
120
+ proc{0 < 1}.true?.should be_true
121
+ end
122
+ specify %(['<'(1.0,1), failure].) do
123
+ proc{1.0 < 1}.true?.should be_false
124
+ end
125
+ specify %(['<'(3*2,7-1), failure].) do
126
+ proc{3*2 < 7-1}.true?.should be_false
127
+ end
128
+ specify %(['<'(X,5), instantiation_error].) do
129
+ proc { proc{X < 5}.true? }.should raise_error NoMethodError
130
+ end
131
+ specify %(['<'(2 + floot(1),5), type_error(evaluable, floot/1)].) do
132
+ proc { proc{2+4.is(4) < 5}.true? }.should raise_error TypeError
133
+ end
314
134
  end
315
- end
316
-
317
- describe "catch-and-throw", :pending=>"There is no such thing in Rubylog yet. Maybe someday." do
318
- specify %([(catch(true, C, write('something')), throw(blabla)), system_error]. ) #% The system catchs 'blabla'
319
- specify %([catch(number_chars(A,L), error(instantiation_error, _), fail), failure].)
320
- end
321
135
 
322
- describe "char_code", :pending=>"There is no such feature in Rubylog yet. Maybe someday." do
323
- specify %([char_code(Char,99),[[Char <-- c]]].)
324
- specify %([char_code(Char,0'c),[[Char <-- c]]].)
325
- specify %([char_code(Char,163),[[Char <-- '\xa3\']]].)
326
- specify %([char_code(b,98),success].)
327
- specify %([char_code(b,4),failure].)
328
- specify %([char_code('ab',Code),type_error(character, 'ab')].)
329
- specify %([char_code(a,x),type_error(integer, x)].)
330
- specify %([char_code(Char,Code),instantiation_error].)
331
- specify %([char_code(Char,-2),representation_error(character_code)].)
332
- end
333
-
334
- describe "clause" do
335
- specify %([clause(x,Body), failure].) do
336
- predicate ":x"
337
- :x.follows_from(Body).true?.should be_false
338
- end
339
- specify %([clause(_,B), instantiation_error].) do
340
- proc { ANY.follows_from(B).true? }.should raise_error Rubylog::InstantiationError
341
- end
342
- specify %([clause(4,B), type_error(callable,4)].) do
343
- proc { A.is(4).and(A.follows_from(B)).true? }.should raise_error NoMethodError
344
- end
345
- specify %([clause(f(_),5), type_error(callable,5)].), :pending=>"As there is no compiling, this is not an error in Rubylog, it simply fails."
346
- specify %([clause(atom(_),Body), permission_error(access,private_procedure,atom/1)]. ) do
347
- proc { ANY.false.follows_from(B).true? }.should raise_error NoMethodError
136
+ describe "arith_lt=" do
137
+ specify %(['=<'(0,1), success].) do
138
+ proc{0 <= 1}.true?.should be_true
139
+ end
140
+ specify %(['=<'(1.0,1), success].) do
141
+ proc{1.0 <= 1}.true?.should be_true
142
+ end
143
+ specify %(['=<'(3*2,7-1), success].) do
144
+ proc{3*2 <= 7-1}.true?.should be_true
145
+ end
146
+ specify %(['=<'(X,5), instantiation_error].) do
147
+ proc { proc{X <= 5}.true? }.should raise_error NoMethodError
148
+ end
149
+ specify %(['=<'(2 + floot(1),5), type_error(evaluable, floot/1)].) do
150
+ proc { proc{2+4.is(4) <= 5}.true? }.should raise_error TypeError
151
+ end
348
152
  end
349
- end
350
153
 
351
- describe "compound", :pending=>"There is no such feature in Rubylog. Use is_a?(Rubylog::CompoundTerm)" do
352
- specify %([compound(33.3), failure].)
353
- specify %([compound(-33.3), failure].)
354
- specify %([compound(-a), success].)
355
- specify %([compound(_), failure].)
356
- specify %([compound(a), failure].)
357
- specify %([compound(a(b)), success].)
358
- specify %([compound([a]),success].)
359
- end
360
-
361
- describe "copy_term", :pending=>"Not supported in Rubylog" do
362
- specify %([copy_term(X,Y), success].)
363
- specify %([copy_term(X,3), success].)
364
- specify %([copy_term(_,a), success].)
365
- specify %([copy_term(a+X,X+b),[[X <-- a]]].)
366
- specify %([copy_term(_,_), success].)
367
- specify %([copy_term(X+X+Y,A+B+B),[[B <-- A]]].)
368
- specify %([copy_term(a,a), success].)
369
- specify %([copy_term(a,b), failure].)
370
- specify %([copy_term(f(a),f(X)),[[X <-- a]]].)
371
- specify %([(copy_term(a+X,X+b),copy_term(a+X,X+b)), failure].)
372
- end
373
-
374
- describe "current_input", :pending=>"Not supported in Rubylog. Use $stdin" do
375
- specify %([exists(current_input/1), success].)
376
- end
377
-
378
- describe "current_output", :pending=>"Not supported in Rubylog. Use $stdout" do
379
- specify %([exists(current_output/1), success]. )
380
- end
381
-
382
- describe "current_predicate", :pending=>"There is no such feature in Rubylog yet. Maybe someday." do
383
- specify %([current_predicate(current_predicate/1), failure]. )
384
- specify %(/* depends on the test harness */)
385
- specify %([current_predicate(run_tests/1), success]. )
386
- specify %([current_predicate(4), type_error(predicate_indicator, 4)].)
387
- specify %([current_predicate(dog), type_error(predicate_indicator, dog)].)
388
- specify %([current_predicate(0/dog), type_error(predicate_indicator, 0/dog)].)
389
- end
390
-
391
- describe "current_prolog_flag", :pending=>"Not supported in Rubylog" do
392
- specify %([current_prolog_flag(debug, off), success].)
393
- specify %([(set_prolog_flag(unknown, warning), )
394
- specify %( current_prolog_flag(unknown, warning)), success].)
395
- specify %( [(set_prolog_flag(unknown, warning), )
396
- specify %( current_prolog_flag(unknown, error)), failure].)
397
- specify %( [current_prolog_flag(debug, V), [[V <-- off]]].)
398
- specify %( [current_prolog_flag(5, V), type_error(atom,5)].)
399
- specify %( [current_prolog_flag(warning, V), domain_error(prolog_flag,warning)].)
400
- end
401
-
402
- describe "cut" do
403
- specify %([(!,fail;true), failure].) do
404
- :cut!.and(:fail).or(:true).true?.should be_false
405
- end
406
- specify %([(call(!),fail;true), success].) do
407
- X.is(:cut!).and(X.and(:fail).or(:true)).true?.should be_true
154
+ describe "asserta", :pending => "Not supported in Rubylog." do
155
+ specify %([(asserta((bar(X) :- X)), clause(bar(X), B)), [[B <-- call(X)]]].)
156
+ specify %([asserta(_), instantiation_error].)
157
+ specify %([asserta(4), type_error(callable, 4)]. )
158
+ specify %([asserta((foo :- 4)), type_error(callable, 4)]. )
159
+ specify %([asserta((atom(_) :- true)), permission_error(modify,static_procedure,atom/1)].)
160
+ end
161
+
162
+ describe "assertz", :pending => "Not supported in Rubylog." do
163
+ specify %([assertz((foo(X) :- X -> call(X))), success].)
164
+ specify %([assertz(_), instantiation_error].)
165
+ specify %([assertz(4), type_error(callable, 4)].)
166
+ specify %([assertz((foo :- 4)), type_error(callable, 4)].)
167
+ specify %([assertz((atom(_) :- true)), )
168
+ specify %( permission_error(modify,static_procedure,atom/1)].)
169
+ end
170
+
171
+ describe "atom", :pending=>"Not supported in Rubylog. Use #is_a?(String) or #is_a?(Symbol)" do
172
+ specify %([atom(atom), success].)
173
+ specify %([atom('string'), success].)
174
+ specify %([atom(a(b)), failure].)
175
+ specify %([atom(Var), failure].)
176
+ specify %([atom([]), success].)
177
+ specify %([atom(6), failure].)
178
+ specify %([atom(3.3), failure].)
179
+ end
180
+
181
+ describe "atom_chars", :pending => "Not supported in Rubylog." do
182
+ specify %([atom_chars('',L), [[L <-- []]]].)
183
+ specify %([atom_chars([],L), [[L <-- ['[',']']]]].)
184
+ specify %([atom_chars('''',L), [[L <-- ['''']]]].)
185
+ specify %([atom_chars('iso',L), [[L <-- ['i','s','o']]]].)
186
+ specify %([atom_chars(A,['p','r','o','l','o','g']), [[A <-- 'prolog']]].)
187
+ specify %([atom_chars('North',['N'|X]), [[X <-- ['o','r','t','h']]]].)
188
+ specify %([atom_chars('iso',['i','s']), failure].)
189
+ specify %([atom_chars(A,L), instantiation_error].)
190
+ specify %([atom_chars(A,[a,E,c]), instantiation_error].)
191
+ specify %([atom_chars(A,[a,b|L]), instantiation_error].)
192
+ specify %([atom_chars(f(a),L), type_error(atom,f(a))].)
193
+ specify %([atom_chars(A,iso), type_error(list,iso)].)
194
+ specify %([atom_chars(A,[a,f(b)]), type_error(character,f(b))].)
195
+ specify %([(atom_chars(X,['1','2']), Y is X + 1), type_error(evaluable, '12'/0)].)
196
+ end
197
+
198
+ describe "atom_codes", :pending => "Not supported in Rubylog." do
199
+ specify %([atom_codes('',L), [[L <-- []]]].)
200
+ specify %([atom_codes([],L), [[L <-- [ 0'[, 0'] ]]]].)
201
+ specify %([atom_codes('''',L), [[L <-- [ 39 ]]]].)
202
+ specify %([atom_codes('iso',L), [[L <-- [ 0'i, 0's, 0'o ]]]].)
203
+ specify %([atom_codes(A,[ 0'p, 0'r, 0'o, 0'l, 0'o, 0'g]), [[A <-- 'prolog']]].)
204
+ specify %([atom_codes('North',[0'N | L]), [[L <-- [0'o, 0'r, 0't, 0'h]]]].)
205
+ specify %([atom_codes('iso',[0'i, 0's]), failure].)
206
+ specify %([atom_codes(A,L), instantiation_error].)
207
+ specify %([atom_codes(f(a),L), type_error(atom,f(a))].)
208
+ specify %([atom_codes(A, 0'x), type_error(list,0'x)].)
209
+ specify %([atom_codes(A,[ 0'i, 0's, 1000]), representation_error(character_code)]. % 1000 not a code)
210
+ end
211
+
212
+ describe "atom_concat" do
213
+ specify %([atom_concat('hello',' world',A), [[A <-- 'hello world']]].) do
214
+ A.is("#{"hello"}#{" world"}").map{A}.should eql ['hello world']
215
+ end
216
+ specify %([atom_concat(T,' world','small world'), [[T <-- 'small']]].) do
217
+ "small world".is("#{T} world").map{T}.should eql ['small']
218
+ end
219
+ specify %([atom_concat('hello',' world','small world'), failure].) do
220
+ "small world".is("#{"hello"}#{" world"}").true?.should be_false
221
+ end
222
+ specify %([atom_concat(T1,T2,'hello'),
223
+ [[T1 <-- '',T2 <-- 'hello'],
224
+ [T1 <-- 'h',T2 <-- 'ello'],
225
+ [T1 <-- 'he',T2 <-- 'llo'],
226
+ [T1 <-- 'hel',T2 <-- 'lo'],
227
+ [T1 <-- 'hell',T2 <-- 'o'],
228
+ [T1 <-- 'hello',T2 <-- '']]]. ) do
229
+ "hello".is("#{A}#{B}").map{[A,B]}.should eql [
230
+ ['','hello'],
231
+ ['h','ello'],
232
+ ['he','llo'],
233
+ ['hel','lo'],
234
+ ['hell','o'],
235
+ ['hello','']]
236
+ end
237
+ specify %( [atom_concat(A1,'iso',A3), instantiation_error].), :pending=>"This is not an error in Rubylog"
238
+ specify %( [atom_concat('iso',A2,A3), instantiation_error].), :pending=>"This is not an error in Rubylog"
239
+ specify %( [atom_concat(f(a),'iso',A3), type_error(atom,f(a))].), :pending=>"This is not an error in Rubylog"
240
+ specify %( [atom_concat('iso',f(a),A3), type_error(atom,f(a))].), :pending=>"This is not an error in Rubylog"
241
+ specify %( [atom_concat(A1,A2,f(a)), type_error(atom,f(a))].), :pending=>"This is not an error in Rubylog"
242
+ end
243
+
244
+ describe "atom_length", :pending=>"Not supported in Rubylog" do
245
+ specify %([atom_length('enchanted evening', N), [[N <-- 17]]].)
246
+ #specify %(%[atom_length('enchanted\)
247
+ #evening', N), [[N <-- 17]]].)
248
+ specify %([atom_length('', N), [[N <-- 0]]].)
249
+ specify %([atom_length('scarlet', 5), failure].)
250
+ specify %([atom_length(Atom, 4), instantiation_error]. % Culprit Atom)
251
+ specify %([atom_length(1.23, 4), type_error(atom, 1.23)].)
252
+ specify %([atom_length(atom, '4'), type_error(integer, '4')].)
253
+ end
254
+
255
+ describe "atomic", :pending=>"There is no such feature in Rubylog. Use !is_a?(Rubylog::CompoundTerm)" do
256
+ specify %([atomic(atom), success].)
257
+ specify %([atomic(a(b)), failure].)
258
+ specify %([atomic(Var), failure].)
259
+ specify %([atomic([]), success].)
260
+ specify %([atomic(6), success].)
261
+ specify %([atomic(3.3), success].)
262
+ end
263
+
264
+ describe "bagof" do
265
+ specify %([bagof(X,(X=1;X=2),L), [[L <-- [1, 2]]]].) do
266
+ X.is(1).or(X.is(2)).map{X}.should eql [1,2]
267
+ end
268
+ specify %([bagof(X,(X=1;X=2),X), [[X <-- [1, 2]]]].), :pending=>"This does not work in Rubylog because of dynamic and static contexts"
269
+ specify %([bagof(X,(X=Y;X=Z),L), [[L <-- [Y, Z]]]].), :pending=>"This does not work in Rubylog because of dynamic and static contexts"
270
+ specify %([bagof(X,fail,L), failure].), :pending=>"This does not work in Rubylog because of dynamic and static contexts"
271
+ specify %([bagof(1,(Y=1;Y=2),L), [[L <-- [1], Y <-- 1], [L <-- [1], Y <-- 2]]].), :pending=>"This does not work in Rubylog because of dynamic and static contexts"
272
+ specify %([bagof(f(X,Y),(X=a;Y=b),L), [[L <-- [f(a, _), f(_, b)]]]].) do
273
+ X.is('a').or(Y.is('b')).map{[X,Y]}.should eql [['a',Y],[X,'b']]
274
+ end
275
+ specify %([bagof(X,Y^((X=1,Y=1);(X=2,Y=2)),S), [[S <-- [1, 2]]]].)
276
+ specify %([bagof(X,Y^((X=1;Y=1);(X=2,Y=2)),S), [[S <-- [1, _, 2]]]].)
277
+ specify %([(set_prolog_flag(unknown, warning),
278
+ bagof(X,(Y^(X=1;Y=1);X=3),S)), [[S <-- [3]]]].)
279
+ specify %( [bagof(X,(X=Y;X=Z;Y=1),L), [[L <-- [Y, Z]], [L <-- [_], Y <-- 1]]].)
280
+ specify %( [bagof(X,Y^Z,L), instantiation_error].)
281
+ specify %( [bagof(X,1,L), type_error(callable, 1)].)
282
+ specify %( [findall(X,call(4),S),type_error(callable, 4)].)
283
+ end
284
+
285
+ describe "call" do
286
+ specify %([call(!),success].) do
287
+ A.is(:cut!).and(A).true?.should be_true
288
+ end
289
+ specify %([call(fail), failure].) do
290
+ A.is(:fail).and(A).true?.should be_false
291
+ end
292
+ specify %([call((fail, X)), failure].) do
293
+ A.is(:fail.and(X)).and(A).true?.should be_false
294
+ end
295
+ specify %([call((fail, call(1))), failure].) do
296
+ A.is(:fail.and(X.is(1).and(X))).and(A).true?.should be_false
297
+ end
298
+ specify %([call((write(3), X)), instantiation_error].) do
299
+ lambda { A.is(proc{p 3; true}.and(X)).and(A).true? }.should raise_error Rubylog::InstantiationError
300
+ end
301
+ specify %([call((write(3), call(1))), type_error(callable,1)].) do
302
+ lambda { A.is(proc{p 3; true}.and(X.is(1).and(X))).and(A).true? }.should raise_error NoMethodError
303
+ end
304
+ specify %([call(X), instantiation_error].) do
305
+ lambda { A.true? }.should raise_error Rubylog::InstantiationError
306
+ end
307
+ specify %([call(1), type_error(callable,1)].) do
308
+ lambda { A.is(1).and(A).true? }.should raise_error NoMethodError
309
+ end
310
+ specify %([call((fail, 1)), type_error(callable,(fail,1))].), :pending=>"Not an error in Rubylog"
311
+ specify %([call((write(3), 1)), type_error(callable,(write(3), 1))].) do
312
+ lambda { A.is(proc{p 3; true}.and(1)).and(A).true? }.should raise_error NoMethodError
313
+ end
314
+ specify %([call((1; true)), type_error(callable,(1; true))].) do
315
+ lambda { A.is(Rubylog::Structure.new(A.or(B).predicate, :or, 1, :true)).and(A).true? }.should raise_error NoMethodError
316
+ end
408
317
  end
409
- end
410
318
 
411
- describe "fail" do
412
- specify %([fail, failure].) do
413
- :fail.true?.should be_false
319
+ describe "catch-and-throw", :pending=>"There is no such thing in Rubylog yet. Maybe someday." do
320
+ specify %([(catch(true, C, write('something')), throw(blabla)), system_error]. ) #% The system catchs 'blabla'
321
+ specify %([catch(number_chars(A,L), error(instantiation_error, _), fail), failure].)
414
322
  end
415
- specify %([undef_pred, existence_error(procedure, undef_pred/0)]. % the value of flag 'unknown' is 'error'.) do
416
- proc{ :undef_pred.true? }.should raise_error Rubylog::ExistenceError
417
- end
418
- specify %([(set_prolog_flag(unknown, fail), undef_pred), failure.), :pending=>"Not supported in Rubylog"
419
- specify %([(set_prolog_flag(unknown, warning), undef_pred), failure]. % A warning message
420
- % appears in the outputfile (see forest by: run_forest or bip_forest).), :pending=>"Not supported in Rubylog"
421
- end
422
-
423
- describe "file_manip", :pending=>"Not supported in Rubylog" do
424
- specify %(/* by 'run_forest' predicate */)
425
- specify %([(seek(my_file,3),at(my_file,X)),in(my_file),[[X <-- 3]]].)
426
- specify %([(seek(my_file,eof),at(my_file,X)),in(my_file),[[X <-- eof]]].)
427
- specify %([(seek(my_file,3),get_char(X,my_file)),in(my_file),[[X <-- e]]].)
428
- end
429
323
 
430
- describe "findall" do
431
- predicate_for Symbol, ".likes()"
432
-
433
- specify %([findall(X,(X=1 ; X=2),S),[[S <-- [1,2]]]].) do
434
- check S.is{X.is(1).or(X.is(2)).map{X}}.and{S == [1,2]}
435
- end
436
- specify %([findall(X+Y,(X=1),S),[[S <-- [1+_]]]].) do
437
- check S.is{X.is(:john).map{X.likes(Y)}}.and{S == [:john.likes(Y)]}
438
- end
439
- specify %([findall(X,fail,L),[[L <-- []]]].) do
440
- check G.is(:fail.or :fail).and L.is{G.map{X}}.and{L == []}
441
- end
442
- specify %([findall(X,(X=1 ; X=1),S),[[S <-- [1,1]]]].) do
443
- check S.is{X.is(1).or(X.is(1)).map{X}}.and{S == [1,1]}
444
- end
445
- specify %([findall(X,(X=2 ; X=1),[1,2]), failure].) do
446
- check [1,2].is{X.is(2).or(X.is(1)).map{X}}.false
324
+ describe "char_code", :pending=>"There is no such feature in Rubylog yet. Maybe someday." do
325
+ specify %([char_code(Char,99),[[Char <-- c]]].)
326
+ specify %([char_code(Char,0'c),[[Char <-- c]]].)
327
+ specify %([char_code(Char,163),[[Char <-- '\xa3\']]].)
328
+ specify %([char_code(b,98),success].)
329
+ specify %([char_code(b,4),failure].)
330
+ specify %([char_code('ab',Code),type_error(character, 'ab')].)
331
+ specify %([char_code(a,x),type_error(integer, x)].)
332
+ specify %([char_code(Char,Code),instantiation_error].)
333
+ specify %([char_code(Char,-2),representation_error(character_code)].)
447
334
  end
448
- specify %([findall(X,(X=1 ; X=2),[X,Y]), [[X <-- 1, Y <-- 2]]].) do
449
- check [X,Y].is{A.is(1).or(A.is(2)).map{A}}.and{X == 1}.and{Y == 2}
450
- end
451
- specify %([findall(X,Goal,S),instantiation_error]. % Culprit Goal) do
452
- expect {(S.is {Goal.map{X}}).solve}.to raise_error NoMethodError
453
- end
454
- specify %([findall(X,4,S),type_error(callable, 4)].) do
455
- expect {(S.is {4.map{X}}).solve}.to raise_error NoMethodError
456
- end
457
- end
458
-
459
- describe "float", :pending=>"Not supported in Rubylog. Use is_a? Float" do
460
- specify %([float(3.3), success].)
461
- specify %([float(-3.3), success].)
462
- specify %([float(3), failure].)
463
- specify %([float(atom), failure].)
464
- specify %([float(X), failure].)
465
- end
466
-
467
- describe "functor", :pending=>"Not supported in Rubylog. Use s.structure(predicate, functor, args)" do
468
- specify %([functor(foo(a,b,c),foo,3), success].)
469
- specify %([functor(foo(a,b,c),X,Y), [[X <-- foo, Y <-- 3]]].)
470
- specify %([functor(X,foo,3), [[X <-- foo(A,B,C)]]]. % A, B and C are 3 new variables)
471
- specify %([functor(X,foo,0), [[X <-- foo]]].)
472
- specify %([functor(mats(A,B),A,B), [[A <-- mats,B <-- 2]]].)
473
- specify %([functor(foo(a),foo,2), failure].)
474
- specify %([functor(foo(a),fo,1), failure].)
475
- specify %([functor(1,X,Y), [[X <-- 1,Y <-- 0]]].)
476
- specify %([functor(X,1.1,0), [[X <-- 1.1]]].)
477
- specify %([functor([_|_],'.',2), success].)
478
- specify %([functor([],[],0), success].)
479
- specify %([functor(X, Y, 3), instantiation_error].)
480
- specify %([functor(X, foo, N), instantiation_error].)
481
- specify %([functor(X, foo, a), type_error(integer,a)].)
482
- specify %([functor(F, 1.5, 1), type_error(atom,1.5)].)
483
- specify %([functor(F,foo(a),1), type_error(atomic,foo(a))].)
484
- specify %([(current_prolog_flag(max_arity,A), X is A + 1, functor(T, foo, X)), )
485
- specify %( representation_error(max_arity)]. )
486
- specify %( [functor(T, foo, -1), domain_error(not_less_than_zero,-1)].)
487
- end
488
-
489
- describe "halt", :pending=>"Not supported in Rubylog" do
490
- specify %([halt, impl_defined].)
491
- specify %([halt(1), impl_defined].)
492
- specify %([halt(a), type_error(integer, a)].)
493
- end
494
335
 
495
- describe "if-then", :pending=>"Not supported in Rubylog yet. Maybe someday." do
496
- specify %(['->'(true, true), success].)
497
- specify %(['->'(true, fail), failure].)
498
- specify %(['->'(fail, true), failure].)
499
- specify %(['->'(true, X=1), [[X <-- 1]]].)
500
- specify %(['->'(';'(X=1, X=2), true), [[X <-- 1]]]. )
501
- specify %(['->'(true, ';'(X=1, X=2)), [[X <-- 1], [X <-- 2]]].)
502
- end
503
-
504
- describe "if-then-else", :pending=>"Not supported in Rubylog yet. Maybe someday." do
505
- specify %([';'('->'(true, true), fail), success].)
506
- specify %([';'('->'(fail, true), true), success].)
507
- specify %([';'('->'(true, fail), fail), failure].)
508
- specify %([';'('->'(fail, true), fail), failure].)
509
- specify %([';'('->'(true, X=1), X=2), [[X <-- 1]]].)
510
- specify %([';'('->'(fail, X=1), X=2), [[X <-- 2]]].)
511
- specify %([';'('->'(true, ';'(X=1, X=2)), true), [[X <-- 1], [X <-- 2]]].)
512
- specify %([';'('->'(';'(X=1, X=2), true), true), [[X <-- 1]]].)
513
- end
514
-
515
- describe "integer", :pending=>"Not supported in Rubylog. Use #is_a?(Integer)" do
516
- specify %([integer(3), success].)
517
- specify %([integer(-3), success].)
518
- specify %([integer(3.3), failure].)
519
- specify %([integer(X), failure].)
520
- specify %([integer(atom), failure].)
521
- end
522
-
523
- describe "is" do
524
- specify %(['is'(Result,3 + 11.0),[[Result <-- 14.0]]].) do
525
- Result.is{3+11.0}.map{Result}.should eql [14.0]
526
- end
527
- specify %([(X = 1 + 2, 'is'(Y, X * 3)),[[X <-- (1 + 2), Y <-- 9]]]. % error? 1+2), :pending=>"Not supported in Rubylog"
528
- specify %(['is'(foo,77), failure]. % error? foo), :pending=>"Not supported in Rubylog"
529
- specify %(['is'(77, N), instantiation_error].), :pending=>"Not supported in Rubylog"
530
- specify %(['is'(77, foo), type_error(evaluable, foo/0)].), :pending=>"Not supported in Rubylog"
531
- specify %(['is'(X,float(3)),[[X <-- 3.0]]].) do
532
- X.is{3.to_f}.map{X}.should eql [3.0]
336
+ describe "clause" do
337
+ specify %([clause(x,Body), failure].) do
338
+ predicate ":x"
339
+ :x.follows_from(Body).true?.should be_false
340
+ end
341
+ specify %([clause(_,B), instantiation_error].) do
342
+ proc { ANY.follows_from(B).true? }.should raise_error Rubylog::InstantiationError
343
+ end
344
+ specify %([clause(4,B), type_error(callable,4)].) do
345
+ proc { A.is(4).and(A.follows_from(B)).true? }.should raise_error NoMethodError
346
+ end
347
+ specify %([clause(f(_),5), type_error(callable,5)].), :pending=>"As there is no compiling, this is not an error in Rubylog, it simply fails."
348
+ specify %([clause(atom(_),Body), permission_error(access,private_procedure,atom/1)]. ) do
349
+ proc { ANY.false.follows_from(B).true? }.should raise_error NoMethodError
350
+ end
533
351
  end
534
- end
535
352
 
536
- describe "nonvar" do
537
- specify %([nonvar(33.3), success].) do
538
- X.is(33.3).and{!X.is_a? Rubylog::Variable}.true?.should == true
539
- end
540
- specify %([nonvar(foo), success].) do
541
- X.is(:foo).and{!X.is_a? Rubylog::Variable}.true?.should be_true
542
- end
543
- specify %([nonvar(Foo), failure].) do
544
- X.is(Foo).and{!X.is_a? Rubylog::Variable}.true?.should be_false
353
+ describe "compound", :pending=>"There is no such feature in Rubylog. Use is_a?(Rubylog::CompoundTerm)" do
354
+ specify %([compound(33.3), failure].)
355
+ specify %([compound(-33.3), failure].)
356
+ specify %([compound(-a), success].)
357
+ specify %([compound(_), failure].)
358
+ specify %([compound(a), failure].)
359
+ specify %([compound(a(b)), success].)
360
+ specify %([compound([a]),success].)
545
361
  end
546
- specify %([(foo=Foo,nonvar(Foo)),[[Foo <-- foo]]].) do
547
- :foo.is(Foo).and(X.is(Foo)).and{!X.is_a? Rubylog::Variable}.true?.should == true
548
- end
549
- specify %([nonvar(_), failure].) do
550
- ANY.is(X).and{!X.is_a? Rubylog::Variable}.true?.should == false
551
- end
552
- specify %([nonvar(a(b)), success].) do
553
- :b.false.is(X).and{!X.is_a? Rubylog::Variable}.true?.should == true
554
- end
555
- end
556
362
 
557
- describe "not_provable" do
558
- specify %([\+(true), failure].) do
559
- :true.false.true?.should == false
560
- end
561
- specify %([\+(!), failure].) do
562
- :cut!.false.true?.should == false
563
- end
564
- specify %([\+((!,fail)), success].) do
565
- :cut!.and(:fail).false.true?.should == true
566
- end
567
- specify %([((X=1;X=2), \+((!,fail))), [[X <-- 1],[X <-- 2]]].) do
568
- X.is(1).or(X.is(2)).and(:cut!.and(:fail).false).map{X}.should eql [1,2]
569
- end
570
- specify %([\+(4 = 5), success].) do
571
- 4.is(5).false.true?.should == true
572
- end
573
- specify %([\+(3), type_error(callable, 3)].) do
574
- expect { 3.false.true? } .to raise_error NoMethodError
363
+ describe "copy_term", :pending=>"Not supported in Rubylog" do
364
+ specify %([copy_term(X,Y), success].)
365
+ specify %([copy_term(X,3), success].)
366
+ specify %([copy_term(_,a), success].)
367
+ specify %([copy_term(a+X,X+b),[[X <-- a]]].)
368
+ specify %([copy_term(_,_), success].)
369
+ specify %([copy_term(X+X+Y,A+B+B),[[B <-- A]]].)
370
+ specify %([copy_term(a,a), success].)
371
+ specify %([copy_term(a,b), failure].)
372
+ specify %([copy_term(f(a),f(X)),[[X <-- a]]].)
373
+ specify %([(copy_term(a+X,X+b),copy_term(a+X,X+b)), failure].)
575
374
  end
576
- specify %([\+(X), instantiation_error]. % Culprit X) do
577
- expect { X.false.true? }.to raise_error Rubylog::InstantiationError
578
- end
579
- end
580
375
 
581
- describe "not_unify" do
582
- specify %(['\\='(1,1), failure].) do
583
- 1.is_not(1).true?.should == false
584
- end
585
- specify %(['\\='(X,1), failure].) do
586
- X.is_not(1).true?.should == false
587
- end
588
- specify %(['\\='(X,Y), failure].) do
589
- X.is_not(Y).true?.should == false
590
- end
591
- specify %([('\\='(X,Y),'\\='(X,abc)), failure].) do
592
- X.is_not(Y).and(X.is_not(:abc)).true?.should == false
376
+ describe "current_input", :pending=>"Not supported in Rubylog. Use $stdin" do
377
+ specify %([exists(current_input/1), success].)
593
378
  end
594
- specify %(['\\='(f(X,def),f(def,Y)), failure].) do
595
- X.and(:def).is_not(:def.and(Y)).true?.should == false
379
+
380
+ describe "current_output", :pending=>"Not supported in Rubylog. Use $stdout" do
381
+ specify %([exists(current_output/1), success]. )
596
382
  end
597
- specify %(['\\='(1,2), success].) do
598
- 1.is_not(2).true?.should == true
383
+
384
+ describe "current_predicate", :pending=>"There is no such feature in Rubylog yet. Maybe someday." do
385
+ specify %([current_predicate(current_predicate/1), failure]. )
386
+ specify %(/* depends on the test harness */)
387
+ specify %([current_predicate(run_tests/1), success]. )
388
+ specify %([current_predicate(4), type_error(predicate_indicator, 4)].)
389
+ specify %([current_predicate(dog), type_error(predicate_indicator, dog)].)
390
+ specify %([current_predicate(0/dog), type_error(predicate_indicator, 0/dog)].)
599
391
  end
600
- specify %(['\\='(1,1.0), success].) do
601
- 1.is_not(1.0).true?.should == true
392
+
393
+ describe "current_prolog_flag", :pending=>"Not supported in Rubylog" do
394
+ specify %([current_prolog_flag(debug, off), success].)
395
+ specify %([(set_prolog_flag(unknown, warning), )
396
+ specify %( current_prolog_flag(unknown, warning)), success].)
397
+ specify %( [(set_prolog_flag(unknown, warning), )
398
+ specify %( current_prolog_flag(unknown, error)), failure].)
399
+ specify %( [current_prolog_flag(debug, V), [[V <-- off]]].)
400
+ specify %( [current_prolog_flag(5, V), type_error(atom,5)].)
401
+ specify %( [current_prolog_flag(warning, V), domain_error(prolog_flag,warning)].)
602
402
  end
603
- specify %(['\\='(g(X),f(f(X))), success].) do
604
- predicate_for Rubylog::Structure, ".g .f"
605
- X.g.is_not(X.f.f).true?.should == true
403
+
404
+ describe "cut" do
405
+ specify %([(!,fail;true), failure].) do
406
+ :cut!.and(:fail).or(:true).true?.should be_false
407
+ end
408
+ specify %([(call(!),fail;true), success].) do
409
+ X.is(:cut!).and(X.and(:fail).or(:true)).true?.should be_true
410
+ end
606
411
  end
607
- specify %(['\\='(f(X,1),f(a(X))), success].), :pending=>"No overloading of procedures in Rubylog yet."
608
- specify %(['\\='(f(X,Y,X),f(a(X),a(Y),Y,2)), success].), :pending=>"No overloading of procedures in Rubylog yet."
609
- end
610
412
 
611
- describe "number", :pending=>"Not supported in Rubylog. Use #is_a?(Numeric)" do
612
- specify %([number(3), success].)
613
- specify %([number(3.3), success].)
614
- specify %([number(-3), success].)
615
- specify %([number(a), failure].)
616
- specify %([number(X), failure].)
617
- end
413
+ describe "fail" do
414
+ specify %([fail, failure].) do
415
+ :fail.true?.should be_false
416
+ end
417
+ specify %([undef_pred, existence_error(procedure, undef_pred/0)]. % the value of flag 'unknown' is 'error'.) do
418
+ proc{ :undef_pred.true? }.should raise_error Rubylog::ExistenceError
419
+ end
420
+ specify %([(set_prolog_flag(unknown, fail), undef_pred), failure.), :pending=>"Not supported in Rubylog"
421
+ specify %([(set_prolog_flag(unknown, warning), undef_pred), failure]. % A warning message
422
+ % appears in the outputfile (see forest by: run_forest or bip_forest).), :pending=>"Not supported in Rubylog"
423
+ end
618
424
 
619
- describe "number_chars", :pending=>"There is no such feature in Rubylog yet. Maybe someday." do
620
- specify %([number_chars(33,L), [[L <-- ['3','3']]]].)
621
- specify %([number_chars(33,['3','3']), success].)
622
- specify %([number_chars(33.0,L), [[L <-- ['3','3','.','0']]]].)
623
- specify %([number_chars(X,['3','.','3','E','+','0']), [[X <-- 3.3]]].)
624
- specify %([number_chars(3.3,['3','.','3','E','+','0']), success].)
625
- specify %([number_chars(A,['-','2','5']), [[A <-- (-25)]]].)
626
- specify %([number_chars(A,['\n',' ','3']), [[A <-- 3]]]. )
627
- specify %([number_chars(A,['3',' ']), syntax_error(_)].)
628
- specify %([number_chars(A,['0',x,f]), [[A <-- 15]]].)
629
- specify %([number_chars(A,['0','''','A']), [[A <-- 65]]].)
630
- specify %([number_chars(A,['4','.','2']), [[A <-- 4.2]]].)
631
- specify %([number_chars(A,['4','2','.','0','e','-','1']), [[A <-- 4.2]]].)
632
- specify %([number_chars(A,L), instantiation_error].)
633
- specify %([number_chars(a,L), type_error(number, a)].)
634
- specify %([number_chars(A,4), type_error(list, 4)].)
635
- specify %([number_chars(A,['4',2]), type_error(character, 2)].)
636
- end
425
+ describe "file_manip", :pending=>"Not supported in Rubylog" do
426
+ specify %(/* by 'run_forest' predicate */)
427
+ specify %([(seek(my_file,3),at(my_file,X)),in(my_file),[[X <-- 3]]].)
428
+ specify %([(seek(my_file,eof),at(my_file,X)),in(my_file),[[X <-- eof]]].)
429
+ specify %([(seek(my_file,3),get_char(X,my_file)),in(my_file),[[X <-- e]]].)
430
+ end
637
431
 
638
- describe "number_codes", :pending=>"There is no such feature in Rubylog yet. Maybe someday." do
639
- specify %([number_codes(33,L), [[L <-- [0'3,0'3]]]].)
640
- specify %([number_codes(33,[0'3,0'3]), success].)
641
- specify %([number_codes(33.0,L), [[L <-- [51,51,46,48]]]].)
642
- specify %([number_codes(33.0,[0'3,0'.,0'3,0'E,0'+,0'0,0'1]), success].)
643
- specify %([number_codes(A,[0'-,0'2,0'5]), [[A <-- (-25)]]].)
644
- specify %([number_codes(A,[0' ,0'3]), [[A <-- 3]]].)
645
- specify %([number_codes(A,[0'0,0'x,0'f]), [[A <-- 15]]].)
646
- specify %([number_codes(A,[0'0,39,0'a]), [[A <-- 97]]].)
647
- specify %([number_codes(A,[0'4,0'.,0'2]), [[A <-- 4.2]]].)
648
- specify %([number_codes(A,[0'4,0'2,0'.,0'0,0'e,0'-,0'1]), [[A <-- 4.2]]].)
649
- specify %([number_codes(A,L), instantiation_error].)
650
- specify %([number_codes(a,L), type_error(number,a)].)
651
- specify %([number_codes(A,4), type_error(list,4)].)
652
- specify %([number_codes(A,[ 0'1, 0'2, 1000]), representation_error(character_code)]. % 1000 not a code)
653
- end
432
+ describe "findall" do
433
+ predicate_for Symbol, ".likes()"
654
434
 
655
- describe "once" do
656
- specify %([once(!), success].) do
657
- :cut!.any.true?.should == true
658
- end
659
- specify %([(once(!), (X=1; X=2)), [[X <-- 1],[X <-- 2]]].) do
660
- :cut!.any.and(X.is(1).or(X.is(2))).map{X}.should == [1,2]
661
- end
662
- specify %([once(repeat), success].) do
663
- class << primitives
664
- def repeat
665
- yield while true
666
- end
435
+ specify %([findall(X,(X=1 ; X=2),S),[[S <-- [1,2]]]].) do
436
+ check S.is{X.is(1).or(X.is(2)).map{X}}.and{S == [1,2]}
437
+ end
438
+ specify %([findall(X+Y,(X=1),S),[[S <-- [1+_]]]].) do
439
+ check S.is{X.is(:john).map{X.likes(Y)}}.and{S == [:john.likes(Y)]}
440
+ end
441
+ specify %([findall(X,fail,L),[[L <-- []]]].) do
442
+ check G.is(:fail.or :fail).and L.is{G.map{X}}.and{L == []}
443
+ end
444
+ specify %([findall(X,(X=1 ; X=1),S),[[S <-- [1,1]]]].) do
445
+ check S.is{X.is(1).or(X.is(1)).map{X}}.and{S == [1,1]}
446
+ end
447
+ specify %([findall(X,(X=2 ; X=1),[1,2]), failure].) do
448
+ check [1,2].is{X.is(2).or(X.is(1)).map{X}}.false
449
+ end
450
+ specify %([findall(X,(X=1 ; X=2),[X,Y]), [[X <-- 1, Y <-- 2]]].) do
451
+ check [X,Y].is{A.is(1).or(A.is(2)).map{A}}.and{X == 1}.and{Y == 2}
452
+ end
453
+ specify %([findall(X,Goal,S),instantiation_error]. % Culprit Goal) do
454
+ expect {(S.is {Goal.map{X}}).solve}.to raise_error NoMethodError
455
+ end
456
+ specify %([findall(X,4,S),type_error(callable, 4)].) do
457
+ expect {(S.is {4.map{X}}).solve}.to raise_error NoMethodError
667
458
  end
668
- :repeat.any.true?.should == true
669
- end
670
- specify %([once(fail), failure].) do
671
- :fail.any.true?.should == false
672
- end
673
- specify %([once(3), type_error(callable, 3)].) do
674
- expect { 3.any.true? }.to raise_error(NoMethodError)
675
459
  end
676
- specify %([once(X), instantiation_error]. % Culprit X) do
677
- expect { X.any.true? }.to raise_error(Rubylog::InstantiationError)
460
+
461
+ describe "float", :pending=>"Not supported in Rubylog. Use is_a? Float" do
462
+ specify %([float(3.3), success].)
463
+ specify %([float(-3.3), success].)
464
+ specify %([float(3), failure].)
465
+ specify %([float(atom), failure].)
466
+ specify %([float(X), failure].)
467
+ end
468
+
469
+ describe "functor", :pending=>"Not supported in Rubylog. Use s.structure(predicate, functor, args)" do
470
+ specify %([functor(foo(a,b,c),foo,3), success].)
471
+ specify %([functor(foo(a,b,c),X,Y), [[X <-- foo, Y <-- 3]]].)
472
+ specify %([functor(X,foo,3), [[X <-- foo(A,B,C)]]]. % A, B and C are 3 new variables)
473
+ specify %([functor(X,foo,0), [[X <-- foo]]].)
474
+ specify %([functor(mats(A,B),A,B), [[A <-- mats,B <-- 2]]].)
475
+ specify %([functor(foo(a),foo,2), failure].)
476
+ specify %([functor(foo(a),fo,1), failure].)
477
+ specify %([functor(1,X,Y), [[X <-- 1,Y <-- 0]]].)
478
+ specify %([functor(X,1.1,0), [[X <-- 1.1]]].)
479
+ specify %([functor([_|_],'.',2), success].)
480
+ specify %([functor([],[],0), success].)
481
+ specify %([functor(X, Y, 3), instantiation_error].)
482
+ specify %([functor(X, foo, N), instantiation_error].)
483
+ specify %([functor(X, foo, a), type_error(integer,a)].)
484
+ specify %([functor(F, 1.5, 1), type_error(atom,1.5)].)
485
+ specify %([functor(F,foo(a),1), type_error(atomic,foo(a))].)
486
+ specify %([(current_prolog_flag(max_arity,A), X is A + 1, functor(T, foo, X)), )
487
+ specify %( representation_error(max_arity)]. )
488
+ specify %( [functor(T, foo, -1), domain_error(not_less_than_zero,-1)].)
489
+ end
490
+
491
+ describe "halt", :pending=>"Not supported in Rubylog" do
492
+ specify %([halt, impl_defined].)
493
+ specify %([halt(1), impl_defined].)
494
+ specify %([halt(a), type_error(integer, a)].)
495
+ end
496
+
497
+ describe "if-then", :pending=>"Not supported in Rubylog yet. Maybe someday." do
498
+ specify %(['->'(true, true), success].)
499
+ specify %(['->'(true, fail), failure].)
500
+ specify %(['->'(fail, true), failure].)
501
+ specify %(['->'(true, X=1), [[X <-- 1]]].)
502
+ specify %(['->'(';'(X=1, X=2), true), [[X <-- 1]]]. )
503
+ specify %(['->'(true, ';'(X=1, X=2)), [[X <-- 1], [X <-- 2]]].)
504
+ end
505
+
506
+ describe "if-then-else", :pending=>"Not supported in Rubylog yet. Maybe someday." do
507
+ specify %([';'('->'(true, true), fail), success].)
508
+ specify %([';'('->'(fail, true), true), success].)
509
+ specify %([';'('->'(true, fail), fail), failure].)
510
+ specify %([';'('->'(fail, true), fail), failure].)
511
+ specify %([';'('->'(true, X=1), X=2), [[X <-- 1]]].)
512
+ specify %([';'('->'(fail, X=1), X=2), [[X <-- 2]]].)
513
+ specify %([';'('->'(true, ';'(X=1, X=2)), true), [[X <-- 1], [X <-- 2]]].)
514
+ specify %([';'('->'(';'(X=1, X=2), true), true), [[X <-- 1]]].)
515
+ end
516
+
517
+ describe "integer", :pending=>"Not supported in Rubylog. Use #is_a?(Integer)" do
518
+ specify %([integer(3), success].)
519
+ specify %([integer(-3), success].)
520
+ specify %([integer(3.3), failure].)
521
+ specify %([integer(X), failure].)
522
+ specify %([integer(atom), failure].)
523
+ end
524
+
525
+ describe "is" do
526
+ specify %(['is'(Result,3 + 11.0),[[Result <-- 14.0]]].) do
527
+ Result.is{3+11.0}.map{Result}.should eql [14.0]
528
+ end
529
+ specify %([(X = 1 + 2, 'is'(Y, X * 3)),[[X <-- (1 + 2), Y <-- 9]]]. % error? 1+2), :pending=>"Not supported in Rubylog"
530
+ specify %(['is'(foo,77), failure]. % error? foo), :pending=>"Not supported in Rubylog"
531
+ specify %(['is'(77, N), instantiation_error].), :pending=>"Not supported in Rubylog"
532
+ specify %(['is'(77, foo), type_error(evaluable, foo/0)].), :pending=>"Not supported in Rubylog"
533
+ specify %(['is'(X,float(3)),[[X <-- 3.0]]].) do
534
+ X.is{3.to_f}.map{X}.should eql [3.0]
535
+ end
678
536
  end
679
- end
680
537
 
681
- describe "or" do
682
- specify %([';'(true, fail), success].) do
683
- :true.or(:fail).true?.should == true
684
- end
685
- specify %([';'((!, fail), true), failure].) do
686
- :cut!.and(:fail).or(:true).true?.should == false
687
- end
688
- specify %([';'(!, call(3)), success].) do
689
- :cut!.or(proc{fail}).true?.should == true
690
- end
691
- specify %([';'((X=1, !), X=2), [[X <-- 1]]].) do
692
- X.is(1).and(:cut!).or(X.is(2)).map{X}.should == [1]
538
+ describe "nonvar" do
539
+ specify %([nonvar(33.3), success].) do
540
+ X.is(33.3).and{!X.is_a? Rubylog::Variable}.true?.should == true
541
+ end
542
+ specify %([nonvar(foo), success].) do
543
+ X.is(:foo).and{!X.is_a? Rubylog::Variable}.true?.should be_true
544
+ end
545
+ specify %([nonvar(Foo), failure].) do
546
+ X.is(Foo).and{!X.is_a? Rubylog::Variable}.true?.should be_false
547
+ end
548
+ specify %([(foo=Foo,nonvar(Foo)),[[Foo <-- foo]]].) do
549
+ :foo.is(Foo).and(X.is(Foo)).and{!X.is_a? Rubylog::Variable}.true?.should == true
550
+ end
551
+ specify %([nonvar(_), failure].) do
552
+ ANY.is(X).and{!X.is_a? Rubylog::Variable}.true?.should == false
553
+ end
554
+ specify %([nonvar(a(b)), success].) do
555
+ :b.false.is(X).and{!X.is_a? Rubylog::Variable}.true?.should == true
556
+ end
693
557
  end
694
- specify %([';'(X=1, X=2), [[X <-- 1], [X <-- 2]]].) do
695
- (X.is(1).or(X.is(2))).map{X}.should == [1,2]
558
+
559
+ describe "not_provable" do
560
+ specify %([\+(true), failure].) do
561
+ :true.false.true?.should == false
562
+ end
563
+ specify %([\+(!), failure].) do
564
+ :cut!.false.true?.should == false
565
+ end
566
+ specify %([\+((!,fail)), success].) do
567
+ :cut!.and(:fail).false.true?.should == true
568
+ end
569
+ specify %([((X=1;X=2), \+((!,fail))), [[X <-- 1],[X <-- 2]]].) do
570
+ X.is(1).or(X.is(2)).and(:cut!.and(:fail).false).map{X}.should eql [1,2]
571
+ end
572
+ specify %([\+(4 = 5), success].) do
573
+ 4.is(5).false.true?.should == true
574
+ end
575
+ specify %([\+(3), type_error(callable, 3)].) do
576
+ expect { 3.false.true? } .to raise_error NoMethodError
577
+ end
578
+ specify %([\+(X), instantiation_error]. % Culprit X) do
579
+ expect { X.false.true? }.to raise_error Rubylog::InstantiationError
580
+ end
696
581
  end
697
- end
698
582
 
699
- describe "repeat" do
700
- before do
701
- class << primitives
702
- def repeat
703
- yield while true
583
+ describe "not_unify" do
584
+ specify %(['\\='(1,1), failure].) do
585
+ 1.is_not(1).true?.should == false
586
+ end
587
+ specify %(['\\='(X,1), failure].) do
588
+ X.is_not(1).true?.should == false
589
+ end
590
+ specify %(['\\='(X,Y), failure].) do
591
+ X.is_not(Y).true?.should == false
592
+ end
593
+ specify %([('\\='(X,Y),'\\='(X,abc)), failure].) do
594
+ X.is_not(Y).and(X.is_not(:abc)).true?.should == false
595
+ end
596
+ specify %(['\\='(f(X,def),f(def,Y)), failure].) do
597
+ X.and(:def).is_not(:def.and(Y)).true?.should == false
598
+ end
599
+ specify %(['\\='(1,2), success].) do
600
+ 1.is_not(2).true?.should == true
601
+ end
602
+ specify %(['\\='(1,1.0), success].) do
603
+ 1.is_not(1.0).true?.should == true
604
+ end
605
+ specify %(['\\='(g(X),f(f(X))), success].) do
606
+ predicate_for Rubylog::Structure, ".g .f"
607
+ X.g.is_not(X.f.f).true?.should == true
608
+ end
609
+ specify %(['\\='(f(X,1),f(a(X))), success].), :pending=>"No overloading of procedures in Rubylog yet."
610
+ specify %(['\\='(f(X,Y,X),f(a(X),a(Y),Y,2)), success].), :pending=>"No overloading of procedures in Rubylog yet."
611
+ end
612
+
613
+ describe "number", :pending=>"Not supported in Rubylog. Use #is_a?(Numeric)" do
614
+ specify %([number(3), success].)
615
+ specify %([number(3.3), success].)
616
+ specify %([number(-3), success].)
617
+ specify %([number(a), failure].)
618
+ specify %([number(X), failure].)
619
+ end
620
+
621
+ describe "number_chars", :pending=>"There is no such feature in Rubylog yet. Maybe someday." do
622
+ specify %([number_chars(33,L), [[L <-- ['3','3']]]].)
623
+ specify %([number_chars(33,['3','3']), success].)
624
+ specify %([number_chars(33.0,L), [[L <-- ['3','3','.','0']]]].)
625
+ specify %([number_chars(X,['3','.','3','E','+','0']), [[X <-- 3.3]]].)
626
+ specify %([number_chars(3.3,['3','.','3','E','+','0']), success].)
627
+ specify %([number_chars(A,['-','2','5']), [[A <-- (-25)]]].)
628
+ specify %([number_chars(A,['\n',' ','3']), [[A <-- 3]]]. )
629
+ specify %([number_chars(A,['3',' ']), syntax_error(_)].)
630
+ specify %([number_chars(A,['0',x,f]), [[A <-- 15]]].)
631
+ specify %([number_chars(A,['0','''','A']), [[A <-- 65]]].)
632
+ specify %([number_chars(A,['4','.','2']), [[A <-- 4.2]]].)
633
+ specify %([number_chars(A,['4','2','.','0','e','-','1']), [[A <-- 4.2]]].)
634
+ specify %([number_chars(A,L), instantiation_error].)
635
+ specify %([number_chars(a,L), type_error(number, a)].)
636
+ specify %([number_chars(A,4), type_error(list, 4)].)
637
+ specify %([number_chars(A,['4',2]), type_error(character, 2)].)
638
+ end
639
+
640
+ describe "number_codes", :pending=>"There is no such feature in Rubylog yet. Maybe someday." do
641
+ specify %([number_codes(33,L), [[L <-- [0'3,0'3]]]].)
642
+ specify %([number_codes(33,[0'3,0'3]), success].)
643
+ specify %([number_codes(33.0,L), [[L <-- [51,51,46,48]]]].)
644
+ specify %([number_codes(33.0,[0'3,0'.,0'3,0'E,0'+,0'0,0'1]), success].)
645
+ specify %([number_codes(A,[0'-,0'2,0'5]), [[A <-- (-25)]]].)
646
+ specify %([number_codes(A,[0' ,0'3]), [[A <-- 3]]].)
647
+ specify %([number_codes(A,[0'0,0'x,0'f]), [[A <-- 15]]].)
648
+ specify %([number_codes(A,[0'0,39,0'a]), [[A <-- 97]]].)
649
+ specify %([number_codes(A,[0'4,0'.,0'2]), [[A <-- 4.2]]].)
650
+ specify %([number_codes(A,[0'4,0'2,0'.,0'0,0'e,0'-,0'1]), [[A <-- 4.2]]].)
651
+ specify %([number_codes(A,L), instantiation_error].)
652
+ specify %([number_codes(a,L), type_error(number,a)].)
653
+ specify %([number_codes(A,4), type_error(list,4)].)
654
+ specify %([number_codes(A,[ 0'1, 0'2, 1000]), representation_error(character_code)]. % 1000 not a code)
655
+ end
656
+
657
+ describe "once" do
658
+ specify %([once(!), success].) do
659
+ :cut!.any.true?.should == true
660
+ end
661
+ specify %([(once(!), (X=1; X=2)), [[X <-- 1],[X <-- 2]]].) do
662
+ :cut!.any.and(X.is(1).or(X.is(2))).map{X}.should == [1,2]
663
+ end
664
+ specify %([once(repeat), success].) do
665
+ class << primitives
666
+ def repeat
667
+ yield while true
668
+ end
704
669
  end
670
+ :repeat.any.true?.should == true
671
+ end
672
+ specify %([once(fail), failure].) do
673
+ :fail.any.true?.should == false
674
+ end
675
+ specify %([once(3), type_error(callable, 3)].) do
676
+ expect { 3.any.true? }.to raise_error(NoMethodError)
677
+ end
678
+ specify %([once(X), instantiation_error]. % Culprit X) do
679
+ expect { X.any.true? }.to raise_error(Rubylog::InstantiationError)
705
680
  end
706
681
  end
707
- specify %([(repeat,!,fail), failure].) do
708
- :repeat.and(:cut!).and(:fail).true?.should == false
709
- end
710
- end
711
-
712
- describe "retract", :pending=>"Not supported in Rubylog" do
713
- specify %([retract((4 :- X)), type_error(callable, 4)]. )
714
- specify %([retract((atom(_) :- X == '[]')), )
715
- specify %( permission_error(modify,static_procedure,atom/1)].)
716
- end
717
-
718
- describe "set_prolog_flag", :pending=>"Not supported in Rubylog" do
719
- specify %([(set_prolog_flag(unknown, fail),)
720
- specify %(current_prolog_flag(unknown, V)), [[V <-- fail]]].)
721
- specify %([set_prolog_flag(X, warning), instantiation_error].)
722
- specify %([set_prolog_flag(5, decimals), type_error(atom,5)].)
723
- specify %([set_prolog_flag(date, 'July 1999'), domain_error(prolog_flag,date)].)
724
- specify %([set_prolog_flag(debug, no), domain_error(flag_value,debug+no)].)
725
- specify %([set_prolog_flag(max_arity, 40), permission_error(modify, flag, max_arity)].)
726
- specify %(/* swindles to get tests of double quotes flag to work. */)
727
- specify %([set_prolog_flag(double_quotes, atom), success].)
728
- specify %([X = "fred", [[X <-- fred]]].)
729
- specify %([set_prolog_flag(double_quotes, codes), success].)
730
- specify %([X = "fred", [[X <-- [102,114,101,100]]]].)
731
- specify %([set_prolog_flag(double_quotes, chars), success].)
732
- specify %([X = "fred", [[X <-- [f,r,e,d]]]].)
733
- end
734
-
735
- describe "setof", :pending=>"Not supported in Rubylog. Use map{} instead" do
736
- specify %([setof(X,(X=1;X=2),L), [[L <-- [1, 2]]]].)
737
- specify %([setof(X,(X=1;X=2),X), [[X <-- [1, 2]]]].)
738
- specify %([setof(X,(X=2;X=1),L), [[L <-- [1, 2]]]].)
739
- specify %([setof(X,(X=2;X=2),L), [[L <-- [2]]]].)
740
- specify %([setof(X,fail,L), failure].)
741
- specify %([setof(1,(Y=2;Y=1),L), [[L <-- [1], Y <-- 1], [L <-- [1], Y <-- 2]]].)
742
- specify %([setof(f(X,Y),(X=a;Y=b),L), [[L <-- [f(_, b), f(a, _)]]]].)
743
- specify %([setof(X,Y^((X=1,Y=1);(X=2,Y=2)),S), [[S <-- [1, 2]]]].)
744
- specify %([setof(X,Y^((X=1;Y=1);(X=2,Y=2)),S), [[S <-- [_, 1, 2]]]].)
745
- specify %([(set_prolog_flag(unknown, warning), )
746
- specify %( setof(X,(Y^(X=1;Y=1);X=3),S)), [[S <-- [3]]]].)
747
- specify %( [(set_prolog_flag(unknown, warning), )
748
- specify %( setof(X,Y^(X=1;Y=1;X=3),S)), [[S <-- [_, 1,3]]]].)
749
- specify %( [setof(X,(X=Y;X=Z;Y=1),L), [[L <-- [Y, Z]], [L <-- [_], Y <-- 1]]].)
750
- specify %( [setof(X, X^(true; 4),L), type_error(callable,(true;4))].)
751
- specify %( [setof(X,1,L), type_error(callable,1)].)
752
- end
753
-
754
- describe "sub_atom" do
755
- specify %([sub_atom(abracadabra, 0, 5, _, S2), [[S2 <-- 'abrac']]].) do
756
- 'abracadabra'.is("#{S2[:length=>5]}#{ANY}").map{S2}.should eql ['abrac']
757
- end
758
- specify %([sub_atom(abracadabra, _, 5, 0, S2), [[S2 <-- 'dabra']]].) do
759
- 'abracadabra'.is("#{ANY}#{S2[:length=>5]}").map{S2}.should eql ['dabra']
760
- end
761
- specify %([sub_atom(abracadabra, 3, Length, 3, S2), [[Length <-- 5, S2 <-- 'acada']]].), :pending=>"There is no such feature in Rubylog yet. Maybe someday."
762
- specify %([sub_atom(abracadabra, Before, 2, After, ab),
763
- [[Before <-- 0, After <-- 9],
764
- [Before <-- 7, After <-- 2]]].) do
765
- 'abracadabra'.is("#{X}ab#{Y}").map{[X.length,Y.length]}.should eql [[0,9],[7,2]]
766
- end
767
- specify %( [sub_atom('Banana', 3, 2, _, S2), [[S2 <-- 'an']]].) do
768
- 'Banana'.is("#{ANY[:length=>3]}#{X[:length=>2]}#{ANY}").map{X}.should eql ["an"]
769
- end
770
- specify %( [sub_atom('charity', _, 3, _, S2), [[S2 <-- 'cha'],
771
- [S2 <-- 'har'],
772
- [S2 <-- 'ari'],
773
- [S2 <-- 'rit'],
774
- [S2 <-- 'ity']]].) do
775
- "charity".is("#{ANY}#{X[:length=>3]}#{ANY}").map{X}.should ==
776
- %w(cha har ari rit ity)
777
- end
778
- specify %( [sub_atom('ab', Before, Length, After, Sub_atom),
779
- [[Before <-- 1, Length <-- 0, Sub_atom <-- ''],
780
- [Before <-- 1, Length <-- 1, Sub_atom <-- 'a'],
781
- [Before <-- 1, Length <-- 2, Sub_atom <-- 'ab'],
782
- [Before <-- 2, Length <-- 0, Sub_atom <-- ''],
783
- [Before <-- 2, Length <-- 1, Sub_atom <-- 'b'],
784
- [Before <-- 3, Length <-- 0, Sub_atom <-- '']]].), :comment=>"This is a bug in inriasuite, the Before values are 1 less in reality, at least in GNU Prolog." do
785
- "ab".is("#{B}#{X}#{ANY}").map{[B.length,X.length,X]}.should ==
786
- [[0,0,''],
787
- [0,1,'a'],
788
- [0,2,'ab'],
789
- [1,0,''],
790
- [1,1,'b'],
791
- [2,0,'']]
792
- end
793
- specify %( [sub_atom(Banana, 3, 2, _, S2), instantiation_error].), :pending=>"Not supported in Rubylog"
794
- specify %( [sub_atom(f(a), 2, 2, _, S2), type_error(atom,f(a))].), :pending=>"Not an error in Rubylog"
795
- specify %( [sub_atom('Banana', 4, 2, _, 2), type_error(atom,2)].), :pending=>"Not supported in Rubylog"
796
- specify %( [sub_atom('Banana', a, 2, _, S2), type_error(integer,a)].), :pending=>"Not supported in Rubylog"
797
- specify %( [sub_atom('Banana', 4, n, _, S2), type_error(integer,n)].), :pending=>"Not supported in Rubylog"
798
- specify %( [sub_atom('Banana', 4, _, m, S2), type_error(integer,m)].), :pending=>"Not supported in Rubylog"
799
- end
800
-
801
- describe "term_diff", :pending=>"There is no such feature in Rubylog yet. Maybe someday." do
802
- specify %(['\\=='(1,1), failure].)
803
- specify %(['\\=='(X,X), failure].)
804
- specify %(['\\=='(1,2), success].)
805
- specify %(['\\=='(X,1), success].)
806
- specify %(['\\=='(X,Y), success].)
807
- specify %(['\\=='(_,_), success].)
808
- specify %(['\\=='(X,a(X)), success].)
809
- specify %(['\\=='(f(a),f(a)), failure].)
810
- end
811
-
812
- describe "term_eq", :pending=>"There is no such feature in Rubylog yet. Maybe someday." do
813
- specify %(['=='(1,1), success].)
814
- specify %(['=='(X,X), success].)
815
- specify %(['=='(1,2), failure].)
816
- specify %(['=='(X,1), failure].)
817
- specify %(['=='(X,Y), failure].)
818
- specify %(['=='(_,_), failure].)
819
- specify %(['=='(X,a(X)), failure].)
820
- specify %(['=='(f(a),f(a)), success].)
821
- end
822
-
823
- describe "term_gt", :pending=>"Not supported in Rubylog" do
824
- specify %(['@>'(1.0,1), failure].)
825
- specify %(['@>'(aardvark,zebra), failure].)
826
- specify %(['@>'(short,short), failure].)
827
- specify %(['@>'(short,shorter), failure].)
828
- specify %(['@>'(foo(b),foo(a)), success].)
829
- specify %(['@>'(X,X), failure].)
830
- specify %(['@>'(foo(a,X),foo(b,Y)), failure].)
831
- end
832
-
833
- describe "term_gt=", :pending=>"Not supported in Rubylog" do
834
- specify %(['@>='(1.0,1), failure].)
835
- specify %(['@>='(aardvark,zebra), failure].)
836
- specify %(['@>='(short,short), success].)
837
- specify %(['@>='(short,shorter), failure].)
838
- specify %(['@>='(foo(b),foo(a)), success].)
839
- specify %(['@>='(X,X), success].)
840
- specify %(['@>='(foo(a,X),foo(b,Y)), failure].)
841
- end
842
682
 
843
- describe "term_lt", :pending=>"Not supported in Rubylog" do
844
- specify %(['@<'(1.0,1), success].)
845
- specify %(['@<'(aardvark,zebra), success].)
846
- specify %(['@<'(short,short), failure].)
847
- specify %(['@<'(short,shorter), success].)
848
- specify %(['@<'(foo(b),foo(a)), failure].)
849
- specify %(['@<'(X,X), failure].)
850
- specify %(['@<'(foo(a,X),foo(b,Y)), success].)
851
- end
852
-
853
- describe "term_lt=", :pending=>"Not supported in Rubylog" do
854
- specify %(['@=<'(1.0,1), success].)
855
- specify %(['@=<'(aardvark,zebra), success].)
856
- specify %(['@=<'(short,short), success].)
857
- specify %(['@=<'(short,shorter), success].)
858
- specify %(['@=<'(foo(b),foo(a)), failure].)
859
- specify %(['@=<'(X,X), success].)
860
- specify %(['@=<'(foo(a,X),foo(b,Y)), success].)
861
- end
862
-
863
- describe "true" do
864
- specify %([true, success].) do
865
- :true.true?.should == true
683
+ describe "or" do
684
+ specify %([';'(true, fail), success].) do
685
+ :true.or(:fail).true?.should == true
686
+ end
687
+ specify %([';'((!, fail), true), failure].) do
688
+ :cut!.and(:fail).or(:true).true?.should == false
689
+ end
690
+ specify %([';'(!, call(3)), success].) do
691
+ :cut!.or(proc{fail}).true?.should == true
692
+ end
693
+ specify %([';'((X=1, !), X=2), [[X <-- 1]]].) do
694
+ X.is(1).and(:cut!).or(X.is(2)).map{X}.should == [1]
695
+ end
696
+ specify %([';'(X=1, X=2), [[X <-- 1], [X <-- 2]]].) do
697
+ (X.is(1).or(X.is(2))).map{X}.should == [1,2]
698
+ end
866
699
  end
867
- end
868
700
 
869
- describe "unify" do
870
- specify %(['='(X,1),[[X <-- 1]]].) do
871
- X.is(1).map{X}.should eql [1]
872
- end
873
- specify %(['='(X,Y),[[Y <-- X]]].), pending: "This happens the other way around in Rubylog, X will be bound to Y."
874
- specify %([('='(X,Y),'='(X,abc)),[[X <-- abc, Y <-- abc]]].) do
875
- X.is(Y).and(X.is(:abc)).map{[X,Y]}.should eql [[:abc,:abc]]
876
- end
877
- specify %(['='(f(X,def),f(def,Y)), [[X <-- def, Y <-- def]]].) do
878
- predicate_for Symbol, ".f()"
879
- X.f(:def).is(:def.f(Y)).map{[X,Y]}.should eql [[:def,:def]]
880
- end
881
- specify %(['='(1,2), failure].) do
882
- 1.is?(2).should eql false
883
- end
884
- specify %(['='(1,1.0), failure].) do
885
- 1.is?(1.0).should eql false
701
+ describe "repeat" do
702
+ before do
703
+ class << primitives
704
+ def repeat
705
+ yield while true
706
+ end
707
+ end
708
+ end
709
+ specify %([(repeat,!,fail), failure].) do
710
+ :repeat.and(:cut!).and(:fail).true?.should == false
711
+ end
886
712
  end
887
- specify %(['='(g(X),f(f(X))), failure].) do
888
- predicate ".g .f"
889
- X.g.is(X.f.f).true?.should eql false
713
+
714
+ describe "retract", :pending=>"Not supported in Rubylog" do
715
+ specify %([retract((4 :- X)), type_error(callable, 4)]. )
716
+ specify %([retract((atom(_) :- X == '[]')), )
717
+ specify %( permission_error(modify,static_procedure,atom/1)].)
718
+ end
719
+
720
+ describe "set_prolog_flag", :pending=>"Not supported in Rubylog" do
721
+ specify %([(set_prolog_flag(unknown, fail),)
722
+ specify %(current_prolog_flag(unknown, V)), [[V <-- fail]]].)
723
+ specify %([set_prolog_flag(X, warning), instantiation_error].)
724
+ specify %([set_prolog_flag(5, decimals), type_error(atom,5)].)
725
+ specify %([set_prolog_flag(date, 'July 1999'), domain_error(prolog_flag,date)].)
726
+ specify %([set_prolog_flag(debug, no), domain_error(flag_value,debug+no)].)
727
+ specify %([set_prolog_flag(max_arity, 40), permission_error(modify, flag, max_arity)].)
728
+ specify %(/* swindles to get tests of double quotes flag to work. */)
729
+ specify %([set_prolog_flag(double_quotes, atom), success].)
730
+ specify %([X = "fred", [[X <-- fred]]].)
731
+ specify %([set_prolog_flag(double_quotes, codes), success].)
732
+ specify %([X = "fred", [[X <-- [102,114,101,100]]]].)
733
+ specify %([set_prolog_flag(double_quotes, chars), success].)
734
+ specify %([X = "fred", [[X <-- [f,r,e,d]]]].)
735
+ end
736
+
737
+ describe "setof", :pending=>"Not supported in Rubylog. Use map{} instead" do
738
+ specify %([setof(X,(X=1;X=2),L), [[L <-- [1, 2]]]].)
739
+ specify %([setof(X,(X=1;X=2),X), [[X <-- [1, 2]]]].)
740
+ specify %([setof(X,(X=2;X=1),L), [[L <-- [1, 2]]]].)
741
+ specify %([setof(X,(X=2;X=2),L), [[L <-- [2]]]].)
742
+ specify %([setof(X,fail,L), failure].)
743
+ specify %([setof(1,(Y=2;Y=1),L), [[L <-- [1], Y <-- 1], [L <-- [1], Y <-- 2]]].)
744
+ specify %([setof(f(X,Y),(X=a;Y=b),L), [[L <-- [f(_, b), f(a, _)]]]].)
745
+ specify %([setof(X,Y^((X=1,Y=1);(X=2,Y=2)),S), [[S <-- [1, 2]]]].)
746
+ specify %([setof(X,Y^((X=1;Y=1);(X=2,Y=2)),S), [[S <-- [_, 1, 2]]]].)
747
+ specify %([(set_prolog_flag(unknown, warning), )
748
+ specify %( setof(X,(Y^(X=1;Y=1);X=3),S)), [[S <-- [3]]]].)
749
+ specify %( [(set_prolog_flag(unknown, warning), )
750
+ specify %( setof(X,Y^(X=1;Y=1;X=3),S)), [[S <-- [_, 1,3]]]].)
751
+ specify %( [setof(X,(X=Y;X=Z;Y=1),L), [[L <-- [Y, Z]], [L <-- [_], Y <-- 1]]].)
752
+ specify %( [setof(X, X^(true; 4),L), type_error(callable,(true;4))].)
753
+ specify %( [setof(X,1,L), type_error(callable,1)].)
754
+ end
755
+
756
+ describe "sub_atom" do
757
+ specify %([sub_atom(abracadabra, 0, 5, _, S2), [[S2 <-- 'abrac']]].) do
758
+ 'abracadabra'.is("#{S2[:length=>5]}#{ANY}").map{S2}.should eql ['abrac']
759
+ end
760
+ specify %([sub_atom(abracadabra, _, 5, 0, S2), [[S2 <-- 'dabra']]].) do
761
+ 'abracadabra'.is("#{ANY}#{S2[:length=>5]}").map{S2}.should eql ['dabra']
762
+ end
763
+ specify %([sub_atom(abracadabra, 3, Length, 3, S2), [[Length <-- 5, S2 <-- 'acada']]].), :pending=>"There is no such feature in Rubylog yet. Maybe someday."
764
+ specify %([sub_atom(abracadabra, Before, 2, After, ab),
765
+ [[Before <-- 0, After <-- 9],
766
+ [Before <-- 7, After <-- 2]]].) do
767
+ 'abracadabra'.is("#{X}ab#{Y}").map{[X.length,Y.length]}.should eql [[0,9],[7,2]]
768
+ end
769
+ specify %( [sub_atom('Banana', 3, 2, _, S2), [[S2 <-- 'an']]].) do
770
+ 'Banana'.is("#{ANY[:length=>3]}#{X[:length=>2]}#{ANY}").map{X}.should eql ["an"]
771
+ end
772
+ specify %( [sub_atom('charity', _, 3, _, S2), [[S2 <-- 'cha'],
773
+ [S2 <-- 'har'],
774
+ [S2 <-- 'ari'],
775
+ [S2 <-- 'rit'],
776
+ [S2 <-- 'ity']]].) do
777
+ "charity".is("#{ANY}#{X[:length=>3]}#{ANY}").map{X}.should ==
778
+ %w(cha har ari rit ity)
779
+ end
780
+ specify %( [sub_atom('ab', Before, Length, After, Sub_atom),
781
+ [[Before <-- 1, Length <-- 0, Sub_atom <-- ''],
782
+ [Before <-- 1, Length <-- 1, Sub_atom <-- 'a'],
783
+ [Before <-- 1, Length <-- 2, Sub_atom <-- 'ab'],
784
+ [Before <-- 2, Length <-- 0, Sub_atom <-- ''],
785
+ [Before <-- 2, Length <-- 1, Sub_atom <-- 'b'],
786
+ [Before <-- 3, Length <-- 0, Sub_atom <-- '']]].), :comment=>"This is a bug in inriasuite, the Before values are 1 less in reality, at least in GNU Prolog." do
787
+ "ab".is("#{B}#{X}#{ANY}").map{[B.length,X.length,X]}.should ==
788
+ [[0,0,''],
789
+ [0,1,'a'],
790
+ [0,2,'ab'],
791
+ [1,0,''],
792
+ [1,1,'b'],
793
+ [2,0,'']]
794
+ end
795
+ specify %( [sub_atom(Banana, 3, 2, _, S2), instantiation_error].), :pending=>"Not supported in Rubylog"
796
+ specify %( [sub_atom(f(a), 2, 2, _, S2), type_error(atom,f(a))].), :pending=>"Not an error in Rubylog"
797
+ specify %( [sub_atom('Banana', 4, 2, _, 2), type_error(atom,2)].), :pending=>"Not supported in Rubylog"
798
+ specify %( [sub_atom('Banana', a, 2, _, S2), type_error(integer,a)].), :pending=>"Not supported in Rubylog"
799
+ specify %( [sub_atom('Banana', 4, n, _, S2), type_error(integer,n)].), :pending=>"Not supported in Rubylog"
800
+ specify %( [sub_atom('Banana', 4, _, m, S2), type_error(integer,m)].), :pending=>"Not supported in Rubylog"
801
+ end
802
+
803
+ describe "term_diff", :pending=>"There is no such feature in Rubylog yet. Maybe someday." do
804
+ specify %(['\\=='(1,1), failure].)
805
+ specify %(['\\=='(X,X), failure].)
806
+ specify %(['\\=='(1,2), success].)
807
+ specify %(['\\=='(X,1), success].)
808
+ specify %(['\\=='(X,Y), success].)
809
+ specify %(['\\=='(_,_), success].)
810
+ specify %(['\\=='(X,a(X)), success].)
811
+ specify %(['\\=='(f(a),f(a)), failure].)
812
+ end
813
+
814
+ describe "term_eq", :pending=>"There is no such feature in Rubylog yet. Maybe someday." do
815
+ specify %(['=='(1,1), success].)
816
+ specify %(['=='(X,X), success].)
817
+ specify %(['=='(1,2), failure].)
818
+ specify %(['=='(X,1), failure].)
819
+ specify %(['=='(X,Y), failure].)
820
+ specify %(['=='(_,_), failure].)
821
+ specify %(['=='(X,a(X)), failure].)
822
+ specify %(['=='(f(a),f(a)), success].)
823
+ end
824
+
825
+ describe "term_gt", :pending=>"Not supported in Rubylog" do
826
+ specify %(['@>'(1.0,1), failure].)
827
+ specify %(['@>'(aardvark,zebra), failure].)
828
+ specify %(['@>'(short,short), failure].)
829
+ specify %(['@>'(short,shorter), failure].)
830
+ specify %(['@>'(foo(b),foo(a)), success].)
831
+ specify %(['@>'(X,X), failure].)
832
+ specify %(['@>'(foo(a,X),foo(b,Y)), failure].)
833
+ end
834
+
835
+ describe "term_gt=", :pending=>"Not supported in Rubylog" do
836
+ specify %(['@>='(1.0,1), failure].)
837
+ specify %(['@>='(aardvark,zebra), failure].)
838
+ specify %(['@>='(short,short), success].)
839
+ specify %(['@>='(short,shorter), failure].)
840
+ specify %(['@>='(foo(b),foo(a)), success].)
841
+ specify %(['@>='(X,X), success].)
842
+ specify %(['@>='(foo(a,X),foo(b,Y)), failure].)
843
+ end
844
+
845
+ describe "term_lt", :pending=>"Not supported in Rubylog" do
846
+ specify %(['@<'(1.0,1), success].)
847
+ specify %(['@<'(aardvark,zebra), success].)
848
+ specify %(['@<'(short,short), failure].)
849
+ specify %(['@<'(short,shorter), success].)
850
+ specify %(['@<'(foo(b),foo(a)), failure].)
851
+ specify %(['@<'(X,X), failure].)
852
+ specify %(['@<'(foo(a,X),foo(b,Y)), success].)
853
+ end
854
+
855
+ describe "term_lt=", :pending=>"Not supported in Rubylog" do
856
+ specify %(['@=<'(1.0,1), success].)
857
+ specify %(['@=<'(aardvark,zebra), success].)
858
+ specify %(['@=<'(short,short), success].)
859
+ specify %(['@=<'(short,shorter), success].)
860
+ specify %(['@=<'(foo(b),foo(a)), failure].)
861
+ specify %(['@=<'(X,X), success].)
862
+ specify %(['@=<'(foo(a,X),foo(b,Y)), success].)
863
+ end
864
+
865
+ describe "true" do
866
+ specify %([true, success].) do
867
+ :true.true?.should == true
868
+ end
890
869
  end
891
- specify %(['='(f(X,1),f(a(X))), failure].), :pending=>"No overloading in Rubylog yet"
892
- specify %(['='(f(X,Y,X),f(a(X),a(Y),Y,2)), failure].), :pending=>"No overloading in Rubylog yet"
893
- specify %(['='(f(A,B,C),f(g(B,B),g(C,C),g(D,D))),
894
- [[A <-- g(g(g(D,D),g(D,D)),g(g(D,D),g(D,D))),
895
- B <-- g(g(D,D),g(D,D)),
896
- C <-- g(D,D)]]].) do
897
- predicate ".g() .f(,)"
898
- A.f(B,C).is(B.g(B).f(C.g(C),D.g(D))).map{[A,B,C]}.should eql [[
899
- D.g(D).g(D.g(D)).g(D.g(D).g(D.g(D))),
900
- D.g(D).g(D.g(D)),
901
- D.g(D)
902
- ]]
870
+
871
+ describe "unify" do
872
+ specify %(['='(X,1),[[X <-- 1]]].) do
873
+ X.is(1).map{X}.should eql [1]
874
+ end
875
+ specify %(['='(X,Y),[[Y <-- X]]].), pending: "This happens the other way around in Rubylog, X will be bound to Y."
876
+ specify %([('='(X,Y),'='(X,abc)),[[X <-- abc, Y <-- abc]]].) do
877
+ X.is(Y).and(X.is(:abc)).map{[X,Y]}.should eql [[:abc,:abc]]
878
+ end
879
+ specify %(['='(f(X,def),f(def,Y)), [[X <-- def, Y <-- def]]].) do
880
+ predicate_for Symbol, ".f()"
881
+ X.f(:def).is(:def.f(Y)).map{[X,Y]}.should eql [[:def,:def]]
882
+ end
883
+ specify %(['='(1,2), failure].) do
884
+ 1.is?(2).should eql false
885
+ end
886
+ specify %(['='(1,1.0), failure].) do
887
+ 1.is?(1.0).should eql false
888
+ end
889
+ specify %(['='(g(X),f(f(X))), failure].) do
890
+ predicate ".g .f"
891
+ X.g.is(X.f.f).true?.should eql false
892
+ end
893
+ specify %(['='(f(X,1),f(a(X))), failure].), :pending=>"No overloading in Rubylog yet"
894
+ specify %(['='(f(X,Y,X),f(a(X),a(Y),Y,2)), failure].), :pending=>"No overloading in Rubylog yet"
895
+ specify %(['='(f(A,B,C),f(g(B,B),g(C,C),g(D,D))),
896
+ [[A <-- g(g(g(D,D),g(D,D)),g(g(D,D),g(D,D))),
897
+ B <-- g(g(D,D),g(D,D)),
898
+ C <-- g(D,D)]]].) do
899
+ predicate ".g() .f(,)"
900
+ A.f(B,C).is(B.g(B).f(C.g(C),D.g(D))).map{[A,B,C]}.should eql [[
901
+ D.g(D).g(D.g(D)).g(D.g(D).g(D.g(D))),
902
+ D.g(D).g(D.g(D)),
903
+ D.g(D)
904
+ ]]
905
+ end
906
+
903
907
  end
904
908
 
905
909
  end
906
910
 
907
- end
908
911
 
912
+ end