我是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是什么?
答案 0 :(得分:1)
这里是解决方案行为的差异。让我们来解决这个问题。
removeLast([],[_]).
这条规则说如果我有一个元素的列表,那么删除了最后一个元素的相应列表是[]
而我并不关心那个元素是什么(它甚至可能是一个变量)。这是真的,也是一个有效的规则。
removeLast([_|T], [_|OT]) :- removeLast(T, OT).
此规则表明[_|T]
为[_|OT]
,如果我不关心他们的第一个元素是什么,T
是OT
,那么删除最后一个元素删除最后一个元素(遵循相同的规则)。这听起来不太对劲。这意味着如果我从列表中删除最后一个元素,我就不在乎我的结果中有哪些元素。因此,您将获得一个任意列表,其元数比原始列表少一个。但这些元素与原始列表前面的元素不匹配。在Prolog中,两个_
实例是不同的匿名变量。它们不统一。
更正后的条款是:
removeLast([X|T], [X|OT]) :- removeLast(T, OT).
这表示列表[X|T]
是列表[X|OT]
,其最后一个元素已删除如果 T
是列表OT
及其最后一个元素已删除。公共X
意味着它们共享列表的相同头部,这是正确的。当递归到达第二个参数的最后一个元素时,第一个子句匹配,并且单个元素尾部被空列表[]
替换。然后你得到正确的最终结果。
我将_
变量称为"匿名"而不是"不关心"因为匿名变量有一些用途,其值很重要。通常,在这种情况下,它们在未使用值时使用。