2

给定表格的一组事实is_member(country, organisation),我有以下查询要写入数据日志:

返回属于丹麦加入的所有组织的所有国家。

我想做类似的事情

member_all_Denmarks_organisations(Country):- ¬( is_member('Denmark', Organization), ¬is_member(Country, Organization) ).

换句话说,“对于丹麦加入的每个组织,国家也是其中的一员”。但是datalog 不允许包含非实例化变量的否定谓词,所以这不起作用。

我该如何进行?一般来说,当想要表达“所有人”的陈述时,如何在数据记录中做到这一点?

4

2 回答 2

0

我们将采用以下替代等效定义:

归还所有不属于丹麦所属组织的国家。

当然,你只能用否定的Datalog方言来表达。以下应该做:

organisation_of_denmark(org) :- is_member('Denmark', org).

// a country c is disqualified if there is some organisation org 
// of which Denmark is a member but c isn't  
disqualified_country(c) :- organisation_of_denmark(org), country(c), ¬is_member(c, org). 

// we are only interested in countries that are not excluded by the previous rule
mmember_all_Denmarks_organisations(c) :- country(c), ¬disqualified_country(c). 

// in case there is no unary predicate identifying all countries 
// the best we can do is the following (knowing well that then the above 
// will only work for countries that are members of at least one organisation)
country(c) :- is_member(c, _).

这也正是您所写的,仅包含中间关系以捕获您的一些子公式,并且包含原子country(c)以充当最外层互补的保护或域。

于 2014-04-29T01:03:16.647 回答
0

问题是在Datalog中表达以下命题P的情况:

P(x) := for all y, p(y) => q(x,y)

在 Datalog 中,假设数据库 DB 有 2 列,x 在第 1 列,这可以表示为:

P(x):- DB(x,_), ¬disqualified(x).
disqualified(x):- DB(x,_), p(y), ¬q(x,y).

诀窍是创建自己的disqualified()谓词。 DB(x,_)是否只是x在它出现在否定谓词中之前进行实例化。


在具体的丹麦案例中:

P(x) =: 'x 是丹麦所有组织的成员'

p(y) =:is_member('Denmark', y)

q(x,y) =:is_member(x,y)

数据库=:is_member()

于 2014-04-29T11:22:39.570 回答