我正在尝试在另一个列表中返回某个列表的子集以对它们进行一些操作,我查找子集的代码如下:
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).
回答1
要收集列表中集合的所有子集,只需询问:
?- findall(S, listSubset([a,b,c],S), L).
L = [[a, b, c], [a, b], [a, c], [a], [b, c], [b], [c], []].
回答2
问题是您将子集附加到列表的位置。这应该可以正常工作
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).