gpt4 book ai didi

database - 如何防止 Datalog 规则修剪空值?

转载 作者:太空狗 更新时间:2023-10-30 01:55:05 26 4
gpt4 key购买 nike

我有以下事实和规则:

% 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 绝对可以解决。

最佳答案

我认为对于你的作业,你应该使用基本的 Datalog,而不是滥用聚合。问题的重点是如何表达普遍量化的条件。我在谷歌上搜索“通用量化数据日志”,在第一个位置我找到了 deductnotes.pdf断言:

An universally quantified condition can only be expressed by an equivalent condition with existential quantification and negation.

在该 PDF 中,您还会找到一个有用的示例(pagg 9 和 10)。

因此我们必须重新表述我们的问题。我最终得到了这段代码:

not_happy(D) :-
frequents(D, P),
likes(D, B),
not(serves(P, B)).

very_happy(D) :-
likes(D, _),
not(not_happy(D)).

这似乎是必需的:

DES> very_happy(D)

{
}
Info: 0 tuple computed.

注意 likes(D, _),这是为了避免 yanai 和 dimi 被列为 very_happy,而没有明确断言他们喜欢什么(OT 对不起,我的英语真的很烂......)

编辑:很抱歉,上述解决方案不起作用。我以这种方式重写了它:

likes_pub(D, P) :-
likes(D, B),
serves(P, B).

unhappy(D) :-
frequents(D, P),
not(likes_pub(D, P)).

very_happy(D) :-
likes(D, _),
not(unhappy(D)).

测试:

DES> unhappy(D)

{
unhappy(dimi),
unhappy(janus),
unhappy(yanai)
}
Info: 3 tuples computed.

DES> very_happy(D)

{
}
Info: 0 tuples computed.

现在我们添加一个事实:

serves(goldenekrone, tuborg).

我们可以看到更正后的代码结果:

DES> unhappy(D)

{
unhappy(dimi),
unhappy(yanai)
}
Info: 2 tuples computed.

DES> very_happy(D)

{
very_happy(janus)
}
Info: 1 tuple computed.

关于database - 如何防止 Datalog 规则修剪空值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10889254/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com