Сделать предикат для сравнения списков?

Я относительно новичок в Прологе, так что терпите меня. Скажем, у меня есть факты, каждый из которых содержит человека и его увлечения (в списке):

hobbies(mark, [running, video_games, soccer])
hobbies(jasmine, [writing, swimming, music])
hobbies(john, [rugby, rowing, pets, politics])
hobbies(lisa, [gymnastics, dancing, television])

Что я хочу сделать прямо сейчас, так это определить предикат (назовем его same), где same(P1, P2, H) будет истинным, если P1 и P2 имеют общее хобби H. Я знаю, что мне нужно использовать предикат члена, но пока я научился использовать его только в более простых случаях. Будет ли это что-то вроде:

same(P1, P2, H) :- member(H, P1), member(H, P2)

Однако я, конечно, знаю, что это невозможно. Как мне получить доступ к списку этих фактов?


person Navy670    schedule 02.05.2016    source источник
comment
member(H, P1) не имеет смысла, потому что H — это хобби, а P1 — человек. Для данного человека, скажем P1, какое отношение определяет список его увлечений? И как бы вы поместили их в переменную, скажем, HobbyList1? Тогда вы могли бы сказать, member(H, HobbyList1).   -  person lurker    schedule 03.05.2016


Ответы (1)


Вам нужен список, чтобы использовать предикат member. Итак, вы должны получить список увлечений для P1 и P2. Как это сделать? Использование hobbies фактов

hobbies(mark, [running, video_games, soccer]).
hobbies(jasmine, [writing, swimming, music]).
hobbies(john, [rugby, rowing, pets, politics]).
hobbies(lisa, [gymnastics, dancing, television, video_games]).

same(P1, P2, H) :-
    % Hobbies1 is a list of hobbies of P1
    hobbies(P1, Hobbies1),
    member(H, Hobbies1),
    % Hobbies2 is a list of hobbies of P2
    hobbies(P2, Hobbies2),
    member(H, Hobbies2),
    % P1 and P2 are not the same. Also eliminates symmetrical redundancy
    P1 @< P2.

Запрос

?- same(P1, P2, H).
P1 = mark,
P2 = lisa,
H = video_games ;
false.
person malbarbo    schedule 02.05.2016
comment
И если вы используете P1 @< P2 вместо not(P1 = P2), вы можете устранить симметричную избыточность. - person lurker; 03.05.2016
comment
Это сложно, но, кажется, я понимаю! Спасибо :) - person Navy670; 03.05.2016