【问题标题】:How to permute in Prolog the elements of a list composed of sub-list and atoms如何在 Prolog 中置换由子列表和原子组成的列表的元素
【发布时间】:2016-10-01 17:51:06
【问题描述】:

让我们考虑像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),以及一个将maplist 函数应用于这个排列谓词的allperm 谓词:

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 是异构的(原子和列表)时不起作用。

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

【问题讨论】:

    标签: prolog permutation


    【解决方案1】:

    下面的修改应该做:

    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 的第一个子句)并在第二个子句中禁止它(无论如何只能应用于列表)。

    【讨论】:

    • @Hana:不是吗?我没有彻底检查,但在你的例子中,我得到了 72 个不同的列表(这让我认为它至少适用于你的例子)。你有反例吗?
    • 道歉。确实,它功能完美。谢谢 Gniourf。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多