Можно ли запрашивать несуществование в Datalog?

Предположим, я определил несколько значений для функции:

+(value[1] == "cats")
+(value[2] == "mice")

Можно ли определить функцию, подобную следующей?

(undefined[X] == False) <= (value[X] == Y)
(undefined[X] == True)  <= (value[X] does not exist)

Я предполагаю, что это невозможно по двум причинам:

(1) Запросы гарантированно завершатся в журнале данных, и вы можете запросить undefined[X] == True.

(2) Согласно Википедии, одним из отличий Datalog от Prolog является то, что Datalog «требует, чтобы каждая переменная, появляющаяся в отрицательном литерале в теле предложения, также появлялась в каком-то положительном литерале в теле предложения».

Но я не уверен, потому что используемые термины («завершить», «буквальный», «отрицательный») имеют очень много применений. (Например: означает ли negative literal f[X] == not Y или not (f[X] == Y)? Означает ли termination, что он может вычислить одно выражение, такое как undefined[3] == True, или означает ли это, что он нашел бы все X, для которых undefined[X] == True?)


person Jeffrey Benjamin Brown    schedule 23.03.2018    source источник
comment
Я действительно не узнаю синтаксис.   -  person fingerprints    schedule 05.04.2018
comment
Это почти весь синтаксис pyDatalog, который может быть немного нестандартным. Исключением является value[X] does not exist, который является псевдокодом.   -  person Jeffrey Benjamin Brown    schedule 06.04.2018


Ответы (1)


Вот еще одно определение «безопасного».

Условие безопасности гласит, что каждая переменная в теле правила должна встречаться по крайней мере в одном положительном (т. е. не инвертированном) атоме.

Источник: Журнал данных и рекурсивная обработка запросов

А атом (или цель) — это предикатный символ (функция) вместе со списком терминов в качестве аргументов. (Обратите внимание, что термины «термин» и «атом» здесь используются иначе, чем в Прологе.)

Проблема безопасности заключается в том, чтобы решить, можно ли гарантировать, что результат данной программы Datalog будет конечным, даже если некоторые исходные отношения бесконечны.

Например, следующее правило небезопасно, поскольку переменная Y появляется только в отрицательном атоме (т. е. not predicate2(Z,Y)).

rule(X,Y) :- predicate1(X,Z), not predicate2(Z,Y) .

Чтобы выполнить условие безопасности, переменная Y должна появиться и в положительном предикате.

person fingerprints    schedule 05.04.2018