【发布时间】:2014-04-13 02:01:29
【问题描述】:
我是 Prolog 的新手,我正在尝试从列表中删除最后一个元素。我试过的代码:
removeLast([],[_]).
removeLast([_|T], [_|OT]):-removeLast(T, OT).
从here 获得。我从 SWi Prolog 执行了代码,得到了一个奇怪的输出......
1 ?-
| removeLast(X, [1,2,3,4]).
X = [_G299, _G302, _G305] .
这应该显示 [1,2,3],而不是显示一些数字(?)
我不知道我做错了什么,为什么它以这种格式显示?我尝试了所有我知道的谷歌组合来搜索这个词,尽管我看到人们在他们的查询中直接使用这种格式,比如parent(X, _G3248)。
更新:感谢@lurker,将代码修改为原始格式可以正确输出:
removeLast([],[_]).
removeLast([X|T], [X|OT]):-removeLast(T, OT).
15 ?- removeLast(X, [1,2,3,4]).
X = [1, 2, 3]
但是谁能解释一下,_G3240 是什么?
【问题讨论】:
-
您编写的内容与您提供的链接中的代码不同。你为什么在第二个子句中使用
_,你知道什么时候这样做合适吗?链接中的解决方案没有在第二个子句中使用它是有原因的。 -
如有错误请指正。正如我所说,我是序言的新手。我知道
_用于空占位符?就像我不想在那里使用“未使用的变量”一样? -
对。这是一个“占位符”,在这种情况下,每个
_都是不同的。但是,在原始解决方案中,它在两个地方都使用了X。这两个地方的价值相同,而且非常重要。它不是未使用的。当一个变量在一个子句中出现多次时,它的值在所有情况下都被实例化。这就是为什么原始解决方案在第二个子句中没有使用_的原因。你可以发送trace看看会发生什么。 -
@lurker 我修改了代码,得到了输出。你能解释一下是 _G302吗?它的名称是什么,何时何地使用?
-
_G302等是 SWI Prolog 显示“无关”变量的方式,但可能有几个不同的变量。所以他们有不同的数字。您的第一次尝试生成了几个“无关”变量。在提示符下试试这个:X = [_,_,_]..