rubylog 0.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.
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 */