在这种情况下,gprolog 说"true?"而不是"yes"是什么意思?



我正试图编写一个gprolog程序,该程序确认,在给定这首歌的一些"合理"背景(听这里:-)的情况下,当我查询grandpa(me, me)时,会回答是(即,我真的是我自己的爷爷吗?)。这是我的人工智能课的一项作业,我们自己决定要包括哪些事实和谓词。尽管它充满了冗余和一些我没有使用的条款(有些只是为了这首歌),但以下是我拼凑的内容,并有必要假设继子女被视为完整/普通子女:

  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"再次出现之前,调用堆栈每轮都会越来越大。这是怎么回事?我认为查询的成功"确认"将意味着事情的结束。我看不到更多要检查的变量了!

trueyes用于区分哪里可以有更多的解决方案。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获得的跟踪,请忽略微小差异)

相关内容

  • 没有找到相关文章

最新更新