2013-06-05 2 views
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)] 

Я хочу, чтобы моя программа признать, что 1 может быть подмножеством 2, если X связан с s1 и Y к s2.

Функция подмножества от library(sets) не может этого сделать, поскольку она не может генерировать подмножества.

Я начал играть с реализацией моей собственной функции подмножества, которая создавала бы все возможные привязки, но у меня нет большого опыта в Prolog, и функция становится очень длинной и явно неэффективной.

ответ

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)] 

Если вы хотите, чтобы увидеть необходимые привязки, вы должны вызвать его из интерактивного интерпретатора, как показано ,

+0

закончил с использованием subsetA ([], _). subsetA ([H | T], S): - member_set (H, S), subsetA (T, S). на основе вашего ответа, и, похоже, это трюк. Спасибо! – bamboo10

+0

@ Nieszka Glad Я мог бы помочь. Однако, в зависимости от вашей реализации Prolog, сортировка может быть очень эффективной (реализована на C), в то время как 'member' должен проходить весь список, который вы проверяете каждый раз. –

+0

Спасибо @Boris! На данный момент я нахожусь в напряженном графике, пытаясь закончить его до крайнего срока, но я планирую продолжить свой срок, так что это обязательно пригодится! – bamboo10

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 . 

О подмножестве, я вписываться этот мини-определение (на самом деле мне нужно было его решить некоторые проблемы с project Euler)

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

, но я не вижу, как может помочь ваша задача ...