我想执行类似的操作:
merge([[[],[],[],[t1]],[[],[],[],[t2,t3]]], X).
其中X将返回为:[[],[],[],[t1,t2,t3]]
。
但是我已经尝试了所有的知识并且没有任何想法。
任何提示?
想象一下:
Computer(
Tasklist1(
core1[sometasks],core2[sometasks],...,coreX(sometasks)),
...
TasklistX(
core1[sometasks],core2[sometasks],...,coreX(sometasks))
)
所以tasklist1之后的任务列表需要在tasklist1的任务之后在相同的核心上安排。
答案 0 :(得分:1)
我认为这可能更容易......
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).
答案 1 :(得分:1)
问题的局限性可能并不完全清楚。但是这里有一个解决方案,假设您可能有两个以上的内部列表,并且最里面的列表的数量可能会有所不同。
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).
所以,
| ?- 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).