我正在努力学习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]?
答案 0 :(得分:1)
将此视为命令式程序员的最佳方式是最后一个参数是一种返回值。您看到第一个调用“返回”[H|T2]
,而不仅仅是T2
这是列表的第一个元素保留的方式:在递归计算T2
的值后,mydelete是将H
(在本例中恰好等于1)添加到返回列表的开头。
答案 1 :(得分:0)
[H|T2]
有什么用?
在您的解释中,您忘记考虑第三个参数L
与[H|T2]
统一。到目前为止,L
是免费的(在您的情况下),现在您知道它是以H
开头的列表。列表的其余部分T2
现在是递归调用的第三个参数,并且将同样统一,直到达到基本情况。
顺便说一下,当你的清单为空时会发生什么?