如何在Prolog中解释匿名变量?

sanik98

对于给定的程序规则,关于匿名变量在Prolog查询的解析中起什么作用的快速简单的问题。因此,以我了解SLD解析最简单形式的工作方式的方式,通过从一组目标术语(基于选择规则,例如FIRST)中获取一些术语并遍历所有程序规则来构造SLD树,规则的左手边(可以这样说)可以与当前术语统一。统一两个给定项的方法是采用两个项的差集,并查看变量是否可以代替项以使差消失,您可以通过依次获取最左边的单个差并检查两组中是否存在来做到这一点构成差异,

现在,当匿名变量(_)发挥作用时,我怀疑正确而有效地执行此操作的诀窍在于更改确定两个术语之间最左边的差异的方式,以便在其中一个是匿名变量时忽略一对术语。显然,正确的方法是将目标中的_的每个实例重命名,并将程序设置为新的变量名称,然后使用它们进行求解。

实际如何完成?我的想法够用了吗,或者还有更多呢?(此外,如果我理解SLD解析的工作方式中缺少某些东西,禁止取反,调用,封装,算术谓词和更复杂的内容,将不胜感激。)

保罗·莫拉(Paulo Moura)

Prolog匿名变量在SLD解析或术语统一中不起作用,但在Prolog代码和Prolog查询中起着实际作用。匿名变量的一个基本方面是,每次出现的匿名变量都是一个不同的变量。考虑以下查询:

| ?- a(_, _) = a(1, 2).

yes

如果两个匿名变量是同一变量,那么统一将失败。现在考虑查询:

| ?- a(X, _) = a(1, 2).

X = 1
yes

仅报告不是匿名变量的变量的变量绑定。这允许每次我们对变量的任何绑定都不感兴趣时​​使用匿名变量。

匿名变量还简化了谓词定义的编写过程,在这些谓词定义中它们类似地充当“无关紧要”变量。member/2谓词的通常定义为例

member(Element, [Element| _]).
member(Element, [_| List]) :-
    member(Element, List).

在第一个子句中,我们不在乎列表尾部。在第二个子句中,我们不在乎列表头。通过使用匿名变量,我们可以忽略这些子术语,并避免编译器抱怨在子句中将使用一次的变量。

更新资料

请注意,查询中的所有不同变量都将获得唯一的内部变量引用,不要与用户键入的变量名混淆。变量名称仅由顶级解释器用来报告绑定以进行成功查询。用于证明查询的推理机制使用变量(内部)引用。以下查询(将ISO Prolog标准read_term/2谓词与标准选项一起使用)可能会有所帮助:

| ?- read_term(Term, [variable_names(Names), variables(Variables)]).
a(X, _, Y, _).

Names = ['X'=A,'Y'=B]
Term = a(A,C,B,D)
Variables = [A,C,B,D]

yes

在“读取”一词中,有四个不同的变量,但只有两个具有(用户提供)名称。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在匿名函数中访问变量?

来自分类Dev

如何在jQuery中的匿名函数中获取变量?

来自分类Dev

如何在jQuery中的匿名函数中获取变量?

来自分类Dev

如何在匿名函数中访问函数变量

来自分类Dev

如何在自执行匿名函数中访问对象变量

来自分类Dev

谓词“ append / 3”如何与Prolog中的匿名变量一起使用?

来自分类Dev

如何在Prolog中始终用变量替换原子?

来自分类Dev

如何在Windows中使用的Eclipse中设置Prolog解释器路径?

来自分类Dev

如何在匿名函数中使用变量?

来自分类Dev

如何在PROLOG中回溯

来自分类Dev

Javascript:如何更改匿名函数中的变量

来自分类Dev

如何在Elixir中的匿名函数中分配给局部变量?

来自分类Dev

如何在引用循环变量的匿名类中的循环中创建线程?

来自分类Dev

如何在Elixir中的匿名函数中分配给局部变量?

来自分类Dev

如何在匿名函数中引用和分配全局变量?

来自分类Dev

评估(解释)Prolog中的列表

来自分类Dev

如何在Python中解释解释timeit命令

来自分类Dev

如何在Python中解释解释timeit命令

来自分类Dev

如何在PowerShell中创建匿名对象?

来自分类Dev

如何在C中返回匿名结构?

来自分类Dev

如何在C中返回匿名结构?

来自分类Dev

如何在JavaScript中返回匿名对象?

来自分类Dev

如何在R中做匿名向量?

来自分类Dev

如何在Java中终止匿名线程

来自分类Dev

如何在Typescript中扩展匿名类型

来自分类Dev

如何在Protege中添加匿名个人?

来自分类Dev

如何在Java中终止匿名线程

来自分类Dev

如何在匿名类中添加if语句?

来自分类Dev

如何在Haskell中解释callCC?

Related 相关文章

热门标签

归档