这段代码的解释是什么?

What is the explanation of this code?

我正在努力学习 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]

基本上,问题是t一个一个地删除匹配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] ?

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

What is the use of [H|T2]?

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

顺便问一下,当您的列表为空时会发生什么?