要列出的 Prolog 子集 Return 个值

Prolog Subset Return Values To List

我正在尝试return另一个列表中的某个列表的子集对其进行一些操作,我的查找子集的代码如下:

listSubset([] , []).
listSubset([Head|Tail] , [Head|Subset]) :- 
    listSubset(Tail, Subset).
listSubset([Head|Tail] , Subset) :-
    listSubset(Tail, Subset).

但是此代码仅在屏幕上打印子集,并且每当我尝试使用 append 将每个子集追加到另一个列表中时,代码都无法按预期工作。

我尝试使用追加的方法之一:

listSubset([] , [], AllSubSets).
listSubset([Head|Tail] , [Head|Subset], AllSubSets) :- 
    appendx([[Head|Subset]], AllSubSets, NewAllSubSets),
    listSubset(Tail, Subset, NewAllSubSets).
listSubset([Head|Tail] , Subset, AllSubSets) :-
    listSubset(Tail, Subset, AllSubSets).
    
appendx([],List,List).
appendx([H|T],List,[H|T2]) :- 
    appendx(T,List,T2).

问题在于您将子集附加到列表的位置。这应该可以正常工作

listSubset([] , [], AllSubSets).

listSubset([Head|Tail] , [Head|Subset], AllSubSets) :- 
    appendx([[Head|Subset]], AllSubSets, NewAllSubSets),
    listSubset(Tail, Subset, NewAllSubSets).

listSubset([Head|Tail] , Subset, AllSubSets) :-

appendx(Subset, AllSubSets, NewAllSubSets),

    listSubset(Tail, Subset, AllSubSets).
    
appendx([],List,List).
appendx([H|T],List,[H|T2]) :- 
    appendx(T,List,T2).

要将一个集合的所有子集收集到一个列表中,只需问:

?- findall(S, listSubset([a,b,c],S), L).
L = [[a, b, c], [a, b], [a, c], [a], [b, c], [b], [c], []].