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.
@@ -61,7 +61,7 @@ module Porolog
61
61
  def satisfy(goal, &block)
62
62
  subgoal = Goal.new self.arguments, goal
63
63
 
64
- unified_goals = unify_goals(goal, subgoal)
64
+ unified_goals = Porolog::unify_goals(goal, subgoal)
65
65
  if unified_goals
66
66
  satisfy_definition(goal, subgoal) do |solution_goal|
67
67
  block.call(solution_goal)
@@ -143,7 +143,7 @@ module Porolog
143
143
  }
144
144
 
145
145
  if values.size > 2
146
- merged, unifications = unify_many_arrays(values, values_goals, visited)
146
+ merged, unifications = Porolog::unify_many_arrays(values, values_goals, visited)
147
147
  elsif values.size == 2
148
148
  no_variables = values.map(&:variables).flatten.empty?
149
149
  if no_variables
@@ -157,7 +157,7 @@ module Porolog
157
157
  return nil
158
158
  end
159
159
  end
160
- merged, unifications = unify_arrays(*values, *values_goals, visited)
160
+ merged, unifications = Porolog::unify_arrays(*values, *values_goals, visited)
161
161
  else
162
162
  # :nocov: NOT REACHED
163
163
  merged, unifications = values.first, []
@@ -168,7 +168,7 @@ module Porolog
168
168
  else
169
169
  # -- Not All Values Are Arrays --
