我有列表結構L的Prolog的創建從第i個數組中的元素的集列表
L=[[a,b,c,d],[a,f,c,h]]
長度可以大於2。我想團結列表的元素,使L或一個的NewL成爲
L=[a,[b,f],c,[d-h]]
我有列表結構L的Prolog的創建從第i個數組中的元素的集列表
L=[[a,b,c,d],[a,f,c,h]]
長度可以大於2。我想團結列表的元素,使L或一個的NewL成爲
L=[a,[b,f],c,[d-h]]
你需要的是一個聚合模式。我想我明白了:
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中替換一些比統一更適用的任務(如果有的話)(例如,可以調用您的數據庫)。
有時候真的很難想象downvotes的原因。我可以理解是否有更好的答案,或者是否會出錯,或者這個問題大概是家庭作業。但在這兒 ?這裏有什麼問題?任何暗示都歡迎... – CapelliC 2013-03-25 13:46:19
這可能是你想要什麼:
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,因爲這是一個奇怪的AP我和那裏有很多未處理的邊緣情況。
「團結」是什麼意思?你大概說'a',因爲元素是相同的,但是你不是指'[a]'?這應該如何解決'L = [[[a]],[[a]]]? – false 2013-03-24 01:10:40
你想要實現某種「主題」發現,或結構對齊?如果是這樣,那麼值得實施現有的算法。 – 2013-03-24 08:05:34