1

我有两套

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 方面没有太多经验,而且该函数变得非常长而且效率明显低下。

4

2 回答 2

1

您应该订购这些套件,例如使用sort. 当您这样做时,问题仍然存在,是否可以将 in 中的列表与 inOrdSet1中的子序列统一起来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)]

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

于 2013-06-05T15:11:22.633 回答
1

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

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 .

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

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

但我看不出如何帮助您完成任务...

于 2013-06-05T22:35:16.627 回答