【问题标题】:Merge lists of lists in prolog合并序言中的列表列表
【发布时间】:2014-12-28 12:58:24
【问题描述】:

我想执行以下操作:

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

其中 X 将返回为:[[],[],[],[t1,t2,t3]]

但我已经尝试了所有我的 prolog 知识,但一无所获。

有什么提示吗?

想象一下:

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

所以 tasklist1 之后的任务列表需要在相同的核心上调度,在 tasklist1 的任务之后。

【问题讨论】:

  • [[[1],[2],[3]], [[4],[5],[6]]] 会产生[[1,4],[2,5],[3,6]]?
  • (为什么第一个参数列表中有“叶子”?)
  • 是的,确实如此!您只需“附加”每个列表的第 X 个元素
  • 你可以想象得到的每一个列表都是一个处理器核心,数字就是任务。这些任务包含在列表中,以明确这些是 1 个核心的任务。
  • 任何答案都可以接受吗?

标签: list prolog declarative declarative-programming


【解决方案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).

【讨论】:

  • 谢谢!这就是我一直在寻找的。抱歉回复晚了
  • @ValentijnSpruyt 不用担心。根据我编辑的答案,如果内部列表计数相同,您还可以使用 maplist 简化解决方案。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 2011-12-15
    相关资源
    最近更新 更多