nic*_*ole 5 logic artificial-intelligence prolog gnu-prolog
我正在尝试编写一个 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).
Run Code Online (Sandbox Code Playgroud)
这很草率,但我想说最重要的是第 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
Run Code Online (Sandbox Code Playgroud)
我担心的是true?
声明。如果我只是按回车键,yes
就会出现,但是说类似的话a
会导致无限循环,在“true”再次出现之前,每轮调用堆栈都会变得越来越大。这里发生了什么?我认为查询的成功“确认”将意味着事情的结束。我看不到更多要检查的变量!
true
vsyes
用于区分哪里可能有更多解决方案。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)
...
Run Code Online (Sandbox Code Playgroud)
(注:使用SWI-Prolog获得的迹线,请忽略微小差异)