2014-10-21 62 views
0

对于我的生活,我无法弄清楚这个permute函数如何恰恰工作。序言 - 这个置换函数是如何工作的?

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

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

+2

您是否尝试过使用跟踪? (运行:trace,perm([1,2,3],X)ex) – user1018513 2014-10-21 21:15:06

+0

试着去考虑它*关系*不*功能* ... *'[H | T]'是L的置换'如果'L'是附加到'V'和... *的'[H | U]'。而*'[]'是'[]'*的排列组合。 – lurker 2014-10-21 21:21:07

+0

是的,很多次。这仍然让我感到困惑。说我输入烫发([1,2,3],X)。最后3条曲线将显示给我: 退出:(8)perm([1],[1])?蠕变 退出:(7)perm([1,2],[2,1])?蠕变 退出:(6)perm([1,2,3],[3,2,1])?蠕变 看起来像它奇迹般地创造了我的排列。 – 2014-10-21 21:22:11

回答

1

它看起来对我来说,第一append接受的L最后一个元素,并与H结合它。

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

append(V, [H|U], L)可以被读取L = V + [H] + U,对于一些列表VU以及某些元素H。它打破了LH前的部分和部分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谓词,何必;)

+1

此外,当* *参数被充分实例化时,SWI的置换/ 2谓词也会终止。例子:'? - 置换(Ls,[a,b,c])'上面的版本在这种情况下不终止。 – mat 2014-10-21 22:40:39