rubylog 0.0.1 → 1.0.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.
- data/Gemfile +1 -1
- data/README.hu.rb +58 -0
- data/README.rdoc +248 -89
- data/Rakefile +6 -1
- data/VERSION +1 -1
- data/bin/rubylog +18 -0
- data/examples/dcg.rb +35 -0
- data/examples/dcg2.rb +42 -0
- data/examples/enumerators.rb +30 -0
- data/examples/factorial.rb +9 -8
- data/examples/hanoi.rb +24 -0
- data/examples/hello.rb +11 -5
- data/examples/parsing.rb +27 -0
- data/examples/primitives.rb +24 -0
- data/examples/theory.rb +22 -10
- data/lib/rubylog/builtins/default.rb +10 -0
- data/lib/rubylog/builtins/file_system.rb +15 -0
- data/lib/rubylog/builtins/logic.rb +109 -0
- data/lib/rubylog/builtins/reflection.rb +94 -0
- data/lib/rubylog/builtins/term.rb +47 -0
- data/lib/rubylog/dsl/array_splat.rb +25 -0
- data/lib/rubylog/dsl/primitives.rb +17 -0
- data/lib/rubylog/dsl/thats.rb +22 -0
- data/lib/rubylog/dsl/variables.rb +30 -0
- data/lib/rubylog/dsl.rb +35 -17
- data/lib/rubylog/errors.rb +19 -1
- data/lib/rubylog/interfaces/assertable.rb +16 -0
- data/lib/rubylog/interfaces/callable.rb +18 -0
- data/lib/rubylog/interfaces/composite_term.rb +47 -0
- data/lib/rubylog/interfaces/predicate.rb +8 -0
- data/lib/rubylog/interfaces/procedure.rb +60 -0
- data/lib/rubylog/interfaces/term.rb +41 -0
- data/lib/rubylog/mixins/array.rb +118 -0
- data/lib/{class.rb → rubylog/mixins/class.rb} +2 -2
- data/lib/rubylog/mixins/hash.rb +8 -0
- data/lib/rubylog/mixins/kernel.rb +5 -0
- data/lib/rubylog/mixins/method.rb +3 -0
- data/lib/rubylog/mixins/object.rb +8 -0
- data/lib/rubylog/mixins/proc.rb +37 -0
- data/lib/rubylog/mixins/string.rb +104 -0
- data/lib/rubylog/mixins/symbol.rb +44 -0
- data/lib/rubylog/simple_procedure.rb +8 -0
- data/lib/rubylog/{clause.rb → structure.rb} +32 -31
- data/lib/rubylog/theory.rb +368 -79
- data/lib/rubylog/variable.rb +102 -23
- data/lib/rubylog.rb +33 -25
- data/logic/builtins/file_system_logic.rb +23 -0
- data/logic/builtins/reflection_logic.rb +40 -0
- data/logic/dereference_logic.rb +23 -0
- data/logic/directory_structure_logic.rb +19 -0
- data/logic/dsl_logic.rb +29 -0
- data/logic/errors_logic.rb +9 -0
- data/logic/guard_logic.rb +115 -0
- data/logic/list_logic.rb +55 -0
- data/logic/map_logic.rb +15 -0
- data/logic/multitheory.rb +23 -0
- data/logic/recursion_logic.rb +12 -0
- data/logic/string_logic.rb +41 -0
- data/logic/thats_logic.rb +51 -0
- data/logic/variable_logic.rb +24 -0
- data/rubylog.gemspec +85 -46
- data/spec/bartak_guide_spec.rb +57 -62
- data/spec/builtins/all_spec.rb +99 -0
- data/spec/builtins/and_spec.rb +22 -0
- data/spec/builtins/array_spec.rb +16 -0
- data/spec/builtins/branch_or_spec.rb +27 -0
- data/spec/builtins/cut_spec.rb +44 -0
- data/spec/builtins/fail_spec.rb +5 -0
- data/spec/builtins/false_spec.rb +5 -0
- data/spec/builtins/in_spec.rb +38 -0
- data/spec/builtins/is_false_spec.rb +12 -0
- data/spec/builtins/is_spec.rb +26 -0
- data/spec/builtins/matches_spec.rb +23 -0
- data/spec/builtins/or_spec.rb +22 -0
- data/spec/{rubylog/builtins → builtins}/splits_to.rb +0 -0
- data/spec/builtins/then_spec.rb +27 -0
- data/spec/builtins/true_spec.rb +5 -0
- data/spec/clause_spec.rb +82 -0
- data/spec/compilation_spec.rb +61 -0
- data/spec/custom_classes_spec.rb +43 -0
- data/spec/dereference.rb +10 -0
- data/spec/{inriasuite.rb → inriasuite_spec.rb} +2 -9
- data/spec/queries_spec.rb +150 -0
- data/spec/recursion_spec.rb +4 -4
- data/spec/ruby_code_spec.rb +52 -0
- data/spec/rules_spec.rb +97 -0
- data/spec/spec_helper.rb +6 -2
- data/spec/theory_spec.rb +28 -0
- data/spec/unification_spec.rb +84 -0
- data/spec/variable_spec.rb +26 -0
- metadata +153 -180
- data/examples/4queens.rb +0 -10
- data/examples/calculation.rb +0 -12
- data/examples/concepts.rb +0 -46
- data/examples/fp.rb +0 -56
- data/examples/historia_de_espana.rb +0 -31
- data/examples/idea.rb +0 -143
- data/examples/lists.rb +0 -5
- data/examples/mechanika.rb +0 -409
- data/examples/parse.rb +0 -15
- data/lib/array.rb +0 -24
- data/lib/method.rb +0 -4
- data/lib/object.rb +0 -5
- data/lib/proc.rb +0 -4
- data/lib/rubylog/builtins.rb +0 -193
- data/lib/rubylog/callable.rb +0 -20
- data/lib/rubylog/composite_term.rb +0 -38
- data/lib/rubylog/dsl/constants.rb +0 -15
- data/lib/rubylog/dsl/first_order_functors.rb +0 -9
- data/lib/rubylog/dsl/global_functors.rb +0 -3
- data/lib/rubylog/dsl/second_order_functors.rb +0 -8
- data/lib/rubylog/internal_helpers.rb +0 -16
- data/lib/rubylog/predicate.rb +0 -34
- data/lib/rubylog/proc_method_additions.rb +0 -69
- data/lib/rubylog/term.rb +0 -20
- data/lib/rubylog/unifiable.rb +0 -19
- data/lib/symbol.rb +0 -35
- data/script/inriasuite2spec +0 -0
- data/script/inriasuite2spec.pl +0 -22
- data/spec/rubylog/clause_spec.rb +0 -81
- data/spec/rubylog/variable_spec.rb +0 -25
- data/spec/rubylog_spec.rb +0 -914
data/rubylog.gemspec
CHANGED
@@ -4,16 +4,18 @@
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
8
|
-
s.version = "0.0
|
7
|
+
s.name = "rubylog"
|
8
|
+
s.version = "1.0.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = ["Bern\
|
12
|
-
s.date =
|
13
|
-
s.description =
|
14
|
-
s.email =
|
11
|
+
s.authors = ["Bern\u{e1}t Kall\u{f3}"]
|
12
|
+
s.date = "2013-02-27"
|
13
|
+
s.description = "Rubylog is an embedded Prolog language and interpreter for Ruby."
|
14
|
+
s.email = "kallo.bernat@gmail.com"
|
15
|
+
s.executables = ["rubylog"]
|
15
16
|
s.extra_rdoc_files = [
|
16
17
|
"LICENSE.txt",
|
18
|
+
"README.hu.rb",
|
17
19
|
"README.rdoc"
|
18
20
|
]
|
19
21
|
s.files = [
|
@@ -22,50 +24,86 @@ Gem::Specification.new do |s|
|
|
22
24
|
"Gemfile",
|
23
25
|
"Gemfile.lock",
|
24
26
|
"LICENSE.txt",
|
27
|
+
"README.hu.rb",
|
25
28
|
"README.rdoc",
|
26
29
|
"Rakefile",
|
27
30
|
"VERSION",
|
28
|
-
"
|
29
|
-
"examples/
|
30
|
-
"examples/
|
31
|
+
"bin/rubylog",
|
32
|
+
"examples/dcg.rb",
|
33
|
+
"examples/dcg2.rb",
|
34
|
+
"examples/enumerators.rb",
|
31
35
|
"examples/factorial.rb",
|
32
|
-
"examples/
|
36
|
+
"examples/hanoi.rb",
|
33
37
|
"examples/hello.rb",
|
34
|
-
"examples/
|
35
|
-
"examples/
|
36
|
-
"examples/lists.rb",
|
37
|
-
"examples/mechanika.rb",
|
38
|
-
"examples/parse.rb",
|
38
|
+
"examples/parsing.rb",
|
39
|
+
"examples/primitives.rb",
|
39
40
|
"examples/theory.rb",
|
40
|
-
"lib/array.rb",
|
41
|
-
"lib/class.rb",
|
42
|
-
"lib/method.rb",
|
43
|
-
"lib/object.rb",
|
44
|
-
"lib/proc.rb",
|
45
41
|
"lib/rubylog.rb",
|
46
|
-
"lib/rubylog/builtins.rb",
|
47
|
-
"lib/rubylog/
|
48
|
-
"lib/rubylog/
|
49
|
-
"lib/rubylog/
|
42
|
+
"lib/rubylog/builtins/default.rb",
|
43
|
+
"lib/rubylog/builtins/file_system.rb",
|
44
|
+
"lib/rubylog/builtins/logic.rb",
|
45
|
+
"lib/rubylog/builtins/reflection.rb",
|
46
|
+
"lib/rubylog/builtins/term.rb",
|
50
47
|
"lib/rubylog/dsl.rb",
|
51
|
-
"lib/rubylog/dsl/
|
52
|
-
"lib/rubylog/dsl/
|
53
|
-
"lib/rubylog/dsl/
|
54
|
-
"lib/rubylog/dsl/
|
48
|
+
"lib/rubylog/dsl/array_splat.rb",
|
49
|
+
"lib/rubylog/dsl/primitives.rb",
|
50
|
+
"lib/rubylog/dsl/thats.rb",
|
51
|
+
"lib/rubylog/dsl/variables.rb",
|
55
52
|
"lib/rubylog/errors.rb",
|
56
|
-
"lib/rubylog/
|
57
|
-
"lib/rubylog/
|
58
|
-
"lib/rubylog/
|
59
|
-
"lib/rubylog/
|
53
|
+
"lib/rubylog/interfaces/assertable.rb",
|
54
|
+
"lib/rubylog/interfaces/callable.rb",
|
55
|
+
"lib/rubylog/interfaces/composite_term.rb",
|
56
|
+
"lib/rubylog/interfaces/predicate.rb",
|
57
|
+
"lib/rubylog/interfaces/procedure.rb",
|
58
|
+
"lib/rubylog/interfaces/term.rb",
|
59
|
+
"lib/rubylog/mixins/array.rb",
|
60
|
+
"lib/rubylog/mixins/class.rb",
|
61
|
+
"lib/rubylog/mixins/hash.rb",
|
62
|
+
"lib/rubylog/mixins/kernel.rb",
|
63
|
+
"lib/rubylog/mixins/method.rb",
|
64
|
+
"lib/rubylog/mixins/object.rb",
|
65
|
+
"lib/rubylog/mixins/proc.rb",
|
66
|
+
"lib/rubylog/mixins/string.rb",
|
67
|
+
"lib/rubylog/mixins/symbol.rb",
|
68
|
+
"lib/rubylog/simple_procedure.rb",
|
69
|
+
"lib/rubylog/structure.rb",
|
60
70
|
"lib/rubylog/theory.rb",
|
61
|
-
"lib/rubylog/unifiable.rb",
|
62
71
|
"lib/rubylog/variable.rb",
|
63
|
-
"
|
72
|
+
"logic/builtins/file_system_logic.rb",
|
73
|
+
"logic/builtins/reflection_logic.rb",
|
74
|
+
"logic/dereference_logic.rb",
|
75
|
+
"logic/directory_structure_logic.rb",
|
76
|
+
"logic/dsl_logic.rb",
|
77
|
+
"logic/errors_logic.rb",
|
78
|
+
"logic/guard_logic.rb",
|
79
|
+
"logic/list_logic.rb",
|
80
|
+
"logic/map_logic.rb",
|
81
|
+
"logic/multitheory.rb",
|
82
|
+
"logic/recursion_logic.rb",
|
83
|
+
"logic/string_logic.rb",
|
84
|
+
"logic/thats_logic.rb",
|
85
|
+
"logic/variable_logic.rb",
|
64
86
|
"rubylog.gemspec",
|
65
|
-
"script/inriasuite2spec",
|
66
|
-
"script/inriasuite2spec.pl",
|
67
87
|
"spec/bartak_guide_spec.rb",
|
68
|
-
"spec/
|
88
|
+
"spec/builtins/all_spec.rb",
|
89
|
+
"spec/builtins/and_spec.rb",
|
90
|
+
"spec/builtins/array_spec.rb",
|
91
|
+
"spec/builtins/branch_or_spec.rb",
|
92
|
+
"spec/builtins/cut_spec.rb",
|
93
|
+
"spec/builtins/fail_spec.rb",
|
94
|
+
"spec/builtins/false_spec.rb",
|
95
|
+
"spec/builtins/in_spec.rb",
|
96
|
+
"spec/builtins/is_false_spec.rb",
|
97
|
+
"spec/builtins/is_spec.rb",
|
98
|
+
"spec/builtins/matches_spec.rb",
|
99
|
+
"spec/builtins/or_spec.rb",
|
100
|
+
"spec/builtins/splits_to.rb",
|
101
|
+
"spec/builtins/then_spec.rb",
|
102
|
+
"spec/builtins/true_spec.rb",
|
103
|
+
"spec/clause_spec.rb",
|
104
|
+
"spec/compilation_spec.rb",
|
105
|
+
"spec/custom_classes_spec.rb",
|
106
|
+
"spec/dereference.rb",
|
69
107
|
"spec/inriasuite/README",
|
70
108
|
"spec/inriasuite/abolish",
|
71
109
|
"spec/inriasuite/and",
|
@@ -133,22 +171,23 @@ Gem::Specification.new do |s|
|
|
133
171
|
"spec/inriasuite/term_lt=",
|
134
172
|
"spec/inriasuite/true",
|
135
173
|
"spec/inriasuite/unify",
|
174
|
+
"spec/inriasuite_spec.rb",
|
175
|
+
"spec/queries_spec.rb",
|
136
176
|
"spec/recursion_spec.rb",
|
137
|
-
"spec/
|
138
|
-
"spec/
|
139
|
-
"spec/rubylog/variable_spec.rb",
|
140
|
-
"spec/rubylog_spec.rb",
|
177
|
+
"spec/ruby_code_spec.rb",
|
178
|
+
"spec/rules_spec.rb",
|
141
179
|
"spec/spec_helper.rb",
|
142
|
-
"spec/theory_spec.rb"
|
180
|
+
"spec/theory_spec.rb",
|
181
|
+
"spec/unification_spec.rb",
|
182
|
+
"spec/variable_spec.rb"
|
143
183
|
]
|
144
|
-
s.homepage =
|
184
|
+
s.homepage = "https://github.com/cie/rubylog"
|
145
185
|
s.licenses = ["MIT"]
|
146
186
|
s.require_paths = ["lib"]
|
147
|
-
s.rubygems_version =
|
148
|
-
s.summary =
|
187
|
+
s.rubygems_version = "1.8.15"
|
188
|
+
s.summary = "An embedded Prolog interpreter"
|
149
189
|
|
150
190
|
if s.respond_to? :specification_version then
|
151
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
152
191
|
s.specification_version = 3
|
153
192
|
|
154
193
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
data/spec/bartak_guide_spec.rb
CHANGED
@@ -4,88 +4,83 @@
|
|
4
4
|
|
5
5
|
require 'rubylog'
|
6
6
|
|
7
|
-
class << Rubylog.theory
|
8
|
-
describe Rubylog do
|
9
|
-
before do
|
10
|
-
Rubylog.theory.clear
|
11
|
-
end
|
12
|
-
|
13
|
-
specify "Genealogy database" do
|
14
|
-
Symbol.rubylog_functor :man, :woman
|
15
|
-
|
16
|
-
:adam.man!
|
17
|
-
:peter.man!
|
18
|
-
:paul.man!
|
19
7
|
|
20
|
-
|
21
|
-
|
8
|
+
theory "Genealogy" do
|
9
|
+
subject Symbol
|
10
|
+
functor :man, :woman
|
22
11
|
|
23
|
-
|
12
|
+
:adam.man!
|
13
|
+
:peter.man!
|
14
|
+
:paul.man!
|
24
15
|
|
16
|
+
:marry.woman!
|
17
|
+
:eve.woman!
|
18
|
+
end
|
25
19
|
|
26
|
-
|
27
|
-
|
28
|
-
|
20
|
+
__END__
|
21
|
+
theory "Lists" do
|
22
|
+
functor_for Object, :head_of
|
23
|
+
functor_for Array, :tail_of
|
29
24
|
|
30
|
-
|
31
|
-
|
25
|
+
H.head_of(A).if A.splits_to(H,ANY)
|
26
|
+
T.tail_of(A).if A.splits_to(ANY,T)
|
32
27
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
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 []
|
37
32
|
|
38
|
-
|
39
|
-
|
33
|
+
[3,4].should be_tail_of [2,3,4]
|
34
|
+
[]. should be_tail_of [1]
|
40
35
|
|
41
|
-
|
36
|
+
Object.rubylog_functor :member_of
|
42
37
|
|
43
|
-
|
44
|
-
|
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)
|
45
40
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
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]
|
51
46
|
|
52
|
-
|
47
|
+
Object.rubylog_functor :first_of, :last_of
|
53
48
|
|
54
|
-
|
55
|
-
|
56
|
-
|
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)
|
57
52
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
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]
|
64
59
|
|
65
|
-
|
60
|
+
Array.rubylog_functor :prefix_of
|
66
61
|
|
67
|
-
|
68
|
-
|
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)
|
69
64
|
|
70
|
-
|
71
|
-
|
65
|
+
[1,2,3].should be_prefix_of [1,2,3]
|
66
|
+
end
|
72
67
|
|
73
68
|
|
74
|
-
|
69
|
+
describe "How does it work?" do
|
75
70
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
end
|
85
|
-
#lists.should == [[1], [nil,1], [nil,nil,1]]
|
86
|
-
end
|
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
|
87
79
|
end
|
88
|
-
|
80
|
+
#lists.should == [[1], [nil,1], [nil,nil,1]]
|
89
81
|
end
|
90
82
|
end
|
91
83
|
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
@@ -0,0 +1,99 @@
|
|
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
|
@@ -0,0 +1,22 @@
|
|
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
|
@@ -0,0 +1,16 @@
|
|
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
|
@@ -0,0 +1,27 @@
|
|
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
|
@@ -0,0 +1,44 @@
|
|
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
|
@@ -0,0 +1,38 @@
|
|
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
|
@@ -0,0 +1,26 @@
|
|
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
|
@@ -0,0 +1,23 @@
|
|
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
|
@@ -0,0 +1,22 @@
|
|
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
|
File without changes
|