2

私は次のようなことをしたいと思います:

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 の後の tasklist は、同じコアで、tasklist1 のタスクの後にスケジュールする必要があります。

4

2 に答える 2

1

問題の限界が何であるかは完全には明らかではありません。しかし、ここでは、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).

そう、

| ?- 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
| ?-

最も内側のリストの数を同じに制限したい場合は、 に置き換えることができmerge2maplist述語mergeは次のようになります。

merge([L], L).
merge([H1,H2|T], R) :-
    maplist(append, H1, H2, H),
    merge([H|T], R).
于 2014-12-28T21:05:51.303 に答える
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).
于 2014-12-28T15:29:47.020 に答える