170
170
  values.each_cons(2){|left,right|
171
- unification = unify(left, right, @goal, @goal, visited)
171
+ unification = Porolog::unify(left, right, @goal, @goal, visited)
172
172
  if unification && unifications
173
173
  unifications += unification
174
174
  else
@@ -178,9 +178,9 @@ module Porolog
178
178
  if unifications
179
179
  values.min_by{|value|
180
180
  case value
181
- when Variable, Symbol then 2
182
- when UNKNOWN_TAIL, UNKNOWN_ARRAY then 9
183
- else 0
181
+ when Porolog::Variable, Symbol then 2
182
+ when Porolog::UNKNOWN_TAIL, Porolog::UNKNOWN_ARRAY then 9
183
+ else 0
184
184
  end
185
185
  } || self
186
186
  else
@@ -233,7 +233,7 @@ module Porolog
233
233
  other_goal ||= self.goal
234
234
 
235
235
  # -- Check Unification --
236
- unless unify(self, other, self.goal, other_goal)
236
+ unless Porolog::unify(self, other, self.goal, other_goal)
237
237
  self.goal.log << "Cannot unify: #{self.inspect} and #{other.inspect}"
238
238
  return nil
239
239
  end
@@ -14,27 +14,27 @@ describe 'Porolog' do
14
14
  end
15
15
 
16
16
  let(:pred_name) { :pred }
17
- let(:pred) { Predicate.new pred_name }
18
- let(:pred1) { Predicate.new :p }
19
- let(:pred2) { Predicate.new :q }
17
+ let(:pred) { Porolog::Predicate.new pred_name }
18
+ let(:pred1) { Porolog::Predicate.new :p }
19
+ let(:pred2) { Porolog::Predicate.new :q }
20
20
 
21
21
  describe 'Arguments' do
22
22
 
23
23
  describe '.reset' do
24
24
 
25
25
  it 'should delete/unregister all Arguments' do
26
- args1 = Arguments.new pred, [1,:x,'word',[2,:y,0.3]]
27
- args2 = Arguments.new pred, [2]
28
- args3 = Arguments.new pred, [3,:x,:y,:z]
26
+ args1 = Porolog::Arguments.new pred, [1,:x,'word',[2,:y,0.3]]
27
+ args2 = Porolog::Arguments.new pred, [2]
28
+ args3 = Porolog::Arguments.new pred, [3,:x,:y,:z]
29
29
 
30
30
  assert_equal 'Arguments1', args1.myid
31
31
  assert_equal 'Arguments2', args2.myid
32
32
  assert_equal 'Arguments3', args3.myid
33
33
 
34
- Arguments.reset
34
+ Porolog::Arguments.reset
35
35
 
36
- args4 = Arguments.new pred, [4,[1,2,3]]
37
- args5 = Arguments.new pred, [5,[]]
36
+ args4 = Porolog::Arguments.new pred, [4,[1,2,3]]
37
+ args5 = Porolog::Arguments.new pred, [5,[]]
38
38
 
39
39
  assert_equal 'Arguments-999', args1.myid
40
40
  assert_equal 'Arguments-999', args2.myid
@@ -42,7 +42,7 @@ describe 'Porolog' do
42
42
  assert_equal 'Arguments1', args4.myid
43
43
  assert_equal 'Arguments2', args5.myid
44
44
 
45
- Arguments.reset
45
+ Porolog::Arguments.reset
46
46
 
47
47
  assert_equal 'Arguments-999', args1.myid
48
48
  assert_equal 'Arguments-999', args2.myid
@@ -56,7 +56,7 @@ describe 'Porolog' do
56
56
  describe '.new' do
57
57
 
58
58
  it 'should create a new Arguments' do
59
- arguments = Arguments.new pred, [1, :x, 'word', [2, :y, 0.3]]
59
+ arguments = Porolog::Arguments.new pred, [1, :x, 'word', [2, :y, 0.3]]
60
60
 
61
61
  assert_Arguments arguments, :pred, [1, :x, 'word', [2, :y, 0.3]]
62
62
  end
@@ -67,22 +67,22 @@ describe 'Porolog' do
67
67
 
68
68
  it 'should return all registered arguments' do
69
69
  # -- No Arguments --
70
- assert_equal 0, Arguments.arguments.size
70
+ assert_equal 0, Porolog::Arguments.arguments.size
71
71
 
72
72
  # -- One Arguments --
73
- arguments1 = Arguments.new pred1, [:x,:y,:z]
73
+ arguments1 = Porolog::Arguments.new pred1, [:x,:y,:z]
74
74
 
75
- assert_equal 1, Arguments.arguments.size
76
- assert_Arguments Arguments.arguments.last, :p, [:x,:y,:z]
75
+ assert_equal 1, Porolog::Arguments.arguments.size
76
+ assert_Arguments Porolog::Arguments.arguments.last, :p, [:x,:y,:z]
77
77
 
78
78
  # -- Two Arguments --
79
- arguments2 = Arguments.new pred2, [:a,:b,:c,:d]
79
+ arguments2 = Porolog::Arguments.new pred2, [:a,:b,:c,:d]
80
80
 
81
- assert_equal 2, Arguments.arguments.size
82
- assert_Arguments Arguments.arguments.last, :q, [:a,:b,:c,:d]
81
+ assert_equal 2, Porolog::Arguments.arguments.size
82
+ assert_Arguments Porolog::Arguments.arguments.last, :q, [:a,:b,:c,:d]
83
83
 
84
84
 
85
- assert_equal [arguments1, arguments2], Arguments.arguments
85
+ assert_equal [arguments1, arguments2], Porolog::Arguments.arguments
86
86
  end
87
87
 
88
88
  end
@@ -90,22 +90,22 @@ describe 'Porolog' do
90
90
  describe '#initialize' do
91
91
 
92
92
  it 'should initialize predicate and arguments' do
93
- arguments = Arguments.new pred, [:x,:y,:z]
93
+ arguments = Porolog::Arguments.new pred, [:x,:y,:z]
94
94
 
95
95
  assert_equal pred, arguments.predicate
96
96
  assert_equal [:x,:y,:z], arguments.arguments
97
97
  end
98
98
 
99
99
  it 'should register the arguments' do
100
- arguments1 = Arguments.new pred, [:x]
101
- arguments2 = Arguments.new pred, [:x,:y]
102
- arguments3 = Arguments.new pred, [:x,:y,:z]
100
+ arguments1 = Porolog::Arguments.new pred, [:x]
101
+ arguments2 = Porolog::Arguments.new pred, [:x,:y]
102
+ arguments3 = Porolog::Arguments.new pred, [:x,:y,:z]
103
103
 
104
104
  assert_equal [
105
105
  arguments1,
106
106
  arguments2,
107
107
  arguments3,
108
- ], Arguments.arguments
108
+ ], Porolog::Arguments.arguments
109
109
  end
110
110
 
111
111
  end
@@ -113,9 +113,9 @@ describe 'Porolog' do
113
113
  describe '#myid' do
114
114
 
115
115
  it 'should return its class and index as a String' do
