porolog 1.0.2 → 1.0.3
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.
- checksums.yaml +4 -4
- data/README.md +22 -13
- data/coverage/index.html +4564 -4552
- data/doc/Array.html +9 -9
- data/doc/Object.html +1 -1
- data/doc/Porolog.html +77 -67
- data/doc/Symbol.html +1 -1
- data/doc/_index.html +1 -1
- data/doc/file.README.html +22 -14
- data/doc/index.html +22 -14
- data/doc/top-level-namespace.html +1 -1
- data/lib/porolog.rb +4 -2
- data/lib/porolog/core_ext.rb +8 -8
- data/lib/porolog/goal.rb +2 -2
- data/lib/porolog/predicate/builtin.rb +34 -34
- data/lib/porolog/rule.rb +1 -1
- data/lib/porolog/variable.rb +7 -7
- data/test/porolog/arguments_test.rb +73 -73
- data/test/porolog/core_ext_test.rb +39 -39
- data/test/porolog/goal_test.rb +72 -72
- data/test/porolog/instantiation_test.rb +153 -153
- data/test/porolog/porolog_test.rb +272 -270
- data/test/porolog/predicate/builtin_test.rb +166 -166
- data/test/porolog/predicate_test.rb +85 -85
- data/test/porolog/rule_test.rb +69 -69
- data/test/porolog/scope_test.rb +89 -89
- data/test/porolog/tail_test.rb +23 -23
- data/test/porolog/value_test.rb +32 -34
- data/test/porolog/variable_test.rb +120 -120
- data/test/samples_test.rb +11 -11
- data/test/test_helper.rb +56 -61
- metadata +2 -2
data/doc/Symbol.html
CHANGED
@@ -491,7 +491,7 @@
|
|
491
491
|
</div>
|
492
492
|
|
493
493
|
<div id="footer">
|
494
|
-
Generated on
|
494
|
+
Generated on Thu Aug 13 22:35:32 2020 by
|
495
495
|
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
496
496
|
0.9.19 (ruby-2.6.5).
|
497
497
|
</div>
|
data/doc/_index.html
CHANGED
@@ -451,7 +451,7 @@
|
|
451
451
|
</div>
|
452
452
|
|
453
453
|
<div id="footer">
|
454
|
-
Generated on
|
454
|
+
Generated on Thu Aug 13 22:35:30 2020 by
|
455
455
|
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
456
456
|
0.9.19 (ruby-2.6.5).
|
457
457
|
</div>
|
data/doc/file.README.html
CHANGED
@@ -64,7 +64,7 @@
|
|
64
64
|
|
65
65
|
<p>Plain Old Ruby Objects Prolog</p>
|
66
66
|
|
67
|
-
<p><a href="https://badge.fury.io/rb/porolog"><img src="https://badge.fury.io/rb/porolog.svg"></a> <a href="https://travis-ci.com/wizardofosmium/porolog"><img src="https://travis-ci.com/wizardofosmium/porolog.svg?branch=master"></a> <a href="https://github.com/wizardofosmium/porolog"><img src="https://github.com/wizardofosmium/porolog/blob/master/coverage/badge.svg"></a></p>
|
67
|
+
<p><a href="https://badge.fury.io/rb/porolog"><img src="https://badge.fury.io/rb/porolog.svg"></a> <a href="https://travis-ci.com/wizardofosmium/porolog"><img src="https://travis-ci.com/wizardofosmium/porolog.svg?branch=master"></a> <a href="https://htmlpreview.github.io/?https://github.com/wizardofosmium/porolog/blob/master/coverage/index.html"><img src="https://github.com/wizardofosmium/porolog/blob/master/coverage/badge.svg"></a> <a href="https://www.rubydoc.info/gems/porolog"><img src="https://img.shields.io/badge/documentation-100%2E0%25-brightgreen.svg"></a> <a href="https://github.com/wizardofosmium/porolog/wiki"><img src="https://img.shields.io/badge/wiki-in%20progress-brightgreen.svg"></a></p>
|
68
68
|
|
69
69
|
<h2 id="label-Introduction">Introduction</h2>
|
70
70
|
|
@@ -72,7 +72,7 @@
|
|
72
72
|
|
73
73
|
<p>The need that this gem aims to meet is to have a Ruby program interact with a Prolog program using native Ruby objects (POROs); hence the name Porolog. The goal was to implement a minimal logic engine in the style of Prolog where Ruby objects could be passed in and Ruby objects were passed back.</p>
|
74
74
|
|
75
|
-
<p>This version completes
|
75
|
+
<p>This version completes modularisation, so that <code>include Porolog</code> is no longer required.</p>
|
76
76
|
|
77
77
|
<h2 id="label-Dependencies">Dependencies</h2>
|
78
78
|
|
@@ -124,10 +124,11 @@
|
|
124
124
|
|
125
125
|
<pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_require'>require</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>porolog</span><span class='tstring_end'>'</span></span>
|
126
126
|
|
127
|
-
<span class='id identifier rubyid_include'>include</span> <span class='const'><span class='object_link'><a href="Porolog.html" title="Porolog (module)">Porolog</a></span></span>
|
128
|
-
|
129
127
|
<span class='kw'>class</span> <span class='const'>Numbers</span>
|
130
128
|
|
129
|
+
<span class='id identifier rubyid_include'>include</span> <span class='const'><span class='object_link'><a href="Porolog.html" title="Porolog (module)">Porolog</a></span></span>
|
130
|
+
<span class='id identifier rubyid_extend'>extend</span> <span class='const'><span class='object_link'><a href="Porolog.html" title="Porolog (module)">Porolog</a></span></span>
|
131
|
+
|
131
132
|
<span class='const'>Predicate</span><span class='period'>.</span><span class='id identifier rubyid_scope'>scope</span> <span class='kw'>self</span>
|
132
133
|
<span class='id identifier rubyid_predicate'>predicate</span> <span class='symbol'>:prime</span><span class='comma'>,</span> <span class='label'>class_base:</span> <span class='kw'>self</span>
|
133
134
|
|
@@ -223,13 +224,11 @@
|
|
223
224
|
|
224
225
|
<pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_require'>require</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>porolog</span><span class='tstring_end'>'</span></span>
|
225
226
|
|
226
|
-
<span class='id identifier rubyid_include'>include</span> <span class='const'><span class='object_link'><a href="Porolog.html" title="Porolog (module)">Porolog</a></span></span>
|
227
|
-
|
228
227
|
<span class='kw'>class</span> <span class='const'>Numbers</span>
|
229
228
|
|
230
|
-
<span class='const'>Predicate</span><span class='period'>.</span><span class='id identifier rubyid_scope'>scope</span> <span class='kw'>self</span>
|
231
|
-
<span class='id identifier rubyid_builtin'>builtin</span> <span class='symbol'>:gtr</span><span class='comma'>,</span> <span class='symbol'>:is</span><span class='comma'>,</span> <span class='symbol'>:noteq</span><span class='comma'>,</span> <span class='symbol'>:between</span><span class='comma'>,</span> <span class='label'>class_base:</span> <span class='kw'>self</span>
|
232
|
-
<span class='id identifier rubyid_predicate'>predicate</span> <span class='symbol'>:prime</span><span class='comma'>,</span> <span class='symbol'>:search_prime</span><span class='comma'>,</span> <span class='label'>class_base:</span> <span class='kw'>self</span>
|
229
|
+
<span class='const'><span class='object_link'><a href="Porolog.html" title="Porolog (module)">Porolog</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Porolog/Predicate.html" title="Porolog::Predicate (class)">Predicate</a></span></span><span class='period'>.</span><span class='id identifier rubyid_scope'><span class='object_link'><a href="Porolog/Predicate.html#scope-class_method" title="Porolog::Predicate.scope (method)">scope</a></span></span> <span class='kw'>self</span>
|
230
|
+
<span class='const'><span class='object_link'><a href="Porolog.html" title="Porolog (module)">Porolog</a></span></span><span class='op'>::</span><span class='id identifier rubyid_builtin'><span class='object_link'><a href="Porolog.html#builtin-instance_method" title="Porolog#builtin (method)">builtin</a></span></span> <span class='symbol'>:gtr</span><span class='comma'>,</span> <span class='symbol'>:is</span><span class='comma'>,</span> <span class='symbol'>:noteq</span><span class='comma'>,</span> <span class='symbol'>:between</span><span class='comma'>,</span> <span class='label'>class_base:</span> <span class='kw'>self</span>
|
231
|
+
<span class='const'><span class='object_link'><a href="Porolog.html" title="Porolog (module)">Porolog</a></span></span><span class='op'>::</span><span class='id identifier rubyid_predicate'><span class='object_link'><a href="Porolog.html#predicate-instance_method" title="Porolog#predicate (method)">predicate</a></span></span> <span class='symbol'>:prime</span><span class='comma'>,</span> <span class='symbol'>:search_prime</span><span class='comma'>,</span> <span class='label'>class_base:</span> <span class='kw'>self</span>
|
233
232
|
|
234
233
|
<span class='id identifier rubyid_prime'>prime</span><span class='lparen'>(</span><span class='int'>2</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_fact!'>fact!</span>
|
235
234
|
<span class='id identifier rubyid_prime'>prime</span><span class='lparen'>(</span><span class='int'>3</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_fact!'>fact!</span>
|
@@ -254,6 +253,10 @@
|
|
254
253
|
<span class='symbol'>:CUT</span><span class='comma'>,</span>
|
255
254
|
<span class='id identifier rubyid_search_prime'>search_prime</span><span class='lparen'>(</span><span class='symbol'>:X</span><span class='comma'>,</span> <span class='symbol'>:M</span><span class='rparen'>)</span><span class='comma'>,</span>
|
256
255
|
<span class='rbracket'>]</span>
|
256
|
+
|
257
|
+
<span class='comment'># Unexpose `search_prime`
|
258
|
+
</span> <span class='id identifier rubyid_private'>private</span> <span class='symbol'>:search_prime</span>
|
259
|
+
<span class='id identifier rubyid_private_class_method'>private_class_method</span> <span class='symbol'>:search_prime</span>
|
257
260
|
|
258
261
|
<span class='kw'>def</span> <span class='id identifier rubyid_show_primes'>show_primes</span>
|
259
262
|
<span class='id identifier rubyid_solutions'>solutions</span> <span class='op'>=</span> <span class='id identifier rubyid_prime'>prime</span><span class='lparen'>(</span><span class='symbol'>:X</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_solve'>solve</span>
|
@@ -282,11 +285,15 @@
|
|
282
285
|
<span class='kw'>end</span>
|
283
286
|
|
284
287
|
|
285
|
-
<span class='
|
286
|
-
<span class='id identifier
|
287
|
-
<span class='id identifier rubyid_puts'>puts</span> <span class='id identifier
|
288
|
+
<span class='const'>Numbers</span><span class='period'>.</span><span class='id identifier rubyid_show_primes'>show_primes</span>
|
289
|
+
<span class='id identifier rubyid_number'>number</span> <span class='op'>=</span> <span class='const'>Numbers</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span> <span class='int'>23</span>
|
290
|
+
<span class='id identifier rubyid_puts'>puts</span> <span class='id identifier rubyid_number'>number</span><span class='period'>.</span><span class='id identifier rubyid_primes'>primes</span><span class='period'>.</span><span class='id identifier rubyid_inspect'>inspect</span>
|
291
|
+
|
292
|
+
<span class='comment'># `prime` predicate is exposed as a class method
|
293
|
+
</span><span class='id identifier rubyid_puts'>puts</span> <span class='const'>Numbers</span><span class='period'>.</span><span class='id identifier rubyid_prime'>prime</span><span class='lparen'>(</span><span class='int'>3</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_valid?'>valid?</span><span class='period'>.</span><span class='id identifier rubyid_inspect'>inspect</span>
|
288
294
|
|
289
|
-
<span class='
|
295
|
+
<span class='comment'># `prime` predicate is exposed as an instance method
|
296
|
+
</span><span class='id identifier rubyid_puts'>puts</span> <span class='id identifier rubyid_number'>number</span><span class='period'>.</span><span class='id identifier rubyid_prime'>prime</span><span class='lparen'>(</span><span class='int'>3</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_valid?'>valid?</span><span class='period'>.</span><span class='id identifier rubyid_inspect'>inspect</span>
|
290
297
|
|
291
298
|
<span class='id identifier rubyid_puts'>puts</span> <span class='const'>ARGV</span><span class='period'>.</span><span class='id identifier rubyid_inspect'>inspect</span>
|
292
299
|
<span class='const'>ARGV</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span><span class='lparen'>(</span><span class='op'>&</span><span class='symbol'>:to_i</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_arg'>arg</span><span class='op'>|</span>
|
@@ -318,6 +325,7 @@
|
|
318
325
|
<span class='id identifier rubyid_rake'>rake</span> <span class='id identifier rubyid_value_test'>value_test</span>
|
319
326
|
<span class='id identifier rubyid_rake'>rake</span> <span class='id identifier rubyid_tail_test'>tail_test</span>
|
320
327
|
<span class='id identifier rubyid_rake'>rake</span> <span class='id identifier rubyid_instantiation_test'>instantiation_test</span>
|
328
|
+
<span class='id identifier rubyid_rake'>rake</span> <span class='id identifier rubyid_samples_test'>samples_test</span>
|
321
329
|
</code></pre>
|
322
330
|
|
323
331
|
<h2 id="label-Author">Author</h2>
|
@@ -326,7 +334,7 @@
|
|
326
334
|
</div></div>
|
327
335
|
|
328
336
|
<div id="footer">
|
329
|
-
Generated on
|
337
|
+
Generated on Thu Aug 13 22:35:30 2020 by
|
330
338
|
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
331
339
|
0.9.19 (ruby-2.6.5).
|
332
340
|
</div>
|
data/doc/index.html
CHANGED
@@ -64,7 +64,7 @@
|
|
64
64
|
|
65
65
|
<p>Plain Old Ruby Objects Prolog</p>
|
66
66
|
|
67
|
-
<p><a href="https://badge.fury.io/rb/porolog"><img src="https://badge.fury.io/rb/porolog.svg"></a> <a href="https://travis-ci.com/wizardofosmium/porolog"><img src="https://travis-ci.com/wizardofosmium/porolog.svg?branch=master"></a> <a href="https://github.com/wizardofosmium/porolog"><img src="https://github.com/wizardofosmium/porolog/blob/master/coverage/badge.svg"></a></p>
|
67
|
+
<p><a href="https://badge.fury.io/rb/porolog"><img src="https://badge.fury.io/rb/porolog.svg"></a> <a href="https://travis-ci.com/wizardofosmium/porolog"><img src="https://travis-ci.com/wizardofosmium/porolog.svg?branch=master"></a> <a href="https://htmlpreview.github.io/?https://github.com/wizardofosmium/porolog/blob/master/coverage/index.html"><img src="https://github.com/wizardofosmium/porolog/blob/master/coverage/badge.svg"></a> <a href="https://www.rubydoc.info/gems/porolog"><img src="https://img.shields.io/badge/documentation-100%2E0%25-brightgreen.svg"></a> <a href="https://github.com/wizardofosmium/porolog/wiki"><img src="https://img.shields.io/badge/wiki-in%20progress-brightgreen.svg"></a></p>
|
68
68
|
|
69
69
|
<h2 id="label-Introduction">Introduction</h2>
|
70
70
|
|
@@ -72,7 +72,7 @@
|
|
72
72
|
|
73
73
|
<p>The need that this gem aims to meet is to have a Ruby program interact with a Prolog program using native Ruby objects (POROs); hence the name Porolog. The goal was to implement a minimal logic engine in the style of Prolog where Ruby objects could be passed in and Ruby objects were passed back.</p>
|
74
74
|
|
75
|
-
<p>This version completes
|
75
|
+
<p>This version completes modularisation, so that <code>include Porolog</code> is no longer required.</p>
|
76
76
|
|
77
77
|
<h2 id="label-Dependencies">Dependencies</h2>
|
78
78
|
|
@@ -124,10 +124,11 @@
|
|
124
124
|
|
125
125
|
<pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_require'>require</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>porolog</span><span class='tstring_end'>'</span></span>
|
126
126
|
|
127
|
-
<span class='id identifier rubyid_include'>include</span> <span class='const'><span class='object_link'><a href="Porolog.html" title="Porolog (module)">Porolog</a></span></span>
|
128
|
-
|
129
127
|
<span class='kw'>class</span> <span class='const'>Numbers</span>
|
130
128
|
|
129
|
+
<span class='id identifier rubyid_include'>include</span> <span class='const'><span class='object_link'><a href="Porolog.html" title="Porolog (module)">Porolog</a></span></span>
|
130
|
+
<span class='id identifier rubyid_extend'>extend</span> <span class='const'><span class='object_link'><a href="Porolog.html" title="Porolog (module)">Porolog</a></span></span>
|
131
|
+
|
131
132
|
<span class='const'>Predicate</span><span class='period'>.</span><span class='id identifier rubyid_scope'>scope</span> <span class='kw'>self</span>
|
132
133
|
<span class='id identifier rubyid_predicate'>predicate</span> <span class='symbol'>:prime</span><span class='comma'>,</span> <span class='label'>class_base:</span> <span class='kw'>self</span>
|
133
134
|
|
@@ -223,13 +224,11 @@
|
|
223
224
|
|
224
225
|
<pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_require'>require</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>porolog</span><span class='tstring_end'>'</span></span>
|
225
226
|
|
226
|
-
<span class='id identifier rubyid_include'>include</span> <span class='const'><span class='object_link'><a href="Porolog.html" title="Porolog (module)">Porolog</a></span></span>
|
227
|
-
|
228
227
|
<span class='kw'>class</span> <span class='const'>Numbers</span>
|
229
228
|
|
230
|
-
<span class='const'>Predicate</span><span class='period'>.</span><span class='id identifier rubyid_scope'>scope</span> <span class='kw'>self</span>
|
231
|
-
<span class='id identifier rubyid_builtin'>builtin</span> <span class='symbol'>:gtr</span><span class='comma'>,</span> <span class='symbol'>:is</span><span class='comma'>,</span> <span class='symbol'>:noteq</span><span class='comma'>,</span> <span class='symbol'>:between</span><span class='comma'>,</span> <span class='label'>class_base:</span> <span class='kw'>self</span>
|
232
|
-
<span class='id identifier rubyid_predicate'>predicate</span> <span class='symbol'>:prime</span><span class='comma'>,</span> <span class='symbol'>:search_prime</span><span class='comma'>,</span> <span class='label'>class_base:</span> <span class='kw'>self</span>
|
229
|
+
<span class='const'><span class='object_link'><a href="Porolog.html" title="Porolog (module)">Porolog</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Porolog/Predicate.html" title="Porolog::Predicate (class)">Predicate</a></span></span><span class='period'>.</span><span class='id identifier rubyid_scope'><span class='object_link'><a href="Porolog/Predicate.html#scope-class_method" title="Porolog::Predicate.scope (method)">scope</a></span></span> <span class='kw'>self</span>
|
230
|
+
<span class='const'><span class='object_link'><a href="Porolog.html" title="Porolog (module)">Porolog</a></span></span><span class='op'>::</span><span class='id identifier rubyid_builtin'><span class='object_link'><a href="Porolog.html#builtin-instance_method" title="Porolog#builtin (method)">builtin</a></span></span> <span class='symbol'>:gtr</span><span class='comma'>,</span> <span class='symbol'>:is</span><span class='comma'>,</span> <span class='symbol'>:noteq</span><span class='comma'>,</span> <span class='symbol'>:between</span><span class='comma'>,</span> <span class='label'>class_base:</span> <span class='kw'>self</span>
|
231
|
+
<span class='const'><span class='object_link'><a href="Porolog.html" title="Porolog (module)">Porolog</a></span></span><span class='op'>::</span><span class='id identifier rubyid_predicate'><span class='object_link'><a href="Porolog.html#predicate-instance_method" title="Porolog#predicate (method)">predicate</a></span></span> <span class='symbol'>:prime</span><span class='comma'>,</span> <span class='symbol'>:search_prime</span><span class='comma'>,</span> <span class='label'>class_base:</span> <span class='kw'>self</span>
|
233
232
|
|
234
233
|
<span class='id identifier rubyid_prime'>prime</span><span class='lparen'>(</span><span class='int'>2</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_fact!'>fact!</span>
|
235
234
|
<span class='id identifier rubyid_prime'>prime</span><span class='lparen'>(</span><span class='int'>3</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_fact!'>fact!</span>
|
@@ -254,6 +253,10 @@
|
|
254
253
|
<span class='symbol'>:CUT</span><span class='comma'>,</span>
|
255
254
|
<span class='id identifier rubyid_search_prime'>search_prime</span><span class='lparen'>(</span><span class='symbol'>:X</span><span class='comma'>,</span> <span class='symbol'>:M</span><span class='rparen'>)</span><span class='comma'>,</span>
|
256
255
|
<span class='rbracket'>]</span>
|
256
|
+
|
257
|
+
<span class='comment'># Unexpose `search_prime`
|
258
|
+
</span> <span class='id identifier rubyid_private'>private</span> <span class='symbol'>:search_prime</span>
|
259
|
+
<span class='id identifier rubyid_private_class_method'>private_class_method</span> <span class='symbol'>:search_prime</span>
|
257
260
|
|
258
261
|
<span class='kw'>def</span> <span class='id identifier rubyid_show_primes'>show_primes</span>
|
259
262
|
<span class='id identifier rubyid_solutions'>solutions</span> <span class='op'>=</span> <span class='id identifier rubyid_prime'>prime</span><span class='lparen'>(</span><span class='symbol'>:X</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_solve'>solve</span>
|
@@ -282,11 +285,15 @@
|
|
282
285
|
<span class='kw'>end</span>
|
283
286
|
|
284
287
|
|
285
|
-
<span class='
|
286
|
-
<span class='id identifier
|
287
|
-
<span class='id identifier rubyid_puts'>puts</span> <span class='id identifier
|
288
|
+
<span class='const'>Numbers</span><span class='period'>.</span><span class='id identifier rubyid_show_primes'>show_primes</span>
|
289
|
+
<span class='id identifier rubyid_number'>number</span> <span class='op'>=</span> <span class='const'>Numbers</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span> <span class='int'>23</span>
|
290
|
+
<span class='id identifier rubyid_puts'>puts</span> <span class='id identifier rubyid_number'>number</span><span class='period'>.</span><span class='id identifier rubyid_primes'>primes</span><span class='period'>.</span><span class='id identifier rubyid_inspect'>inspect</span>
|
291
|
+
|
292
|
+
<span class='comment'># `prime` predicate is exposed as a class method
|
293
|
+
</span><span class='id identifier rubyid_puts'>puts</span> <span class='const'>Numbers</span><span class='period'>.</span><span class='id identifier rubyid_prime'>prime</span><span class='lparen'>(</span><span class='int'>3</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_valid?'>valid?</span><span class='period'>.</span><span class='id identifier rubyid_inspect'>inspect</span>
|
288
294
|
|
289
|
-
<span class='
|
295
|
+
<span class='comment'># `prime` predicate is exposed as an instance method
|
296
|
+
</span><span class='id identifier rubyid_puts'>puts</span> <span class='id identifier rubyid_number'>number</span><span class='period'>.</span><span class='id identifier rubyid_prime'>prime</span><span class='lparen'>(</span><span class='int'>3</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_valid?'>valid?</span><span class='period'>.</span><span class='id identifier rubyid_inspect'>inspect</span>
|
290
297
|
|
291
298
|
<span class='id identifier rubyid_puts'>puts</span> <span class='const'>ARGV</span><span class='period'>.</span><span class='id identifier rubyid_inspect'>inspect</span>
|
292
299
|
<span class='const'>ARGV</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span><span class='lparen'>(</span><span class='op'>&</span><span class='symbol'>:to_i</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_arg'>arg</span><span class='op'>|</span>
|
@@ -318,6 +325,7 @@
|
|
318
325
|
<span class='id identifier rubyid_rake'>rake</span> <span class='id identifier rubyid_value_test'>value_test</span>
|
319
326
|
<span class='id identifier rubyid_rake'>rake</span> <span class='id identifier rubyid_tail_test'>tail_test</span>
|
320
327
|
<span class='id identifier rubyid_rake'>rake</span> <span class='id identifier rubyid_instantiation_test'>instantiation_test</span>
|
328
|
+
<span class='id identifier rubyid_rake'>rake</span> <span class='id identifier rubyid_samples_test'>samples_test</span>
|
321
329
|
</code></pre>
|
322
330
|
|
323
331
|
<h2 id="label-Author">Author</h2>
|
@@ -326,7 +334,7 @@
|
|
326
334
|
</div></div>
|
327
335
|
|
328
336
|
<div id="footer">
|
329
|
-
Generated on
|
337
|
+
Generated on Thu Aug 13 22:35:30 2020 by
|
330
338
|
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
331
339
|
0.9.19 (ruby-2.6.5).
|
332
340
|
</div>
|
@@ -102,7 +102,7 @@
|
|
102
102
|
</div>
|
103
103
|
|
104
104
|
<div id="footer">
|
105
|
-
Generated on
|
105
|
+
Generated on Thu Aug 13 22:35:30 2020 by
|
106
106
|
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
107
107
|
0.9.19 (ruby-2.6.5).
|
108
108
|
</div>
|
data/lib/porolog.rb
CHANGED
@@ -10,10 +10,12 @@
|
|
10
10
|
#
|
11
11
|
module Porolog
|
12
12
|
|
13
|
+
extend self
|
14
|
+
|
13
15
|
# The most recent version of the Porolog gem.
|
14
|
-
VERSION = '1.0.
|
16
|
+
VERSION = '1.0.3'.freeze
|
15
17
|
# The most recent date of when the VERSION changed.
|
16
|
-
VERSION_DATE = '2020-08-
|
18
|
+
VERSION_DATE = '2020-08-13'.freeze
|
17
19
|
|
18
20
|
# Represents an unknown tail of a list.
|
19
21
|
UNKNOWN_TAIL = Object.new
|
data/lib/porolog/core_ext.rb
CHANGED
@@ -93,15 +93,15 @@ class Array
|
|
93
93
|
return self if visited.include?(self)
|
94
94
|
visited = visited + [self]
|
95
95
|
flat_map{|element|
|
96
|
-
if element.is_a?(Tail)
|
96
|
+
if element.is_a?(Porolog::Tail)
|
97
97
|
tail = element.value(visited)
|
98
98
|
if tail.is_a?(Array)
|
99
99
|
tail
|
100
|
-
elsif tail.is_a?(Variable) || tail.is_a?(Value)
|
100
|
+
elsif tail.is_a?(Porolog::Variable) || tail.is_a?(Porolog::Value)
|
101
101
|
tail = tail.value(visited)
|
102
102
|
if tail.is_a?(Array)
|
103
103
|
tail
|
104
|
-
elsif tail.is_a?(Variable) || tail.is_a?(Value)
|
104
|
+
elsif tail.is_a?(Porolog::Variable) || tail.is_a?(Porolog::Value)
|
105
105
|
tail = tail.goal.variablise(tail.value(visited))
|
106
106
|
if tail.is_a?(Array)
|
107
107
|
tail
|
@@ -126,9 +126,9 @@ class Array
|
|
126
126
|
value.map{|element|
|
127
127
|
if element.is_a?(Array)
|
128
128
|
element.clean
|
129
|
-
elsif element.is_a?(Tail)
|
130
|
-
UNKNOWN_TAIL
|
131
|
-
elsif element.is_a?(Variable)
|
129
|
+
elsif element.is_a?(Porolog::Tail)
|
130
|
+
Porolog::UNKNOWN_TAIL
|
131
|
+
elsif element.is_a?(Porolog::Variable)
|
132
132
|
nil
|
133
133
|
else
|
134
134
|
element.value
|
@@ -145,7 +145,7 @@ class Array
|
|
145
145
|
# @return [Array] an Array with the Object being the head and the other Object being the tail.
|
146
146
|
def /(other)
|
147
147
|
if other.is_a?(Porolog::Variable) || other.is_a?(Symbol)
|
148
|
-
self + [Tail.new(other)]
|
148
|
+
self + [Porolog::Tail.new(other)]
|
149
149
|
else
|
150
150
|
self + [*other]
|
151
151
|
end
|
@@ -177,7 +177,7 @@ class Array
|
|
177
177
|
|
178
178
|
# @return [Boolean] whether the Object is an Array with a head and a tail.
|
179
179
|
def headtail?
|
180
|
-
length == 2 && (last.is_a?(Tail) || last == UNKNOWN_TAIL)
|
180
|
+
length == 2 && (last.is_a?(Porolog::Tail) || last == Porolog::UNKNOWN_TAIL)
|
181
181
|
end
|
182
182
|
|
183
183
|
# @return [Porolog::Goal] the goal that is most likely to be the goal for this array.
|
data/lib/porolog/goal.rb
CHANGED
@@ -336,7 +336,7 @@ module Porolog
|
|
336
336
|
variables.each do |variable|
|
337
337
|
name = variable
|
338
338
|
|
339
|
-
unification = unify(name, name, other_goal, self)
|
339
|
+
unification = Porolog::unify(name, name, other_goal, self)
|
340
340
|
unified &&= !!unification
|
341
341
|
if unified
|
342
342
|
unifications += unification
|
@@ -347,7 +347,7 @@ module Porolog
|
|
347
347
|
#:nocov:
|
348
348
|
end
|
349
349
|
end
|
350
|
-
unified &&= instantiate_unifications(unifications) if unified
|
350
|
+
unified &&= Porolog::instantiate_unifications(unifications) if unified
|
351
351
|
|
352
352
|
unified
|
353
353
|
end
|
@@ -280,7 +280,7 @@ module Porolog
|
|
280
280
|
all_values = all_values.map(&:value).map(&:value)
|
281
281
|
exclusions = exclusions.map(&:value).map(&:value)
|
282
282
|
|
283
|
-
possible_values = goal[anonymous]
|
283
|
+
possible_values = goal[Porolog::anonymous]
|
284
284
|
|
285
285
|
if exclusions.uniq.size == exclusions.size
|
286
286
|
!!possible_values.instantiate(all_values - exclusions) && Predicate.call_builtin(:member, goal, block, variable, possible_values) || false
|
@@ -435,7 +435,7 @@ module Porolog
|
|
435
435
|
when [:array, :atomic]
|
436
436
|
list.length == length
|
437
437
|
when [:variable, :atomic]
|
438
|
-
list.instantiate(Array.new(length){goal[
|
438
|
+
list.instantiate(Array.new(length){goal[Porolog::anonymous]})
|
439
439
|
when [:array, :variable]
|
440
440
|
length.instantiate(list.length)
|
441
441
|
else
|
@@ -533,9 +533,9 @@ module Porolog
|
|
533
533
|
when [:atomic, :array], [:array, :array]
|
534
534
|
satisfied = false
|
535
535
|
list.each do |i|
|
536
|
-
unifications
|
536
|
+
unifications = Porolog::unify(element_value, i, goal)
|
537
537
|
if unifications
|
538
|
-
instantiations = instantiate_unifications(unifications)
|
538
|
+
instantiations = Porolog::instantiate_unifications(unifications)
|
539
539
|
if instantiations
|
540
540
|
block.call(goal) && (satisfied = true)
|
541
541
|
instantiations.each(&:remove)
|
@@ -560,7 +560,7 @@ module Porolog
|
|
560
560
|
when [:variable, :variable], [:atomic, :variable], [:array, :variable]
|
561
561
|
satisfied = false
|
562
562
|
limit.times do |i|
|
563
|
-
instantiation = list.instantiate([*Array.new(i){goal[
|
563
|
+
instantiation = list.instantiate([*Array.new(i){goal[Porolog::anonymous]}, element, Porolog::UNKNOWN_TAIL])
|
564
564
|
instantiation && block.call(goal) && (satisfied = true)
|
565
565
|
instantiation&.remove
|
566
566
|
return satisfied if goal.terminated?
|
@@ -600,8 +600,8 @@ module Porolog
|
|
600
600
|
when [:array, :array, :array]
|
601
601
|
satisfied = false
|
602
602
|
if front.length + back.length == front_back.length
|
603
|
-
unifications = unify(front + back, front_back, goal)
|
604
|
-
instantiations = instantiate_unifications(unifications) if unifications
|
603
|
+
unifications = Porolog::unify(front + back, front_back, goal)
|
604
|
+
instantiations = Porolog::instantiate_unifications(unifications) if unifications
|
605
605
|
instantiations && block.call(goal) && (satisfied = true)
|
606
606
|
instantiations&.each(&:remove)
|
607
607
|
end
|
@@ -609,8 +609,8 @@ module Porolog
|
|
609
609
|
|
610
610
|
when [:array, :array, :variable]
|
611
611
|
satisfied = false
|
612
|
-
unifications = unify(front + back, front_back, goal)
|
613
|
-
instantiations = instantiate_unifications(unifications) if unifications
|
612
|
+
unifications = Porolog::unify(front + back, front_back, goal)
|
613
|
+
instantiations = Porolog::instantiate_unifications(unifications) if unifications
|
614
614
|
instantiations && block.call(goal) && (satisfied = true)
|
615
615
|
instantiations&.each(&:remove)
|
616
616
|
satisfied
|
@@ -621,9 +621,9 @@ module Porolog
|
|
621
621
|
expected_front = front_back[0...front.length]
|
622
622
|
expected_back = front_back[front.length..-1]
|
623
623
|
|
624
|
-
unifications = unify(front, expected_front, goal)
|
625
|
-
unifications += unify(back, expected_back, goal) if unifications
|
626
|
-
instantiations = instantiate_unifications(unifications) if unifications
|
624
|
+
unifications = Porolog::unify(front, expected_front, goal)
|
625
|
+
unifications += Porolog::unify(back, expected_back, goal) if unifications
|
626
|
+
instantiations = Porolog::instantiate_unifications(unifications) if unifications
|
627
627
|
instantiations && block.call(goal) && (satisfied = true)
|
628
628
|
instantiations&.each(&:remove)
|
629
629
|
end
|
@@ -635,9 +635,9 @@ module Porolog
|
|
635
635
|
expected_front = front_back[0...-back.length]
|
636
636
|
expected_back = front_back[-back.length..-1]
|
637
637
|
|
638
|
-
unifications = unify(front, expected_front, goal)
|
639
|
-
unifications += unify(back, expected_back, goal) if unifications
|
640
|
-
instantiations = instantiate_unifications(unifications) if unifications
|
638
|
+
unifications = Porolog::unify(front, expected_front, goal)
|
639
|
+
unifications += Porolog::unify(back, expected_back, goal) if unifications
|
640
|
+
instantiations = Porolog::instantiate_unifications(unifications) if unifications
|
641
641
|
instantiations && block.call(goal) && (satisfied = true)
|
642
642
|
instantiations&.each(&:remove)
|
643
643
|
end
|
@@ -649,9 +649,9 @@ module Porolog
|
|
649
649
|
expected_front = front_back[0...i]
|
650
650
|
expected_back = front_back[i..-1]
|
651
651
|
|
652
|
-
unifications = unify(front, expected_front, goal)
|
653
|
-
unifications += unify(back, expected_back, goal) if unifications
|
654
|
-
instantiations = instantiate_unifications(unifications) if unifications
|
652
|
+
unifications = Porolog::unify(front, expected_front, goal)
|
653
|
+
unifications += Porolog::unify(back, expected_back, goal) if unifications
|
654
|
+
instantiations = Porolog::instantiate_unifications(unifications) if unifications
|
655
655
|
instantiations && block.call(goal) && (satisfied = true)
|
656
656
|
instantiations&.each(&:remove)
|
657
657
|
return satisfied if goal.terminated?
|
@@ -660,8 +660,8 @@ module Porolog
|
|
660
660
|
|
661
661
|
when [:array, :variable, :variable]
|
662
662
|
satisfied = false
|
663
|
-
unifications = unify(front / back, front_back, goal)
|
664
|
-
instantiations = instantiate_unifications(unifications) if unifications
|
663
|
+
unifications = Porolog::unify(front / back, front_back, goal)
|
664
|
+
instantiations = Porolog::instantiate_unifications(unifications) if unifications
|
665
665
|
instantiations && block.call(goal) && (satisfied = true)
|
666
666
|
instantiations&.each(&:remove)
|
667
667
|
satisfied
|
@@ -720,16 +720,16 @@ module Porolog
|
|
720
720
|
list1 = list1.sort_by(&:inspect)
|
721
721
|
list2 = list2.sort_by(&:inspect)
|
722
722
|
|
723
|
-
unifications = unify(list1, list2, goal)
|
724
|
-
instantiations = instantiate_unifications(unifications) if unifications
|
723
|
+
unifications = Porolog::unify(list1, list2, goal)
|
724
|
+
instantiations = Porolog::instantiate_unifications(unifications) if unifications
|
725
725
|
instantiations && block.call(goal) && (satisfied = true)
|
726
726
|
instantiations&.each(&:remove)
|
727
727
|
|
728
728
|
when [false, true], [false, false]
|
729
729
|
list2.permutation do |p|
|
730
|
-
unifications = unify(list1, p, goal)
|
730
|
+
unifications = Porolog::unify(list1, p, goal)
|
731
731
|
instantiations = nil
|
732
|
-
instantiations = instantiate_unifications(unifications) if unifications
|
732
|
+
instantiations = Porolog::instantiate_unifications(unifications) if unifications
|
733
733
|
instantiations && block.call(goal) && (satisfied = true)
|
734
734
|
instantiations&.each(&:remove)
|
735
735
|
return satisfied if goal.terminated?
|
@@ -737,9 +737,9 @@ module Porolog
|
|
737
737
|
|
738
738
|
when [true, false]
|
739
739
|
list1.permutation do |p|
|
740
|
-
unifications = unify(list2, p, goal)
|
740
|
+
unifications = Porolog::unify(list2, p, goal)
|
741
741
|
instantiations = nil
|
742
|
-
instantiations = instantiate_unifications(unifications) if unifications
|
742
|
+
instantiations = Porolog::instantiate_unifications(unifications) if unifications
|
743
743
|
instantiations && block.call(goal) && (satisfied = true)
|
744
744
|
instantiations&.each(&:remove)
|
745
745
|
return satisfied if goal.terminated?
|
@@ -750,8 +750,8 @@ module Porolog
|
|
750
750
|
when [:array, :variable]
|
751
751
|
satisfied = false
|
752
752
|
list1.permutation do |p|
|
753
|
-
unifications = unify(p, list2, goal)
|
754
|
-
instantiations = instantiate_unifications(unifications) if unifications
|
753
|
+
unifications = Porolog::unify(p, list2, goal)
|
754
|
+
instantiations = Porolog::instantiate_unifications(unifications) if unifications
|
755
755
|
instantiations && block.call(goal) && (satisfied = true)
|
756
756
|
instantiations&.each(&:remove)
|
757
757
|
return satisfied if goal.terminated?
|
@@ -761,9 +761,9 @@ module Porolog
|
|
761
761
|
when [:variable, :array]
|
762
762
|
satisfied = false
|
763
763
|
list2.permutation do |p|
|
764
|
-
unifications = unify(list1, p, goal)
|
764
|
+
unifications = Porolog::unify(list1, p, goal)
|
765
765
|
instantiations = nil
|
766
|
-
instantiations = instantiate_unifications(unifications) if unifications
|
766
|
+
instantiations = Porolog::instantiate_unifications(unifications) if unifications
|
767
767
|
instantiations && block.call(goal) && (satisfied = true)
|
768
768
|
instantiations&.each(&:remove)
|
769
769
|
return satisfied if goal.terminated?
|
@@ -799,16 +799,16 @@ module Porolog
|
|
799
799
|
case [list1.type, list2.type]
|
800
800
|
when [:array, :array], [:variable, :array]
|
801
801
|
satisfied = false
|
802
|
-
unifications = unify(list1, list2.reverse, goal)
|
803
|
-
instantiations = instantiate_unifications(unifications) if unifications
|
802
|
+
unifications = Porolog::unify(list1, list2.reverse, goal)
|
803
|
+
instantiations = Porolog::instantiate_unifications(unifications) if unifications
|
804
804
|
instantiations && block.call(goal) && (satisfied = true)
|
805
805
|
instantiations&.each(&:remove)
|
806
806
|
satisfied
|
807
807
|
|
808
808
|
when [:array, :variable]
|
809
809
|
satisfied = false
|
810
|
-
unifications = unify(list1.reverse, list2, goal)
|
811
|
-
instantiations = instantiate_unifications(unifications) if unifications
|
810
|
+
unifications = Porolog::unify(list1.reverse, list2, goal)
|
811
|
+
instantiations = Porolog::instantiate_unifications(unifications) if unifications
|
812
812
|
instantiations && block.call(goal) && (satisfied = true)
|
813
813
|
instantiations&.each(&:remove)
|
814
814
|
satisfied
|