RosettaCodeData/Task/Amb/Picat/amb.picat

39 lines
1008 B
Plaintext

go ?=>
% select which version of amb/2 and joins/2 to test
member(Amb,[amb,amb2]),
member(Joins,[joins,join2]),
println([amb=Amb,joins=Joins]),
test_amb(amb,joins, Word1,Word2,Word3,Word4),
println([Word1, Word2, Word3, Word4]),
nl,
fail, % get other solutions
nl.
go => true.
% Test a combination of amb and joins
test_amb(Amb,Joins, Word1,Word2,Word3,Word4) =>
call(Amb, Word1, ["the","that","a"]),
call(Amb, Word2, ["frog","elephant","thing"]),
call(Amb, Word3, ["walked","treaded","grows"]),
call(Amb, Word4, ["slowly","quickly"]),
call(Joins, Word1, Word2),
call(Joins, Word2, Word3),
call(Joins, Word3, Word4).
% Based on the Prolog solution.
amb(E, [E|_]).
amb(E, [_|ES]) :- amb(E, ES).
joins(Left, Right) =>
append(_, [T], Left),
append([R], _, Right),
( T != R -> amb(_, [])
; true ).
% Another approach, using member/2 for
% generating the words.
amb2([],[]).
amb2(Word,Words) :- member(Word,Words).
joins2(Word1,Word2) :- Word1.last() = Word2.first().