Prolog子列表生成,乘以空列表 - 不知道为什么

时间:2012-03-13 16:58:16

标签: prolog append sublist

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

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

我需要做些什么来摆脱重复的空列表?

2 个答案:

答案 0 :(得分: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] ? ;

答案 1 :(得分:2)

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

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

然而,使用DCG通常可以更好地表达后续步骤。请参阅this response中的第一个定义。使用append/3可能会有效,但会导致难以阅读的代码。