List 列表操作序言

List 列表操作序言,list,prolog,List,Prolog,我已经用prolog编写了这些代码行 extend([],[]). extend([(N,L)|T], [NewList|NewListT]):- fill((N,L),NewList), extend(T,NewListT). fill((N,L),List) :- length(List, N), maplist(=(L), List). 我试图做的事情是为给定的list=[(0,a)、(0,b)、(1,c)]创建一个list=[[c]]。 我的问题

我已经用prolog编写了这些代码行

extend([],[]).
extend([(N,L)|T], [NewList|NewListT]):-
    fill((N,L),NewList),
    extend(T,NewListT).


fill((N,L),List) :-  
    length(List, N),
    maplist(=(L), List).
我试图做的事情是为给定的
list=[(0,a)、(0,b)、(1,c)]
创建一个
list=[[c]]

我的问题是,当我运行代码时,我得到了这个结果
L=[],[],[c]]
问题是
extend/2
为传入列表的每个元素向结果中添加了一个列表。需要对非空列表进行筛选。如果我根据您的代码和示例正确理解了您的需求,那么这应该是可行的:

extend([],[]).
extend([(N,L)|T], NewListFinal):-
    fill((N,L),NewList),
    extend(T,NewListT),
    (NewList=[]->NewListFinal=NewListT; NewListFinal=[NewList|NewListT]).
示例查询:

?- extend([(0, a), (0, b), (1, c)],L).
L = [[c]].

?- extend([(0, a), (3, b), (1, c)],L).
L = [[b, b, b], [c]].