test/porolog/arguments_test.rb in porolog-1.0.2 vs test/porolog/arguments_test.rb in porolog-1.0.3

- old
+ new

@@ -12,39 +12,39 @@ before(:all) do reset end let(:pred_name) { :pred } - let(:pred) { Predicate.new pred_name } - let(:pred1) { Predicate.new :p } - let(:pred2) { Predicate.new :q } + let(:pred) { Porolog::Predicate.new pred_name } + let(:pred1) { Porolog::Predicate.new :p } + let(:pred2) { Porolog::Predicate.new :q } describe 'Arguments' do describe '.reset' do it 'should delete/unregister all Arguments' do - args1 = Arguments.new pred, [1,:x,'word',[2,:y,0.3]] - args2 = Arguments.new pred, [2] - args3 = Arguments.new pred, [3,:x,:y,:z] + args1 = Porolog::Arguments.new pred, [1,:x,'word',[2,:y,0.3]] + args2 = Porolog::Arguments.new pred, [2] + args3 = Porolog::Arguments.new pred, [3,:x,:y,:z] assert_equal 'Arguments1', args1.myid assert_equal 'Arguments2', args2.myid assert_equal 'Arguments3', args3.myid - Arguments.reset + Porolog::Arguments.reset - args4 = Arguments.new pred, [4,[1,2,3]] - args5 = Arguments.new pred, [5,[]] + args4 = Porolog::Arguments.new pred, [4,[1,2,3]] + args5 = Porolog::Arguments.new pred, [5,[]] assert_equal 'Arguments-999', args1.myid assert_equal 'Arguments-999', args2.myid assert_equal 'Arguments-999', args3.myid assert_equal 'Arguments1', args4.myid assert_equal 'Arguments2', args5.myid - Arguments.reset + Porolog::Arguments.reset assert_equal 'Arguments-999', args1.myid assert_equal 'Arguments-999', args2.myid assert_equal 'Arguments-999', args3.myid assert_equal 'Arguments-999', args4.myid @@ -54,82 +54,82 @@ end describe '.new' do it 'should create a new Arguments' do - arguments = Arguments.new pred, [1, :x, 'word', [2, :y, 0.3]] + arguments = Porolog::Arguments.new pred, [1, :x, 'word', [2, :y, 0.3]] assert_Arguments arguments, :pred, [1, :x, 'word', [2, :y, 0.3]] end end describe '.arguments' do it 'should return all registered arguments' do # -- No Arguments -- - assert_equal 0, Arguments.arguments.size + assert_equal 0, Porolog::Arguments.arguments.size # -- One Arguments -- - arguments1 = Arguments.new pred1, [:x,:y,:z] + arguments1 = Porolog::Arguments.new pred1, [:x,:y,:z] - assert_equal 1, Arguments.arguments.size - assert_Arguments Arguments.arguments.last, :p, [:x,:y,:z] + assert_equal 1, Porolog::Arguments.arguments.size + assert_Arguments Porolog::Arguments.arguments.last, :p, [:x,:y,:z] # -- Two Arguments -- - arguments2 = Arguments.new pred2, [:a,:b,:c,:d] + arguments2 = Porolog::Arguments.new pred2, [:a,:b,:c,:d] - assert_equal 2, Arguments.arguments.size - assert_Arguments Arguments.arguments.last, :q, [:a,:b,:c,:d] + assert_equal 2, Porolog::Arguments.arguments.size + assert_Arguments Porolog::Arguments.arguments.last, :q, [:a,:b,:c,:d] - assert_equal [arguments1, arguments2], Arguments.arguments + assert_equal [arguments1, arguments2], Porolog::Arguments.arguments end end describe '#initialize' do it 'should initialize predicate and arguments' do - arguments = Arguments.new pred, [:x,:y,:z] + arguments = Porolog::Arguments.new pred, [:x,:y,:z] assert_equal pred, arguments.predicate assert_equal [:x,:y,:z], arguments.arguments end it 'should register the arguments' do - arguments1 = Arguments.new pred, [:x] - arguments2 = Arguments.new pred, [:x,:y] - arguments3 = Arguments.new pred, [:x,:y,:z] + arguments1 = Porolog::Arguments.new pred, [:x] + arguments2 = Porolog::Arguments.new pred, [:x,:y] + arguments3 = Porolog::Arguments.new pred, [:x,:y,:z] assert_equal [ arguments1, arguments2, arguments3, - ], Arguments.arguments + ], Porolog::Arguments.arguments end end describe '#myid' do it 'should return its class and index as a String' do - arguments1 = Arguments.new pred, [:x] - arguments2 = Arguments.new pred, [:x,:y] - arguments3 = Arguments.new pred, [:x,:y,:z] + arguments1 = Porolog::Arguments.new pred, [:x] + arguments2 = Porolog::Arguments.new pred, [:x,:y] + arguments3 = Porolog::Arguments.new pred, [:x,:y,:z] assert_equal 'Arguments1', arguments1.myid assert_equal 'Arguments2', arguments2.myid assert_equal 'Arguments3', arguments3.myid end it 'should return its class and -999 as a String when deleted/reset' do - arguments1 = Arguments.new pred, [:x] - arguments2 = Arguments.new pred, [:x,:y] - arguments3 = Arguments.new pred, [:x,:y,:z] + arguments1 = Porolog::Arguments.new pred, [:x] + arguments2 = Porolog::Arguments.new pred, [:x,:y] + arguments3 = Porolog::Arguments.new pred, [:x,:y,:z] - Arguments.reset + Porolog::Arguments.reset assert_equal 'Arguments-999', arguments1.myid assert_equal 'Arguments-999', arguments2.myid assert_equal 'Arguments-999', arguments3.myid end @@ -137,17 +137,17 @@ end describe '#inspect' do it 'should show the predicate and arguments' do - predicate1 = Predicate.new :p - predicate2 = Predicate.new :q - predicate3 = Predicate.new :generic + predicate1 = Porolog::Predicate.new :p + predicate2 = Porolog::Predicate.new :q + predicate3 = Porolog::Predicate.new :generic - arguments1 = Arguments.new predicate1, [:x] - arguments2 = Arguments.new predicate2, [:list, [1,2,3]] - arguments3 = Arguments.new predicate3, [:a,:b,:c] + arguments1 = Porolog::Arguments.new predicate1, [:x] + arguments2 = Porolog::Arguments.new predicate2, [:list, [1,2,3]] + arguments3 = Porolog::Arguments.new predicate3, [:a,:b,:c] assert_equal 'p(:x)', arguments1.inspect assert_equal 'q(:list,[1, 2, 3])', arguments2.inspect assert_equal 'generic(:a,:b,:c)', arguments3.inspect end @@ -225,11 +225,11 @@ #:nocov: $stderr.puts "args = #{args.inspect}" #:nocov: end - assert_instance_of Arguments, arguments2 + assert_instance_of Porolog::Arguments, arguments2 part1 = "[ pred(1,\"a\",0.1):- #<Proc:0x" part2 = "@#{__FILE__}:#{line}>]" matcher = Regexp.new( @@ -281,12 +281,12 @@ end describe '#solutions' do it 'should memoize solutions' do - args1 = Arguments.new pred, [1,2] - args2 = Arguments.new pred, [:p,:q] + args1 = Porolog::Arguments.new pred, [1,2] + args2 = Porolog::Arguments.new pred, [:p,:q] args1.fact! solve_spy = Spy.on(args2, :solve).and_call_through @@ -302,22 +302,22 @@ end describe '#solve' do it 'should unify and solve a simple predicate' do - args1 = Arguments.new pred, [1,2] - args2 = Arguments.new pred, [:p,:q] + args1 = Porolog::Arguments.new pred, [1,2] + args2 = Porolog::Arguments.new pred, [:p,:q] args1.fact! solutions = args2.solve assert_equal [{ p: 1, q: 2 }], solutions end it 'should unify and solve a simple predicate with multiple solutions' do - predicate :simple + Porolog::predicate :simple simple(1,2).fact! simple(3,4).fact! solutions = simple(:p,:q).solve @@ -327,11 +327,11 @@ { p: 3, q: 4 }, ],solutions end it 'should unify and solve a simple predicate with multiple solutions involving a head and tail' do - predicate :basic + Porolog::predicate :basic basic([1,2,3]).fact! basic([3,4,5]).fact! solutions = basic(:p/:q).solve @@ -341,11 +341,11 @@ { p: 3, q: [4,5] }, ],solutions end it 'should unify and solve a normal predicate' do - predicate :likes + Porolog::predicate :likes likes('mary','food').fact! likes('mary','wine').fact! likes('john','wine').fact! likes('john','mary').fact! @@ -363,11 +363,11 @@ { who: 'john', what: 'mary' }, ], solutions end it 'should allow isnt to be defined' do - predicate :isnt + Porolog::predicate :isnt isnt(:A,:A) << [:CUT, false] isnt(:A,:B) << [:CUT, true] solutions = isnt(123,123).solve @@ -376,11 +376,11 @@ solutions = isnt(123,124).solve assert_equal [{}], solutions end it 'should unify and solve a deeper predicate' do - predicate :male, :female, :parent + Porolog::predicate :male, :female, :parent male('james1').fact! male('charles1').fact! male('charles2').fact! male('james2').fact! @@ -413,11 +413,11 @@ { X: 'catherine' }, { X: 'james2' }, ], solutions - predicate :mother, :father, :sibling, :isnt + Porolog::predicate :mother, :father, :sibling, :isnt mother(:X,:M) << [ parent(:X,:M), female(:M) ] @@ -466,11 +466,11 @@ { s1: 'james2', s2: 'catherine' } ], solutions end it 'should unify and solve a predicate involving a head and tail' do - predicate :join, :split, :head, :tail + Porolog::predicate :join, :split, :head, :tail head(1).fact! head(4).fact! tail([2,3]).fact! tail([5,6]).fact! @@ -502,12 +502,12 @@ { p: 4, q: [5,6] }, ],solutions end it 'should call a builtin predicate' do - builtin :write - predicate :callwrite + Porolog::builtin :write + Porolog::predicate :callwrite callwrite(:MESSAGE) << [ write(:MESSAGE,"\n") ] @@ -519,12 +519,12 @@ ],solutions end end it 'should pass on instantiations between goals' do - builtin :write - predicate :passon, :copy + Porolog::builtin :write + Porolog::predicate :passon, :copy copy(:A,:A).fact! passon(1,:A) << [ write('1: A=',:A,"\n"), @@ -544,12 +544,12 @@ ],solutions end end it 'should implement simple recursion' do - builtin :write, :is, :gtr - predicate :count + Porolog::builtin :write, :is, :gtr + Porolog::predicate :count count(1) << [ write("1: END\n"), :CUT ] @@ -583,12 +583,12 @@ ],solutions end end it 'should solve tower of Hanoi' do - builtin :gtr, :is, :write - predicate :move + Porolog::builtin :gtr, :is, :write + Porolog::predicate :move move(1,:X,:Y,:Z) << [ write('Move top disk from ', :X, ' to ', :Y, "\n"), ] move(:N,:X,:Y,:Z) << [ @@ -625,12 +625,12 @@ ],solutions end end it 'should solve a peeling off predicate' do - builtin :is - predicate :peel + Porolog::builtin :is + Porolog::predicate :peel peel([],0).cut_fact! peel(:H/:T,:N) << [ peel(:T,:NT), is(:N,:NT){|nt| nt + 1 }, @@ -650,12 +650,12 @@ end it 'should solve tower of Hanoi with list representation' do # TODO: convert to list representation - builtin :gtr, :is, :append, :write - predicate :tower, :move + Porolog::builtin :gtr, :is, :append, :write + Porolog::predicate :tower, :move tower(1, :X, :Y, :Z, [[:X,:Z]]).fact! tower(:N, :X, :Y, :Z, :S) << [ gtr(:N,1), is(:M,:N){|n| n - 1 }, @@ -714,32 +714,32 @@ end describe '#solve_for' do it 'should solve a predicate for specified variables' do - predicate :alpha + Porolog::predicate :alpha alpha(1,2).fact! solutions = alpha(:p,:q).solve_for(:q,:p) assert_equal [[2,1]], solutions end it 'should solve a predicate for a specified variable' do - predicate :alpha + Porolog::predicate :alpha alpha(1,2).fact! alpha(3,5).fact! solutions = alpha(:p,:q).solve_for(:q) assert_equal [2,5], solutions end it 'should solve a predicate with multiple solutions for specified variables' do - predicate :alpha + Porolog::predicate :alpha alpha(1,2).fact! alpha(3,4).fact! alpha(5,6).fact! alpha(5,7).fact! @@ -752,30 +752,30 @@ end describe '#valid?' do it 'should return true when a solution is found' do - predicate :f + Porolog::predicate :f f(3).fact! assert f(3).valid?, name end it 'should return false when no solution is found' do - predicate :f + Porolog::predicate :f f(1).fact! f(2).fact! f(4).fact! f(5).fact! refute f(3).valid?, name end it 'should return false when a fallacy is found' do - predicate :f + Porolog::predicate :f f(3).fallacy! refute f(3).valid?, name end @@ -801,33 +801,33 @@ end describe '#==' do it 'should return true for Arguments with identical predicates and arguments' do - predicate1 = Predicate.new :omega + predicate1 = Porolog::Predicate.new :omega arguments1 = predicate1.(1,'a',0.1) - predicate2 = Predicate.new :omega + predicate2 = Porolog::Predicate.new :omega arguments2 = predicate2.(1,'a',0.1) assert arguments1 == arguments2, 'Arguments with identical predicates and arguments should return true' end it 'should return false for Arguments with non-identical arguments' do - predicate1 = Predicate.new :omega + predicate1 = Porolog::Predicate.new :omega arguments1 = predicate1.(1,'a',0.1) - predicate2 = Predicate.new :omega + predicate2 = Porolog::Predicate.new :omega arguments2 = predicate2.(1,'a',0.2) refute arguments1 == arguments2, 'Arguments with non-identical arguments should return false' end it 'should return false for Arguments with non-identical predicates' do - predicate1 = Predicate.new :omega + predicate1 = Porolog::Predicate.new :omega arguments1 = predicate1.(1,'a',0.1) - predicate2 = Predicate.new :omegb + predicate2 = Porolog::Predicate.new :omegb arguments2 = predicate2.(1,'a',0.1) refute arguments1 == arguments2, 'Arguments with non-identical predicates should return false' end