对于我的生活,我无法弄清楚完全这种置换功能是如何工作的。
perm(L, [H|T]) :-
append(V, [H|U], L),
append(V,U,W),
perm(W,T).
perm([],[]).
在我看来,第一个追加采用L的最后一个元素并将其与H结合。然后内部perm调用置换其他元素并将它们与T统一。我只是不确定第二个追加函数是做什么的。我知道没有它,每次尝试找到新解决方案都会将列表大小减少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
,因此W
为L
,但删除了一些元素H
。
(SWI-Prolog有一个select
谓词,它以更易读的方式执行相同的操作:
perm(L, [H|T]) :-
select(H, L, Rest),
perm(Rest, T).
perm([], []).
但它也有一个permutation
谓词,所以为什么要这么麻烦;)