Prolog匿名变量

13

这是我对Prolog变量的理解:

  1. 单个下划线代表匿名变量,每次出现时就像一个新的变量。

  2. 以下划线开头的变量名,比如_W,并不是匿名变量。或者在Prolog中生成的变量名(比如_G189),也不被视为匿名变量:

?- append([1,2],X,Y).
X = _G189
Y = [1, 2|_G189]

请问您能帮我理解吗?

顺便说一下,我从某些教程中拿到了上面的例子,但是当我在SWI-Prolog版本6中运行它时,我得到了以下结果:

?- append([1,2],X,Y).
Y = [1, 2|X].

谢谢你。

1个回答

19

变量

匿名变量_是唯一一个不同出现代表不同变量的变量。以_开头的其他变量不是匿名的。不同的出现指向同一个变量(在同一范围内)。然而,许多像SWI这样的Prolog会警告您如果一个不以下划线开头的变量只出现一次:

?- [user].
a(V).
Warning: user://1:9:
        Singleton variables: [V]
你需要将那个变量重命名为_V以避免该警告。这有助于程序员更好地发现变量名称中的拼写错误。许多系统中都有类似的限制。

你需要将那个变量重命名为_V以避免该警告。这有助于程序员更好地发现变量名称中的拼写错误。许多系统中都有类似的限制。

a(_V,_V).
Warning: user://1:12:
        Singleton-marked variables appearing more than once: [_V]

再次强调,这只是一个警告。如果您希望以_开头的变量出现两次(无警告),请改为写__。但最好使用更有意义的名称,不要以_开头。

答案

从Prolog的顶层循环中获取的是答案;特别地,是答案替换。它们用于表示解决方案(这是我们真正感兴趣的)。有几种方法可以表示答案替换。您正在使用的教程似乎是针对非常旧的SWI版本。我会说这个版本可能已经15到20年了。

?- append([1,2],X,Y).
X = _G189
Y = [1, 2|_G189]

然而,给出的答案并不是错误的:引入了一个新的辅助变量_G189

SWI的新版本和许多其他系统试图最小化输出,避免使用辅助变量。所以

?- append([1,2],X,Y).
Y = [1, 2|X].

也是可以的。这是一个“更新”的版本的答案(也有大约6年的历史)。注意,这个答案比第一个答案告诉你更多:它不仅以更简洁的方式展示了答案替换,还告诉你只有确切地这一个答案(没有更多了)。看见最后的点 . 了吗?这意味着:这里没有更多需要回答的了。否则会有 ; 来表示下一个答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接