这段代码的解释是什么?
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
现在是递归调用的第三个参数,并且将同样统一,直到到达基本情况。
顺便问一下,当您的列表为空时会发生什么?
我正在努力学习 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
现在是递归调用的第三个参数,并且将同样统一,直到到达基本情况。
顺便问一下,当您的列表为空时会发生什么?