【发布时间】:2015-04-30 16:26:58
【问题描述】:
假设我们有一个矩阵,由一个列表表示,例如:[[1,2,3],[4,5,6],[7,8,9]]。
我如何编写一个得到的谓词
[[1,4][4,7][2,5][5,8][3,6][6,9]]?
提前谢谢你!
【问题讨论】:
标签: prolog
假设我们有一个矩阵,由一个列表表示,例如:[[1,2,3],[4,5,6],[7,8,9]]。
我如何编写一个得到的谓词
[[1,4][4,7][2,5][5,8][3,6][6,9]]?
提前谢谢你!
【问题讨论】:
标签: prolog
在以下逻辑纯 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]].
将元谓词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]].
【讨论】:
不知道SICStus Prolog中是否存在transpose/2,在SWI-Prolog中transpose/2转置一个矩阵,例如:
?- transpose([[1,2,3],[4,5,6],[7,8,9]], R).
R = [[1,4,7],[2,5,8],[3,6,9]].
现在,您可以在 SWI-Prolog 中执行以下操作:
:- use_module(library(clpfd)).
combis(L, R) :-
transpose(L, L1),
create_lst_combis(L1, R).
create_lst_combis([], []).
create_lst_combis([H | T], R) :-
create_lst_combis(T, R1),
create_combis(H, CH),
append(CH, R1, R).
create_combis([H , T], [[H, T]]) :- !.
create_combis([H | T], R) :-
maplist(create_one_combi(H), T, T1),
create_combis(T, R1),
append(T1, R1, R).
create_one_combi(H, V, [H, V]).
【讨论】: