Prolog简单递归

时间:2018-07-02 13:19:42

标签: prolog

这是一个非常简单的问题,但我不明白。

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]。我对递归缺少什么?

1 个答案:

答案 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]