假设我们有一个矩阵,由列表列表表示,例如:[[1,2,3],[4,5,6],[7,8,9]]
.
如何编写一个谓词来获取
[[1,4][4,7][2,5][5,8][3,6][6,9]]
?
提前谢谢您!
最佳答案
在下面的逻辑纯 Prolog 代码中,我使用 definite clause grammars dcg :
matrix_adjacentPairs([]) -->
[].
matrix_adjacentPairs([Xs|Xss]) -->
list_adjacentPairs(Xs),
matrix_adjacentPairs(Xss).
list_adjacentPairs([]) -->
[].
list_adjacentPairs([X|Xs]) -->
list_adjacentPairs_(Xs,X). % use "lagging"
list_adjacentPairs_([],_) -->
[].
list_adjacentPairs_([X1|Xs],X0) -->
[[X0,X1]],
list_adjacentPairs_(Xs,X1).
这是 OP 提出的查询:
:- use_module(library(clpfd)). % SWI-Prolog transpose/2
:- use_module(library(lists)). % SICStus Prolog transpose/2
?- transpose([[1,2,3],[4,5,6],[7,8,9]],Tss),
phrase(matrix_adjacentPairs(Tss),Pss).
Tss = [[1,4,7],[2,5,8],[3,6,9]],
Pss = [[1,4],[4,7],[2,5],[5,8],[3,6],[6,9]].
编辑2015-04-26
使用元谓词 foldl/4
和 foldadjl/4
与 library(lambda) ,这一切都归结为:
:- use_module(library(apply)).
:- use_module(library(lambda)).
?- transpose([[1,2,3],[4,5,6],[7,8,9]],Tss),
phrase(foldl(foldadjl(\X^Y^[[X,Y]|Xs]^Xs^true),Tss),Pss).
Tss = [[1,4,7],[2,5,8],[3,6,9]],
Pss = [[1,4],[4,7],[2,5],[5,8],[3,6],[6,9]].
关于prolog - 如何在 Prolog 中获取列表第一个元素的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13678029/