2013-07-01 48 views
3

我正在嘗試編寫一個gprolog程序,確認從this歌曲(收聽here :-))獲得一些「合理的」背景後,當我查詢grandpa(me, me)(即,我的確是我自己的爺爺?)時,會回答「是」。這是作爲我的AI類的任務給出的,我們需要自己決定包含哪些事實和謂詞。雖然它充滿了冗餘和我不使用的一些條款(一些僅僅是爲了歌曲),但這裏是我扔在一起的,必要的假設是繼子女被認爲是完全/普通兒童:gprolog說「真的?」是什麼意思?而不是在這個例子中「是」?

3 male(me). 
    4 male(mydad). 
    5 male(mybaby). 
    6 female(widow). 
    7 female(redhead). 
    8 grandma(Z, X) :- female(Z), child(Z, Y), child(Y, X).   
    9 grandpa(Z, X) :- male(Z), child(Z, Y), child(Y, X).   
10 child(me, mydad). 
11 child(redhead, widow). 
12 child(mybaby, me). 
13 child(A, B) :- married(B, C), married(A, D), child(D, C). 
14 child(C, A) :- married(A, B), child(C, B). %step children as children 
15 married(me, widow). 
16 married(widow, me). 
17 married(mydad, redhead). 

這是草率的,但我想說的最重要的事情是第13及14。特別是,14名試圖保證,例如,我的父親是我的孩子,因爲他娶了我的繼子,因此我女婿。

反正跟蹤顯示運行查詢,似乎工作 - 種:

{trace} 
| ?- grandpa(me, me). 
     1 1 Call: grandpa(me,me) ? 
     2 2 Call: male(me) ? 
     2 2 Exit: male(me) ? 
     3 2 Call: child(me,_366) ? 
     3 2 Exit: child(me,mydad) ? 
     4 2 Call: child(mydad,me) ? 
     5 3 Call: married(me,_415) ? 
     5 3 Exit: married(me,widow) ? 
     6 3 Call: married(mydad,_440) ? 
     6 3 Exit: married(mydad,redhead) ? 
     7 3 Call: child(redhead,widow) ? 
     7 3 Exit: child(redhead,widow) ? 
     4 2 Exit: child(mydad,me) ? 
     1 1 Exit: grandpa(me,me) ? 

true ? 

(2 ms) yes 

我關注的是true?聲明。如果我只是按回車鍵,出現yes,但是說出類似a的內容會導致無限循環,並且在每次出現「真」再次出現之前,調用堆棧會逐漸變大和變大。這裏發生了什麼?我認爲對查詢的成功「確認」意味着事情的結束。我沒有看到更多的變量需要檢查!

回答

0

true vs yes用於區分哪裏可以有更多的解決方案。 Prolog可以檢查證明堆棧,尋找選擇點,即仍有待反駁的替代計算正在等待的地方。

擊中a,你強調主循環,導致了悖論:

... 
    Redo: (31) child(redhead, me) 
    Call: (32) married(me, _G2289) 
    Exit: (32) married(me, widow) 
    Call: (32) child(redhead, widow) 
    Exit: (32) child(redhead, widow) 
    Exit: (31) child(redhead, me) 
    Exit: (30) child(redhead, widow) 
    Exit: (29) child(redhead, me) 
    Exit: (28) child(redhead, widow) 
... 

(注:與SWI-Prolog的獲得跟蹤,請忽略小的差異)

+0

我不知道我的理解你在講些什麼。 – nicole