这是谓词:

partList(Len,L,R):-
    length(L,LL),
    length(R,RR),
    RR is LL/Len,
    append(R,L).

查询显示:

42 ?- partList(2,[t,t,t,f,f,t,f,f],R).
R = [[], [], [], [t, t, t, f, f, t, f, f]] .

但我想分成

[[t,t],[t,f],[f,t],[f,f]]. 

我该如何解决? 谢谢!

#1楼 票数:2

一种简单的方法是查看问题,该问题是从列表的开头反复剥离第N个项目(直到列表用完)。

partition( []      , []        ) .   % if the source list is exhausted, we're done.
partition( [X]     , [X]       ) .   % if the source list contains just one item, we're done.
partition( [X,Y|Z] , [[X,Y]|R] ) :-  % if the source list contains 2 or more items, we take the 1st two, and ...
  partition(Z,R)                     % - recursively partition the remainder.
  .                                  % Easy!.

使它通用并不复杂。

首先,我们需要一种将列表划分为前缀的方法 ,该前缀包含N个项目(如果列表不够长,则包含较少项)和后缀 ,包含剩下的所有内容(可能为空):

take_prefix( _ , []     , []    , []     ) .  % if the source list is empty, both prefix and suffix are empty, regardless of the value of N.
take_prefix( 0 , [X|Xs] , []    , [X|Xs] ) .  % if N is 0, The prefix is the empty list and the suffix is the source list.
take_prefix( N , [X|Xs] , [X|P] , S      ) :- % otherwise, add the head to the prefix,
  N > 0 ,                                     % - assuming N > 0
  N1 is N-1 ,                                 % - decrement N
  take_prefix(N1,Xs,P,S)                      % - and recurse down.
  .                                           % Easy!

这是问题的症结所在。 一旦有了,只需反复(递归)应用它,直到获得空白列表即可:

partition( _ , [] , []   ) .  % if the source list is empty, we're done.
partition( N , L , [P|R] ) :- % otherwise...
  take_prefix(N,L,P,S) ,      % - break it up into a prefix and a suffix,
  partition(N,S,R)            % - and recurse down on the suffix.
  .                           % Easy!

  ask by qing78 translate from so

未解决问题?本站智能推荐:

5回复

在Prolog中对列表进行分区

我试图创建一个Prolog谓词,在给定一个列表的情况下,可以查看该列表是否可以拆分为两个总和相同的列表。 我有一个工作列表总和谓词,所以我在分区谓词中使用它。 我首先尝试对谓词进行编码,以查看列表的第一个元素是否等于列表其余部分的总和([2,1,1])。 这就是我要面对的情况。 但是
2回复

prolog中列表的所有分区

我在Prolog编码。 我想找到列表的所有不同分区。 我在这里看一个列表。 每个分区都是一组集合,其中none都是空的,所有集合的并集是主集合,它们的成对交集是空的。
1回复

在Prolog中对列表进行排序

事实库以以下形式存储考试时间表信息:考试(“组”、“科目”、“教师”、日期)。 编写一个程序,允许您为小组/教师选择考试信息,并按日期对其进行排序。 所以,我已经知道如何根据您的需要(通过组号或教师姓名)从 base 获取数据: 这是输入 这是输出 但我不知道如何按日期对输出进行排序。 例如,如何按
2回复

在Prolog中对列表进行分类

好吧,所以我正在编写算术方程的解析器。 我在列表中输入输入,例如"10+20" = [49,48,43,50,48]然后我将所有数字转换为相应的数字,例如[49,48,43,50,48] = [1,0,43,2,0]并从那里我想把整数> 10重新组合在一起。 从ascii转换 - &
2回复

在Prolog中对列表进行排序

Prolog有一种独特的处理方式,特别是因为几乎每个操作都涉及到这种或那种的递归。 每种语言的一个经典示例是将整数列表按升序排序。 什么是最佳方式(不使用太多内置谓词,当然排除了sort / 2谓词)来排序随机的整数列表?
1回复

通过Prolog中的列表进行递归

我试图在Prolog中反转一个列表。 当我用['item1', 'item2']调用它时,它正常工作,但是当我用['item1'|'item2']调用时,它['item1'|'item2'] 。 我是Prolog的初学者,但是我认为这两种表示法在本质上可以互换吗? 这是我正在使用的代码:
2回复

Prolog中不同的主分区

我需要列举在Prolog中将给定数字n划分为一个或多个不同素数之和的所有方法,即a + b + ... + m 例如: 给定整数n,程序应将适当的总和写入标准输出。 例如,如果n = 20,则程序可能会打印 n可以是任何数字,并且对运行时间没有限制。 这是我所拥有的: 目前
2回复

Prolog:对列表中的子列表进行排序

怎么做? 我需要这样的东西: 但我得到: 我的代码: 感谢您的帮助。