这段代码有什么解释?

时间:2015-10-22 21:03:56

标签: list prolog

我正在努力学习Prolog。我有一个问题,并在Prolog中的解决方案。虽然我无法完全理解代码。

问题是 -

Write a procedure   mydelete( X, HasXs, OneLessXs ) that returns

%      ?- mydelete( 2, [1,2,3,4], L ) .    --> L = [1,3,4]

%      ?- mydelete( 2, [1,2,3,2], L ) .    --> L = [1,3,2] ; L = [1,2,3]

基本上,问题是逐个删除与X匹配的成员并在每次删除后打印结果。

我有一个解决方案,但是,我确实,不确定此代码是如何工作的。

mydelete(X,[X|T],T).
mydelete(X,[H|T1],[H|T2]) :- mydelete(X,T1,T2).

根据我的理解,第一行显示L = ...当它在列表的头部找到与X匹配时。

在代码的第二行,它只是从输入列表中弹出头部并递归发送更新的列表。

但是,在这里,我们还没有定义T2。

让我们考虑一个例子。

mydelete( 2, [1,2,3,4], L ) .  --> this is the call.

X = 2,列表= [1,2,3,4],因此,H = 1,T = [2,3,4]。

因此,它不执行代码的第1行。现在,它涉及到代码的第二行。

mydelete(X,[H|T1],[H|T2]) :- mydelete(X,T1,T2).

此处X = 2,H = 1,T1 = [2,3,4],T2 =。

所以,在下一次递归时,

X = 2,list = [2,3,4],H匹配X,因此第1行将被执行。

因此,X = 2,T = [3,4]

所以,它应该打印= [3,4]。(我知道,[1,3,4]是正确答案。我无法理解此代码背后的解释)

我的问题是,我的理解有什么问题?

而且,[H | T2]在

中的用途是什么
mydelete(X,[H|T1],[H|T2]) :- mydelete(X,T1,T2).

谢谢!请帮帮我!

编辑:我尝试从[H | T2]中删除H.正在打印[3,4]。 H如何在列表中添加1作为前缀[3,4]?

2 个答案:

答案 0 :(得分:1)

将此视为命令式程序员的最佳方式是最后一个参数是一种返回值。您看到第一个调用“返回”[H|T2],而不仅仅是T2这是列表的第一个元素保留的方式:在递归计算T2的值后,mydelete是将H(在本例中恰好等于1)添加到返回列表的开头。

答案 1 :(得分:0)

  

[H|T2]有什么用?

在您的解释中,您忘记考虑第三个参数L[H|T2]统一。到目前为止,L是免费的(在您的情况下),现在您知道它是以H开头的列表。列表的其余部分T2现在是递归调用的第三个参数,并且将同样统一,直到达到基本情况。

顺便说一下,当你的清单为空时会发生什么?