是否可以在 Datalog 中为其他变量的每个可能值编写一个事实查询,其中一个变量只有一个值?
例如找到所有这样的,每个X
只有一个X
Y
expr(X, Y)
在普通的 Datalog 中,您可以通过首先计算具有多个 X 的 Y,然后使用它来计算具有 1 个 X 的 Y 来表达这一点。
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.