我是Prolog的新手,我正尝试从列表中删除最后一个元素。我尝试过的代码:
removeLast([],[_]).
removeLast([_|T], [_|OT]):-removeLast(T, OT).
从这里获得。我从SWi Prolog执行了代码,却得到了一个奇怪的输出...
1 ?-
| removeLast(X, [1,2,3,4]).
X = [_G299, _G302, _G305] .
应该显示[1,2,3],而是显示一些数字(?)
我不知道我在做什么错,为什么它以这种格式显示?尽管有人看到人们在查询中直接使用这种格式,但我尝试了所有我知道的Google组合来搜索该词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是什么?
这是解决方案行为的差异。让我们来看看发生故障的那一个。
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
意思是他们共享列表的相同头,这是正确的。当递归到达第二个参数的最后一个元素时,则匹配第一个子句,并将单元素尾部替换为空列表[]
。然后,您将获得正确的最终结果。
我将_
变量称为“匿名”而不是“无关”,因为匿名变量有一些用途,它们的值确实很重要。但是,通常在这种情况下,当不使用该值时会使用它们。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句