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

Gopikrishna S

我是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]与最后一个元素,如果我不关心他们的第一个元素被删除,TOT其移除的最后一个元素(的规则相同)。这听起来不太正确。这意味着,如果我要从列表中删除最后一个元素,则无需关心结果中包含的元素。因此,您将获得一个任意元素列表,其数量比原始列表少一。但是这些元素与原始列表的最前面的元素不匹配。在Prolog中,两个_实例是不同的匿名变量。它们不是统一的。

更正后的子句是:

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

这表示列表[X|T][X|OT]最后一个元素已删除的列表如果 列表最后一个元素已删除T的列表OT共同的X意思是他们共享列表的相同头,这是正确的。当递归到达第二个参数的最后一个元素时,则匹配第一个子句,并将单元素尾部替换为空列表[]然后,您将获得正确的最终结果。

我将_变量称为“匿名”而不是“无关”,因为匿名变量有一些用途,它们的值确实很重要。但是,通常在这种情况下,当不使用该值时会使用它们。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章