rubylog 1.0.0 → 2.0pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (163) hide show
  1. data/Gemfile +3 -12
  2. data/Gemfile.lock +22 -48
  3. data/README.rdoc +38 -38
  4. data/README.rdoc.orig +284 -0
  5. data/RELEASE_NOTES.rdoc +51 -0
  6. data/Rakefile +14 -18
  7. data/TODO.txt +0 -0
  8. data/VERSION +1 -1
  9. data/examples/a_plus_b.rb +6 -0
  10. data/examples/checkmate.rb +88 -0
  11. data/examples/combination.rb +17 -0
  12. data/examples/dcg.rb +3 -2
  13. data/examples/dcg2.rb +2 -2
  14. data/{logic → examples}/directory_structure_logic.rb +3 -5
  15. data/examples/dirlist.rb +4 -0
  16. data/examples/divisors.rb +6 -0
  17. data/examples/enumerators.rb +3 -3
  18. data/examples/factorial.rb +2 -3
  19. data/examples/file_search.rb +14 -0
  20. data/examples/hanoi.rb +4 -5
  21. data/examples/hello.rb +6 -4
  22. data/examples/mice.rb +92 -0
  23. data/examples/mice2.rb +19 -0
  24. data/examples/n_queens.rb +32 -0
  25. data/examples/object_oriented.rb +14 -0
  26. data/examples/palindrome_detection.rb +18 -0
  27. data/examples/parsing.rb +6 -4
  28. data/examples/permutation.rb +12 -0
  29. data/examples/prefix.rb +13 -0
  30. data/examples/primality_by_division.rb +22 -0
  31. data/examples/primitives.rb +10 -8
  32. data/examples/sieve_of_eratosthenes.rb +14 -0
  33. data/examples/string_interpolation.rb +4 -0
  34. data/examples/sudoku.rb +52 -0
  35. data/examples/tracing.rb +19 -0
  36. data/lib/rspec/rubylog.rb +29 -0
  37. data/lib/rubylog/assertable.rb +24 -0
  38. data/lib/rubylog/builtins/arithmetics.rb +63 -0
  39. data/lib/rubylog/builtins/assumption.rb +71 -0
  40. data/lib/rubylog/builtins/ensure.rb +13 -0
  41. data/lib/rubylog/builtins/file_system.rb +30 -8
  42. data/lib/rubylog/builtins/logic.rb +69 -38
  43. data/lib/rubylog/builtins/reflection.rb +35 -50
  44. data/lib/rubylog/builtins/term.rb +15 -17
  45. data/lib/rubylog/builtins.rb +11 -0
  46. data/lib/rubylog/clause.rb +19 -0
  47. data/lib/rubylog/{interfaces/composite_term.rb → compound_term.rb} +3 -3
  48. data/lib/rubylog/context.rb +24 -0
  49. data/lib/rubylog/context_creation.rb +71 -0
  50. data/lib/rubylog/context_modules/checks.rb +35 -0
  51. data/lib/rubylog/context_modules/demonstration.rb +16 -0
  52. data/lib/rubylog/context_modules/predicates.rb +86 -0
  53. data/lib/rubylog/context_modules/primitives.rb +18 -0
  54. data/lib/rubylog/context_modules/thats.rb +13 -0
  55. data/lib/rubylog/default_context.rb +9 -0
  56. data/lib/rubylog/dsl/array_splat.rb +11 -3
  57. data/lib/rubylog/dsl/primitives.rb +24 -12
  58. data/lib/rubylog/dsl/thats.rb +6 -0
  59. data/lib/rubylog/dsl/variables.rb +56 -21
  60. data/lib/rubylog/errors.rb +26 -15
  61. data/lib/rubylog/mixins/array.rb +95 -62
  62. data/lib/rubylog/mixins/kernel.rb +3 -2
  63. data/lib/rubylog/mixins/method.rb +0 -1
  64. data/lib/rubylog/mixins/object.rb +2 -1
  65. data/lib/rubylog/mixins/proc.rb +9 -12
  66. data/lib/rubylog/mixins/string.rb +15 -23
  67. data/lib/rubylog/mixins/symbol.rb +7 -24
  68. data/lib/rubylog/nullary_predicates.rb +3 -0
  69. data/lib/rubylog/predicate.rb +53 -0
  70. data/lib/rubylog/primitive.rb +15 -0
  71. data/lib/rubylog/procedure.rb +42 -0
  72. data/lib/rubylog/rule.rb +24 -0
  73. data/lib/rubylog/structure.rb +19 -38
  74. data/lib/rubylog/{interfaces/term.rb → term.rb} +2 -7
  75. data/lib/rubylog/tracing.rb +75 -0
  76. data/lib/rubylog/variable.rb +31 -12
  77. data/lib/rubylog.rb +36 -32
  78. data/rubylog.gemspec +92 -84
  79. data/spec/inriasuite_spec.rb +906 -9
  80. data/spec/integration/custom_classes_spec.rb +61 -0
  81. data/spec/integration/dsl_spec.rb +38 -0
  82. data/spec/integration/recursion_spec.rb +14 -0
  83. data/spec/integration/theory_as_module_spec.rb +20 -0
  84. data/spec/integration/theory_as_module_with_include_spec.rb +14 -0
  85. data/spec/rspec/rubylog_spec.rb +75 -0
  86. data/spec/rubylog/assertable_spec.rb +111 -0
  87. data/spec/rubylog/builtins/arithmetics_spec.rb +94 -0
  88. data/spec/rubylog/builtins/assumption_spec.rb +70 -0
  89. data/spec/rubylog/builtins/ensure_spec.rb +8 -0
  90. data/spec/rubylog/builtins/file_system_spec.rb +40 -0
  91. data/spec/rubylog/builtins/logic_spec.rb +340 -0
  92. data/spec/rubylog/builtins/reflection_spec.rb +43 -0
  93. data/spec/rubylog/builtins/term_spec.rb +85 -0
  94. data/spec/rubylog/context_modules/demonstration_spec.rb +132 -0
  95. data/spec/rubylog/context_modules/predicates_spec.rb +57 -0
  96. data/spec/rubylog/context_modules/thats_spec.rb +94 -0
  97. data/spec/rubylog/dsl/array_splat_spec.rb +15 -0
  98. data/spec/rubylog/dsl/primitives_spec.rb +43 -0
  99. data/spec/rubylog/errors_spec.rb +18 -0
  100. data/spec/{unification_spec.rb → rubylog/interfaces/term_spec.rb} +8 -9
  101. data/spec/rubylog/mixins/array_spec.rb +80 -0
  102. data/spec/rubylog/mixins/composite_term_spec.rb +66 -0
  103. data/spec/rubylog/mixins/proc_spec.rb +59 -0
  104. data/spec/rubylog/mixins/string_spec.rb +48 -0
  105. data/spec/rubylog/mixins/symbol_spec.rb +9 -0
  106. data/spec/{clause_spec.rb → rubylog/structure_spec.rb} +16 -15
  107. data/spec/rubylog/term_spec.rb +7 -0
  108. data/spec/rubylog/tracing_spec.input +27 -0
  109. data/spec/rubylog/tracing_spec.rb +44 -0
  110. data/spec/rubylog/variable_spec.rb +279 -0
  111. data/spec/spec_helper.rb +1 -0
  112. data/vimrc +11 -0
  113. metadata +103 -123
  114. data/README.hu.rb +0 -58
  115. data/bin/rubylog +0 -18
  116. data/examples/theory.rb +0 -32
  117. data/lib/rubylog/builtins/default.rb +0 -10
  118. data/lib/rubylog/dsl.rb +0 -70
  119. data/lib/rubylog/interfaces/assertable.rb +0 -16
  120. data/lib/rubylog/interfaces/callable.rb +0 -18
  121. data/lib/rubylog/interfaces/predicate.rb +0 -8
  122. data/lib/rubylog/interfaces/procedure.rb +0 -60
  123. data/lib/rubylog/mixins/class.rb +0 -11
  124. data/lib/rubylog/simple_procedure.rb +0 -8
  125. data/lib/rubylog/theory.rb +0 -422
  126. data/logic/builtins/file_system_logic.rb +0 -23
  127. data/logic/builtins/reflection_logic.rb +0 -40
  128. data/logic/dereference_logic.rb +0 -23
  129. data/logic/dsl_logic.rb +0 -29
  130. data/logic/errors_logic.rb +0 -9
  131. data/logic/guard_logic.rb +0 -115
  132. data/logic/list_logic.rb +0 -55
  133. data/logic/map_logic.rb +0 -15
  134. data/logic/multitheory.rb +0 -23
  135. data/logic/recursion_logic.rb +0 -12
  136. data/logic/string_logic.rb +0 -41
  137. data/logic/thats_logic.rb +0 -51
  138. data/logic/variable_logic.rb +0 -24
  139. data/spec/bartak_guide_spec.rb +0 -86
  140. data/spec/builtins/all_spec.rb +0 -99
  141. data/spec/builtins/and_spec.rb +0 -22
  142. data/spec/builtins/array_spec.rb +0 -16
  143. data/spec/builtins/branch_or_spec.rb +0 -27
  144. data/spec/builtins/cut_spec.rb +0 -44
  145. data/spec/builtins/fail_spec.rb +0 -5
  146. data/spec/builtins/false_spec.rb +0 -5
  147. data/spec/builtins/in_spec.rb +0 -38
  148. data/spec/builtins/is_false_spec.rb +0 -12
  149. data/spec/builtins/is_spec.rb +0 -26
  150. data/spec/builtins/matches_spec.rb +0 -23
  151. data/spec/builtins/or_spec.rb +0 -22
  152. data/spec/builtins/splits_to.rb +0 -18
  153. data/spec/builtins/then_spec.rb +0 -27
  154. data/spec/builtins/true_spec.rb +0 -5
  155. data/spec/compilation_spec.rb +0 -61
  156. data/spec/custom_classes_spec.rb +0 -43
  157. data/spec/dereference.rb +0 -10
  158. data/spec/queries_spec.rb +0 -150
  159. data/spec/recursion_spec.rb +0 -18
  160. data/spec/ruby_code_spec.rb +0 -52
  161. data/spec/rules_spec.rb +0 -97
  162. data/spec/theory_spec.rb +0 -29
  163. data/spec/variable_spec.rb +0 -26
