Объединить списки списков в прологе

Я хотел бы выполнить что-то вроде:

merge([[[],[],[],[t1]],[[],[],[],[t2,t3]]], X).

где X вернется как: [[],[],[],[t1,t2,t3]].

Но я перепробовал все, что знал о прологе, и ничего не придумал.

Любые подсказки?

Представьте это как:

Computer(
    Tasklist1(
            core1[sometasks],core2[sometasks],...,coreX(sometasks)), 
    ...
    TasklistX(
            core1[sometasks],core2[sometasks],...,coreX(sometasks))
)

поэтому список задач после списка задач1 должен быть запланирован на тех же ядрах, после задач списка задач1.


person voluminat0    schedule 28.12.2014    source источник
comment
И [[[1],[2],[3]], [[4],[5],[6]]] даст [[1,4],[2,5],[3,6]]?   -  person aioobe    schedule 28.12.2014
comment
(Почему листья в списках первых аргументов?)   -  person aioobe    schedule 28.12.2014
comment
Да, в самом деле! вы просто «добавляете» каждый X-й элемент каждого списка   -  person voluminat0    schedule 28.12.2014
comment
Вы можете представить, что каждый список, который вы получаете, — это ядро ​​процессора, а числа — задачи. задачи заключены в списки, чтобы было понятно, что это задачи для 1 ядра.   -  person voluminat0    schedule 28.12.2014
comment
Но каждый внутренний список должен быть одним элементом?   -  person aioobe    schedule 28.12.2014
comment
Формат ввода всегда следующий: [ [[],[], ...], [[],[], ...], ... ] и не глубже. Представьте, как в примере с моим вопросом, я отредактировал его для вас.   -  person voluminat0    schedule 28.12.2014
comment
Хорошо, кажется, я понимаю, чего ты добиваешься.   -  person aioobe    schedule 28.12.2014
comment
О, Боже! у меня опечатка! посмотри на мой вопрос еще раз пожалуйста :o   -  person voluminat0    schedule 28.12.2014
comment
Таким образом, ваш пример слияния ([[[1], [2], [3]], [[4], [5], [6]]]) все равно даст [[1,4], [2,5 ],[3,6]].   -  person voluminat0    schedule 28.12.2014
comment
Давайте продолжим обсуждение в чате.   -  person voluminat0    schedule 28.12.2014
comment
Был ли какой-либо из ответов приемлемым?   -  person lurker    schedule 30.12.2014


Ответы (2)


Не совсем ясно, каковы могут быть пределы проблемы. Но вот решение, которое предполагает, что у вас может быть более двух внутренних списков списков, и количество самых внутренних списков может варьироваться.

merge2(L, [], L) :- L \= [].
merge2([], L, L).
merge2([LH1|LT1], [LH2|LT2], [LH3|LT3]) :-
    append(LH1, LH2, LH3),
    merge2(LT1, LT2, LT3).

merge([L], L).
merge([H1,H2|T], R) :-
    merge2(H1, H2, H),
    merge([H|T], R).

So,

| ?- merge([[[],[],[],[t1]],[[],[],[],[t2,t3]]], L).

L = [[],[],[],[t1,t2,t3]] ? ;

no
| ?- merge([[[1],[2],[3]], [[4],[5],[6]],[[a],[b],[c,d]]], L).

L = [[1,4,a],[2,5,b],[3,6,c,d]] ? a

no
| ?- merge([[[1],[2],[3]], [[5],[6]],[[a],[b],[c,d]]], L).

L = [[1,5,a],[2,6,b],[3,c,d]] ? ;

(1 ms) no
| ?-

Если вы хотите, чтобы число самых внутренних списков было одинаковым, вы можете заменить merge2 на maplist, а предикат merge просто станет следующим:

merge([L], L).
merge([H1,H2|T], R) :-
    maplist(append, H1, H2, H),
    merge([H|T], R).
person lurker    schedule 28.12.2014
comment
Спасибо! Это то, что я искал. Извините за поздний ответ - person voluminat0; 30.12.2014
comment
@ValentijnSpruyt не беспокойтесь. Вы также можете упростить решение, используя maplist, если количество внутренних списков одинаковое, согласно моему отредактированному ответу. - person lurker; 30.12.2014

Я думал, что это может быть проще...

merge(L, R) :-
    maplist(length_list(N), L),
    findall(S, (
        between(1,N,I),
        findall(Zs, (
            member(Z,L),
            nth1(I,Z,Zs)), T),
        append(T, S)), R).

length_list(Len, L) :- length(L, Len).
person CapelliC    schedule 28.12.2014