Prolog - 排序列表的子列表

时间:2017-11-04 18:36:39

标签: prolog

我想对列表的子列表进行排序,该列表包含消除重复项的整数。例如:

[1, 2, [4, 1, 4], 3, 6, [7, 10, 1, 3, 9], 5, [1, 1, 1], 7]
=>>>
[1, 2, [1, 4], 3, 6, [1, 3, 7, 9, 10], 5, [1], 7].

我知道我必须与仿函数合作(但我并没有真正得到它)。 这是我的代码:((插入+排序)函数在一个简单的整数列表中工作,但不在这里工作。我每次都得到红色假)

insert(E,[],[E]).
insert(E,[H|T],[H|L]):-
    E>H,
    insert(E,T,L).
insert(E,[H|T],[H|T]):-
    E=H,
    !.
insert(E,[H|T],[E|[H|T]]):-
    E<H,
    !.

sort([],[]).
sort([i(H)|T],L):-
    sort(T,L1),
    insert(i(H),L1,L).

2 个答案:

答案 0 :(得分:0)

@Eduard Adrian在评论中很难回答,所以你需要做的第一件事就是从嵌套列表中删除重复项。

Here我试过了,你可以看到你需要处理的不同情况。一个例子:(列表的头部可以是一个列表,但如果列表的最后一个元素是一个列表,它的尾部会变空)在这种情况下,您需要定义另一个与递归调用匹配的谓词。

删除重复项后,您可以使用简单的排序算法,但是您必须检查头部是否为列表,然后先对内置列表进行排序,然后将其放在同一位置,否则调用sort谓词。

当您询问如何检查元素is_listinteger时,您可以始终使用内置函数,因为这些谓词不能自己编写。

答案 1 :(得分:0)

您可以尝试这样的解决方案,它使用sort/2谓词对子列表进行排序:

sort_sublists([], []).
sort_sublists([X|Xs], List) :-
    (integer(X) ->
        List = [X | List1]
    ;
        sort(X, Sorted),
        List = [Sorted | List1]
    ),
    sort_sublists(Xs, List1).

示例电话:

?- set_prolog_flag(answer_write_options,[max_depth(0)]).
true.

?- sort_sublists([1, 2, [4, 1, 4], 3, 6, [7, 10, 1, 3, 9], 5, [1, 1, 1], 7], X).
X = [1,2,[1,4],3,6,[1,3,7,9,10],5,[1],7].