像这样的小谜题可以通过生成和测试来解决
solve(L) :-
% generator
length(L, 5), maplist(tf, L),
% Tania got more answers right than Teresa did.
matches(L, tania, Tania),
matches(L, teresa, Teresa), Tania > Teresa,
...
tf(t).
tf(f).
teresa(t, t, f, t, f).
tim(f, t, t, t, f).
...
当然,matches(L, tania, Tania)
计算正确塔尼亚的答案。
但是,我没有找到解决方案。唯一“通过”托尼的元组,这是它的确切结果。所以,这个条件
托尼没有得到所有正确的答案
无法解决...
编辑我在matches / 3中有一个错误。当然有解决办法。
编辑好,CLP(FD) 版本可以非常紧凑,同时更通用...
teresa(t, t, f, t, f).
...
matches(L, P, N) :-
call(P, A,B,C,D,E),
foldl(eqsum, [A,B,C,D,E], L, 0, N).
eqsum(t,Ls,Acc,N) :- N #= Acc + (° #<==> Ls #= 1).
eqsum(f,Ls,Acc,N) :- N #= Acc + (° #<==> Ls #= 0).
solve(L) :-
length(°L, 5) ins 0..1,
% Tania got more answers right than Teresa did.
matches(L, tania, °) #> matches(L, teresa, °),
% Tom got more right than Tim.
matches(L, tom, °) #> matches(L, tim, °),
% Tony did not get all the answers right, nor did he get them all wrong.
matches(L, tony, °Tony) #> 0, Tony #< 5.
我在这里使用了我的升降机。