[英]What does it mean when gprolog says “true?” instead of “yes” in this instance?
我正在嘗試寫一個gprolog程序,確認一下,鑒於這首歌的一些“合理”背景(聽這里 :-)),當我查詢grandpa(me, me)
時會回答是(即,我確實是我自己的爺爺?)。 這是作為我的AI課程的作業,我們自己決定要包括哪些事實和謂詞。 雖然它充滿了冗余和一些我不使用的條款(有些僅僅是為了歌曲),但這里是我一起投入的,並且必須假設步子被認為是完整的/普通的孩子:
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
導致無限循環,與調用堆棧越來越有點過了越來越大的每一輪“真”再次出現。 這里發生了什么? 我認為對查詢的成功“確認”意味着事情的結束。 我沒有看到任何更多變量要檢查!
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獲得的痕跡,請忽略小的差異)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.