我编写了此函数,该函数将第一个参数给定一个列表列表,它在第二个参数中生成连接所有列表的结果。
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)
不会减少。
我该如何解决?
一个简单的实现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]]