2013-03-14 52 views
0

請你能解釋一下我在Prolog上編寫這個東西的方法是什麼?如何在Prolog上對此進行編碼?

梅森,亞歷克斯,史蒂夫, 和西蒙弧站在一個警察陣容。其中之一是金髮碧眼,英俊無辜。兩個不是金髮女郎的 站在梅森的兩邊。亞歷克斯是唯一站在 旁邊的一個英俊男子。史蒂夫是唯一一個不站在一個疤痕的 男人旁邊的人。誰是金髮碧眼,英俊而不害怕?

我這裏有,

p - >站(X,Y)

twoOfThem(未金髮,站在梅森的任一側)

standing(mason,[x,y]):- 
     blond([x,y]) == false. 

亞歷僅一個站在旁邊正好一個英俊的

standing(alex,x):- 
     handsome(x). 

史蒂夫只是不站在無辜的旁邊。

standing(steve,x):- 
     unscared(x). 
+2

你試過了什麼?請向我們展示您的努力(我們應該在meta上發佈請求,在標記的prolog答案上添加此評論......) – CapelliC 2013-03-14 06:48:01

+1

您有事實列表。您的第一步應該是嘗試將這些事實置入Prolog語法(構建「數據庫」)。之後,開始思考這些事實之間的關係(以謂詞表示)。 – 2013-03-14 08:35:28

回答

0

不使用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)解決方案感興趣,請編輯您的問題(例如添加適當的標籤)。