@@ -1,27 +0,0 @@
1
-
2
-
3
- describe "branch or" do
4
- it "works 1" do
5
- :john.happy.if :fail
6
- :john.happy.if :true
7
- :john.should be_happy
8
- end
9
-
10
- it "works 2" do
11
- :john.happy.if :true
12
- :john.happy.if :fail
13
- :john.should be_happy
14
- end
15
-
16
- it "works 3" do
17
- :john.happy.if :fail
18
- :john.happy.if :fail
19
- :john.should_not be_happy
20
- end
21
-
22
- it "works 4" do
23
- :john.happy.if :true
24
- :john.happy.if :true
25
- :john.should be_happy
26
- end
27
- end
@@ -1,44 +0,0 @@
1
-
2
- describe "cut" do
3
- it "works with branch or" do
4
- :john.happy.if :true.and :cut.and :fail
5
- :john.happy.if :true
6
- :john.should_not be_happy
7
- end
8
- it "works with branch or (control)" do
9
- :john.happy.if :true.and :fail
10
- :john.happy.if :true
11
- :john.should be_happy
12
- end
13
-
14
- it "works with or" do
15
- :john.happy.if((:true.and :cut.and :fail).or :true)
16
- :john.should_not be_happy
17
- end
18
-
19
- it "works with or (control)" do
20
- :john.happy.if((:true.and :fail).or :true)
21
- :john.should be_happy
22
- end
23
-
24
- it "returns true with branch or" do
25
- :john.happy.if :true.and :cut.and :true
26
- :john.happy.if :true
27
- :john.should be_happy
28
- end
29
- it "returns true with branch or (control)" do
30
- :john.happy.if :true.and :true
31
- :john.happy.if :true
32
- :john.should be_happy
33
- end
34
-
35
- it "returns true with or" do
36
- :john.happy.if((:true.and :cut.and :true).or :true)
37
- :john.should be_happy
38
- end
39
-
40
- it "returns true with or (control)" do
41
- :john.happy.if((:true.and :true).or :true)
42
- :john.should be_happy
43
- end
44
- end
@@ -1,5 +0,0 @@
1
-
2
- it "fail" do
3
- :john.happy.if :fail
4
- :john.should_not be_happy
5
- end
@@ -1,5 +0,0 @@
1
-
2
- it "false" do
3
- :john.happy.if :false
4
- :john.should_not be_happy
5
- end
@@ -1,38 +0,0 @@
1
-
2
- describe "in" do
3
- before do
4
- :john.likes! :beer
5
- :jane.likes! :milk
6
- end
7
-
8
- it "works for variables" do
9
- (A.likes(B).and(B.in [])).to_a.should == []
10
- (A.likes(B).and(B.in [:milk])).to_a.should == [[:jane, :milk]]
11
- (A.likes(B).and(B.in [:beer])).to_a.should == [[:john, :beer]]
12
- (A.likes(B).and(B.in [:milk, :beer])).to_a.should == [[:john, :beer], [:jane, :milk]]
13
- end
14
-
15
- it "works with blocks" do
16
- (A.likes(B).and(B.in {[]})).to_a.should == []
17
- (A.likes(B).and(B.in {|a|[a,:milk]})).to_a.should == [[:jane, :milk]]
18
- (A.likes(B).and(B.in {|a,b|[:beer]})).to_a.should == [[:john, :beer]]
19
- (A.likes(B).and(B.in {|a,b|[b]})).to_a.should == [[:john, :beer], [:jane, :milk]]
20
- end
21
-
22
- it "works as iterator" do
23
- (A.in{[1,3,4]}).to_a.should == [1,3,4]
24
- (A.in [1,3,4]).to_a.should == [1,3,4]
25
- end
26
-
27
- it "works as search" do
28
- (1.in{[1,3,4]}).to_a.should == [nil]
29
- (2.in{[1,3,4]}).to_a.should == []
30
- (1.in [1,3,4]).to_a.should == [nil]
31
- (2.in [1,3,4]).to_a.should == []
32
- end
33
-
34
- it "works with clauses" do
35
- (A.likes(B).and B.in{:john.likes(X)}).to_a.should == [[:john, :beer]]
36
- end
37
-
38
- end
@@ -1,12 +0,0 @@
1
-
2
- describe "is_false" do
3
- it "works 5" do
4
- :john.happy.if :true.is_false
5
- :john.should_not be_happy
6
- end
7
-
8
- it "works 5" do
9
- :john.happy.if :fail.is_false
10
- :john.should be_happy
11
- end
12
- end
@@ -1,26 +0,0 @@
1
-
2
- describe "is" do
3
- before do
4
- :john.likes! :beer
5
- :jane.likes! :milk
6
- end
7
-
8
- it "works for variables" do
9
- (A.likes(B).and(B.is :milk)).to_a.should == [[:jane, :milk]]
10
- (A.likes(B).and(:milk.is B)).to_a.should == [[:jane, :milk]]
11
- end
12
-
13
- it "works as calculation" do
14
- (A.is {|| 4+4}).to_a.should == [8]
15
- (A.is {4+4}).to_a.should == [8]
16
- (A.is(4).and A.is{2*2}).to_a.should == [4]
17
- (A.is(4).and A.is{2*3}).to_a.should == []
18
- end
19
-
20
- it "works as calculation with vars" do
21
- (A.is(4).and B.is{|a|a*4}).to_a.should == [[4,16]]
22
- (A.is(4).and A.is{|a|a*1}).to_a.should == [4]
23
- (A.is(4).and A.is{|a|a*2}).to_a.should == []
24
- end
25
-
26
- end
@@ -1,23 +0,0 @@
1
-
2
- describe "matches" do
3
- before do
4
- :john.likes! "Beer"
5
- :jane.likes! "Water"
6
- end
7
-
8
- it "works for variables" do
9
- (A.likes(B).and(B.matches /e/)).to_a.should == [[:john, "Beer"], [:jane, "Water"]]
10
- (A.likes(B).and(B.matches /ee/)).to_a.should == [[:john, "Beer"]]
11
- (A.likes(B).and(B.matches /w/i)).to_a.should == [[:jane, "Water"]]
12
- end
13
-
14
- it "works as calculation" do
15
- (A.likes(B).and(B.matches {|a,b|/e/})).to_a.should == [[:john, "Beer"], [:jane, "Water"]]
16
- (A.likes(B).and(B.matches {|a,b|/ee/})).to_a.should == [[:john, "Beer"]]
17
- (A.likes(B).and(B.matches {|a,b|/w/i})).to_a.should == [[:jane, "Water"]]
18
- (A.likes(B).and(B.matches {|a,b|b})).to_a.should == [[:john, "Beer"], [:jane, "Water"]]
19
- (A.likes(B).and(B.matches {|a,b|a})).to_a.should == []
20
- end
21
-
22
-
23
- end
@@ -1,22 +0,0 @@
1
-
2
- describe "or" do
3
- it "works 1" do
4
- :john.happy.if :fail.or :true
5
- :john.should be_happy
6
- end
7
-
8
- it "works 2" do
9
- :john.happy.if :true.or :fail
10
- :john.should be_happy
11
- end
12
-
13
- it "works 3" do
14
- :john.happy.if :fail.or :fail
15
- :john.should_not be_happy
16
- end
17
-
18
- it "works 4" do
19
- :john.happy.if :true.or :true
20
- :john.should be_happy
21
- end
22
- end
@@ -1,18 +0,0 @@
1
- require 'rubylog'
2
-
3
- class << Rubylog.theory
4
- describe "splits_to" do
5
- specify do
6
- def split_to a,b
7
- be_splits_to a,b
8
- end
9
-
10
- [].should_not split_to(ANY,ANY)
11
- [1].should split_to(1,[])
12
- [1,2].should split_to(1,[2])
13
- [1,2,3].should split_to(1,[2,3])
14
-
15
- ([1,2,3].splits_to(B,C)).to_a.should == [[1,[2,3]]]
16
- end
17
- end
18
- end
@@ -1,27 +0,0 @@
1
-
2
- describe "then" do
3
- it "works 1" do
4
- :john.happy.if :fail.then :true
5
- :john.should_not be_happy
6
- end
7
-
8
- it "works 2" do
9
- :john.happy.if :true.then :fail
10
- :john.should_not be_happy
11
- end
12
-
13
- it "works 3" do
14
- :john.happy.if :fail.then :fail
15
- :john.should_not be_happy
16
- end
17
-
18
- it "works 4" do
19
- :john.happy.if :true.then :true
20
- :john.should be_happy
21
- end
22
-
23
- it "works 5" do
24
- :john.happy.if :true.then :true
25
- :john.should be_happy
26
- end
27
- end
@@ -1,5 +0,0 @@
1
-
2
- it "true" do
3
- :john.happy.if :true
4
- :john.should be_happy
5
- end
@@ -1,61 +0,0 @@
1
-
2
- describe "compilation" do
3
-
4
- it "makes eql variables be equal" do
5
- a = A; b = A
6
- c = (a.likes b)
7
- c[0].should be_equal a; c[1].should be_equal b
8
- c[0].should_not be_equal c[1]
9
- c = c.rubylog_compile_variables
10
- c[0].should be_equal c[1]
11
- end
12
-
13
- it "makes non-eql variables be non-equal" do
14
- a = A; b = B
15
- c = (a.likes b)
16
- c[0].should be_equal a; c[1].should be_equal b
17
- c[0].should_not be_equal c[1]
18
- c = c.rubylog_compile_variables
19
- c[0].should_not be_equal c[1]
20
- end
21
-
22
- it "makes dont-care variables be non-equal" do
23
- a = ANY; b = ANY
24
- c = (a.likes b)
25
- c[0].should be_equal a; c[1].should be_equal b
26
- c[0].should_not be_equal c[1]
27
- c = c.rubylog_compile_variables
28
- c[0].should_not be_equal c[1]
29
- end
30
-
31
- it "creates new variables" do
32
- a = A; b = B
33
- c = (a.likes b)
34
- c[0].should be_equal a; c[1].should be_equal b
35
- c = c.rubylog_compile_variables
36
- c[0].should_not be_equal a
37
- c[1].should_not be_equal a
38
- c[0].should_not be_equal b
39
- c[1].should_not be_equal b
40
- end
41
-
42
- it "makes variables available" do
43
- a = A; a1 = A; a2 = A; b = B; b1 = B; c = C;
44
- (a.likes b).rubylog_compile_variables.rubylog_variables.should == [a, b]
45
- (a.likes a1).rubylog_compile_variables.rubylog_variables.should == [a]
46
- (a.likes a1.in b).rubylog_compile_variables.rubylog_variables.should == [a, b]
47
- (a.likes a1,b,b1,a2,c).rubylog_compile_variables.rubylog_variables.should == [a, b, c]
48
- end
49
-
50
- it "does not make dont-care variables available" do
51
- a = ANY; a1 = ANYTHING; a2 = ANYTHING; b = B; b1 = B; c = C;
52
- (a.likes b).rubylog_compile_variables.rubylog_variables.should == [b]
53
- (a.likes a1).rubylog_compile_variables.rubylog_variables.should == []
54
- (a.likes a1.in b).rubylog_compile_variables.
55
- rubylog_variables.should == [b]
56
- (a.likes a1,b,b1,a2,c).rubylog_compile_variables.
57
- rubylog_variables.should == [b, c]
58
- end
59
-
60
-
61
- end
@@ -1,43 +0,0 @@
1
-
2
- describe "custom classes" do
3
- before do
4
- class User
5
- rubylog_functor :girl, :boy
6
- include Rubylog::DSL::Constants
7
-
8
- attr_reader :name
9
- def initialize name
10
- @name = name
11
- end
12
-
13
- U.girl.if {|u| u.name =~ /[aeiouh]$/ }
14
- U.boy.unless U.girl
15
- end
16
- end
17
-
18
- it "can have ruby predicates" do
19
- john = User.new "John"
20
- john.girl?.should be_false
21
- john.boy?.should be_true
22
- jane = User.new "Jane"
23
- jane.girl?.should be_true
24
- jane.boy?.should be_false
25
- end
26
-
27
- it "can be used in assertions" do
28
- pete = User.new "Pete"
29
- pete.boy?.should be_false
30
- pete.boy!
31
- pete.boy?.should be_true
32
-
33
- Rubylog.theory[:girl][1].discontinuous!
34
- janet = User.new "Janet"
35
- janet.girl?.should be_false
36
- janet.girl!
37
- janet.girl?.should be_true
38
- end
39
-
40
-
41
-
42
-
43
- end
data/spec/dereference.rb DELETED
@@ -1,10 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "Dereference" do
4
- specify do
5
- t = theory do
6
- Rubylog::Variable.should === A
7
-
8
- end
9
- end
10
- end
data/spec/queries_spec.rb DELETED
@@ -1,150 +0,0 @@
1
-
2
- describe "queries" do
3
- it "can be run with true?" do
4
- lambda {Rubylog.theory.true?(:john.likes :beer)}.should raise_error(Rubylog::ExistenceError)
5
- :john.likes! :beer
6
- Rubylog.theory.true?(:john.likes :beer).should be_true
7
- Rubylog.theory.true?(:john.likes :milk).should be_false
8
- end
9
-
10
- it "can be run with question mark" do
11
- lambda {Rubylog.theory.true?(:john.likes :beer)}.should raise_error(Rubylog::ExistenceError)
12
- :john.likes! :beer
13
- :john.likes?(:beer).should be_true
14
- end
15
-
16
- it "can be run with true?" do
17
- lambda {Rubylog.theory.true?(:john.likes :beer)}.should raise_error(Rubylog::ExistenceError)
18
- :john.likes! :beer
19
- (:john.likes(:beer)).true?.should be_true
20
- end
21
-
22
- it "work with variables" do
23
- lambda {Rubylog.theory.true?(:john.likes X)}.should raise_error(Rubylog::ExistenceError)
24
- :john.likes! :water
25
- :john.likes?(X).should be_true
26
- end
27
-
28
- it "yield all solutions" do
29
- :john.likes! :beer
30
- :john.likes! :milk
31
-
32
- k=[]
33
- (:john.likes X).each{|x|k << x}
34
- k.should == [:beer, :milk]
35
- end
36
-
37
- it "yield all solutions with solve" do
38
- :john.likes! :beer
39
- :john.likes! :milk
40
-
41
- k=[]
42
- (:john.likes X).solve{|x|k << x}
43
- k.should == [:beer, :milk]
44
- end
45
-
46
- it "yield all solutions with solve and multiple vars and multiple block parameters" do
47
- :john.likes! :beer
48
- :jane.likes! :milk
49
- :jane.likes! :water
50
-
51
- k=[]
52
- (X.likes Y).solve{|a,b|k << [a,b]}
53
- k.should == [[:john, :beer], [:jane, :milk], [:jane, :water]]
54
- end
55
-
56
- it "ignore don't-care variables" do
57
- :john.likes! :beer
58
-
59
- k=[]
60
- ANYONE.likes(X).each{|x|k << x}
61
- k.should == [:beer]
62
-
63
- k=[]
64
- X.likes(ANYTHING).each{|x|k << x}
65
- k.should == [:john]
66
- end
67
-
68
- it "makes sure all variables are instantiated" do
69
- res = []
70
- A.likes(B).if {|a,b| res << a << b }
71
- A.likes? :beer
72
- res.should == [nil,:beer]
73
- end
74
-
75
- it "substitutes deeper variables" do
76
- res = []
77
- A.likes(B).if {|a,b| res << a << b }
78
- (A.is(:john).and B.is(:swimming.in C).and
79
- C.is(:sea).and A.likes B).to_a.should == [[:john,:swimming.in(:sea),:sea]]
80
- res.should == [:john, :swimming.in(:sea)]
81
- end
82
-
83
-
84
- describe "support Enumerable" do
85
- before do
86
- :john.likes! :beer
87
- :john.likes! :milk
88
- end
89
-
90
- it "#all?, #any? and #none?" do
91
- (:john.likes A).all?{|a| Symbol===a}.should be_true
92
- (:john.likes A).all?{|a| a == :beer}.should be_false
93
- (:john.likes A).all?{|a| a == :beer or a == :milk}.should be_true
94
- (:john.likes A).any?{|a| a == :beer}.should be_true
95
- (:john.likes A).any?{|a| a == :milk}.should be_true
96
- (:john.likes A).any?{|a| a == :water}.should be_false
97
- (:john.likes A).none?{|a| a == :water}.should be_true
98
- (:john.likes A).none?{|a| a == :beer}.should be_false
99
- end
100
-
101
- it "#to_a" do
102
- (:john.likes A).to_a.should == [:beer, :milk]
103
- (X.likes A).to_a.should == [[:john, :beer], [:john, :milk]]
104
- (ANYONE.likes A).to_a.should == [:beer, :milk]
105
- end
106
-
107
- it "#first" do
108
- (:john.likes A).first.should == :beer
109
- end
110
-
111
- it "#map" do
112
- (:john.likes A).map{|a|a.to_s}.should == ['beer', 'milk']
113
- end
114
-
115
- it "#include? and #member?" do
116
- (:john.likes B).member?(:beer).should be_true
117
- (:john.likes B).include?(:beer).should be_true
118
- (:john.likes B).member?(:milk).should be_true
119
- (:john.likes B).include?(:milk).should be_true
120
- (:john.likes B).member?(:water).should be_false
121
- (:john.likes B).include?(:water).should be_false
122
- end
123
-
124
- end
125
-
126
- it "can yield solutions with vars substituted" do
127
- :john.likes! :beer
128
- :john.likes! :milk
129
- :jane.likes! :milk
130
-
131
- (A.likes B).solutions.should == [
132
- :john.likes(:beer),
133
- :john.likes(:milk),
134
- :jane.likes(:milk)
135
- ]
136
- (A.likes(B).and A.is :john).solutions.should == [
137
- :john.likes(:beer).and(:john.is :john),
138
- :john.likes(:milk).and(:john.is :john)
139
- ]
140
- (:john.likes(B)).solutions.should == [
141
- :john.likes(:beer),
142
- :john.likes(:milk)
143
- ]
144
- (A.likes(:milk)).solutions.should == [
145
- :john.likes(:milk),
146
- :jane.likes(:milk)
147
- ]
148
- end
149
-
150
- end
@@ -1,18 +0,0 @@
1
-
2
- require 'rubylog'
3
-
4
- describe "recursion" do
5
- specify "factorial" do
6
- theory "Recursion" do
7
- functor_for Integer, :factorial
8
- 0.factorial! 1
9
- N.factorial(K).if lambda{|n|n>0}.and N1.is{|n|n-1}.and N1.factorial(K1).and K.is{|n,_,_,k1|k1*n}
10
-
11
- (0.factorial K).to_a.should == [1]
12
- (1.factorial K).to_a.should == [1]
13
- (2.factorial K).to_a.should == [2]
14
- (3.factorial K).to_a.should == [6]
15
- (4.factorial K).to_a.should == [24]
16
- end
17
- end
18
- end
@@ -1,52 +0,0 @@
1
-
2
- describe "using ruby code in clauses" do
3
- it "works" do
4
- (:true.and? {false}).should be_false
5
- (:true.and? {true}).should be_true
6
- (:false.and? {false}).should be_false
7
- (:false.and? {true}).should be_false
8
- (:true.or? {false}).should be_true
9
- (:true.or? {true}).should be_true
10
- (:false.or? {false}).should be_false
11
- (:false.or? {true}).should be_true
12
-
13
- (:fail.or? {false}).should be_false
14
- (:fail.or? {true}).should be_true
15
- end
16
- it "runs the query once at every evaluation" do
17
- count = 0
18
- :john.is_happy.if :true.and { count += 1 }
19
- count.should == 0
20
- :john.is_happy?
21
- count.should == 1
22
- :john.is_happy?
23
- count.should == 2
24
- (:false.or? {count+=1}).should be_true
25
- count.should == 3
26
- end
27
-
28
- describe "bindings" do
29
- it "works for rule bodies" do
30
- result = nil;
31
- (A.likes(B).if {|*args| result = args})
32
- (:john.likes(:beer)).solve{}
33
- result.should == [:john,:beer]
34
- end
35
-
36
- it "works for rules" do
37
- result = nil
38
- (A.likes(B).if B.is(4).and A.is(2).and C.is(5).and {|*args| result = args})
39
- (A.likes(B)).solve{}
40
- result.should == [2,4,5]
41
- end
42
-
43
- it "works for inline terms" do
44
- result = nil
45
- (A.is(1).and B.is(2).and {|*args| result = args}).solve{}
46
- result.should == [1,2]
47
- end
48
-
49
-
50
-
51
- end
52
- end