rubylog 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.rspec +1 -0
- data/Gemfile +18 -0
- data/Gemfile.lock +64 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +96 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/examples/4queens.rb +10 -0
- data/examples/calculation.rb +12 -0
- data/examples/concepts.rb +46 -0
- data/examples/factorial.rb +16 -0
- data/examples/fp.rb +56 -0
- data/examples/hello.rb +9 -0
- data/examples/historia_de_espana.rb +31 -0
- data/examples/idea.rb +143 -0
- data/examples/lists.rb +5 -0
- data/examples/mechanika.rb +409 -0
- data/examples/parse.rb +15 -0
- data/examples/theory.rb +20 -0
- data/lib/array.rb +24 -0
- data/lib/class.rb +11 -0
- data/lib/method.rb +4 -0
- data/lib/object.rb +5 -0
- data/lib/proc.rb +4 -0
- data/lib/rubylog/builtins.rb +193 -0
- data/lib/rubylog/callable.rb +20 -0
- data/lib/rubylog/clause.rb +113 -0
- data/lib/rubylog/composite_term.rb +38 -0
- data/lib/rubylog/dsl/constants.rb +15 -0
- data/lib/rubylog/dsl/first_order_functors.rb +9 -0
- data/lib/rubylog/dsl/global_functors.rb +3 -0
- data/lib/rubylog/dsl/second_order_functors.rb +8 -0
- data/lib/rubylog/dsl.rb +52 -0
- data/lib/rubylog/errors.rb +18 -0
- data/lib/rubylog/internal_helpers.rb +16 -0
- data/lib/rubylog/predicate.rb +34 -0
- data/lib/rubylog/proc_method_additions.rb +69 -0
- data/lib/rubylog/term.rb +20 -0
- data/lib/rubylog/theory.rb +133 -0
- data/lib/rubylog/unifiable.rb +19 -0
- data/lib/rubylog/variable.rb +97 -0
- data/lib/rubylog.rb +39 -0
- data/lib/symbol.rb +35 -0
- data/rubylog.gemspec +187 -0
- data/script/inriasuite2spec +0 -0
- data/script/inriasuite2spec.pl +22 -0
- data/spec/bartak_guide_spec.rb +91 -0
- data/spec/inriasuite/README +122 -0
- data/spec/inriasuite/abolish +18 -0
- data/spec/inriasuite/and +9 -0
- data/spec/inriasuite/arg +32 -0
- data/spec/inriasuite/arith_diff +10 -0
- data/spec/inriasuite/arith_eq +10 -0
- data/spec/inriasuite/arith_gt +10 -0
- data/spec/inriasuite/arith_gt= +10 -0
- data/spec/inriasuite/arith_lt +10 -0
- data/spec/inriasuite/arith_lt= +10 -0
- data/spec/inriasuite/asserta +18 -0
- data/spec/inriasuite/assertz +16 -0
- data/spec/inriasuite/atom +12 -0
- data/spec/inriasuite/atom_chars +19 -0
- data/spec/inriasuite/atom_codes +15 -0
- data/spec/inriasuite/atom_concat +19 -0
- data/spec/inriasuite/atom_length +12 -0
- data/spec/inriasuite/atomic +11 -0
- data/spec/inriasuite/bagof +31 -0
- data/spec/inriasuite/call +19 -0
- data/spec/inriasuite/catch-and-throw +16 -0
- data/spec/inriasuite/char_code +13 -0
- data/spec/inriasuite/clause +16 -0
- data/spec/inriasuite/compound +12 -0
- data/spec/inriasuite/copy_term +25 -0
- data/spec/inriasuite/current_input +5 -0
- data/spec/inriasuite/current_output +5 -0
- data/spec/inriasuite/current_predicate +16 -0
- data/spec/inriasuite/current_prolog_flag +12 -0
- data/spec/inriasuite/cut +9 -0
- data/spec/inriasuite/fail +15 -0
- data/spec/inriasuite/file_manip +8 -0
- data/spec/inriasuite/findall +22 -0
- data/spec/inriasuite/float +10 -0
- data/spec/inriasuite/functor +41 -0
- data/spec/inriasuite/functor-bis +41 -0
- data/spec/inriasuite/halt +7 -0
- data/spec/inriasuite/if-then +10 -0
- data/spec/inriasuite/if-then-else +12 -0
- data/spec/inriasuite/inriasuite.obp +0 -0
- data/spec/inriasuite/inriasuite.pl +836 -0
- data/spec/inriasuite/integer +10 -0
- data/spec/inriasuite/is +11 -0
- data/spec/inriasuite/junk +0 -0
- data/spec/inriasuite/nonvar +11 -0
- data/spec/inriasuite/not_provable +12 -0
- data/spec/inriasuite/not_unify +15 -0
- data/spec/inriasuite/number +10 -0
- data/spec/inriasuite/number_chars +22 -0
- data/spec/inriasuite/number_codes +19 -0
- data/spec/inriasuite/once +11 -0
- data/spec/inriasuite/or +9 -0
- data/spec/inriasuite/repeat +5 -0
- data/spec/inriasuite/retract +10 -0
- data/spec/inriasuite/set_prolog_flag +21 -0
- data/spec/inriasuite/setof +36 -0
- data/spec/inriasuite/sub_atom +30 -0
- data/spec/inriasuite/t +1 -0
- data/spec/inriasuite/t_foo.pl +4 -0
- data/spec/inriasuite/term_diff +13 -0
- data/spec/inriasuite/term_eq +12 -0
- data/spec/inriasuite/term_gt +12 -0
- data/spec/inriasuite/term_gt= +12 -0
- data/spec/inriasuite/term_lt +12 -0
- data/spec/inriasuite/term_lt= +12 -0
- data/spec/inriasuite/true +7 -0
- data/spec/inriasuite/unify +18 -0
- data/spec/inriasuite.rb +20 -0
- data/spec/recursion_spec.rb +18 -0
- data/spec/rubylog/builtins/splits_to.rb +18 -0
- data/spec/rubylog/clause_spec.rb +81 -0
- data/spec/rubylog/variable_spec.rb +25 -0
- data/spec/rubylog_spec.rb +914 -0
- data/spec/spec_helper.rb +12 -0
- data/spec/theory_spec.rb +1 -0
- metadata +339 -0
data/spec/inriasuite/is
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
/* file is */
|
2
|
+
|
3
|
+
['is'(Result,3 + 11.0),[[Result <-- 14.0]]].
|
4
|
+
[(X = 1 + 2, 'is'(Y, X * 3)),[[X <-- (1 + 2), Y <-- 9]]]. % error? 1+2
|
5
|
+
['is'(foo,77), failure]. % error? foo
|
6
|
+
['is'(77, N), instantiation_error].
|
7
|
+
['is'(77, foo), type_error(evaluable, foo/0)].
|
8
|
+
|
9
|
+
['is'(X,float(3)),[[X <-- 3.0]]].
|
10
|
+
|
11
|
+
/* end of is */
|
File without changes
|
@@ -0,0 +1,12 @@
|
|
1
|
+
/* file \+ */
|
2
|
+
|
3
|
+
[\+(true), failure].
|
4
|
+
[\+(!), failure].
|
5
|
+
[\+((!,fail)), success].
|
6
|
+
[((X=1;X=2), \+((!,fail))), [[X <-- 1],[X <-- 2]]].
|
7
|
+
[\+(4 = 5), success].
|
8
|
+
[\+(3), type_error(callable, 3)].
|
9
|
+
[\+(X), instantiation_error]. % Culprit X
|
10
|
+
|
11
|
+
/* end of \+ */
|
12
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
/* file \= */
|
2
|
+
|
3
|
+
['\\='(1,1), failure].
|
4
|
+
['\\='(X,1), failure].
|
5
|
+
['\\='(X,Y), failure].
|
6
|
+
[('\\='(X,Y),'\\='(X,abc)), failure].
|
7
|
+
['\\='(f(X,def),f(def,Y)), failure].
|
8
|
+
['\\='(1,2), success].
|
9
|
+
['\\='(1,1.0), success].
|
10
|
+
['\\='(g(X),f(f(X))), success].
|
11
|
+
['\\='(f(X,1),f(a(X))), success].
|
12
|
+
['\\='(f(X,Y,X),f(a(X),a(Y),Y,2)), success].
|
13
|
+
|
14
|
+
/* end of \= */
|
15
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
/* file number_chars */
|
2
|
+
/* Some goals fails because the parser is not yet implemented */
|
3
|
+
|
4
|
+
[number_chars(33,L), [[L <-- ['3','3']]]].
|
5
|
+
[number_chars(33,['3','3']), success].
|
6
|
+
[number_chars(33.0,L), [[L <-- ['3','3','.','0']]]].
|
7
|
+
[number_chars(X,['3','.','3','E','+','0']), [[X <-- 3.3]]].
|
8
|
+
[number_chars(3.3,['3','.','3','E','+','0']), success].
|
9
|
+
[number_chars(A,['-','2','5']), [[A <-- (-25)]]].
|
10
|
+
[number_chars(A,['\n',' ','3']), [[A <-- 3]]].
|
11
|
+
[number_chars(A,['3',' ']), syntax_error(_)].
|
12
|
+
[number_chars(A,['0',x,f]), [[A <-- 15]]].
|
13
|
+
[number_chars(A,['0','''','A']), [[A <-- 65]]].
|
14
|
+
[number_chars(A,['4','.','2']), [[A <-- 4.2]]].
|
15
|
+
[number_chars(A,['4','2','.','0','e','-','1']), [[A <-- 4.2]]].
|
16
|
+
|
17
|
+
[number_chars(A,L), instantiation_error].
|
18
|
+
[number_chars(a,L), type_error(number, a)].
|
19
|
+
[number_chars(A,4), type_error(list, 4)].
|
20
|
+
[number_chars(A,['4',2]), type_error(character, 2)].
|
21
|
+
|
22
|
+
/* end of file number_chars */
|
@@ -0,0 +1,19 @@
|
|
1
|
+
/* file number_codes */
|
2
|
+
/* Some goals fails because the parser is not yet implemented */
|
3
|
+
|
4
|
+
[number_codes(33,L), [[L <-- [0'3,0'3]]]].
|
5
|
+
[number_codes(33,[0'3,0'3]), success].
|
6
|
+
[number_codes(33.0,L), [[L <-- [51,51,46,48]]]].
|
7
|
+
[number_codes(33.0,[0'3,0'.,0'3,0'E,0'+,0'0,0'1]), success].
|
8
|
+
[number_codes(A,[0'-,0'2,0'5]), [[A <-- (-25)]]].
|
9
|
+
[number_codes(A,[0' ,0'3]), [[A <-- 3]]].
|
10
|
+
[number_codes(A,[0'0,0'x,0'f]), [[A <-- 15]]].
|
11
|
+
[number_codes(A,[0'0,39,0'a]), [[A <-- 97]]].
|
12
|
+
[number_codes(A,[0'4,0'.,0'2]), [[A <-- 4.2]]].
|
13
|
+
[number_codes(A,[0'4,0'2,0'.,0'0,0'e,0'-,0'1]), [[A <-- 4.2]]].
|
14
|
+
|
15
|
+
[number_codes(A,L), instantiation_error].
|
16
|
+
[number_codes(a,L), type_error(number,a)].
|
17
|
+
[number_codes(A,4), type_error(list,4)].
|
18
|
+
[number_codes(A,[ 0'1, 0'2, 1000]), representation_error(character_code)]. % 1000 not a code
|
19
|
+
/* end of file number_codes */
|
data/spec/inriasuite/or
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
/* file current_prolog_flag */
|
2
|
+
|
3
|
+
[(set_prolog_flag(unknown, fail),
|
4
|
+
current_prolog_flag(unknown, V)), [[V <-- fail]]].
|
5
|
+
[set_prolog_flag(X, warning), instantiation_error].
|
6
|
+
[set_prolog_flag(5, decimals), type_error(atom,5)].
|
7
|
+
[set_prolog_flag(date, 'July 1999'), domain_error(prolog_flag,date)].
|
8
|
+
[set_prolog_flag(debug, no), domain_error(flag_value,debug+no)].
|
9
|
+
[set_prolog_flag(max_arity, 40), permission_error(modify, flag, max_arity)].
|
10
|
+
/* swindles to get tests of double quotes flag to work. */
|
11
|
+
|
12
|
+
[set_prolog_flag(double_quotes, atom), success].
|
13
|
+
[X = "fred", [[X <-- fred]]].
|
14
|
+
|
15
|
+
[set_prolog_flag(double_quotes, codes), success].
|
16
|
+
[X = "fred", [[X <-- [102,114,101,100]]]].
|
17
|
+
|
18
|
+
[set_prolog_flag(double_quotes, chars), success].
|
19
|
+
[X = "fred", [[X <-- [f,r,e,d]]]].
|
20
|
+
|
21
|
+
/* end of current_prolog_flag */
|
@@ -0,0 +1,36 @@
|
|
1
|
+
/* file of setof */
|
2
|
+
|
3
|
+
[setof(X,(X=1;X=2),L), [[L <-- [1, 2]]]].
|
4
|
+
|
5
|
+
[setof(X,(X=1;X=2),X), [[X <-- [1, 2]]]].
|
6
|
+
|
7
|
+
[setof(X,(X=2;X=1),L), [[L <-- [1, 2]]]].
|
8
|
+
|
9
|
+
[setof(X,(X=2;X=2),L), [[L <-- [2]]]].
|
10
|
+
|
11
|
+
|
12
|
+
[setof(X,fail,L), failure].
|
13
|
+
|
14
|
+
[setof(1,(Y=2;Y=1),L), [[L <-- [1], Y <-- 1], [L <-- [1], Y <-- 2]]].
|
15
|
+
|
16
|
+
[setof(f(X,Y),(X=a;Y=b),L), [[L <-- [f(_, b), f(a, _)]]]].
|
17
|
+
|
18
|
+
[setof(X,Y^((X=1,Y=1);(X=2,Y=2)),S), [[S <-- [1, 2]]]].
|
19
|
+
|
20
|
+
[setof(X,Y^((X=1;Y=1);(X=2,Y=2)),S), [[S <-- [_, 1, 2]]]].
|
21
|
+
|
22
|
+
[(set_prolog_flag(unknown, warning),
|
23
|
+
setof(X,(Y^(X=1;Y=1);X=3),S)), [[S <-- [3]]]].
|
24
|
+
[(set_prolog_flag(unknown, warning),
|
25
|
+
setof(X,Y^(X=1;Y=1;X=3),S)), [[S <-- [_, 1,3]]]].
|
26
|
+
|
27
|
+
[setof(X,(X=Y;X=Z;Y=1),L), [[L <-- [Y, Z]], [L <-- [_], Y <-- 1]]].
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
|
32
|
+
[setof(X, X^(true; 4),L), type_error(callable,(true;4))].
|
33
|
+
|
34
|
+
[setof(X,1,L), type_error(callable,1)].
|
35
|
+
|
36
|
+
/* end of setof */
|
@@ -0,0 +1,30 @@
|
|
1
|
+
/* file sub_atom */
|
2
|
+
|
3
|
+
[sub_atom(abracadabra, 0, 5, _, S2), [[S2 <-- 'abrac']]].
|
4
|
+
[sub_atom(abracadabra, _, 5, 0, S2), [[S2 <-- 'dabra']]].
|
5
|
+
[sub_atom(abracadabra, 3, Length, 3, S2), [[Length <-- 5, S2 <-- 'acada']]].
|
6
|
+
[sub_atom(abracadabra, Before, 2, After, ab),
|
7
|
+
[[Before <-- 0, After <-- 9],
|
8
|
+
[Before <-- 7, After <-- 2]]].
|
9
|
+
[sub_atom('Banana', 3, 2, _, S2), [[S2 <-- 'an']]].
|
10
|
+
[sub_atom('charity', _, 3, _, S2), [[S2 <-- 'cha'],
|
11
|
+
[S2 <-- 'har'],
|
12
|
+
[S2 <-- 'ari'],
|
13
|
+
[S2 <-- 'rit'],
|
14
|
+
[S2 <-- 'ity']]].
|
15
|
+
[sub_atom('ab', Before, Length, After, Sub_atom),
|
16
|
+
[[Before <-- 1, Length <-- 0, Sub_atom <-- ''],
|
17
|
+
[Before <-- 1, Length <-- 1, Sub_atom <-- 'a'],
|
18
|
+
[Before <-- 1, Length <-- 2, Sub_atom <-- 'ab'],
|
19
|
+
[Before <-- 2, Length <-- 0, Sub_atom <-- ''],
|
20
|
+
[Before <-- 2, Length <-- 1, Sub_atom <-- 'b'],
|
21
|
+
[Before <-- 3, Length <-- 0, Sub_atom <-- '']]].
|
22
|
+
|
23
|
+
[sub_atom(Banana, 3, 2, _, S2), instantiation_error].
|
24
|
+
[sub_atom(f(a), 2, 2, _, S2), type_error(atom,f(a))].
|
25
|
+
[sub_atom('Banana', 4, 2, _, 2), type_error(atom,2)].
|
26
|
+
[sub_atom('Banana', a, 2, _, S2), type_error(integer,a)].
|
27
|
+
[sub_atom('Banana', 4, n, _, S2), type_error(integer,n)].
|
28
|
+
[sub_atom('Banana', 4, _, m, S2), type_error(integer,m)].
|
29
|
+
|
30
|
+
/* end of sub_atom */
|
data/spec/inriasuite/t
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
[bagof([X,Y], t_foo(X,Y), S) , t_foo, success].
|
@@ -0,0 +1,13 @@
|
|
1
|
+
/* file \== */
|
2
|
+
|
3
|
+
['\\=='(1,1), failure].
|
4
|
+
['\\=='(X,X), failure].
|
5
|
+
['\\=='(1,2), success].
|
6
|
+
['\\=='(X,1), success].
|
7
|
+
['\\=='(X,Y), success].
|
8
|
+
['\\=='(_,_), success].
|
9
|
+
['\\=='(X,a(X)), success].
|
10
|
+
['\\=='(f(a),f(a)), failure].
|
11
|
+
|
12
|
+
/* end of \== */
|
13
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
/* file @> */
|
2
|
+
|
3
|
+
['@>'(1.0,1), failure].
|
4
|
+
['@>'(aardvark,zebra), failure].
|
5
|
+
['@>'(short,short), failure].
|
6
|
+
['@>'(short,shorter), failure].
|
7
|
+
['@>'(foo(b),foo(a)), success].
|
8
|
+
['@>'(X,X), failure].
|
9
|
+
['@>'(foo(a,X),foo(b,Y)), failure].
|
10
|
+
|
11
|
+
/* end of @> */
|
12
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
/* file @>= */
|
2
|
+
|
3
|
+
['@>='(1.0,1), failure].
|
4
|
+
['@>='(aardvark,zebra), failure].
|
5
|
+
['@>='(short,short), success].
|
6
|
+
['@>='(short,shorter), failure].
|
7
|
+
['@>='(foo(b),foo(a)), success].
|
8
|
+
['@>='(X,X), success].
|
9
|
+
['@>='(foo(a,X),foo(b,Y)), failure].
|
10
|
+
|
11
|
+
/* end of @>= */
|
12
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
/* file @< */
|
2
|
+
|
3
|
+
['@<'(1.0,1), success].
|
4
|
+
['@<'(aardvark,zebra), success].
|
5
|
+
['@<'(short,short), failure].
|
6
|
+
['@<'(short,shorter), success].
|
7
|
+
['@<'(foo(b),foo(a)), failure].
|
8
|
+
['@<'(X,X), failure].
|
9
|
+
['@<'(foo(a,X),foo(b,Y)), success].
|
10
|
+
|
11
|
+
/* end of @< */
|
12
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
/* file @=< */
|
2
|
+
|
3
|
+
['@=<'(1.0,1), success].
|
4
|
+
['@=<'(aardvark,zebra), success].
|
5
|
+
['@=<'(short,short), success].
|
6
|
+
['@=<'(short,shorter), success].
|
7
|
+
['@=<'(foo(b),foo(a)), failure].
|
8
|
+
['@=<'(X,X), success].
|
9
|
+
['@=<'(foo(a,X),foo(b,Y)), success].
|
10
|
+
|
11
|
+
/* end of @=< */
|
12
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
/* file = */
|
2
|
+
['='(1,1), success].
|
3
|
+
['='(X,1),[[X <-- 1]]].
|
4
|
+
['='(X,Y),[[Y <-- X]]].
|
5
|
+
[('='(X,Y),'='(X,abc)),[[X <-- abc, Y <-- abc]]].
|
6
|
+
['='(f(X,def),f(def,Y)), [[X <-- def, Y <-- def]]].
|
7
|
+
['='(1,2), failure].
|
8
|
+
['='(1,1.0), failure].
|
9
|
+
['='(g(X),f(f(X))), failure].
|
10
|
+
['='(f(X,1),f(a(X))), failure].
|
11
|
+
['='(f(X,Y,X),f(a(X),a(Y),Y,2)), failure].
|
12
|
+
['='(f(A,B,C),f(g(B,B),g(C,C),g(D,D))),
|
13
|
+
[[A <-- g(g(g(D,D),g(D,D)),g(g(D,D),g(D,D))),
|
14
|
+
B <-- g(g(D,D),g(D,D)),
|
15
|
+
C <-- g(D,D)]]].
|
16
|
+
|
17
|
+
/* end of = */
|
18
|
+
|
data/spec/inriasuite.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
describe "abolish" do
|
2
|
+
|
3
|
+
end
|
4
|
+
|
5
|
+
describe "and" do
|
6
|
+
it {
|
7
|
+
(X.is(1).and X.var).to_a.should == []
|
8
|
+
(X.var.and X.is(1)).to_a.should == [1]
|
9
|
+
(:fail.and :call[3]).to_a.should == []
|
10
|
+
lambda { (:nofoo[X].and X.call).to_a }.
|
11
|
+
should raise_error ExistenceError
|
12
|
+
(X.is(:true).and X.call).should == [:true]
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
describe "arg" do
|
18
|
+
|
19
|
+
end
|
20
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
|
2
|
+
require 'rubylog'
|
3
|
+
|
4
|
+
class << Rubylog.theory
|
5
|
+
describe "recursion" do
|
6
|
+
specify "factorial" do
|
7
|
+
Integer.rubylog_functor :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
|
@@ -0,0 +1,18 @@
|
|
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
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'rubylog'
|
2
|
+
|
3
|
+
class << Rubylog.theory
|
4
|
+
describe "clauses" do
|
5
|
+
it "can be created" do
|
6
|
+
(:john.is_happy).should be_kind_of Rubylog::Term
|
7
|
+
(:john.likes :beer).should be_kind_of Rubylog::Term
|
8
|
+
(A.likes :beer).should be_kind_of Rubylog::Term
|
9
|
+
(:john.likes Drink).should be_kind_of Rubylog::Term
|
10
|
+
(:john.likes :drinking.in :bar).should be_kind_of Rubylog::Term
|
11
|
+
end
|
12
|
+
it "forbids non-declared names" do
|
13
|
+
lambda { :john.something_else }.should raise_error(NoMethodError)
|
14
|
+
end
|
15
|
+
it "also work with operators" do
|
16
|
+
(:is_happy%1).should be_kind_of Rubylog::Term
|
17
|
+
(A%B).should be_kind_of Rubylog::Term
|
18
|
+
end
|
19
|
+
it "can be asked for their functor" do
|
20
|
+
(:john.is_happy).functor.should == :is_happy
|
21
|
+
(:is_happy%1).functor.should == :%
|
22
|
+
(A%1).functor.should == :%
|
23
|
+
(:john.likes :drinking.in :bar).functor.should == :likes
|
24
|
+
end
|
25
|
+
it "can be indexed" do
|
26
|
+
(:john.is_happy)[0].should == :john
|
27
|
+
(:john.likes :beer)[0].should == :john
|
28
|
+
(:john.likes :beer)[1].should == :beer
|
29
|
+
(:john.likes(:cold, :beer))[2].should == :beer
|
30
|
+
(:john.likes(:cold, :beer))[1..2].should == [:cold,:beer]
|
31
|
+
(:john.likes :drinking.in :bar)[1].should == (:drinking.in :bar)
|
32
|
+
end
|
33
|
+
it "can be asked for their args" do
|
34
|
+
(:john.is_happy).args.should == [:john]
|
35
|
+
(:john.likes :beer).args.should == [:john, :beer]
|
36
|
+
(:john.likes(:cold, :beer)).args.should == [:john, :cold, :beer]
|
37
|
+
(:john.likes :drinking.in :bar).args.should == [:john, :drinking.in(:bar)]
|
38
|
+
end
|
39
|
+
it "support ==" do
|
40
|
+
(:john.is_happy).should == (:john.is_happy)
|
41
|
+
(:john.is_happy).should_not be_equal(:john.is_happy)
|
42
|
+
(:john.is_happy).should_not == nil
|
43
|
+
(:john.is_happy).should_not == 9
|
44
|
+
(:john.is_happy).should_not == :john
|
45
|
+
(:john.is_happy).should_not == Rubylog
|
46
|
+
(:john.likes :drinking.in :bar).should == (:john.likes :drinking.in :bar)
|
47
|
+
end
|
48
|
+
it "support eql?" do
|
49
|
+
(:john.is_happy).should be_eql(:john.is_happy)
|
50
|
+
(:john.is_happy).should_not be_eql nil
|
51
|
+
(:john.is_happy).should_not be_eql 9
|
52
|
+
(:john.is_happy).should_not be_eql :john
|
53
|
+
(:john.is_happy).should_not be_eql Rubylog
|
54
|
+
(:john.likes :drinking.in :bar).should be_eql(:john.likes :drinking.in :bar)
|
55
|
+
end
|
56
|
+
it "support hash" do
|
57
|
+
(:john.is_happy).hash.should == (:john.is_happy).hash
|
58
|
+
(:john.likes :drinking.in :bar).hash.should ==
|
59
|
+
(:john.likes :drinking.in :bar).hash
|
60
|
+
end
|
61
|
+
it "support inspect" do
|
62
|
+
(:john.is_happy).inspect.should == ":john.is_happy"
|
63
|
+
(:john.likes :beer).inspect.should == ":john.likes(:beer)"
|
64
|
+
(:john.likes :drinking,:beer).inspect.should == ":john.likes(:drinking, :beer)"
|
65
|
+
(:john.likes :drinking.in :bar).inspect.should == ":john.likes(:drinking.in(:bar))"
|
66
|
+
end
|
67
|
+
it "can tell their arity" do
|
68
|
+
(:john.is_happy).arity.should == 1
|
69
|
+
(:john.likes :beer).arity.should == 2
|
70
|
+
(:john.likes :drinking,:beer).arity.should == 3
|
71
|
+
(:john.likes :drinking.in :bar).arity.should == 2
|
72
|
+
end
|
73
|
+
it "can tell their descriptor" do
|
74
|
+
(:john.is_happy).desc.should == [:is_happy,1]
|
75
|
+
(:john.likes :beer).desc.should == [:likes,2]
|
76
|
+
(:john.likes :drinking,:beer).desc.should == [:likes,3]
|
77
|
+
(:john.likes :drinking.in :bar).desc.should == [:likes,2]
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'rubylog'
|
2
|
+
|
3
|
+
class << Rubylog.theory
|
4
|
+
describe "variables" do
|
5
|
+
it "are undefined constants" do
|
6
|
+
[A, SomethingLong].each{|x|x.should be_kind_of Rubylog::Variable}
|
7
|
+
end
|
8
|
+
|
9
|
+
it "support ==" do
|
10
|
+
A.should == A
|
11
|
+
end
|
12
|
+
|
13
|
+
it "support eql?" do
|
14
|
+
A.should be_eql A
|
15
|
+
end
|
16
|
+
|
17
|
+
it "returns different instances" do
|
18
|
+
A.should_not be_equal A
|
19
|
+
end
|
20
|
+
|
21
|
+
specify "that start with ANY... are dont care" do
|
22
|
+
[ANY, ANYTHING, ANYTIME].each{|x|x.should be_kind_of Rubylog::Variable; x.should be_dont_care}
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|