从列表中分离列表 Prolog

Separate list from a list Prolog

我有这个:

Lines=[['4'],['1','2','3','4'],['5','6','7','8'],['9', '10']]

我想要:

a=['4']
b=[['1','2','3','4']['5','6','7','8']]

为此,我必须在具有 length=a=['4'] 的 Lines 中搜索元素。

有人可以帮我吗?

可以用“一行”来做:

Lines=[[4],[1,2,3,4],[5,6,7,8],[9, 10]] ,
selectchk([Len], Lines, Lines0) ,
length(LineOfLen, Len) ,
findall(LineOfLen, member(LineOfLen, Lines0), LinesOfLen) .

swi-prolog 中的结果(忽略不太重要的变量):

Len = 4,
LinesOfLen = [[1,2,3,4],[5,6,7,8]].

这是一个简单的单行代码:

select_sublists( [[L]|Xs] , Ys ) :-
  findall( X , (member(X,Xs), length(X,L)) , Ys ).

select_sublists/2的头部,我们确保传入列表的头部(第一个参数)是包含所需长度的单个元素列表。我们提取该长度,并将尾部用作要搜索的列表列表。

正文中findall/3的调用说:

  • 找到所有 X,使得
  • XXs 的成员,并且
  • X的长度是L,
  • 返回 Ys 中的结果列表。

运行

Lines = [ [4] , [1,2,3,4] , [5,6,7,8] , [9, 10] ] ,
select_sublists( Lines, Filtered).

给你预期的

Filtered = [ [1,2,3,4] , [5,6,7,8] ]