2013-04-06 79 views
0

我一直在使用類似這樣的鏈接代碼嘗試:在prolog中解決導致錯誤?

Solving a textual logic puzzle in Prolog - Find birthday and month

我試圖解決的問題是這樣的(電話交談)。 http://www.cis.upenn.edu/~matuszek/cis554-2012/Assignments/prolog-01-logic-puzzle.html

我的代碼:

dated(Date):- 
member(Date,[1928,1929,1932,1935]). 
exchanged(Exchange):- 
member(Exchange,[al,be,pe,sl]). 

solve(X):- 
X=[[gertie,Exchange1,Date1], 
    [herbert,Exchange2,Date2], 
    [miriam,Exchange3,Date3], 
    [wallace,Exchange4,Date4]], 

exchanged(Exchange1), exchanged(Exchange2), exchanged(Exchange3), exchanged(Exchange4), 
Exchange1 \== Exchange2, Exchange1 \== Exchange3, Exchange1 \== Exchange4, 
Exchange2 \== Exchange1, Exchange2 \== Exchange3, Exchange2 \== Exchange4, 
Exchange3 \== Exchange1, Exchange3 \== Exchange2, Exchange3 \== Exchange4, 
Exchange4 \== Exchange1, Exchange4 \== Exchange2, Exchange4 \== Exchange3, 

dated(Date1), dated(Date2), dated(Date3), dated(Date4), 
Date1 \== Date2, Date1 \== Date3, Date1 \== Date4, 
Date2 \== Date1, Date2 \== Date3, Date2 \== Date4, 
Date3 \== Date1, Date3 \== Date2, Date3 \== Date4, 
Date4 \== Date1, Date4 \== Date2, Date4 \== Date3, 

%Herbet's first exchange wasn't for BE 
Exchange2 \== be, 

%The Person whose first exchange was SL wasn't Getie or Herbert 
Exchange1 \== sl, 
Exchange2 \== sl, 

%The person whose first exchange was BE didn't get the phone in 1935 
member([_,be, \+1935], X), 

%The person who got the first phone in 1932 didn't have an exchange for AL or BE 
member([_, \+al, 1932], X), 
member([_, \+be, 1932],X), 

%The person who got the first phone in 1928 had an exchange for PE 
member([_,pe,1929], X), 

%Wallace first exchange was AL 
Exchange4 == al. 

我的問題是這樣的:

?- solve(X). 
false. 

回答

1

所以你的問題是,你的solve謂詞沒有找到任何解決方案。這意味着,找到解決方案的先決條件之一就是解決方案樹中所有可能的路徑失敗。

你真的試過去搜索它是哪一個嗎?當然不會,否則你會注意到這一點:

member([_,be,\+1935],X) 

總是失敗。爲什麼?什麼是\+/1? 「\+ :目標爲真如果目標不能被證明」。換句話說,你不能使用\+進行匹配。取而代之的是,你可以寫:

\+ member([_,be,1935),X). 

因此,所有的更正:

?- solve(X). 
X = [[gertie, be, 1928], [herbert, pe, 1929], [miriam, sl, 1932], [wallace, al, 1935]] ; 
false. 

假設程序的其餘部分是正確的。

使用stackoverflow替代調試代碼是非常糟糕的。

+0

對不起,我不知道如何使用SWI序言正是調試。我對聲明式編程完全陌生!感謝您的回覆 - 是的,我也嘗試過搜索它 – 2013-04-06 23:05:24

+0

@AlexCutajar我試圖展示我發現程序出了什麼問題的方式,以便您可以自己做。而且,不管語言如何,在程序中發現問題都是你必須學會​​如何去做的。 – 2013-04-07 01:11:38

0

而不是

exchanged(Exchange1), exchanged(Exchange2), exchanged(Exchange3), exchanged(Exchange4), 
Exchange1 \== Exchange2, Exchange1 \== Exchange3, Exchange1 \== Exchange4, 
Exchange2 \== Exchange1, Exchange2 \== Exchange3, Exchange2 \== Exchange4, 
Exchange3 \== Exchange1, Exchange3 \== Exchange2, Exchange3 \== Exchange4, 
Exchange4 \== Exchange1, Exchange4 \== Exchange2, Exchange4 \== Exchange3, 

dated(Date1), dated(Date2), dated(Date3), dated(Date4), 
Date1 \== Date2, Date1 \== Date3, Date1 \== Date4, 
Date2 \== Date1, Date2 \== Date3, Date2 \== Date4, 
Date3 \== Date1, Date3 \== Date2, Date3 \== Date4, 
Date4 \== Date1, Date4 \== Date2, Date4 \== Date3, 

你可以寫

permutation([al,be,pe,sl], [Exchange1, Exchange2, Exchange3, Exchange4]), 
permutation([1928,1929,1932,1935], [Date1, Date2, Date3, Date4]), 
+0

感謝您的信息! – 2013-04-06 23:05:40