【发布时间】:2012-06-04 22:25:13
【问题描述】:
我有以下事实和规则:
% 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.
如您所见,柜台不会返回经常光顾但有 0 个喜欢的啤酒的酒吧。我打算通过使用左外连接来解决这个问题。
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 杯他喜欢的啤酒”。由于这个作业是关于 Datalog 的,我认为不使用 Prolog 绝对可以解决。
【问题讨论】:
-
不知道,但我想如果有人关心数据记录标签,他们比关心元组的人更有可能提供帮助......
-
@andrewcooke:查看编辑历史。从昨天到今天我尝试了一批新标签时,我在这个问题上有了数据记录标签。遗憾的是,相关标签似乎都没有很多订阅者。
-
啊,好的,对不起。好久没用了,实在忍不住……
标签: database prolog logic datalog