我想让序言返回给定列表的所有可能的子列表,所以我写道:
subSet(L,S):- append(_,L2,L),append(S,_,L2).
这样我得到的结果如下:
Out = [] ;
Out = [a] ;
Out = [a, b] ;
Out = [a, b, c] ;
Out = [] ;
Out = [b] ;
Out = [b, c] ;
Out = [] ;
Out = [c] ;
Out = [] ;
我必须做些什么来摆脱重复的空列表?
请注意,sublist
标准列表谓词中已经有一个谓词(仅列出[]
一次)。我假设您将其作为练习来实施...
空列表始终是子列表,因此可以明确指定。然后,您可以使用[S|T]
而不是避免空列表S
:
subSet(_, []).
subSet(L, [S|T]) :- append(_, L2,L), append([S|T], _, L2).
示例运行:
| ?- subSet([a, b, c], Out).
Out = [] ? ;
Out = [a] ? ;
Out = [a,b] ? ;
Out = [a,b,c] ? ;
Out = [b] ? ;
Out = [b,c] ? ;
Out = [c] ? ;
排除您完全描述空列表并手动添加一次。
list_subseq(_,[]).
list_subseq(L, S) :- S = [_|_], ....
然而,表达子序列通常用 DCG 更好。请参阅此响应中的第一个定义 。使用append/3
可能会起作用,但会导致代码非常难以阅读。