【发布时间】:2021-11-07 01:46:18
【问题描述】:
知识库:
child(martha,charlotte).
child(charlotte,caroline).
child(caroline,laura).
child(laura,rose).
descend(X,Y) :- child(X,Y).
descend(X,Y) :- child(X,Z),
descend(Z,Y).
查询:descend(martha, laura).
Prolog 首先调用 child(martha, laura) 失败然后返回到descend(martha, laura)。
现在,它需要调用 child(martha, Z) 来检查条件,但为什么需要将 Z 赋予另一个变量,例如 _2978?我认为只调用(或查询)child(martha, Z) 就可以了。
追踪:
Call: (8) descend(martha, laura) ? creep
Call: (9) child(martha, laura) ? creep
Fail: (9) child(martha, laura) ? creep
Redo: (8) descend(martha, laura) ? creep
Call: (9) child(martha, _2978) ? creep % HERE, why does Prolog
% need this extra variable
% _2978 instead of
% utilizing the original Z variable?
Exit: (9) child(martha, charlotte) ? creep
一个更简单的例子:
我有知识库:numeral(0)
然后我查询numeral(X)。在跟踪过程中,我可以看到第一个调用是numeral(_3233)。
【问题讨论】:
-
你知道可变变量和不可变变量的区别吗?你知道绑定和不绑定是什么意思吗?当您知道这些问题的答案时,您将更接近于回答您的问题。
-
@GuyCoder 你能把我链接到Prolog中的一些好的参考吗?我的书没有涵盖它们,我在网上找不到好的参考资料。虽然我确实知道其他语言环境中的可变性。
-
如果每个实例都使用相同的变量名,你将如何处理递归?
-
@GuyCoder 当我还在为我大学的另一门课程学习 Java 时,忘记 OO 很困难。
-
为什么有人对这个寻求推荐的人投了赞成票。这个问题的推荐请求在哪里?
标签: prolog