这是一个非常简单的问题,但我不明白。
insert(X, L, [X|L]).
insert(X, [H|T], [H|T2]) :-
insert(X, T, T2).
我们使用insert(1, [2,3], L).
当它被称为第一个插入时产生(1,[2,3],[1 | 2,3])> L = [1,2,3],然后它看第二个插入(1,[2 | 3],[2 | T2])// T2是一个即时猜测的变量..它调用insert(1,[3],T2),后者再次使用insert(1,[3],[1]调用第一个插入| 3])> L = [1,3],
这是不正确的,因为它实际上返回L = [2,1,3]。我对递归缺少什么?
答案 0 :(得分:1)
insert
生成三个值
insert(X, L, [X|L]). %fact(1)
insert(X, [H|T], [H|T2]) :- %fact(2)
insert(X, T, T2).
?- insert(1,[2,3],L).
L = [1, 2, 3] ;
L = [2, 1, 3] ;
L = [2, 3, 1].
让我们看看它是如何工作的:
insert(1,[2,3],L)
for fact(1)
生成L=[1,2,3]
insert(1,[2,3],L)
代表fact(2)
:
insert(1,[2|[3]],[2|T2]) :-
insert(1,[3],T2) :- %check fact(1)
insert(1,[3],[1|[3]) %T2 = [1,3]
所以L=[2|T2]=[2,1,3].
此外:
insert(1,[2,3],L)
for fact(2)
生成另一个值,
insert(1,[2|[3]],[2|T2]) :-
insert(1,[3],T2) :- %check fact(2)
insert(1,[3|[]],[3|T3]) :- %check fact(2) T2=[3,1]
insert(1,[],[1]) %check fact(1) T3=[1]
所以L=[2|T2]=[2,3,1]