2013-06-05 7 views
1

Как я могу объединить все элементы списка из списка в списках?Объединить все элементы из списка списков

пример

combine([[a,b,c],[d,[e,f],g],h],X). 
return X = [a,b,c,d,e,f,g,h] 

Это то, что я имел попробовать

flat([], []). 
flat([First|Rest], _X):- 
    flat(Rest, First). 
+1

Вы можете также искать вдохновение в реализации библиотеки SWI-Prolog из 'выравниваться/2', который является точным предикат, который вы пытаетесь реализовать: HTTP: //www.swi- prolog.org/pldoc/doc/home/vnc/prolog/lib/swipl/library/lists.pl?show=src (поиск на странице для определения flatten) –

+0

Разве это не то, что встроенный 'flatten 'делает? – lurker

ответ

0

Рекурсивно.

Сначала определите базовые футляры - если у вас нет списков для объединения, у вас есть пустой список.

combine([],[]). 

, и если у вас есть один элемент, у вас есть список Синглтон

combine(X,[X]). 

Тогда мы определим общий случай - непустого списка

combine([X|Xs], Y) :- 

Сначала мы хотим рекурсивно свернуть головку

combine(X,XX), 

затем хвост

combine(XS,XXs), 

затем положить их вместе

append(XX,XXs,Y). 

Мы должны тщательно подумать о том, как мы помещаем это вместе. Базовый регистр для элемента singleton хочет выглядеть последним. При совпадении правил Prolog будет соответствовать первому, который применяется - базовый регистр с элементом singleton будет соответствовать списку, поэтому мы помещаем это после этого случая, чтобы остановить его соответствие в этом случае. Наконец дает нам:

combine([],[]). 
combine([X|Xs],Y) :- combine(X,XX), combine(Xs,XXs), append(XX,XXs,Y). 
combine(X,[X]). 
+0

Эта реализация кажется довольно неэффективной. Вы протестировали его? – CapelliC

+0

Это дает мне много помогает. Большое спасибо. –

+0

btw, я немного изменил ваш код. :П –

Смежные вопросы