当gprolog说"是真的是什么意思?"而不是"是"在这种情况下?

时间:2013-07-01 20:59:44

标签: prolog logic artificial-intelligence gnu-prolog

我正在尝试编写一个gprolog程序,该程序确认,鉴于来自this歌曲的一些“合理”背景(听here :-)),当我查询{{1}时,它会回答是(我的确是我自己的爷爷吗?)。这是作为我的AI课程的作业,我们自己决定要包括哪些事实和谓词。虽然它充满了冗余和一些我不使用的条款(有些只是为了这首歌),但这是我把它们放在一起的必要假设,即步子女被认为是完整的/普通的孩子: / p>

grandpa(me, me)

这很草率,但我会说最重要的是第13和第14条。特别是14次尝试确保,例如,我的父亲是我的孩子,因为他嫁给了我的继子,因此是我的儿子-法。

无论如何,跟踪显示运行查询似乎有效 - 有点:

  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).

我关注的是{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 声明。如果我只按Enter键,true?会出现,但是说yes之类的内容会导致无限循环,每次回合之前调用堆栈会变得越来越大,然后再出现“true”。这里发生了什么?我认为对查询的成功“确认”意味着事情的结束。我没有看到更多要检查的变量!

1 个答案:

答案 0 :(得分: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获得的痕迹,请忽略小的差异)