2016-10-25 13 views
0

Возможно ли в Datalog написать запрос для фактов, где имеется одно значение для одной из переменных, для каждого возможного значения других переменных?Запрос на уникальность в Datalog?

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

ответ

0

В равнинном Datalog вы можете выразить это, первым вычисляя Y, у которых есть больше чем один X, а затем с помощью, чтобы вычислить Y с 1 X.

problem(y) <- expr(x1, y), expr(x2, y), x1 != x2. 
    exactly_one_opt1(y) <- expr(_, y), !problem(y). 

Большинство систем также поддерживают агрегации, которые, вероятно, будут более эффективным решением, но синтаксис агрегации не является стандартным Datalog. Я использую синтаксис LogiQL (LogicBlox Datalog) здесь:

count[y] = c <- agg<<c = count()>> expr(_, y). 
    exactly_one_opt2(y) <- count[y] = 1. 
+0

Вы уверены, что первый из них является стандартным Datalog? Является ли отрицание стандартной функцией? –

+0

Официального стандарта нет, но отрицание поддерживается каждым вариантом Datalog, о котором я знаю, поэтому я бы сказал, что вы можете считать его стандартной функцией. Этот пример здесь - очень основное использование отрицания. Семантика отрицания становится сложной, когда отрицание используется в рекурсии (в большинстве систем реализовано что-то называемое стратифицированным отрицанием) или когда переменная, используемая в отрицании, не связана положительно в правиле (известном как небезопасное отрицание). –

 Смежные вопросы

  • Нет связанных вопросов^_^