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,40 +0,0 @@
1
- require "./lib/rubylog/builtins/reflection.rb"
2
-
3
- theory do
4
- functor_for String, :likes, :drinks
5
-
6
- # fact
7
- "John".likes! "beer"
8
- check "John".likes("beer").fact
9
- check { A.likes(B).fact.map{A.likes(B)} == ["John".likes("beer")] }
10
-
11
- # follows_from
12
- A.drinks(B).if A.likes(B)
13
- check A.drinks(B).follows_from A.likes(B)
14
- check {A.drinks(B).follows_from(K).map{K} == [A.likes(B)] }
15
-
16
- # structure
17
- check A.likes(B).structure(:likes, [A,B])
18
- check { A.likes(B).structure(X,Y).map{[X,Y]} == [[:likes, [A,B]]] }
19
-
20
- # structures with variable functor and partial argument list
21
- check { K.structure(:drinks, ["John", "beer"]).map{K} == ["John".drinks("beer")] }
22
- check { K.structure(A,[*B]).
23
- and(A.is(:drinks)).
24
- and(B.is(["John","beer"])).
25
- map{K} == ["John".drinks("beer")] }
26
-
27
- # variable
28
- # Removed because of the "every built-in prediate is pure logical" principle
29
- #check A.variable("A")
30
- #check A.variable("B").false
31
- #check { A.variable(B).map{B} == ["A"] }
32
- # You can use the fact that automatic variable resolution yields nil if the
33
- # variable is undefined:
34
- #
35
- # check A.is(ANY).and{ A }.false
36
- # check A.is(ANY).and{ not A }
37
- #
38
-
39
-
40
- end
@@ -1,23 +0,0 @@
1
- theory do
2
- functor_for Integer, :divides
3
-
4
- check { A.is_a? Rubylog::Variable }
5
- check { A.rubylog_deep_dereference == A }
6
-
7
- a = A
8
- check { a.rubylog_deep_dereference.equal? a }
9
-
10
- a.rubylog_unify(4) do
11
- check { a.rubylog_deep_dereference == 4 }
12
- check { [1,a].rubylog_deep_dereference == [1,4] }
13
- check { a.divides(16).rubylog_deep_dereference == 4.divides(16) }
14
- end
15
-
16
- b = []
17
- check { not b.rubylog_deep_dereference.equal? b }
18
-
19
- c = Object.new
20
- check { c.rubylog_deep_dereference.equal? c }
21
- end
22
-
23
-
data/logic/dsl_logic.rb DELETED
@@ -1,29 +0,0 @@
1
- theory do
2
-
3
- # prefix functors
4
-
5
- prefix_functor :we_have
6
- we_have! :weapons
7
- we_have! :sunglasses
8
- we_have! :rustling_leather_coats
9
-
10
- check we_have :sunglasses
11
- check { we_have? :rustling_leather_coats }
12
-
13
-
14
- # built-in prefix functors
15
-
16
- check all X.is(4).and(Y.is(X)), Y.is(4)
17
- check any X.is(4)
18
- check one(X.in([1,2,3])) { X % 2 == 0 }
19
- check none X.in([1,2,3]), X.is(5)
20
-
21
- check { all?(X.is(4)) { X < 5 } }
22
-
23
- # variables
24
- check A.is(ANY).and{ A == nil }
25
- check A.is(4) .and{ A == 4 }
26
- check B.is(4) .and{ A.is_a? Rubylog::Variable }
27
- check B.is(ANY).and{ A.is_a? Rubylog::Variable }
28
-
29
- end
@@ -1,9 +0,0 @@
1
- theory do
2
- functor_for String, :happy, :has
3
-
4
- # syntax error
5
- check { begin "John".happy.if; rescue Rubylog::SyntaxError; true else false end }
6
- check { begin "John".happy.if!; rescue Rubylog::SyntaxError; true else false end }
7
- check { begin "John".happy.unless; rescue Rubylog::SyntaxError; true else false end }
8
-
9
- end
data/logic/guard_logic.rb DELETED
@@ -1,115 +0,0 @@
1
- theory do
2
-
3
- # class guard
4
- functor_for Numeric, :divides
5
- A[Integer].divides(B[Integer]).if { B % A == 0 }
6
- A[Float].divides!(B[Float])
7
- check 2.divides(10)
8
- check 2.divides(9).false
9
- check 2.divides(1).false
10
- check 2.divides(0)
11
- check 2.12.divides(4.5)
12
- check -0.31.divides(-1.5)
13
- check 0.3.divides(3).false
14
- check 2.0.divides(10).false
15
- check 2.divides(10.0).false
16
- check 2.divides(9.0).false
17
-
18
- # union of guards at compile
19
- functor_for Numeric, :small
20
- A[0...100].small.if ANY.is A[Integer]
21
- check 0.small
22
- check 10.small
23
- check -1.small.false
24
- check 0.0.small.false
25
- check 99.small
26
- check 99.0.small.false
27
- check 99.9.small.false
28
- check 100.small.false
29
- check 100.0.small.false
30
-
31
- # union of guards at compile (dont-care)
32
- functor_for Numeric, :small
33
- A[0...100].small.if A.is ANY[Integer]
34
- check 0.small
35
- check 10.small
36
- check -1.small.false
37
- check 0.0.small.false
38
- check 99.small
39
- check 99.0.small.false
40
- check 99.9.small.false
41
- check 100.small.false
42
- check 100.0.small.false
43
-
44
- # union of guards at unification
45
- self[[:small,1]].clear
46
- functor_for Numeric, :small
47
- A[0...100].small.if A.is B[Integer]
48
- check 0.small
49
- check 10.small
50
- check -1.small.false
51
- check 0.0.small.false
52
- check 99.small
53
- check 99.0.small.false
54
- check 99.9.small.false
55
- check 100.small.false
56
- check 100.0.small.false
57
-
58
- # union of guards at unification (reversed)
59
- self[[:small,1]].clear
60
- functor_for Numeric, :small
61
- A[0...100].small.if B[Integer].is A
62
- check 0.small
63
- check 10.small
64
- check -1.small.false
65
- check 0.0.small.false
66
- check 99.small
67
- check 99.0.small.false
68
- check 99.9.small.false
69
- check 100.small.false
70
- check 100.0.small.false
71
-
72
-
73
- # proc guards
74
- functor_for Numeric, :big
75
- A[proc{|a|a > 20}].big!
76
- check -100.big.false
77
- check 0.big.false
78
- check 10.big.false
79
- check 20.big.false
80
- check 21.big
81
- check 200.big
82
-
83
- # hash guards
84
- functor_for String, :char
85
- S[length: 1].char!
86
- check "a".char
87
- check " ".char
88
- check "".char.false
89
- check "af".char.false
90
- check "Hello".char.false
91
-
92
- # list hash guards
93
- functor_for String, :capitalized
94
- S[[:[],0] => /[A-Z]/].capitalized!
95
- check "a".capitalized.false
96
- check " ".capitalized.false
97
- check "".capitalized.false
98
- check "af".capitalized.false
99
- check "A".capitalized
100
- check "Hello".capitalized
101
-
102
-
103
- # chained hash guards
104
- functor_for String, :funny
105
- S[upcase: {[:[],1..-2] => "ELL"}].funny!
106
- check "hello".funny
107
- check "Bell!".funny
108
- check "BELL!".funny
109
- check "DELL".funny.false
110
- check "help!".funny.false
111
- check "hello!".funny.false
112
-
113
-
114
-
115
- end
data/logic/list_logic.rb DELETED
@@ -1,55 +0,0 @@
1
- theory do
2
- check [1,2,3].is [1,2,3]
3
- check {[1,2,3].is([A,B,C]).map{[A,B,C]} == [[1,2,3]]}
4
- check [].is []
5
-
6
- check [1,2,3].is_not [1,2,4]
7
- check [1,2,3].is_not [1,2]
8
- check [1,2,3].is_not [1,ANY]
9
- check [1,2,3].is [1,2,ANY]
10
-
11
- # splats
12
- check { [1,2,3].is([1,*A]).map{A} == [[2,3]] }
13
- check [].is_not [A,*ANY]
14
- check [].is [*ANY]
15
- check [2].is [2, *ANY]
16
- check [2, *ANY].is [2]
17
- check [1,2].is([A,*B]).and A.is(1).and B.is([2])
18
-
19
- # [*A] = [*B]
20
- check {[*A].is([*B]).and A.is([1,2]).map{B} == [[1,2]]}
21
- check [*A].is [*B]
22
- check { [*A].is([*B]).each { } } # no infinite recursion
23
-
24
-
25
- # append
26
- check {[1,2,3].is([*A,*B]).map{[A,B]} == [[[],[1,2,3]],[[1],[2,3]],[[1,2],[3]],[[1,2,3],[]]] }
27
- check [1,2,3].is [Rubylog::DSL::ArraySplat.new([1,2]),*ANY]
28
- check [1,2,3].is [Rubylog::DSL::ArraySplat.new([1,2,3]),*ANY]
29
- check [1,2,3].is_not [Rubylog::DSL::ArraySplat.new([1,2,3,B]),*ANY]
30
-
31
- # member
32
- check [1,2,3].is [*ANY,2,*ANY]
33
- check X.is([1,2,3]).and A.in(X).all X.is [*ANY,A,*ANY]
34
-
35
- # palindromes
36
- functor_for Array, :palindrome
37
- [].palindrome!
38
- [ANY].palindrome!
39
- [A,*X,A].palindrome.if X.palindrome
40
- check X.in([[], [1], [1,1], [1,2,1], [1,2,2,1], [1,2,3,2,1], [1,2,3,3,2,1]]).all X.palindrome
41
- check X.in([[1,2], [1,3,4,1], [2,2,5]]).none X.palindrome
42
-
43
- # legacy syntax
44
- check { [1,2,3].is([1]+A).map{A} == [[2,3]] }
45
- check [].is_not [A]+ANY
46
- check [].is []+ANY
47
- check [2].is [2]+ANY
48
- check(([2]+ANY).is [2])
49
- check [1,2].is([A]+B).and A.is(1).and B.is([2])
50
- check {([]+A).is([]+B).and A.is([1,2]).map{B} == [[1,2]]}
51
- check(([]+A).is([]+B))
52
- check {([]+A).is([]+B).each { } }
53
- check {[1,2,3].is([]+A+B).map{[A,B]} == [[[],[1,2,3]],[[1],[2,3]],[[1,2],[3]],[[1,2,3],[]]] }
54
- check X.is([1,2,3]).and A.in(X).all X.is []+ANY+[A]+ANY
55
- end
data/logic/map_logic.rb DELETED
@@ -1,15 +0,0 @@
1
- theory "Rubylog::MapLogic" do
2
- functor :likes
3
- subject Symbol
4
-
5
- # inriausite^findall
6
- check S.is{X.is(1).or(X.is(2)).map{X}}.and{S == [1,2]}
7
- check S.is{X.is(:john).map{X.likes(Y)}}.and{S == [:john.likes(Y)]}
8
- check G.is(:fail.or :fail).and L.is{G.map{X}}.and{L == []}
9
- check S.is{X.is(1).or(X.is(1)).map{X}}.and{S == [1,1]}
10
- check [1,2].is{X.is(2).or(X.is(1)).map{X}}.false
11
- check [X,Y].is{A.is(1).or(A.is(2)).map{A}}.and{X == 1}.and{Y == 2}
12
- (S.is {Goal.map{X}}).solve and check :fail rescue NoMethodError
13
- (S.is {4.map{X}}).solve and check :fail rescue NoMethodError
14
- end
15
-
data/logic/multitheory.rb DELETED
@@ -1,23 +0,0 @@
1
- load "lib/rubylog/theory.rb"
2
- A = theory do
3
- functor_for Symbol, :good
4
-
5
- :x.good!
6
- end
7
-
8
- B = theory do
9
- :y.good!
10
- end
11
-
12
- theory do
13
- multitheory [:good,1]
14
-
15
- check { self[[:good,1]].multitheory? }
16
-
17
- include A
18
- include B
19
-
20
- check { self[[:good,1]].multitheory? }
21
-
22
- check {X.good.map{X} == [:x,:y]}
23
- end
@@ -1,12 +0,0 @@
1
- theory do
2
- functor_for Integer, :factorial
3
- 0.factorial! 1
4
- N.factorial(K).if proc{N > 0}.and N1.is {N-1} .and N1.factorial(K1).and K.is{ N*K1 }
5
-
6
- check 0.factorial 1
7
- check 1.factorial 1
8
- check 2.factorial 2
9
- check 3.factorial 6
10
- check 4.factorial 24
11
- check 7.factorial 5040
12
- end
@@ -1,41 +0,0 @@
1
- theory do
2
- check "asdf".is "asdf"
3
- check { "abc#{S}def" =~ /abc.S\[\].def/ }
4
- check { "abc#{S[length: 1]}def" =~ /abc.S\[\d+\].def/ }
5
- check { "h#{S}o".is("hello").map{S} == ["ell"] }
6
- check { "#{Base}.#{Ext}".is("hello.rb").map{Base} == ["hello"] }
7
-
8
- check { "#{Base}.#{Ext}".is("hello.rb").map{Ext} == ["rb"] }
9
- check { "h#{S}o".is("auto").map{S} == [] }
10
-
11
- # backtracked matches
12
- check { "abc".is("#{A}#{B}").map{"#{A}:#{B}"} == [":abc","a:bc","ab:c","abc:"] }
13
- check { "www.google.com".is("#{A}.#{B}").map{[A,B]} == [["www", "google.com"],["www.google", "com"]] }
14
- check { "a".is("#{A}#{B}#{C}").map{"#{A}:#{B}:#{C}"} == ["::a",":a:","a::"] }
15
- check { "ab".is("#{A}#{B}#{C}").map{"#{A}:#{B}:#{C}"} == %w(::ab :a:b :ab: a::b a:b: ab::) }
16
-
17
- # guards
18
- check { "abc".is("#{A[/\A.\z/]}#{B}").map{"#{A}:#{B}"} == ["a:bc"] }
19
- check { "abc".is("#{A[length: 1]}#{B}").map{"#{A}:#{B}"} == ["a:bc"] }
20
-
21
-
22
- # palindromes
23
- functor_for String, :palindrome
24
-
25
- S[empty?: true].palindrome!
26
- S[length: 1].palindrome!
27
- S[lambda{|s|s.length > 1}].palindrome.if S.is("#{A[length: 1]}#{B}#{A}").and B.palindrome
28
-
29
- check "".palindrome
30
- check "dd".palindrome
31
- check "aba".palindrome
32
- check "faaf".palindrome
33
- check "ffaaff".palindrome
34
- check "rererer".palindrome
35
- check "lol".palindrome
36
- check "ji".palindrome.false
37
- check "doo".palindrome.false
38
- check "taaaz".palindrome.false
39
- check "faad".palindrome.false
40
- check "rerere".palindrome.false
41
- end
data/logic/thats_logic.rb DELETED
@@ -1,51 +0,0 @@
1
- require "./lib/rubylog/builtins/file_system"
2
-
3
- theory do
4
- functor_for Integer, :factorial
5
-
6
- # one level
7
- check 4.is(ANY[Integer,thats < 10])
8
- check 4.is(ANY[Integer,thats < 5])
9
- check 4.is(ANY[Integer,thats < 4]).false
10
- check 4.is(ANY[Integer,thats < 2]).false
11
-
12
- # question mark
13
- check "".is(ANY[thats.empty?])
14
- check "a".is(ANY[thats.empty?]).false
15
-
16
- # two levels
17
- check "hello".is(ANYTHING[thats.reverse == "olleh"])
18
- check "hello".is(ANYTHING[thats.reverse == "olle"]).false
19
-
20
- # four levels
21
- check "hello".is(ANY[thats.upcase.partition("E")[0] == "H"])
22
- check "hello".is(ANY[thats.upcase.partition("E")[1] == "E"])
23
- check "hello".is(ANY[thats.upcase.partition("E")[2] == "LLO"])
24
- check "hello".is(ANY[thats.upcase.partition("E")[1] == "H"]).false
25
- check "hello".is(ANY[thats.upcase.partition("E")[0] == "h"]).false
26
- check "hello".is(ANY[thats.upcase.partition("L")[0] == "H"]).false
27
- check "hello".is(ANY[thats.upcase.partition("e")[0] == "H"]).false
28
-
29
- # files
30
- check { "#{S[String, thats.start_with?(".")]}".filename_in(".").map{S}.include? ".gitignore" }
31
- check { not "#{S[String, thats.start_with?(".")]}".filename_in(".").map{S}.include? "lib" }
32
- check { "#{S[/\A(.*)\.rb/]}".filename_in("lib").map{S} == ["rubylog.rb"] }
33
-
34
- # factorial
35
- 0.factorial! 1
36
- K[thats > 0].factorial(N).if K0.is{K-1}.and K0.factorial(N0).and N.is{N0*K}
37
-
38
- # palindrome
39
- functor_for String, :palindrome
40
- S[String, thats.length <= 1].palindrome!
41
- "#{A[thats.length == 1]}#{B}#{A}".palindrome.if B.palindrome
42
-
43
- check "a".palindrome
44
- check "aa".palindrome
45
- check "aga".palindrome
46
- check "aaa".palindrome
47
- check "avava".palindrome
48
- check "ab".palindrome.false
49
- check "abb".palindrome.false
50
- check "abab".palindrome.false
51
- end
@@ -1,24 +0,0 @@
1
- theory do
2
- # dont-care variables case insensitive ANY* and _*
3
- check 3.is(ANY).and 3.is(ANY)
4
- check 3.is(ANY).and 4.is(ANY)
5
- check 3.is(ANYTHING).and 3.is(ANYTHING)
6
- check 3.is(ANYTHING).and 4.is(ANYTHING)
7
- check 3.is(Anything).and 3.is(Anything)
8
- check 3.is(Anything).and 4.is(Anything)
9
- check 3.is(Rubylog::Variable.new(:_var1)).and(3.is(Rubylog::Variable.new(:_var1)))
10
- check 3.is(Rubylog::Variable.new(:_var1)).and(4.is(Rubylog::Variable.new(:_var1)))
11
- check 3.is(Rubylog::Variable.new(:var1 )).and(3.is(Rubylog::Variable.new(:var1 )))
12
- check 3.is(Rubylog::Variable.new(:var1 )).and(4.is(Rubylog::Variable.new(:var1 ))).false
13
-
14
- # dont-care variables support recursion
15
- functor_for Integer, :factorial
16
- 0.factorial! 1
17
- N.factorial(K).if proc{N > 0}.and N1.is {N-1} .and N1.factorial(K1).and K.is{ N*K1 }.and K.is(ANY1).and N.is(ANY2)
18
- check 0.factorial 1
19
- check 1.factorial 1
20
- check 2.factorial 2
21
- check 3.factorial 6
22
- check 4.factorial 24
23
- check 7.factorial 5040
24
- end
@@ -1,86 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # These are the rubylog transcripts of prolog codes from Roman Barták's Prolog
3
- # guide: http://kti.mff.cuni.cz/~bartak/prolog/
4
-
5
- require 'rubylog'
6
-
7
-
8
- theory "Genealogy" do
9
- subject Symbol
10
- functor :man, :woman
11
-
12
- :adam.man!
13
- :peter.man!
14
- :paul.man!
15
-
16
- :marry.woman!
17
- :eve.woman!
18
- end
19
-
20
- __END__
21
- theory "Lists" do
22
- functor_for Object, :head_of
23
- functor_for Array, :tail_of
24
-
25
- H.head_of(A).if A.splits_to(H,ANY)
26
- T.tail_of(A).if A.splits_to(ANY,T)
27
-
28
- 2.should be_head_of [2,3,4]
29
- 2.should be_head_of [2]
30
- 2.should_not be_head_of [1]
31
- 2.should_not be_head_of []
32
-
33
- [3,4].should be_tail_of [2,3,4]
34
- []. should be_tail_of [1]
35
-
36
- Object.rubylog_functor :member_of
37
-
38
- M.member_of(A).if A.splits_to(M,ANY)
39
- M.member_of(A).if A.splits_to(ANY,T).and M.member_of(T)
40
-
41
- 0.should_not be_member_of [1,2,3]
42
- 1.should be_member_of [1,2,3]
43
- 2.should be_member_of [1,2,3]
44
- 3.should be_member_of [1,2,3]
45
- 4.should_not be_member_of [1,2,3]
46
-
47
- Object.rubylog_functor :first_of, :last_of
48
-
49
- F.first_of(A).if A.splits_to(F,ANY)
50
- L.last_of(A).if A.splits_to(L,[])
51
- L.last_of(A).if A.splits_to(H,T).and L.last_of(T)
52
-
53
- 1.should be_first_of [1,2,3]
54
- 3.should_not be_last_of []
55
- 3.should be_last_of [3]
56
- 3.should be_last_of [2,3]
57
- 3.should be_last_of [1,2,3]
58
- 1.should_not be_last_of [1,2,3]
59
-
60
- Array.rubylog_functor :prefix_of
61
-
62
- [].prefix_of! ANY_LIST
63
- A.prefix_of(B).if A.splits_to(H,TA).and B.splits_to(H,TB).and TA.prefix_of(TB)
64
-
65
- [1,2,3].should be_prefix_of [1,2,3]
66
- end
67
-
68
-
69
- describe "How does it work?" do
70
-
71
- specify "declarative character" do
72
- (1.in? [1,2,3]).should be_true
73
- (X.in [1,2,3]).to_a.should == [1,2,3]
74
- (1.in [X,Y]).to_a.should == [[1,nil], [nil,1]]
75
- lists = []
76
- (1.in L).each do |l|
77
- lists << l
78
- break if lists.size == 3
79
- end
80
- #lists.should == [[1], [nil,1], [nil,nil,1]]
81
- end
82
- end
83
-
84
- end
85
- end
86
-
@@ -1,99 +0,0 @@
1
-
2
- describe "all,any,one,none" do
3
- before do
4
- :john.likes! :water
5
- :john.likes! :beer
6
-
7
- :jane.likes! :water
8
- :jane.likes! :milk
9
- :jane.likes! :beer
10
-
11
- :jeff.likes! :water
12
- :jeff.likes! :absinth
13
-
14
- :todd.likes! :milk
15
-
16
- @predicates = [:all, :any, :one, :none]
17
- @names = :john, :jane, :jeff, :todd
18
- @good =
19
- [
20
- [[1,1,0,0], [0,1,0,0], [0,0,1,0], [0,1,0,1]], # all
21
- [[1,1,1,0], [1,1,1,1], [1,1,1,0], [0,1,0,1]], # any
22
- [[0,0,1,0], [0,0,1,1], [1,1,0,0], [0,1,0,1]], # one
23
- [[0,0,0,1], [0,0,0,0], [0,0,0,1], [1,0,1,0]] # none
24
- ]
25
- end
26
-
27
- it "work" do
28
- @predicates.map{|p| @names.map{|n| @names.map{|m|
29
- (n.likes(K).send p, m.likes(K)).true? ? 1 : 0
30
- }}}.should == @good
31
- end
32
-
33
- it "mimic well enumerators' predicates" do
34
- @predicates.map{|p| @names.map{|n| @names.map{|m|
35
- n.likes(K).to_a.send(:"#{p}?"){|x| m.likes?(x) } ? 1 : 0
36
- }}}.should == @good
37
- end
38
-
39
-
40
-
41
- it "all works" do
42
- (:john.likes(X).all(:john.likes(X))).should stand
43
- (:john.likes(X).all(:jane.likes(X))).should stand
44
- (:john.likes(X).all(:jeff.likes(X))).should_not stand
45
- (:john.likes(X).all(:todd.likes(X))).should_not stand
46
-
47
- (:jane.likes(X).all(:john.likes(X))).should_not stand
48
- (:jane.likes(X).all(:jane.likes(X))).should stand
49
- (:jane.likes(X).all(:jeff.likes(X))).should_not stand
50
- (:jane.likes(X).all(:todd.likes(X))).should_not stand
51
-
52
- (:jeff.likes(X).all(:john.likes(X))).should_not stand
53
- (:jeff.likes(X).all(:jane.likes(X))).should_not stand
54
- (:jeff.likes(X).all(:jeff.likes(X))).should stand
55
- (:jeff.likes(X).all(:todd.likes(X))).should_not stand
56
-
57
- (:todd.likes(X).all(:john.likes(X))).should_not stand
58
- (:todd.likes(X).all(:jane.likes(X))).should stand
59
- (:todd.likes(X).all(:jeff.likes(X))).should_not stand
60
- (:todd.likes(X).all(:todd.likes(X))).should stand
61
- end
62
-
63
- it "can be called with global functor syntax" do
64
- extend Rubylog::DSL::GlobalFunctors
65
- all(:john.likes(X), :jane.likes(X)).should stand
66
- all(:jane.likes(X), :john.likes(X)).should_not stand
67
- any(:jane.likes(X), :todd.likes(X)).should stand
68
- any(:john.likes(X), :todd.likes(X)).should_not stand
69
- end
70
-
71
- it "can be called unarily" do
72
- extend Rubylog::DSL::GlobalFunctors
73
- one(:john.likes(X)).should_not stand
74
- one(:jane.likes(X)).should_not stand
75
- one(:jeff.likes(X)).should_not stand
76
- one(:todd.likes(X)).should stand
77
- one(:jim.likes(X)).should_not stand
78
-
79
- any(:john.likes(X)).should stand
80
- any(:jane.likes(X)).should stand
81
- any(:jeff.likes(X)).should stand
82
- any(:todd.likes(X)).should stand
83
- any(:jim.likes(X)).should_not stand
84
-
85
- all(:john.likes(X)).should stand
86
- all(:jane.likes(X)).should stand
87
- all(:jeff.likes(X)).should stand
88
- all(:todd.likes(X)).should stand
89
- all(:jim.likes(X)).should stand
90
-
91
- none(:john.likes(X)).should_not stand
92
- none(:jane.likes(X)).should_not stand
93
- none(:jeff.likes(X)).should_not stand
94
- none(:todd.likes(X)).should_not stand
95
- none(:jim.likes(X)).should stand
96
- end
97
- end
98
-
99
- end
@@ -1,22 +0,0 @@
1
-
2
- describe "and" do
3
- it "works 1" do
4
- :john.happy.if :fail.and :true
5
- :john.should_not be_happy
6
- end
7
-
8
- it "works 2" do
9
- :john.happy.if :true.and :fail
10
- :john.should_not be_happy
11
- end
12
-
13
- it "works 3" do
14
- :john.happy.if :fail.and :fail
15
- :john.should_not be_happy
16
- end
17
-
18
- it "works 4" do
19
- :john.happy.if :true.and :true
20
- :john.should be_happy
21
- end
22
- end
@@ -1,16 +0,0 @@
1
-
2
- describe "Array" do
3
- it "can be unified" do
4
- result = false
5
- [A,B].rubylog_unify(12) { result = true }
6
- result.should == false
7
-
8
- result = false
9
- [A,B].rubylog_unify([12,13]) { result = true }
10
- result.should == true
11
-
12
- result = false
13
- [14,B].rubylog_unify([12,13]) { result = true }
14
- result.should == false
15
- end
16
- end