"为所有"在数据记录中

时间:2014-04-28 22:40:43

标签: declarative datalog

给定一组is_member(country, organisation)形式的事实,我在数据记录中写了以下查询:

  

返回属于丹麦所有组织的所有国家/地区。

我想做点什么

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

换句话说,对于丹麦所属的每个组织而言,国家也是其中的一员。'。但是数据记录不允许包含非实例化变量的否定谓词,所以这不起作用。

我该怎么办?一般来说,当想要为所有人表达一个'声明,如何在数据记录中这样做?

2 个答案:

答案 0 :(得分: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)作为 最外层互补的守卫或域名。

答案 1 :(得分:0)

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

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

在Datalog中,给定数据库DB,例如2列,第1列为x,这可以表示为:

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)

DB =:is_member()