116
- arguments1 = Arguments.new pred, [:x]
117
- arguments2 = Arguments.new pred, [:x,:y]
118
- arguments3 = Arguments.new pred, [:x,:y,:z]
116
+ arguments1 = Porolog::Arguments.new pred, [:x]
117
+ arguments2 = Porolog::Arguments.new pred, [:x,:y]
118
+ arguments3 = Porolog::Arguments.new pred, [:x,:y,:z]
119
119
 
120
120
  assert_equal 'Arguments1', arguments1.myid
121
121
  assert_equal 'Arguments2', arguments2.myid
@@ -123,11 +123,11 @@ describe 'Porolog' do
123
123
  end
124
124
 
125
125
  it 'should return its class and -999 as a String when deleted/reset' do
126
- arguments1 = Arguments.new pred, [:x]
127
- arguments2 = Arguments.new pred, [:x,:y]
128
- arguments3 = Arguments.new pred, [:x,:y,:z]
126
+ arguments1 = Porolog::Arguments.new pred, [:x]
127
+ arguments2 = Porolog::Arguments.new pred, [:x,:y]
128
+ arguments3 = Porolog::Arguments.new pred, [:x,:y,:z]
129
129
 
130
- Arguments.reset
130
+ Porolog::Arguments.reset
131
131
 
132
132
  assert_equal 'Arguments-999', arguments1.myid
133
133
  assert_equal 'Arguments-999', arguments2.myid
@@ -139,13 +139,13 @@ describe 'Porolog' do
139
139
  describe '#inspect' do
140
140
 
141
141
  it 'should show the predicate and arguments' do
142
- predicate1 = Predicate.new :p
143
- predicate2 = Predicate.new :q
144
- predicate3 = Predicate.new :generic
142
+ predicate1 = Porolog::Predicate.new :p
143
+ predicate2 = Porolog::Predicate.new :q
144
+ predicate3 = Porolog::Predicate.new :generic
145
145
 
146
- arguments1 = Arguments.new predicate1, [:x]
147
- arguments2 = Arguments.new predicate2, [:list, [1,2,3]]
148
- arguments3 = Arguments.new predicate3, [:a,:b,:c]
146
+ arguments1 = Porolog::Arguments.new predicate1, [:x]
147
+ arguments2 = Porolog::Arguments.new predicate2, [:list, [1,2,3]]
148
+ arguments3 = Porolog::Arguments.new predicate3, [:a,:b,:c]
149
149
 
150
150
  assert_equal 'p(:x)', arguments1.inspect
151
151
  assert_equal 'q(:list,[1, 2, 3])', arguments2.inspect
@@ -227,7 +227,7 @@ describe 'Porolog' do
227
227
  #:nocov:
228
228
  end
229
229
 
230
- assert_instance_of Arguments, arguments2
230
+ assert_instance_of Porolog::Arguments, arguments2
231
231
 
232
232
  part1 = "[ pred(1,\"a\",0.1):- #<Proc:0x"
233
233
  part2 = "@#{__FILE__}:#{line}>]"
@@ -283,8 +283,8 @@ describe 'Porolog' do
283
283
  describe '#solutions' do
284
284
 
285
285
  it 'should memoize solutions' do
286
- args1 = Arguments.new pred, [1,2]
287
- args2 = Arguments.new pred, [:p,:q]
286
+ args1 = Porolog::Arguments.new pred, [1,2]
287
+ args2 = Porolog::Arguments.new pred, [:p,:q]
288
288
 
289
289
  args1.fact!
290
290
 
@@ -304,8 +304,8 @@ describe 'Porolog' do
304
304
  describe '#solve' do
305
305
 
306
306
  it 'should unify and solve a simple predicate' do
307
- args1 = Arguments.new pred, [1,2]
308
- args2 = Arguments.new pred, [:p,:q]
307
+ args1 = Porolog::Arguments.new pred, [1,2]
308
+ args2 = Porolog::Arguments.new pred, [:p,:q]
309
309
 
310
310
  args1.fact!
311
311
 
@@ -315,7 +315,7 @@ describe 'Porolog' do
315
315
  end
316
316
 
317
317
  it 'should unify and solve a simple predicate with multiple solutions' do
318
- predicate :simple
318
+ Porolog::predicate :simple
319
319
 
