如何在Prolog中置换由子列表和原子组成的列表的元素

时间:2016-10-01 17:51:06

标签: prolog permutation

让我们考虑诸如L=[[7,3,4],9,[4,5],[1,3,5],4]之类的列表,其中组件可以是列表或原子。如何产生这种排列结果:

R = [[7, 3, 4], 9, [4, 5], [1, 3, 5], 4] 
R = [[7, 4, 3], 9, [5, 4], [1, 3, 5], 4] 
R = [[7, 4, 3], 9, [4, 5], [1, 5, 3], 4] 
....

事实上,我们希望L的子列表具有所有可能的排列,而原子应保持不变。

我写了一个经典谓词permutation(OriginalList,PermutedList)和一个allperm谓词,它将maplist函数应用于此置换谓词:

permutation([],[]).

permutation(L,[T|Q]) :-
    select(T,L,L1),
    permutation(L1,Q).

/*L is the list to permute, R the result*/
allperm(L,R) :-
    maplist(permutation,L,R).

它仅在L由列表组成的特殊情况下起作用,而在L是异构的(原子和列表)时不起作用。

您是否可以提供解决方案的提示或元素来进行正确的排列?

1 个答案:

答案 0 :(得分:3)

以下修改应该:

permutation(X,X).

permutation(L,[T|Q]) :-
   dif(L,[T|Q]),
   select(T,L,L1),
   permutation(L1,Q).

allperm(L,R) :-
    maplist(permutation,L,R).

我们将“身份”排列扩展到任何Prolog术语(permutation的第一个子句),并在第二个子句中禁止它(它只能应用于列表)。