prolog - 如何在 Prolog 中获取列表第一个元素的列表?

标签 prolog

假设我们有一个矩阵,由列表列表表示,例如:[[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 :

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/4foldadjl/4library(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/

相关文章:

list - 在 Prolog 中移动列表的元素

prolog - 为什么我的规则不能求解简单代数方程中的 X?

recursion - 如何在一个谓词中返回从右到左大于整数的所有元素?

java - Hello hello prolog 和 weka 集成

prolog - 天真和半天真评估有什么区别?

module - 在 Prolog 中定义模块

prolog - 将行读取到序言中的原子列表

list - Prolog 子列表关系

performance - Prolog 性能和递归类型

prolog - 如何使用序言进行编程,使用列表进行逆向