320
320
  simple(1,2).fact!
321
321
  simple(3,4).fact!
@@ -329,7 +329,7 @@ describe 'Porolog' do
329
329
  end
330
330
 
331
331
  it 'should unify and solve a simple predicate with multiple solutions involving a head and tail' do
332
- predicate :basic
332
+ Porolog::predicate :basic
333
333
 
334
334
  basic([1,2,3]).fact!
335
335
  basic([3,4,5]).fact!
@@ -343,7 +343,7 @@ describe 'Porolog' do
343
343
  end
344
344
 
345
345
  it 'should unify and solve a normal predicate' do
346
- predicate :likes
346
+ Porolog::predicate :likes
347
347
 
348
348
  likes('mary','food').fact!
349
349
  likes('mary','wine').fact!
@@ -365,7 +365,7 @@ describe 'Porolog' do
365
365
  end
366
366
 
367
367
  it 'should allow isnt to be defined' do
368
- predicate :isnt
368
+ Porolog::predicate :isnt
369
369
 
370
370
  isnt(:A,:A) << [:CUT, false]
371
371
  isnt(:A,:B) << [:CUT, true]
@@ -378,7 +378,7 @@ describe 'Porolog' do
378
378
  end
379
379
 
380
380
  it 'should unify and solve a deeper predicate' do
381
- predicate :male, :female, :parent
381
+ Porolog::predicate :male, :female, :parent
382
382
 
383
383
  male('james1').fact!
384
384
  male('charles1').fact!
@@ -415,7 +415,7 @@ describe 'Porolog' do
415
415
  ], solutions
416
416
 
417
417
 
418
- predicate :mother, :father, :sibling, :isnt
418
+ Porolog::predicate :mother, :father, :sibling, :isnt
419
419
 
