[英]Prolog: Solving a Puzzle
我是prolog的新手,正在嘗試解決以下問題。 我很難理解解決問題的邏輯。 我知道它類似於斑馬問題,但是我不確定該如何處理。 任何幫助將不勝感激。
由五名學生提交給T / F測驗的答案如下。
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)
,斷言Answer是t
和f
常數的列表,這是對測驗的正確答案。
如果您使用SWI-Prolog,則可以使用庫clpfd來解決這個難題:,我只有一個解決方案(f,f,t,f,t)。
您有解決方案[A,B,C,D,E]。 您可以使用初始化可能的解決方案
[A,B,C,D,E] ins 0..1,
例如,您對特蕾莎修整的所有答案
teresea([1,1,0,1,0]).
A #= 1 #<==> TA
B #= 1 #<==> TB
.....
您計算Tis的總和
sum([TA, TB, ...], #= , Steresa),
后來您將為Tania獲得比Teresa正確的答案。
Stania #> Steresa
您得到的解決方案
label([A,B,C,D,E]).
希望這可以幫助
這樣的小難題可以通過生成和測試來解決
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)
正確的Tania答案。
但是,我找不到解決方案。 唯一通過“托尼”的元組,這就是它的確切結果。 因此,這種情況
托尼沒有正確回答所有問題
無法解決...
編輯我在matchs / 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.
我在這里用過我的升降器 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.