我想对列表的子列表进行排序,该列表包含消除重复项的整数。例如:
[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).
答案 0 :(得分:0)
Here我试过了,你可以看到你需要处理的不同情况。一个例子:(列表的头部可以是一个列表,但如果列表的最后一个元素是一个列表,它的尾部会变空)在这种情况下,您需要定义另一个与递归调用匹配的谓词。
删除重复项后,您可以使用简单的排序算法,但是您必须检查头部是否为列表,然后先对内置列表进行排序,然后将其放在同一位置,否则调用sort谓词。
答案 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].