【问题标题】:Prolog find all subsets matching conditionProlog查找所有匹配条件的子集
【发布时间】:2014-11-09 05:02:42
【问题描述】:

我正在尝试解决 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 获取子集,但是如何迭代该结果以仅获取与条件匹配的子集?

【问题讨论】:

    标签: prolog


    【解决方案1】:

    提供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 可以如此高效地生成它们。

    【讨论】:

    • 嗨@false,感谢您的回答。我对 Prolog 很陌生,您能否详细说明当您说“明确表示此类集合是相当不寻常的,仅仅是因为 Prolog 可以如此有效地生成它们”。我怎样才能让 prolog 生成它们?我提出的解决方案可以吗?
    • 以上加上您的定义是正确的解决方案。但是很少有这样的集合是显式生成的。也就是说,Subs 中的列表可能非常大。另一方面,possiblesubset(S) 很容易直接调用而不一次生成整个集合。
    【解决方案2】:

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

    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 获取列表的所有集合。

    【讨论】:

    • 将此关系称为powerset/2 有点用词不当。 Powerset 将是:powerset(M, P) :- bagof(S,seq_subseq(M,S),P).
    • 是的,你是对的。我将更改代码。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多