list - 合并序言中的列表列表

标签 list prolog declarative declarative-programming

我想执行类似的操作:

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的任务之后调度到相同的核心上。

最佳答案

尚不完全清楚该问题的局限性。但这里有一个解决方案,假设您可能有两个以上的内部列表列表,并且最内部列表的数量可能会有所不同。

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

关于list - 合并序言中的列表列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27676581/

相关文章:

用于文本文件中值的 Python 拆分函数

Prolog:查找不满足目标的列表

java - Gradle深度讲解中的build-by-convention是什么?

jQuery 显示/隐藏常见问题列表元素的切换器

python - 从两个坐标数组创建所有 x,y 对

list - Prolog:使用递归在多个列表上成对兼容

list - 在谓词响应中评估 s(N),而不丢失功能

python - SQLAlchemy - 连接表的 order_by 关系

python - 来自连接的 SQLAlchemy 声明属性(单个属性,而不是整个对象)

python - 将掩码应用于多维数组