Можно ли в Datalog написать запрос фактов, где имеется ровно одно значение одной из переменных для каждого возможного значения других переменных?
например найти все X
такие, что есть только один X
для каждого Y
в expr(X, Y)
Можно ли в Datalog написать запрос фактов, где имеется ровно одно значение одной из переменных для каждого возможного значения других переменных?
например найти все X
такие, что есть только один X
для каждого Y
в expr(X, Y)
В обычном журнале данных вы можете выразить это, сначала вычислив 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.