如何在Prolog中排列由子列表和原子组成的列表的元素 让我们考虑列表,如代码> 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] ....

如何在Prolog中排列由子列表和原子组成的列表的元素 让我们考虑列表,如代码> 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] ....,prolog,permutation,Prolog,Permutation,事实上,我们希望在原子保持不变的情况下,拥有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*/ a

事实上,我们希望在原子保持不变的情况下,拥有
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
为异构(原子和列表)时不起作用


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

以下修改应该可以:

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).

我们将“身份”置换扩展到任何序言项(置换的第一个子句),并在第二个子句中禁止它(无论如何只能应用于列表)。

@Hana:不是吗?我没有彻底检查,但通过您的示例,我得到了72个不同的列表(这使我认为它至少适用于您的示例)。你有反例吗?道歉。事实上,它功能完美。谢谢你。