Prolog找到匹配条件的所有子集

时间:2014-11-08 17:34:54

标签: prolog

我正在尝试解决SWI-Prolog中的问题。我有一个用。获得的合适元素(常量)列表。

suitables(L) :- setof(X, isSuitable(X), L).

上面的每个元素都通过仿函数得分,我需要所有分数大于>的子集。 10.我知道如何得分:

scoreSum([], 0).
scoreSum([H,T], Tot) :- getScore(H,F),scoreSum(T, Rest), Tot is F+Rest.

条件可以这样表达:

cond(L) :- scoreSum(L, R), R > 10.

如何获得与给定条件匹配的所有子集?我可以根据答案here获取子集,但是如何迭代该结果以仅获得与条件匹配的子集?

2 个答案:

答案 0 :(得分:2)

提供scoreSum/2scoreSum([H|T], Tot) :- ...

开头
seq_subseq([], []).
seq_subseq([_|Es], Fs) :-
   seq_subseq(Es, Fs).
seq_subseq([E|Es], [E|Fs]) :-
   seq_subseq(Es, Fs).

possiblesubset(S) :-
   suitables(L),
   seq_subseq(L, S),
   cond(S).

?- setof(S, possiblesubset(S), Subs).

?- setof(S, (suitables(L), seq_subseq(L,S), cond(S)), Subs).  % No L^ needed ; there is only one L.

然而,明确表示这些集合是相当不寻常的,因为Prolog可以如此高效地生成它们。

答案 1 :(得分:0)

我想我找到了我需要的解决方案,虽然我不确定它是有效的还是推荐的方式。提供了以下仿函数:

isSuitable(X) :- ...

scoreSum([], 0).
scoreSum([H,T], Tot) :- getScore(H,F),scoreSum(T, Rest), Tot is F+Rest.

条件:

cond(L) :- scoreSum(L, R), R > 10.

我只能获得满足给定条件的集合:

suitables(L) :- setof(X, isSuitable(X), S), setof(R, (powerset(S, R), cond(R)),L).

凡powerset给出了给定集合的所有子集:

powerset([], []).
powerset([_|T], P) :- powerset(T,P).
powerset([H|T], [H|P]) :- powerset(T,P).

因此,我没有获得所有组合,而是基于this question来获取列表的所有组合。