rubylog 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (124) hide show
  1. data/.document +5 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +18 -0
  4. data/Gemfile.lock +64 -0
  5. data/LICENSE.txt +20 -0
  6. data/README.rdoc +96 -0
  7. data/Rakefile +53 -0
  8. data/VERSION +1 -0
  9. data/examples/4queens.rb +10 -0
  10. data/examples/calculation.rb +12 -0
  11. data/examples/concepts.rb +46 -0
  12. data/examples/factorial.rb +16 -0
  13. data/examples/fp.rb +56 -0
  14. data/examples/hello.rb +9 -0
  15. data/examples/historia_de_espana.rb +31 -0
  16. data/examples/idea.rb +143 -0
  17. data/examples/lists.rb +5 -0
  18. data/examples/mechanika.rb +409 -0
  19. data/examples/parse.rb +15 -0
  20. data/examples/theory.rb +20 -0
  21. data/lib/array.rb +24 -0
  22. data/lib/class.rb +11 -0
  23. data/lib/method.rb +4 -0
  24. data/lib/object.rb +5 -0
  25. data/lib/proc.rb +4 -0
  26. data/lib/rubylog/builtins.rb +193 -0
  27. data/lib/rubylog/callable.rb +20 -0
  28. data/lib/rubylog/clause.rb +113 -0
  29. data/lib/rubylog/composite_term.rb +38 -0
  30. data/lib/rubylog/dsl/constants.rb +15 -0
  31. data/lib/rubylog/dsl/first_order_functors.rb +9 -0
  32. data/lib/rubylog/dsl/global_functors.rb +3 -0
  33. data/lib/rubylog/dsl/second_order_functors.rb +8 -0
  34. data/lib/rubylog/dsl.rb +52 -0
  35. data/lib/rubylog/errors.rb +18 -0
  36. data/lib/rubylog/internal_helpers.rb +16 -0
  37. data/lib/rubylog/predicate.rb +34 -0
  38. data/lib/rubylog/proc_method_additions.rb +69 -0
  39. data/lib/rubylog/term.rb +20 -0
  40. data/lib/rubylog/theory.rb +133 -0
  41. data/lib/rubylog/unifiable.rb +19 -0
  42. data/lib/rubylog/variable.rb +97 -0
  43. data/lib/rubylog.rb +39 -0
  44. data/lib/symbol.rb +35 -0
  45. data/rubylog.gemspec +187 -0
  46. data/script/inriasuite2spec +0 -0
  47. data/script/inriasuite2spec.pl +22 -0
  48. data/spec/bartak_guide_spec.rb +91 -0
  49. data/spec/inriasuite/README +122 -0
  50. data/spec/inriasuite/abolish +18 -0
  51. data/spec/inriasuite/and +9 -0
  52. data/spec/inriasuite/arg +32 -0
  53. data/spec/inriasuite/arith_diff +10 -0
  54. data/spec/inriasuite/arith_eq +10 -0
  55. data/spec/inriasuite/arith_gt +10 -0
  56. data/spec/inriasuite/arith_gt= +10 -0
  57. data/spec/inriasuite/arith_lt +10 -0
  58. data/spec/inriasuite/arith_lt= +10 -0
  59. data/spec/inriasuite/asserta +18 -0
  60. data/spec/inriasuite/assertz +16 -0
  61. data/spec/inriasuite/atom +12 -0
  62. data/spec/inriasuite/atom_chars +19 -0
  63. data/spec/inriasuite/atom_codes +15 -0
  64. data/spec/inriasuite/atom_concat +19 -0
  65. data/spec/inriasuite/atom_length +12 -0
  66. data/spec/inriasuite/atomic +11 -0
  67. data/spec/inriasuite/bagof +31 -0
  68. data/spec/inriasuite/call +19 -0
  69. data/spec/inriasuite/catch-and-throw +16 -0
  70. data/spec/inriasuite/char_code +13 -0
  71. data/spec/inriasuite/clause +16 -0
  72. data/spec/inriasuite/compound +12 -0
  73. data/spec/inriasuite/copy_term +25 -0
  74. data/spec/inriasuite/current_input +5 -0
  75. data/spec/inriasuite/current_output +5 -0
  76. data/spec/inriasuite/current_predicate +16 -0
  77. data/spec/inriasuite/current_prolog_flag +12 -0
  78. data/spec/inriasuite/cut +9 -0
  79. data/spec/inriasuite/fail +15 -0
  80. data/spec/inriasuite/file_manip +8 -0
  81. data/spec/inriasuite/findall +22 -0
  82. data/spec/inriasuite/float +10 -0
  83. data/spec/inriasuite/functor +41 -0
  84. data/spec/inriasuite/functor-bis +41 -0
  85. data/spec/inriasuite/halt +7 -0
  86. data/spec/inriasuite/if-then +10 -0
  87. data/spec/inriasuite/if-then-else +12 -0
  88. data/spec/inriasuite/inriasuite.obp +0 -0
  89. data/spec/inriasuite/inriasuite.pl +836 -0
  90. data/spec/inriasuite/integer +10 -0
  91. data/spec/inriasuite/is +11 -0
  92. data/spec/inriasuite/junk +0 -0
  93. data/spec/inriasuite/nonvar +11 -0
  94. data/spec/inriasuite/not_provable +12 -0
  95. data/spec/inriasuite/not_unify +15 -0
  96. data/spec/inriasuite/number +10 -0
  97. data/spec/inriasuite/number_chars +22 -0
  98. data/spec/inriasuite/number_codes +19 -0
  99. data/spec/inriasuite/once +11 -0
  100. data/spec/inriasuite/or +9 -0
  101. data/spec/inriasuite/repeat +5 -0
  102. data/spec/inriasuite/retract +10 -0
  103. data/spec/inriasuite/set_prolog_flag +21 -0
  104. data/spec/inriasuite/setof +36 -0
  105. data/spec/inriasuite/sub_atom +30 -0
  106. data/spec/inriasuite/t +1 -0
  107. data/spec/inriasuite/t_foo.pl +4 -0
  108. data/spec/inriasuite/term_diff +13 -0
  109. data/spec/inriasuite/term_eq +12 -0
  110. data/spec/inriasuite/term_gt +12 -0
  111. data/spec/inriasuite/term_gt= +12 -0
  112. data/spec/inriasuite/term_lt +12 -0
  113. data/spec/inriasuite/term_lt= +12 -0
  114. data/spec/inriasuite/true +7 -0
  115. data/spec/inriasuite/unify +18 -0
  116. data/spec/inriasuite.rb +20 -0
  117. data/spec/recursion_spec.rb +18 -0
  118. data/spec/rubylog/builtins/splits_to.rb +18 -0
  119. data/spec/rubylog/clause_spec.rb +81 -0
  120. data/spec/rubylog/variable_spec.rb +25 -0
  121. data/spec/rubylog_spec.rb +914 -0
  122. data/spec/spec_helper.rb +12 -0
  123. data/spec/theory_spec.rb +1 -0
  124. metadata +339 -0
