不使用CLP(FD),您應該使用Prolog的組合能力以適當的方式表達問題和約束。例如,
puzzle(Name) :-
L = [[mason, Pos1, Blond1, Handsome1, UnScared1],
[alex, Pos2, Blond2, Handsome2, UnScared2],
[steve, Pos3, Blond3, Handsome3, UnScared3],
[simon, Pos4, Blond4, Handsome4, UnScared4]
],
permutation([1,2,3,4], [Pos1,Pos2,Pos3,Pos4]),
maplist(yn,
[Blond1, Handsome1, UnScared1,
Blond2, Handsome2, UnScared2,
Blond3, Handsome3, UnScared3,
Blond4, Handsome4, UnScared4
]),
...
每個變量(以大寫字母開頭的那些符號!)是一個人的屬性,並且可以從域中假設一個值。 YN/1這是一個服務的事實,允許這些二進制值的假設是或否:
yn(y).
yn(n).
約束就可以以這種方式(這裏只是第一)
...
% Two of them who are not blond are standing on either side of Mason.
member([mason, I1, _,_,_], L),
member([_, I2, n,_,_], L),
member([_, I3, n,_,_], L),
(I2>I1, I3>I1 ; I2<I1, I3<I1),
...
和表達解決方案將是
% One of them is blond, handsome, and unscarred.
member([Name, _, y, y, y], L).
我不知道我理解每一個約束(英文),實際上我的程序沒有找到解決方案。
該程序相當慢,並要求CLP(FD)。如果您對CLP(FD)解決方案感興趣,請編輯您的問題(例如添加適當的標籤)。
你試過了什麼?請向我們展示您的努力(我們應該在meta上發佈請求,在標記的prolog答案上添加此評論......) – CapelliC 2013-03-14 06:48:01
您有事實列表。您的第一步應該是嘗試將這些事實置入Prolog語法(構建「數據庫」)。之後,開始思考這些事實之間的關係(以謂詞表示)。 – 2013-03-14 08:35:28