2013-07-01 58 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