Prolog - 这种置换功能如何工作?

时间:2014-10-21 21:06:55

标签: list prolog permutation

对于我的生活,我无法弄清楚完全这种置换功能是如何工作的。

perm(L, [H|T]) :-
    append(V, [H|U], L),
    append(V,U,W),
    perm(W,T).
perm([],[]).

在我看来,第一个追加采用L的最后一个元素并将其与H结合。然后内部perm调用置换其他元素并将它们与T统一。我只是不确定第二个追加函数是做什么的。我知道没有它,每次尝试找到新解决方案都会将列表大小减少1,但我无法解释这种行为。

1 个答案:

答案 0 :(得分:1)

  

在我看来,第一个附加内容采用L的最后一个元素,并将其与H统一。

不是最后一个元素; 一些元素。

对于某些列表append(V, [H|U], L)L = V + [H] + U以及某些元素V

U可以为H。在挑选元素L后,它会将H分成H之前的部分和H之后的部分:

?- append(V, [H|U], [1,2,3]).
V = [],
H = 1,
U = [2, 3] ;
V = [1],
H = 2,
U = [3] ;
V = [1, 2],
H = 3,
U = [] ;
false.

然后可以阅读下一个append W = V + U,因此WL,但删除了一些元素H

(SWI-Prolog有一个select谓词,它以更易读的方式执行相同的操作:

perm(L, [H|T]) :-
    select(H, L, Rest),
    perm(Rest, T).
perm([], []).

但它也有一个permutation谓词,所以为什么要这么麻烦;)