我正在尝试解决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获取子集,但是如何迭代该结果以仅获得与条件匹配的子集?
答案 0 :(得分:2)
提供scoreSum/2
以scoreSum([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来获取列表的所有组合。