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