如何在 Prolog 中获取列表的第一个元素的列表? [英] How do I get the lists of list' first element in Prolog?

查看:51
本文介绍了如何在 Prolog 中获取列表的第一个元素的列表?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我们有一个矩阵,由列表的列表表示,例如:[[1,2,3],[4,5,6],[7,8,9]].

Let's say we have a matrix, represented by a list of lists, e.g.: [[1,2,3],[4,5,6],[7,8,9]].

如何写一个谓词得到[[1,4][4,7][2,5][5,8][3,6][6,9]]?

先谢谢你!

推荐答案

在以下逻辑纯 Prolog 代码中,我使用 定语从句语法 一个>:

In the following logically-pure Prolog code I use 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 声明的查询:

Here is the query that the OP stated:

:- 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/4库(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 中获取列表的第一个元素的列表?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