для всех в журнале данных

Имея набор фактов в форме is_member(country, organisation), я должен записать в журнал данных следующий запрос:

Вернуть все страны, которые принадлежат ко всем организациям, членом которых является Дания.

Я хочу сделать что-то вроде

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

Другими словами, «для каждой организации, членом которой является Дания, страна также является ее членом». Но журнал данных не допускает отрицательных предикатов, содержащих неэкземплярные переменные, так что это не работает.

Как я могу продолжить? И вообще, когда вы хотите выразить утверждение «для всех», как это сделать в журнале данных?


person Alexandre Holden Daly    schedule 28.04.2014    source источник


Ответы (2)


Мы собираемся принять следующее альтернативное эквивалентное определение:

Вернуть все страны, которые не могут не принадлежать к какой-либо организации, членом которой является Дания.

Конечно, вы можете выразить это только на диалекте даталога с отрицанием. Следует сделать следующее:

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), который действует как охранник или домен для самого внешнего дополнения.

person Hamlet    schedule 29.04.2014

Проблема представляет собой случай выражения следующего предложения P в журнале данных:

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

В журнале данных, учитывая базу данных БД, скажем, с 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)

DB =: is_member()

person Alexandre Holden Daly    schedule 29.04.2014