我是prolog的新手,我正试图解决以下问题。我很难理解解决问题的逻辑。我知道它类似斑马问题,但我不知道如何接近。任何帮助都将不胜感激。
五名学生在一项教学/教学测验中提出的答案如下。
Teresa: T T F T F
Tim: F T T T F
Tania: T F T T F
Tom: F T T F T
Tony: T F T F T编写一个Prolog程序quiz(Answer),它断言答案是t和f常量的列表,这是对测试的正确答案。
发布于 2015-01-30 08:26:58
如果您使用SWI,您可以使用库clpfd来解决这个难题:,我只得到一个解决方案(f,f,t,f,t)。
你有一个解A,B,C,D,E。你用
[A,B,C,D,E] ins 0..1,例如,您将teresa的所有答案具体化。
teresea([1,1,0,1,0]).
A #= 1 #<==> TA
B #= 1 #<==> TB
.....计算Tis的和
sum([TA, TB, ...], #= , Steresa),之后,你对的回答将比特蕾莎得到更多的答案。
Stania #> Steresa你得到了解决办法
label([A,B,C,D,E]).希望这能有所帮助
发布于 2015-01-30 03:19:35
像这样的小难题可以通过生成和测试来解决。
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中有一个bug,当然有一个解决方案。
编辑好了,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.我在这里用了我的提升机。
https://stackoverflow.com/questions/28224626
复制相似问题