【问题标题】:Prolog: checking if an unbound set is a subset of a bound setProlog:检查未绑定集是否是绑定集的子集
【发布时间】:2013-06-05 13:39:54
【问题描述】:

我有两套

Set1 = [stone(X),  active(X),  stone(Y),  in(app2,Y),  unlocked(app2)]
Set2 = [stone(s1), active(s1), stone(s2), in(app2,s2), unlocked(app2)]

如果 X 绑定到 s1 并且 Y 绑定到 s2,我希望我的程序能够识别 1 可以是 2 的子集。

library(sets) 的子集函数无法做到这一点,因为它无法生成子集。

我已经开始尝试实现我自己的子集函数,该函数会生成所有可能的绑定,但我在 Prolog 方面没有太多经验,而且该函数变得很长而且效率明显低下。

【问题讨论】:

    标签: prolog set


    【解决方案1】:

    您应该订购这些套件,例如使用sort。当您这样做时,问题仍然存在,OrdSet1 中的列表是否可以与OrdSet2 中的子序列统一。这是直截了当的:

    is_subseq([], _).
    is_subseq([X|Xs], [X|Ys]) :- is_subseq(Xs, Ys).
    is_subseq([X|Xs], [Y|Ys]) :- X \= Y, is_subseq([X|Xs], Ys).
    

    当你有这个谓词时,你可以这样做:

    ?- S1 = [stone(X), active(X), stone(Y), in(app2,Y), unlocked(app2)],
    |    sort(S1, OrdS1),
    |    S2 = [stone(s1), active(s1), stone(s2), in(app2,s2), unlocked(app2)],
    |    sort(S2, OrdS2),
    |    is_subseq(OrdS1, OrdS2).
    S1 = S2, S2 = [stone(s1), active(s1), stone(s2), in(app2, s2), unlocked(app2)],
    X = s1,
    Y = s2,
    OrdS1 = OrdS2, OrdS2 = [active(s1), stone(s1), stone(s2), unlocked(app2), in(app2, s2)]
    

    如果您想查看必要的绑定,您必须从交互式解释器中调用它,如图所示。

    【讨论】:

    • 最终使用了子集 A([], _)。子集A([H|T],S):-成员集(H,S),子集A(T,S)。根据您的回答,它似乎可以解决问题。谢谢!
    • @Nieszka 很高兴我能帮上忙。但是,根据您的 Prolog 实现,排序可能非常有效(在 C 中实现),而 member 需要遍历您每次检查的整个列表。
    • 谢谢@Boris!目前我的时间很紧,试图在截止日期之前完成它,但我计划在截止日期之后继续,所以这肯定会有用!
    【解决方案2】:

    据我了解您的要求,我会写:

    elements([], _).
    elements([E|Es], S2) :-
        select(E, S2, SR),
        elements(Es, SR).
    
    bindings(X, Y) :-
        S1 = [stone(X),  active(X),  stone(Y),  in(app2,Y),  unlocked(app2)],
        S2 = [stone(s1), active(s1), stone(s2), in(app2,s2), unlocked(app2)],
        elements(S1, S2).
    

    产量

    ?- bindings(X,Y).
    X = s1,
    Y = s2 .
    

    关于子集,我制作了这个迷你定义(实际上我需要它来解决来自project Euler 的一些问题)

    subset(_, []).
    subset(L, [F|T]) :-
        append(_, [F|R], L),
        subset(R, T).
    

    但我看不出对您的任务有何帮助...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 2016-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多