私はリスト構造を持っています
L=[[a,b,c,d],[a,f,c,h]]
L の長さは 2 より大きくてもかまいません。L または NewL になるように list の要素を結合したい
L=[a,[b,f],c,[d-h]]
私はリスト構造を持っています
L=[[a,b,c,d],[a,f,c,h]]
L の長さは 2 より大きくてもかまいません。L または NewL になるように list の要素を結合したい
L=[a,[b,f],c,[d-h]]
これはおそらくあなたが望むものです:
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).
ただし、これは奇妙な API であり、未処理のエッジ ケースが多数あるため、@false に同意します。
必要なのは集計スキーマです。私はそれを得たと思います:
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] .
最初のソリューションの後のカットは適切に配置されると思います (そのために一度/1 を使用します)。
スキーマはかなり一般的であることに注意してください。 setof/3 では、統合よりも適用可能なタスク (存在する場合) を置き換えるだけです (たとえば、DB を呼び出すことができます)。