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