查找所有子列表,合并后给出给定列表

问题描述 投票:0回答:1

我编写了此函数,该函数将第一个参数给定一个列表列表,它在第二个参数中生成连接所有列表的结果。

appall([],[]).
appall([H|T],V):-appall(T,V1), append(H,V1,V).

但是,我希望它以其他方式工作-appall(X,[1,2,3])。先给我X = [[],[1,2,3]],然后给我X=[[1],[2,3]],依此类推。这不起作用,因为呼叫appall(T, V1)不会减少。

我该如何解决?

prolog swi-prolog
1个回答
0
投票

一个简单的实现based on this answer(谓词子集):

subset([], []).
subset([E|Tail], [E|NTail]):-
  subset(Tail, NTail).
subset([_|Tail], NTail):-
  subset(Tail, NTail).

my_sub(L,[X,LO]):-
    subset(L,X),
    subtract(L,X,LO).

?- my_sub([1,2,3],X).
X = [[1, 2, 3], []]
X = [[1, 2], [3]]
X = [[1, 3], [2]]
X = [[1], [2, 3]]
X = [[2, 3], [1]]
X = [[2], [1, 3]]
X = [[3], [1, 2]]
X = [[], [1, 2, 3]]
© www.soinside.com 2019 - 2024. All rights reserved.