我想让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 = [] ;
我需要做些什么来摆脱重复的空列表?
答案 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
可能会有效,但会导致难以阅读的代码。