data/lib/symbol.rb ADDED
@@ -0,0 +1,35 @@
1
+ class Symbol
2
+
3
+ # a proxy for Clause
4
+ def functor
5
+ self
6
+ end
7
+
8
+ def arity
9
+ 0
10
+ end
11
+
12
+ def desc
13
+ [self, 0]
14
+ end
15
+
16
+ def args
17
+ []
18
+ end
19
+
20
+ # Unifiable methods
21
+ include Rubylog::Unifiable
22
+
23
+ # Callable methods
24
+ include Rubylog::Callable
25
+
26
+ def prove
27
+ predicate = Rubylog.theory[self][0]
28
+ raise Rubylog::ExistenceError, desc.inspect if not predicate
29
+ predicate.call(*args) { yield }
30
+ end
31
+
32
+ # Second-order functors (:is_false, :and, :or, :then)
33
+ include Rubylog::DSL::SecondOrderFunctors
34
+
35
+ end
data/rubylog.gemspec ADDED
@@ -0,0 +1,187 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{rubylog}
8
+ s.version = "0.0.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Bern\303\241t Kall\303\263"]
12
+ s.date = %q{2012-02-07}
13
+ s.description = %q{Rubylog is an embedded Prolog language and interpreter for Ruby.}
14
+ s.email = %q{kallo.bernat@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".rspec",
22
+ "Gemfile",
23
+ "Gemfile.lock",
24
+ "LICENSE.txt",
25
+ "README.rdoc",
26
+ "Rakefile",
27
+ "VERSION",
28
+ "examples/4queens.rb",
29
+ "examples/calculation.rb",
30
+ "examples/concepts.rb",
31
+ "examples/factorial.rb",
32
+ "examples/fp.rb",
33
+ "examples/hello.rb",
34
+ "examples/historia_de_espana.rb",
35
+ "examples/idea.rb",
36
+ "examples/lists.rb",
37
+ "examples/mechanika.rb",
38
+ "examples/parse.rb",
39
+ "examples/theory.rb",
40
+ "lib/array.rb",
41
+ "lib/class.rb",
42
+ "lib/method.rb",
43
+ "lib/object.rb",
44
+ "lib/proc.rb",
45
+ "lib/rubylog.rb",
46
+ "lib/rubylog/builtins.rb",
47
+ "lib/rubylog/callable.rb",
48
+ "lib/rubylog/clause.rb",
49
+ "lib/rubylog/composite_term.rb",
50
+ "lib/rubylog/dsl.rb",
51
+ "lib/rubylog/dsl/constants.rb",
52
+ "lib/rubylog/dsl/first_order_functors.rb",
53
+ "lib/rubylog/dsl/global_functors.rb",
54
+ "lib/rubylog/dsl/second_order_functors.rb",
55
+ "lib/rubylog/errors.rb",
56
+ "lib/rubylog/internal_helpers.rb",
57
+ "lib/rubylog/predicate.rb",
58
+ "lib/rubylog/proc_method_additions.rb",
59
+ "lib/rubylog/term.rb",
60
+ "lib/rubylog/theory.rb",
61
+ "lib/rubylog/unifiable.rb",
62
+ "lib/rubylog/variable.rb",
63
+ "lib/symbol.rb",
64
+ "rubylog.gemspec",
65
+ "script/inriasuite2spec",
66
+ "script/inriasuite2spec.pl",
67
+ "spec/bartak_guide_spec.rb",
68
+ "spec/inriasuite.rb",
69
+ "spec/inriasuite/README",
70
+ "spec/inriasuite/abolish",
71
+ "spec/inriasuite/and",
72
+ "spec/inriasuite/arg",
73
+ "spec/inriasuite/arith_diff",
74
+ "spec/inriasuite/arith_eq",
75
+ "spec/inriasuite/arith_gt",
76
+ "spec/inriasuite/arith_gt=",
77
+ "spec/inriasuite/arith_lt",
78
+ "spec/inriasuite/arith_lt=",
79
+ "spec/inriasuite/asserta",
80
+ "spec/inriasuite/assertz",
81
+ "spec/inriasuite/atom",
82
+ "spec/inriasuite/atom_chars",
83
+ "spec/inriasuite/atom_codes",
84
+ "spec/inriasuite/atom_concat",
85
+ "spec/inriasuite/atom_length",
86
+ "spec/inriasuite/atomic",
87
+ "spec/inriasuite/bagof",
88
+ "spec/inriasuite/call",
89
+ "spec/inriasuite/catch-and-throw",
90
+ "spec/inriasuite/char_code",
91
+ "spec/inriasuite/clause",
92
+ "spec/inriasuite/compound",
93
+ "spec/inriasuite/copy_term",
94
+ "spec/inriasuite/current_input",
95
+ "spec/inriasuite/current_output",
96
+ "spec/inriasuite/current_predicate",
97
+ "spec/inriasuite/current_prolog_flag",
98
+ "spec/inriasuite/cut",
99
+ "spec/inriasuite/fail",
100
+ "spec/inriasuite/file_manip",
101
+ "spec/inriasuite/findall",
102
+ "spec/inriasuite/float",
103
+ "spec/inriasuite/functor",
104
+ "spec/inriasuite/functor-bis",
105
+ "spec/inriasuite/halt",
106
+ "spec/inriasuite/if-then",
107
+ "spec/inriasuite/if-then-else",
108
+ "spec/inriasuite/inriasuite.obp",
109
+ "spec/inriasuite/inriasuite.pl",
110
+ "spec/inriasuite/integer",
111
+ "spec/inriasuite/is",
112
+ "spec/inriasuite/junk",
113
+ "spec/inriasuite/nonvar",
114
+ "spec/inriasuite/not_provable",
115
+ "spec/inriasuite/not_unify",
116
+ "spec/inriasuite/number",
117
+ "spec/inriasuite/number_chars",
118
+ "spec/inriasuite/number_codes",
119
+ "spec/inriasuite/once",
120
+ "spec/inriasuite/or",
121
+ "spec/inriasuite/repeat",
122
+ "spec/inriasuite/retract",
123
+ "spec/inriasuite/set_prolog_flag",
124
+ "spec/inriasuite/setof",
125
+ "spec/inriasuite/sub_atom",
126
+ "spec/inriasuite/t",
127
+ "spec/inriasuite/t_foo.pl",
128
+ "spec/inriasuite/term_diff",
129
+ "spec/inriasuite/term_eq",
130
+ "spec/inriasuite/term_gt",
131
+ "spec/inriasuite/term_gt=",
132
+ "spec/inriasuite/term_lt",
133
+ "spec/inriasuite/term_lt=",
134
+ "spec/inriasuite/true",
135
+ "spec/inriasuite/unify",
136
+ "spec/recursion_spec.rb",
137
+ "spec/rubylog/builtins/splits_to.rb",
138
+ "spec/rubylog/clause_spec.rb",
139
+ "spec/rubylog/variable_spec.rb",
140
+ "spec/rubylog_spec.rb",
141
+ "spec/spec_helper.rb",
142
+ "spec/theory_spec.rb"
143
+ ]
144
+ s.homepage = %q{https://github.com/cie/rubylog}
145
+ s.licenses = ["MIT"]
146
+ s.require_paths = ["lib"]
147
+ s.rubygems_version = %q{1.3.7}
148
+ s.summary = %q{An embedded Prolog interpreter}
149
+
150
+ if s.respond_to? :specification_version then
151
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
152
+ s.specification_version = 3
153
+
154
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
155
+ s.add_development_dependency(%q<rspec>, ["~> 2.8.0"])
156
+ s.add_development_dependency(%q<yard>, ["~> 0.7"])
157
+ s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
158
+ s.add_development_dependency(%q<cucumber>, [">= 0"])
159
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
160
+ s.add_development_dependency(%q<jeweler>, ["~> 1.8.3"])
161
+ s.add_development_dependency(%q<simplecov>, [">= 0"])
162
+ s.add_development_dependency(%q<reek>, ["~> 1.2.8"])
163
+ s.add_development_dependency(%q<roodi>, ["~> 2.1.0"])
164
+ else
165
+ s.add_dependency(%q<rspec>, ["~> 2.8.0"])
166
+ s.add_dependency(%q<yard>, ["~> 0.7"])
167
+ s.add_dependency(%q<rdoc>, ["~> 3.12"])
168
+ s.add_dependency(%q<cucumber>, [">= 0"])
169
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
170
+ s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
171
+ s.add_dependency(%q<simplecov>, [">= 0"])
172
+ s.add_dependency(%q<reek>, ["~> 1.2.8"])
173
+ s.add_dependency(%q<roodi>, ["~> 2.1.0"])
174
+ end
175
+ else
176
+ s.add_dependency(%q<rspec>, ["~> 2.8.0"])
177
+ s.add_dependency(%q<yard>, ["~> 0.7"])
178
+ s.add_dependency(%q<rdoc>, ["~> 3.12"])
179
+ s.add_dependency(%q<cucumber>, [">= 0"])
180
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
181
+ s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
182
+ s.add_dependency(%q<simplecov>, [">= 0"])
183
+ s.add_dependency(%q<reek>, ["~> 1.2.8"])
184
+ s.add_dependency(%q<roodi>, ["~> 2.1.0"])
185
+ end
186
+ end
187
+
Binary file
@@ -0,0 +1,22 @@
1
+ %:-
2
+ %
3
+ :- op( 20, xfx, <-- ).
4
+
5
+ main :-
6
+ open_file,
7
+ repeat,
8
+ (read([Goal, Result]); halt),
9
+ print_assertion(Goal, Result),
10
+ fail; true.
11
+
12
+
13
+ open_file :-
14
+ argument_list([Filename]),
15
+ open(Filename, read, S),
16
+ set_input(S).
17
+
18
+
19
+ print_assertion(Goal, Result) :-
20
+ write(Goal), write(Result), nl.
21
+
22
+ :- initialization(main).
@@ -0,0 +1,91 @@
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
+ 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
+
20
+ :marry.woman!
21
+ :eve.woman!
22
+
23
+ end
24
+
25
+
26
+ specify "Lists" do
27
+ Object.rubylog_functor :head_of
28
+ Array.rubylog_functor :tail_of
29
+
30
+ H.head_of(A).if A.splits_to(H,ANY)
31
+ T.tail_of(A).if A.splits_to(ANY,T)
32
+
33
+ 2.should be_head_of [2,3,4]
34
+ 2.should be_head_of [2]
35
+ 2.should_not be_head_of [1]
36
+ 2.should_not be_head_of []
37
+
38
+ [3,4].should be_tail_of [2,3,4]
39
+ []. should be_tail_of [1]
40
+
41
+ Object.rubylog_functor :member_of
42
+
43
+ M.member_of(A).if A.splits_to(M,ANY)
44
+ M.member_of(A).if A.splits_to(ANY,T).and M.member_of(T)
45
+
46
+ 0.should_not be_member_of [1,2,3]
47
+ 1.should be_member_of [1,2,3]
48
+ 2.should be_member_of [1,2,3]
49
+ 3.should be_member_of [1,2,3]
50
+ 4.should_not be_member_of [1,2,3]
51
+
52
+ Object.rubylog_functor :first_of, :last_of
53
+
54
+ F.first_of(A).if A.splits_to(F,ANY)
55
+ L.last_of(A).if A.splits_to(L,[])
56
+ L.last_of(A).if A.splits_to(H,T).and L.last_of(T)
57
+
58
+ 1.should be_first_of [1,2,3]
59
+ 3.should_not be_last_of []
60
+ 3.should be_last_of [3]
61
+ 3.should be_last_of [2,3]
62
+ 3.should be_last_of [1,2,3]
63
+ 1.should_not be_last_of [1,2,3]
64
+
65
+ Array.rubylog_functor :prefix_of
66
+
67
+ [].prefix_of! ANY_LIST
68
+ A.prefix_of(B).if A.splits_to(H,TA).and B.splits_to(H,TB).and TA.prefix_of(TB)
69
+
70
+ [1,2,3].should be_prefix_of [1,2,3]
71
+ end
72
+
73
+
74
+ describe "How does it work?" do
75
+
76
+ specify "declarative character" do
77
+ (1.in? [1,2,3]).should be_true
78
+ (X.in [1,2,3]).to_a.should == [1,2,3]
79
+ (1.in [X,Y]).to_a.should == [[1,nil], [nil,1]]
80
+ lists = []
81
+ (1.in L).each do |l|
82
+ lists << l
83
+ break if lists.size == 3
84
+ end
85
+ #lists.should == [[1], [nil,1], [nil,nil,1]]
86
+ end
87
+ end
88
+
89
+ end
90
+ end
91
+
@@ -0,0 +1,122 @@
1
+ This is the README file for version 0.9 of
2
+ the test suite of conformance to the ISO
3
+ Prolog standard based on the Formal specification
4
+ of Pierre Deransart, Ali Ed-Dbali and Lurent Cervoni.
5
+
6
+ The driver for the tests was written by Jonathan Hodgson.
7
+
8
+
9
+ The suite cotains the following files.
10
+
11
+ README This file
12
+ inriasuite.pl The driver.
13
+
14
+ and a collection of files containing the tests.
15
+
16
+
17
+ abolish Tests for abolish/1
18
+ and Tests of ','/2
19
+ arg Tests of arg/3
20
+ arith_diff Tests of '=\='/2
21
+ arith_eq Tests of '=:='/2
22
+ arith_gt Tests of '>'/2
23
+ arith_gt= Tests of '>='/2
24
+ arith_lt Tests of '<'/2
25
+ arith_lt= Tests of '=<'/2
26
+ asserta Tests of asserta/1
27
+ assertz Tests of assertz/1
28
+ atom Tests of atom/1
29
+ atom_chars Tests of atom_chars/2
30
+ atom_codes Tests of atom_codes/2
31
+ atom_concat Tests of atom_concat/3
32
+ atom_length Tests of atom_length/2
33
+ atomic Tests of atomic/1
34
+ bagof Tests of bagof/3
35
+ call Tests of call/1
36
+ catch-and-throw Tests of catch/3 and throw/1
37
+ char_code Tests of char_code/2
38
+ clause Tests of clause/2
39
+ compound Tests of compound/1
40
+ copy_term Tests of copy_term/2
41
+ current_input Tests of current_input/1
42
+ current_output Tests of current_output/2
43
+ current_predicate Tests of current_predicate/1
44
+ current_prolog_flag Tests of current_prolog_flag/2
45
+ cut Tests of '!'/0
46
+ fail Tests of fail/0
47
+ file_manip File handling tests (not yet implmented.)
48
+ findall Tests of findall/3
49
+ float Tests of float/1
50
+ functor Tests of functor/3
51
+ halt Tests of halt, provided for documentation only.
52
+ attempts to run these terminate the suite!
53
+ if-then Tests of '->'/2
54
+ if-then-else Tests of '-> ; '/3
55
+ integer Tests of integer/1
56
+ is Tests of is/2
57
+ nonvar Tests of nonvar/1
58
+ not_provable Tests of '\+'/1
59
+ not_unify Tests of '\='/2
60
+ number Tests of number/1
61
+ number_chars Tests of number_chars/2
62
+ number_codes Tests of number_codes/2
63
+ once Tests of once/1
64
+ or Tests of ';'/2
65
+ repeat Tests of repeat/0
66
+ retract Tests of retract/1
67
+ set_prolog_flag Tests of set_prolog_flag/2
68
+ setof Tests of setof/3
69
+ sub_atom Tests of sub_atom/5
70
+ term_diff Tests of '\=='/2
71
+ term_eq Tests of '=='/2
72
+ term_gt Tests of '@>'/2
73
+ term_gt= Tests of '@>='/2
74
+ term_lt Tests of '@<'/2
75
+ term_lt= Tests of '@=<'/2
76
+ true Tests of true/0
77
+ unify Tests of '='/2
78
+
79
+
80
+ The driver can be invoked after loading the file "inriasuite.pl"
81
+ by setting the goal run_all_tests. Alternatively one can use one of
82
+ the commented out initialization directives provided at the end
83
+ of the file to run the suite on load.
84
+
85
+ LIMITATIONS.
86
+
87
+ At present this suite does not test IO. Nor does it allow for
88
+ tests in which a user defined program is specified. Future versions
89
+ of the suite will remedy this.
90
+
91
+ REQUIREMENTS.
92
+
93
+ The driver is written in vanilla ISO prolog. It uses the following (standard)
94
+ builtins.
95
+
96
+ !/0
97
+ (=)/2
98
+ (=..)/2
99
+ (==)/2
100
+ (=\=)/2
101
+ (>=)/2
102
+ (\+)/1
103
+ (\==)/2
104
+ asserta/1
105
+ atomic/1
106
+ call/1
107
+ catch/3
108
+ close/1
109
+ copy_term/2
110
+ findall/3
111
+ (is)/2
112
+ nl/0
113
+ open/3
114
+ read/1
115
+ retract/1
116
+ set_prolog_flag/2
117
+ true/0
118
+ var/1
119
+ write/1
120
+
121
+
122
+ DATE 3 March 1999
@@ -0,0 +1,18 @@
1
+ /* file abolish */
2
+
3
+
4
+ [abolish(abolish/1), permission_error(modify,static_procedure,abolish/1)].
5
+
6
+
7
+ [abolish(foo/a), type_error(integer,a)].
8
+
9
+ [abolish(foo/(-1)), domain_error(not_less_than_zero,-1)].
10
+
11
+ [(current_prolog_flag(max_arity,A), X is A + 1, abolish(foo/X)),
12
+ representation_error(max_arity)].
13
+
14
+ [abolish(5/2), type_error(atom,5)].
15
+
16
+
17
+ /* end of abolish */
18
+
@@ -0,0 +1,9 @@
1
+ /* file ',' (conjunction) */
2
+
3
+ [','(X=1, var(X)), failure].
4
+ [','(var(X), X=1), [[X <-- 1]]].
5
+ [','(fail, call(3)), failure].
6
+ [','(nofoo(X), call(X)), existence_error(procedure, nofoo/1)].
7
+ [','(X = true, call(X)), [[X <-- true]]].
8
+
9
+ /* end of file ',' (conjunction) */
@@ -0,0 +1,32 @@
1
+ /* file arg */
2
+
3
+ [arg(1,foo(a,b),a), success].
4
+
5
+ [arg(1,foo(a,b),X), [[X <-- a]]].
6
+
7
+ [arg(1,foo(X,b),a), [[X <-- a]]].
8
+
9
+ [arg(2,foo(a, f(X,b), c), f(a, Y)), [[X <-- a, Y <-- b]]].
10
+
11
+ [arg(1,foo(X,b),Y), [[Y <-- X]]].
12
+
13
+ [arg(1,foo(a,b),b), failure].
14
+
15
+ [arg(0,foo(a,b),foo), failure].
16
+
17
+ [arg(3,foo(3,4),N), failure].
18
+
19
+ [arg(X,foo(a,b),a), instantiation_error].
20
+
21
+ [arg(1,X,a), instantiation_error].
22
+
23
+ [arg(0,atom,A), type_error(compound, atom)].
24
+
25
+ [arg(0,3,A), type_error(compound, 3)].
26
+
27
+
28
+ [arg(-3,foo(a,b),A), domain_error(not_less_than_zero,-3)].
29
+
30
+ [arg(a,foo(a,b),X), type_error(integer, a)].
31
+
32
+ /* end of arg */
@@ -0,0 +1,10 @@
1
+ /* file =\= */
2
+
3
+ ['=\\='(0,1), success].
4
+ ['=\\='(1.0,1), failure].
5
+ ['=\\='(3 * 2,7 - 1), failure].
6
+ ['=\\='(N,5), instantiation_error].
7
+ ['=\\='(floot(1),5), type_error(evaluable, floot/1)].
8
+
9
+ /* end of =\= */
10
+
@@ -0,0 +1,10 @@
1
+ /* file =:= */
2
+
3
+ ['=:='(0,1), failure].
4
+ ['=:='(1.0,1), success].
5
+ ['=:='(3 * 2,7 - 1), success].
6
+ ['=:='(N,5), instantiation_error].
7
+ ['=:='(floot(1),5), type_error(evaluable, floot/1)].
8
+ [0.333 =:= 1/3, failure].
9
+
10
+ /* end of =:= */
@@ -0,0 +1,10 @@
1
+ /* file > */
2
+
3
+ ['>'(0,1), failure].
4
+ ['>'(1.0,1), failure].
5
+ ['>'(3*2,7-1), failure].
6
+ ['>'(X,5), instantiation_error].
7
+ ['>'(2 + floot(1),5), type_error(evaluable, floot/1)].
8
+
9
+ /* end of > */
10
+
@@ -0,0 +1,10 @@
1
+ /* file >= */
2
+
3
+ ['>='(0,1), failure].
4
+ ['>='(1.0,1), success].
5
+ ['>='(3*2,7-1), success].
6
+ ['>='(X,5), instantiation_error].
7
+ ['>='(2 + floot(1),5), type_error(evaluable, floot/1)].
8
+
9
+ /* end of >= */
10
+
@@ -0,0 +1,10 @@
1
+ /* file < */
2
+
3
+ ['<'(0,1), success].
4
+ ['<'(1.0,1), failure].
5
+ ['<'(3*2,7-1), failure].
6
+ ['<'(X,5), instantiation_error].
7
+ ['<'(2 + floot(1),5), type_error(evaluable, floot/1)].
8
+
9
+ /* end of < */
10
+
@@ -0,0 +1,10 @@
1
+ /* file =< */
2
+
3
+ ['=<'(0,1), success].
4
+ ['=<'(1.0,1), success].
5
+ ['=<'(3*2,7-1), success].
6
+ ['=<'(X,5), instantiation_error].
7
+ ['=<'(2 + floot(1),5), type_error(evaluable, floot/1)].
8
+
9
+ /* end of =< */
10
+
@@ -0,0 +1,18 @@
1
+ /* file asserta */
2
+ /* use run_forest('bips-ex/progs/asserta_program') to see the program changes */
3
+
4
+
5
+
6
+
7
+ [(asserta((bar(X) :- X)), clause(bar(X), B)), [[B <-- call(X)]]].
8
+
9
+ [asserta(_), instantiation_error].
10
+
11
+ [asserta(4), type_error(callable, 4)].
12
+
13
+ [asserta((foo :- 4)), type_error(callable, 4)].
14
+
15
+ [asserta((atom(_) :- true)), permission_error(modify,static_procedure,atom/1)].
16
+
17
+
18
+ /* end of asserta */
@@ -0,0 +1,16 @@
1
+ /* file assertz (see the search tree by 'run_forest' predicate) */
2
+
3
+
4
+ [assertz((foo(X) :- X -> call(X))), success].
5
+
6
+ [assertz(_), instantiation_error].
7
+
8
+ [assertz(4), type_error(callable, 4)].
9
+
10
+ [assertz((foo :- 4)), type_error(callable, 4)].
11
+
12
+ [assertz((atom(_) :- true)),
13
+ permission_error(modify,static_procedure,atom/1)].
14
+
15
+
16
+ /* end of assertz */
@@ -0,0 +1,12 @@
1
+ /* file atom */
2
+
3
+ [atom(atom), success].
4
+ [atom('string'), success].
5
+ [atom(a(b)), failure].
6
+ [atom(Var), failure].
7
+ [atom([]), success].
8
+ [atom(6), failure].
9
+ [atom(3.3), failure].
10
+
11
+ /* end of atom */
12
+
@@ -0,0 +1,19 @@
1
+ /* file atom_chars */
2
+
3
+ [atom_chars('',L), [[L <-- []]]].
4
+ [atom_chars([],L), [[L <-- ['[',']']]]].
5
+ [atom_chars('''',L), [[L <-- ['''']]]].
6
+ [atom_chars('iso',L), [[L <-- ['i','s','o']]]].
7
+ [atom_chars(A,['p','r','o','l','o','g']), [[A <-- 'prolog']]].
8
+ [atom_chars('North',['N'|X]), [[X <-- ['o','r','t','h']]]].
9
+ [atom_chars('iso',['i','s']), failure].
10
+ [atom_chars(A,L), instantiation_error].
11
+
12
+ [atom_chars(A,[a,E,c]), instantiation_error].
13
+ [atom_chars(A,[a,b|L]), instantiation_error].
14
+ [atom_chars(f(a),L), type_error(atom,f(a))].
15
+ [atom_chars(A,iso), type_error(list,iso)].
16
+ [atom_chars(A,[a,f(b)]), type_error(character,f(b))].
17
+ [(atom_chars(X,['1','2']), Y is X + 1), type_error(evaluable, '12'/0)].
18
+
19
+ /* end of file atom_chars */
@@ -0,0 +1,15 @@
1
+ /* file atom_codes */
2
+
3
+ [atom_codes('',L), [[L <-- []]]].
4
+ [atom_codes([],L), [[L <-- [ 0'[, 0'] ]]]].
5
+ [atom_codes('''',L), [[L <-- [ 39 ]]]].
6
+ [atom_codes('iso',L), [[L <-- [ 0'i, 0's, 0'o ]]]].
7
+ [atom_codes(A,[ 0'p, 0'r, 0'o, 0'l, 0'o, 0'g]), [[A <-- 'prolog']]].
8
+ [atom_codes('North',[0'N | L]), [[L <-- [0'o, 0'r, 0't, 0'h]]]].
9
+ [atom_codes('iso',[0'i, 0's]), failure].
10
+ [atom_codes(A,L), instantiation_error].
11
+ [atom_codes(f(a),L), type_error(atom,f(a))].
12
+ [atom_codes(A, 0'x), type_error(list,0'x)].
13
+ [atom_codes(A,[ 0'i, 0's, 1000]), representation_error(character_code)]. % 1000 not a code
14
+
15
+ /* end of file atom_codes */