2016-10-25 7 views
0

Est-il possible dans Datalog d'écrire une requête pour les faits où il y a exactement une valeur pour l'une des variables, pour chaque valeur possible des autres variables?Recherche de l'unicité dans Datalog?

par exemple. trouver toutes X telle qu'il n'y a qu'un seul X pour chaque Y dans expr(X, Y)

Répondre

0

Dans Datalog plaine, vous pouvez l'exprimer en calculant d'abord les Y qui ont plus d'un X, puis en utilisant que pour calculer les Y avec 1 X.

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

La plupart des systèmes prennent également en charge les agrégations qui seront probablement une solution plus efficace, mais la syntaxe d'agrégation n'est pas standard Datalog. J'utilise la syntaxe LogiQL (LogicBlox Datalog) ici:

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

Etes-vous sûr que le premier est Datalog standard? La négation est-elle une caractéristique standard? –

+0

Il n'y a pas de standard formel, mais la négation est supportée par toutes les variantes de Datalog dont je suis conscient, donc je dirais que vous pouvez considérer cela comme une fonctionnalité standard. Cet exemple est un usage très basique de la négation. La sémantique de la négation devient seulement difficile lorsque la négation est utilisée dans la récurrence (la plupart des systèmes implémentent quelque chose appelé négation stratifiée) ou lorsqu'une variable utilisée dans la négation n'est pas liée positivement dans la règle (connue sous le nom de négation dangereuse). –