我需要执行以下操作:给定列表列表,我需要找到列表的所有可能组合,这样如果这些列表中的某些列表属于这样的组合,那么它们没有共同的元素,并且列表由在组合中附加列表具有给定长度。有什么想法吗?
示例:
Say P= [[1,2,3],[4,5,6],[2,5],[7,9],[7,10],[8],[10]].
N给定数字,比如说N = 10。我需要搜索P才能找到合适的列表,没有共同的元素,并将它们添加到列表L中,使得L的并集长度为10.所以在上面的示例中:
L=[[1,2,3],[4,5,6],[7,9],[8],[10]].
这可能很容易,但我是Prolog的新手
答案 0 :(得分:0)
鉴于没有人回答,而且已经有一段时间了,因为我在Prolog中写了任何东西,我想我需要练习,这就是你的做法。
首先,为了更容易地生成组合,我们创建了一个术语来预处理列表,使它们与它们的长度配对,以避免必须多次获取长度。切割避免了不必要的回溯:
with_lengths([], []) :- !.
with_lengths([H|T1], [(Len, H)|T2]) :-
length(H, Len),
with_lengths(T1, T2).
这是comb/3
谓词,用于生成组合:
comb(L, R, Max) :-
with_lengths(L, L1),
comb1(L1, R, Max).
comb1/3
完成实际工作。评论解释了发生了什么:
% Combination works.
comb1([], [], 0).
% Try combining the current element with the remainder.
comb1([(Len, Elem)|T1], [Elem|T2], Max) :-
NewMax is Max - Len,
comb1(T1, T2, NewMax).
% Alternatively, ignore the current element and try
% combinations with the remainder.
comb1([_|T1], T2, Max) :-
comb1(T1, T2, Max).