Prolog从列表元素创建集合列表

时间:2013-03-24 01:06:55

标签: prolog

我有列表结构

L=[[a,b,c,d],[a,f,c,h]]

L的长度可以大于2.我想联合列表的元素,以便L或NewL成为

L=[a,[b,f],c,[d-h]]

2 个答案:

答案 0 :(得分:0)

这可能是你想要的:

unite([[],[]], []).
unite([[X|Ls], [X|Rs]], [X|Rest]) :- unite([Ls, Rs], Rest).
unite([[L|Ls], [R|Rs]], [[L,R]|Rest]) :- L \= R, unite([Ls, Rs], Rest).

但是,我同意@false,因为这是一个奇怪的API,并且有很多未处理的边缘情况。

答案 1 :(得分:-1)

您需要的是聚合架构。我想我明白了:

unite(Ls, [E|Es]) :-
    aggreg(Ls, E, Ns),
    unite(Ns, Es).
unite(_, []).

aggreg(L, E, LLs) :-
    maplist(first, L, Fs, LLs),
    setof(X, member(X, Fs), S),
    ( [E] = S -> true ; E = S ).

first([E|Es], E, Es).

产量

?- L=[[a,b,c,d],[a,f,c,h],[a,f,c,g]],unite(L,U).
L = [[a, b, c, d], [a, f, c, h], [a, f, c, g]],
U = [a, [b, f], c, [d, g, h]] ;
L = [[a, b, c, d], [a, f, c, h], [a, f, c, g]],
U = [a, [b, f], c] .

我认为在第一个解决方案之后的剪切将很好(使用once / 1)。

请注意,它的架构相当普遍:只需在setof / 3中替换一些比统一更多的应用任务(如果有的话)(例如,你可以调用你的数据库)。