1

我想让序言返回给定列表的所有可能的子列表,所以我写道:

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 = [] ;

我必须做些什么来摆脱重复的空列表?

4

2 回答 2

2

请注意,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] ? ;
于 2012-03-13T17:05:19.833 回答
2

排除您完全描述空列表并手动添加一次。

list_subseq(_,[]).
list_subseq(L, S) :- S = [_|_], ....

然而,表达子序列通常用 DCG 更好。请参阅此响应中的第一个定义 。使用append/3可能会起作用,但会导致代码非常难以阅读。

于 2012-03-13T17:07:44.357 回答