2013-03-24 77 views
1

我有列表結構L的Prolog的創建從第i個數組中的元素的集列表

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

長度可以大於2。我想團結列表的元素,使L或一個的NewL成爲

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

「團結」是什麼意思?你大概說'a',因爲元素是相同的,但是你不是指'[a]'?這應該如何解決'L = [[[a]],[[a]]]? – false 2013-03-24 01:10:40

+0

你想要實現某種「主題」發現,或結構對齊?如果是這樣,那麼值得實施現有的算法。 – 2013-03-24 08:05:34

回答

-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中替換一些比統一更適用的任務(如果有的話)(例如,可以調用您的數據庫)。

+0

有時候真的很難想象downvotes的原因。我可以理解是否有更好的答案,或者是否會出錯,或者這個問題大概是家庭作業。但在這兒 ?這裏有什麼問題?任何暗示都歡迎... – CapelliC 2013-03-25 13:46:19

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,因爲這是一個奇怪的AP我和那裏有很多未處理的邊緣情況。

相關問題