2013-03-15 61 views
1

我想了解這個prolog程序是如何工作的,而且作爲初學者,我遇到了一些困難。程序如下:列表上的序言遞歸

initialCan([w, b, w, w, w]). 
scholten([X], X). 
scholten([X, X | Z], Answer) :- scholten([b | Z], Answer). 
scholten([X, Y | Z], Answer) :- scholten([w | Z], Answer). 
run(Answer) :- initialCan(L), scholten(L, Answer). 

這是從第一個解決方案運行它的痕跡。

{trace} 
| ?- run(A). 
     1 1 Call: run(_17) ? 
     2 2 Call: initialCan(_84) ? 
     2 2 Exit: initialCan([w,b,w,w,w]) ? 
     3 2 Call: scholten([w,b,w,w,w],_17) ? 
     4 3 Call: scholten([w,w,w,w],_17) ? 
     5 4 Call: scholten([b,w,w],_17) ? 
     6 5 Call: scholten([w,w],_17) ? 
     7 6 Call: scholten([b],_17) ? 
     7 6 Exit: scholten([b],b) ? 
     6 5 Exit: scholten([w,w],b) ? 
     5 4 Exit: scholten([b,w,w],b) ? 
     4 3 Exit: scholten([w,w,w,w],b) ? 
     3 2 Exit: scholten([w,b,w,w,w],b) ? 
     1 1 Exit: run(b) ? 

A = b ? 

我很難理解的事情是如何遞歸調用工作。究竟發生了什麼

scholten([X, X | Z], Answer) :- scholten([b | Z], Answer). 

什麼是最容易混淆的是[X,X | Z]和[b | Z]。任何幫助,將不勝感激。

回答

0

有關規則說,如果scholten看到一個以兩個相同元素開頭的列表,則需要用單個b替換這兩個元素。列表[b | Z][X, X | Z]短一個元素。

注意以下

scholten([X, Y | Z], Answer) :- scholten([w | Z], Answer). 

的規則有一個單(即不使用其他任何地方)可變Y。你應該改變規則

scholten([X, Y | Z], Answer) :- X \= Y, scholten([w | Z], Answer). 

確保X不等於Y,防止該規則從相同的參數匹配的[X, X | Z]之一。

+0

謝謝,這有很大的幫助。我無法圍繞它檢查前兩個元素是相同還是不同的事實。 – user1739558 2013-03-15 01:54:27