【问题标题】:What does it mean when gprolog says "true?" instead of "yes" in this instance?gprolog 说“真的”是什么意思?在这种情况下,而不是“是”?
【发布时间】:2013-06-29 02:43:54
【问题描述】:

我正在尝试编写一个 gprolog 程序,该程序确认,鉴于 this 歌曲(听 here :-) 的一些“合理”背景,当我查询 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”再次出现之前,调用堆栈在每一轮都变得越来越大。这里发生了什么?我认为查询的成功“确认”将意味着事情的结束。我没有看到更多要检查的变量!

【问题讨论】:

    标签: prolog logic artificial-intelligence gnu-prolog


    【解决方案1】:

    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 获得的迹线,请忽略细微差别)

    【讨论】:

    • 我不确定我明白你在说什么。
    猜你喜欢
    • 2020-04-04
    • 2017-03-28
    • 2016-08-26
    • 2014-10-27
    • 2019-10-15
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    相关资源
    最近更新 更多