给定一组is_member(country, organisation)
形式的事实,我在数据记录中写了以下查询:
返回属于丹麦所有组织的所有国家/地区。
我想做点什么
member_all_Denmarks_organisations(Country):-
¬( is_member('Denmark', Organization),
¬is_member(Country, Organization)
).
换句话说,对于丹麦所属的每个组织而言,国家也是其中的一员。'。但是数据记录不允许包含非实例化变量的否定谓词,所以这不起作用。
我该怎么办?一般来说,当想要为所有人表达一个'声明,如何在数据记录中这样做?
答案 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()