问题 Prolog匿名变量


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

感谢您。


7994
2018-01-09 15:18


起源



答案:


变量

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

?- [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年前的版本)的答案。请注意,这个答案告诉你的不仅仅是第一个答案:它不仅更紧凑地向你显示答案替换,而且它还告诉你有 究竟 这一个答案(而不是更多)。看点 . 最后?这意味着:这里没有更多回答。否则会有一个 ; 为下一个答案。


16
2018-01-09 18:20



很好的回复:-)))))))) - Gurkan E.


答案:


变量

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

?- [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年前的版本)的答案。请注意,这个答案告诉你的不仅仅是第一个答案:它不仅更紧凑地向你显示答案替换,而且它还告诉你有 究竟 这一个答案(而不是更多)。看点 . 最后?这意味着:这里没有更多回答。否则会有一个 ; 为下一个答案。


16
2018-01-09 18:20



很好的回复:-)))))))) - Gurkan E.