2010-12-08 29 views
0

從舊的決賽,我的課:Prolog的代碼示例:統一

下面是一些序言代碼:

mystery(1, 1). 
mystery(N, F) :- 
    N1 is N-1, 
    mystery(N1,F1), 
    F is F1*N. 

問題1:在

mystery(3, P). 

是統一的P什麼樣的價值問題2:如果在Prolog產生並回答神祕之後按分號,並且解釋器最終將報告「錯誤:超出本地堆棧」。爲什麼會發生這種情況,以及如何修改謎題以避免錯誤?


問題1: 我得到

P = 6 ? 

問題2: 如果我按分號得到所有的答案,我得到了本地堆棧錯誤的。 我不確定這段代碼試圖完成什麼或如何解決它,所以我不走出本地堆棧。有任何想法嗎?

+0

您對「問題1」有疑問嗎?你明白爲什麼答案是6嗎? – aschepler 2010-12-08 22:32:21

回答

2

的出棧的錯誤可能是因爲,當你坐下來mystery(1, F1)解析爲mystery(1, 1),並要求更多的解決方案,擊打的條款,這就要求mystery(0, F1)。此時,它試圖找到一個解決方案,但唯一匹配mystery(-1, F1)調用的子句,並且要求mystery(-2, F1)等等。這意味着有匹配會被調用,直到第一個數字包裝爲1或者您會發生堆棧溢出爲止,因爲每個待處理的匹配都會佔用堆棧空間。

0

@David Thornley已經解釋了爲什麼尋找更多答案會炸燬你的堆棧。您可以通過使用切運營商解決它:

mystery(1, F) :- !, F is 1. 
mystery(N, F) :- 
    N1 is N-1, 
    mystery(N1,F1), 
    F is F1*N. 

切割位置使得它如此,如果第一個參數是1,可能不會應用第二條規則。