gpt4 book ai didi

prolog - 为什么 Prolog 在查询时会生成额外的变量?

转载 作者:行者123 更新时间:2023-12-04 13:24:51 26 4
gpt4 key购买 nike

知识库:

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 (玛莎,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) .

最佳答案

Prolog 引擎内部不使用变量名,变量只是内存中特殊类型单元格的地址。因此,当它需要在跟踪过程中表示一个术语时,它必须重建其文本表示,并且由于没有名称,它只需按升序编号即可为所有变量以统一的方式生成它们。您可能会问为什么它不将名称保留为元数据 - 答案是它可以这样做,但没有意义,因为由于可能的递归,它需要创建相同 var 的“副本”,我们再次来到通用命名的必要性。

关于prolog - 为什么 Prolog 在查询时会生成额外的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69134347/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com