У меня есть следующие факты и правила:
% frequents(D,P) % D=drinker, P=pub
% serves(P,B) % B=beer
% likes(D,B)
frequents(janus, godthaab).
frequents(janus, goldenekrone).
frequents(yanai, goldenekrone).
frequents(dimi, schlosskeller).
serves(godthaab, tuborg).
serves(godthaab, carlsberg).
serves(goldenekrone, pfungstaedter).
serves(schlosskeller, fix).
likes(janus, tuborg).
likes(janus, carlsberg).
count_good_beers_for_at(D,P,F) :- group_by((frequents(D,P), serves(P,B), likes(D,B)),[D,P],(F = count)).
possible_beers_served_for_at(D,P,B) :- lj(serves(P,B), frequents(D,R), P=R).
Теперь я хотел бы построить правило, которое должно работать как предикат, возвращающий «истина», когда количество доступных «понравившихся» сортов пива в каждом пабе, который «пьющий» «часто» больше, чем 0.
Я бы считал предикат истинным, если правило не возвращает кортежей. Если предикат ложный, я планировал заставить его возвращать бары, в которых не было ни одного «понравившегося» пива.
Как видите, у меня уже есть правило подсчета хорошего пива для данного пьющего в данном пабе. У меня также есть правило, определяющее количество порций пива.
DES> count_good_beers_for_at(A,B,C)
{
count_good_beers_for_at(janus,godthaab,2)
}
Info: 1 tuple computed.
Как видите, счетчик не показывает посещаемые пабы, но в которых нет понравившихся сортов пива. Я планировал обойти это, используя левое внешнее соединение.
DES> is_happy_at(D,P,Z) :- lj(serves(P,B), count_good_beers_for_at(D,Y,Z), (Y=P))
Info: Processing:
is_happy_at(D,P,Z) :-
lj(serves(P,B),count_good_beers_for_at(D,Y,Z),Y = P).
{
is_happy_at(janus,godthaab,2),
is_happy_at(null,goldenekrone,null),
is_happy_at(null,schlosskeller,null)
}
Info: 3 tuples computed.
Это почти правильно, за исключением того, что я также не посещаю пабы. Я пытаюсь добавить дополнительное условие:
DES> is_happy_at(D,P,Z) :- lj(serves(P,B), count_good_beers_for_at(D,Y,Z), (Y=P)), frequents(D,P)
Info: Processing:
is_happy_at(D,P,Z) :-
lj(serves(P,B),count_good_beers_for_at(D,Y,Z),Y = P),
frequents(D,P).
{
is_happy_at(janus,godthaab,2)
}
Info: 1 tuple computed.
Теперь я каким-то образом отфильтровал все, что содержит нули! Я подозреваю, что это связано с логикой нулевого значения в DES.
Я понимаю, что, возможно, неправильно подхожу ко всей этой проблеме. Любая помощь приветствуется.
РЕДАКТИРОВАТЬ: Назначение: «very_happy(D) ist wahr, genau dann wenn jede Bar, die Trinker D besucht, wenigstens ein Bier ausschenkt, das er mag». что переводится как «very_happy(D) верно, если и только если каждый посетитель бара D, который посещает бар, предлагает по крайней мере 1 пиво, которое ему нравится». Поскольку это задание касается журнала данных, я думаю, что его определенно можно решить без использования Пролога.