对于给定的程序规则,关于匿名变量在Prolog查询的解析中起什么作用的快速简单的问题。因此,以我了解SLD解析最简单形式的工作方式的方式,通过从一组目标术语(基于选择规则,例如FIRST)中获取一些术语并遍历所有程序规则来构造SLD树,规则的左手边(可以这样说)可以与当前术语统一。统一两个给定项的方法是采用两个项的差集,并查看变量是否可以代替项以使差消失,您可以通过依次获取最左边的单个差并检查两组中是否存在来做到这一点构成差异,
现在,当匿名变量(_)发挥作用时,我怀疑正确而有效地执行此操作的诀窍在于更改确定两个术语之间最左边的差异的方式,以便在其中一个是匿名变量时忽略一对术语。显然,正确的方法是将目标中的_的每个实例重命名,并将程序设置为新的变量名称,然后使用它们进行求解。
实际如何完成?我的想法够用了吗,或者还有更多呢?(此外,如果我理解SLD解析的工作方式中缺少某些东西,禁止取反,调用,封装,算术谓词和更复杂的内容,将不胜感激。)
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] 删除。
我来说两句