作者:萝莉控的许123321 | 来源:互联网 | 2022-12-05 14:43
来自Bratko的书,人工智能的Prolog编程(第4版)
我们有以下代码不起作用 -
anc4(X,Z):-
anc4(X,Y),
parent(Y,Z).
anc4(X,Z):-
parent(X,Z).
在第55页的图书中,图2.15显示了parent(Y,Z)
在堆栈内存不足之前一直保持调用.
我不明白的是,prolog首先对anc4(X,Y)进行recursiv调用,而不是父对象(Y,Z).为什么prolog不会反复到第一行,anc4(X,Y)
而是转到第二行?
你能否详细说明为什么这条线parent(Y,Z)
被称为?
谢谢.
1> CapelliC..:
你的"问题"(即目标顺序)的起源深深植根于语言的基础.
Prolog基于时间顺序回溯的简单而有效的策略,实现SLD解析,并留下递归子句,例如anc4/2
,导致无限递归.实际上,逗号运算符(,)/2
代表
仅当左表达式成立时才评估正确的表达式
因此,条款中的目标顺序实际上是该计划的重要部分.
对于你的具体案例,
... , parent(Y,Z).
如果不能被调用
anc4(X,Y),
不成立.
目标顺序的对应物是子句顺序.
也就是说,在交换子句之后,整个程序具有不同的语义:
anc4(X,Z):-
parent(X,Z).
anc4(X,Z):-
anc4(X,Y),
parent(Y,Z).
为了更好地理解这个问题,我认为也值得尝试这个定义.