首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么Prolog在查询时会生成额外的变量?

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

Stack Overflow用户
提问于 2021-09-10 15:11:34
回答 1查看 67关注 0票数 4

知识库:

代码语言:javascript
复制
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)就可以了。

跟踪:

代码语言:javascript
复制
   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)的调用。

EN

回答 1

Stack Overflow用户

发布于 2021-09-14 10:39:07

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69134347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档