知识库:
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)的调用。
发布于 2021-09-14 10:39:07
在内部,Prolog引擎不使用变量名,变量只是内存中特殊类型单元的地址。因此,当它在跟踪过程中需要表示一个术语时,它必须重建其文本表示,并且由于没有名称,因此它只需按升序对所有变量进行编号,就可以以统一的方式生成这些名称。你可能会问,为什么它不将名称保存为元数据-答案是它可以做到这一点,但它没有意义,因为由于可能的递归,它将需要创建相同变量的“副本”,并且我们再次得出泛型命名的必要性。
https://stackoverflow.com/questions/69134347
复制相似问题