39 lines
1008 B
Plaintext
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().
|