合并 prolog 中的列表列表



我想执行以下操作:

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 的任务之后。

目前还不完全清楚这个问题的极限是什么。但这里有一个解决方案,它假设您可能有两个以上的内部列表列表,并且最内部列表的计数可能会有所不同。

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替换为 maplistmerge谓词只需变为:

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

我认为这可能更容易...

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).

相关内容

  • 没有找到相关文章