Prolog没有以正确的格式显示输出

时间:2014-04-13 02:01:29

标签: list prolog output

我是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),但我尝试了我所知道的每个Google组合来搜索这个术语。

更新:感谢@lurker,将代码修改为原始格式会正确显示输出:

removeLast([],[_]).
removeLast([X|T], [X|OT]):-removeLast(T, OT).

15 ?- removeLast(X, [1,2,3,4]).
X = [1, 2, 3] 

但有人可以解释一下,_G3240是什么?

1 个答案:

答案 0 :(得分:1)

这里是解决方案行为的差异。让我们来解决这个问题。

removeLast([],[_]).

这条规则说如果我有一个元素的列表,那么删除了最后一个元素的相应列表是[]而我并不关心那个元素是什么(它甚至可能是一个变量)。这是真的,也是一个有效的规则。

removeLast([_|T], [_|OT]) :- removeLast(T, OT).

此规则表明[_|T][_|OT],如果我不关心他们的第一个元素是什么,TOT,那么删除最后一个元素删除最后一个元素(遵循相同的规则)。这听起来不太对劲。这意味着如果我从列表中删除最后一个元素,我就不在乎我的结果中有哪些元素。因此,您将获得一个任意列表,其元数比原始列表少一个。但这些元素与原始列表前面的元素不匹配。在Prolog中,两个_实例是不同的匿名变量。它们不统一。

更正后的条款是:

removeLast([X|T], [X|OT]) :- removeLast(T, OT).

这表示列表[X|T]是列表[X|OT],其最后一个元素已删除如果 T是列表OT及其最后一个元素已删除。公共X意味着它们共享列表的相同头部,这是正确的。当递归到达第二个参数的最后一个元素时,第一个子句匹配,并且单个元素尾部被空列表[]替换。然后你得到正确的最终结果。

我将_变量称为"匿名"而不是"不关心"因为匿名变量有一些用途,其值很重要。通常,在这种情况下,它们在未使用值时使用。