420
420
  mother(:X,:M) << [
421
421
  parent(:X,:M),
@@ -468,7 +468,7 @@ describe 'Porolog' do
468
468
  end
469
469
 
470
470
  it 'should unify and solve a predicate involving a head and tail' do
471
- predicate :join, :split, :head, :tail
471
+ Porolog::predicate :join, :split, :head, :tail
472
472
 
473
473
  head(1).fact!
474
474
  head(4).fact!
@@ -504,8 +504,8 @@ describe 'Porolog' do
504
504
  end
505
505
 
506
506
  it 'should call a builtin predicate' do
507
- builtin :write
508
- predicate :callwrite
507
+ Porolog::builtin :write
508
+ Porolog::predicate :callwrite
509
509
 
510
510
  callwrite(:MESSAGE) << [
511
511
  write(:MESSAGE,"\n")
@@ -521,8 +521,8 @@ describe 'Porolog' do
521
521
  end
522
522
 
523
523
  it 'should pass on instantiations between goals' do
524
- builtin :write
525
- predicate :passon, :copy
524
+ Porolog::builtin :write
525
+ Porolog::predicate :passon, :copy
526
526
 
527
527
  copy(:A,:A).fact!
528
528
 
@@ -546,8 +546,8 @@ describe 'Porolog' do
546
546
  end
547
547
 
548
548
  it 'should implement simple recursion' do
549
- builtin :write, :is, :gtr
550
- predicate :count
549
+ Porolog::builtin :write, :is, :gtr
550
+ Porolog::predicate :count
551
551
 
552
552
  count(1) << [
553
553
  write("1: END\n"),
@@ -585,8 +585,8 @@ describe 'Porolog' do
585
585
  end
586
586
 
587
587
  it 'should solve tower of Hanoi' do
588
- builtin :gtr, :is, :write
589
- predicate :move
588
+ Porolog::builtin :gtr, :is, :write
589
+ Porolog::predicate :move
590
590
 
591
591
  move(1,:X,:Y,:Z) << [
592
592
  write('Move top disk from ', :X, ' to ', :Y, "\n"),
@@ -627,8 +627,8 @@ describe 'Porolog' do
627
627
  end
628
628
 
629
629
  it 'should solve a peeling off predicate' do
630
- builtin :is
631
- predicate :peel
630
+ Porolog::builtin :is
631
+ Porolog::predicate :peel
632
632
 
633
633
  peel([],0).cut_fact!
634
634
  peel(:H/:T,:N) << [
@@ -652,8 +652,8 @@ describe 'Porolog' do
652
652
  it 'should solve tower of Hanoi with list representation' do
653
653
  # TODO: convert to list representation
654
654
 
655
- builtin :gtr, :is, :append, :write
656
- predicate :tower, :move
655
+ Porolog::builtin :gtr, :is, :append, :write
656
+ Porolog::predicate :tower, :move
657
657
 
658
658
  tower(1, :X, :Y, :Z, [[:X,:Z]]).fact!
659
659
  tower(:N, :X, :Y, :Z, :S) << [
@@ -716,7 +716,7 @@ describe 'Porolog' do
716
716
  describe '#solve_for' do
717
717
 
718
718
  it 'should solve a predicate for specified variables' do
719
- predicate :alpha
719
+ Porolog::predicate :alpha
720
720
 
721
721
  alpha(1,2).fact!
722
722
 
@@ -726,7 +726,7 @@ describe 'Porolog' do
726
726
  end
727
727
 
728
728
  it 'should solve a predicate for a specified variable' do
729
- predicate :alpha
729
+ Porolog::predicate :alpha
730
730
 
731
731
  alpha(1,2).fact!
732
732
  alpha(3,5).fact!
@@ -737,7 +737,7 @@ describe 'Porolog' do
737
737
  end
738
738
 
739
739
  it 'should solve a predicate with multiple solutions for specified variables' do
740
- predicate :alpha
740
+ Porolog::predicate :alpha
741
741
 
742
742
  alpha(1,2).fact!
743
743
  alpha(3,4).fact!
@@ -754,7 +754,7 @@ describe 'Porolog' do
754
754
  describe '#valid?' do
755
755
 
756
756
  it 'should return true when a solution is found' do
757
- predicate :f
757
+ Porolog::predicate :f
758
758
 
759
759
  f(3).fact!
760
760
 
@@ -762,7 +762,7 @@ describe 'Porolog' do
762
762
  end
763
763
 
764
764
  it 'should return false when no solution is found' do
765
- predicate :f
765
+ Porolog::predicate :f
766
766
 
767
767
  f(1).fact!
768
768
  f(2).fact!
@@ -773,7 +773,7 @@ describe 'Porolog' do
773
773
  end
774
774
 
775
775
  it 'should return false when a fallacy is found' do
776
- predicate :f
776
+ Porolog::predicate :f
777
777
 
778
778
  f(3).fallacy!
779
779
 
@@ -803,30 +803,30 @@ describe 'Porolog' do
803
803
  describe '#==' do
804
804
 
805
805
  it 'should return true for Arguments with identical predicates and arguments' do
806
- predicate1 = Predicate.new :omega
806
+ predicate1 = Porolog::Predicate.new :omega
807
807
  arguments1 = predicate1.(1,'a',0.1)
808
808
 
809
- predicate2 = Predicate.new :omega
809
+ predicate2 = Porolog::Predicate.new :omega
810
810
  arguments2 = predicate2.(1,'a',0.1)
811
811
 
812
812
  assert arguments1 == arguments2, 'Arguments with identical predicates and arguments should return true'
813
813
  end
814
814
 
815
815
  it 'should return false for Arguments with non-identical arguments' do
816
- predicate1 = Predicate.new :omega
816
+ predicate1 = Porolog::Predicate.new :omega
817
817
  arguments1 = predicate1.(1,'a',0.1)
818
818
 
819
- predicate2 = Predicate.new :omega
819
+ predicate2 = Porolog::Predicate.new :omega
820
820
  arguments2 = predicate2.(1,'a',0.2)
821
821
 
822
822
  refute arguments1 == arguments2, 'Arguments with non-identical arguments should return false'
823
823
  end
824
824
 
825
825
  it 'should return false for Arguments with non-identical predicates' do
826
- predicate1 = Predicate.new :omega
826
+ predicate1 = Porolog::Predicate.new :omega
827
827
  arguments1 = predicate1.(1,'a',0.1)
828
828
 
829
- predicate2 = Predicate.new :omegb
829
+ predicate2 = Porolog::Predicate.new :omegb
830
830
  arguments2 = predicate2.(1,'a',0.1)
831
831
 
832
832
  refute arguments1 == arguments2, 'Arguments with non-identical predicates should return false'