rubylog 0.0.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|