Gur*_* E. 13 prolog prolog-toplevel
以下是我对Prolog变量的理解.
单个下划线代表匿名变量,每次发生时都像一个新变量.
以_W这样的下划线开头的变量名不是匿名变量.或者,Prolog内部生成的变量名称(如_G189)不被视为匿名:
?- append([1,2],X,Y).
X = _G189
Y = [1, 2|_G189]
Run Code Online (Sandbox Code Playgroud)
你能帮我理解一下吗?
顺便说一下,我从一些教程中得到了上面的例子,但是当我在SWI-Prolog版本6中运行它时,我得到以下内容:
?- append([1,2],X,Y).
Y = [1, 2|X].
Run Code Online (Sandbox Code Playgroud)
感谢您.
fal*_*lse 19
匿名变量_
是唯一的变量,其中不同的出现代表不同的变量.其他以变量开头的变量_
不是匿名的.不同的事件引用相同的变量(在同一范围内).但是,像SWI这样的许多Prolog会警告你,如果一个不以下划线开头的变量只出现一次:
?- [user].
a(V).
Warning: user://1:9:
Singleton variables: [V]
Run Code Online (Sandbox Code Playgroud)
您必须重命名该变量_V
以避免该警告.这有助于程序员更好地发现变量名称中的拼写错误.在许多系统中还有一些这样的限制.
a(_V,_V).
Warning: user://1:12:
Singleton-marked variables appearing more than once: [_V]
Run Code Online (Sandbox Code Playgroud)
同样,这只是一个警告.如果您希望以变量开头的变量_
应该出现两次(没有警告),请__
改为编写.但是如果没有首发,最好坚持更有意义的名字_
.
你从Prolog的顶级循环得到的是答案; 特别是回答替换.它们用于表示解决方案(这是我们真正感兴趣的).有多种方法可以表示答案替换.您正在使用的教程似乎是指一个非常旧的SWI版本.我想说这个版本可能是15到20岁.
?- append([1,2],X,Y).
X = _G189
Y = [1, 2|_G189]
Run Code Online (Sandbox Code Playgroud)
但是,给出的答案并不正确:_G189
引入了一个新的辅助变量.
较新版本的SWI和许多其他系统试图最小化输出,避免辅助变量.所以
?- append([1,2],X,Y).
Y = [1, 2|X].
Run Code Online (Sandbox Code Playgroud)
也一样好.它是"更新"版本(也是6年前的版本)的答案.需要注意的是这个答案告诉你,比第一个更:它不仅告诉你答案替代更紧凑,但它也告诉你,有恰好这一个答案(没有更多).看到最后的点.
?这意味着:这里没有更多回答.否则会有;
下一个答案.