12

这是我对 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].

感谢您。

4

1 回答 1

19

变量

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

?- [user].
a(V).
Warning: user://1:9:
        Singleton variables: [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 年历史)的答案。请注意,此答案比第一个答案告诉您更多:它不仅更紧凑地向您显示答案替换,而且还告诉您确实有这个答案(仅此而已)。看到最后的点.了吗?这意味着:这里没有更多的答案。否则会有;下一个答案。

于 2013-01-09T18:20:37.623 回答