Skip to content

Inférences et Contraintes

En MSL générale la contrainte de type s'écrit (en détail)

\begin{array}{l}
\forall p \forall x \forall y \forall V, C, S, A, P, V', C', S', A', P' \\
S(x, p, y, V, C, S, A, P) \\
\land S(p, \texttt{property constraint }, \texttt{type constraint }, V', C', S', A', P' ) \\
 \to \\
\exists t  \exists V'', C'', S'', A'', P''  S(y, \texttt{instance of}, t, V'', C'', S'', A'', P'' ) \\
 \land \texttt{contains}(\texttt{getClass}(A'), t)
\end{array}

si on veut trouver les x p y qui ne satisfont pas la contrainte il faut une requête du genre

SELECT ?x ?p ?y
WHERE {
  ?x ?p_p ?s_0 . ?s_0 ?p_ps ?y . 
  ?p p:property constraint ?s_1 . ?s_1 ps:property constraint :type constraint
     ; pq:annotationJ ?A .
 FILTER NOT EXISTS {
   ?y instance of _:1 . _:1 instance of ?t  FILTER(extfn:contains(extfn:getClass(?A), ?t) }

Donc il suffit

  • de remplacer le CONSTRUCT par un SELECT sur les variables du body
  • de mettre dans le FILTER NOT EXISTS tout ce qui est à droite du -->

======> Proposition d'extension du langage de règles

  • La tête de la règle peut contenir plusieurs statements et conditions
  • Les variables qui n'apparaissent que dans la tête sont des variables existentielles

Une règle du genre

P(x, y) -> Q(x, z), R(z, y)

s'interpréterait comme

\forall x \forall y \exists z \ P(x,y) \to Q(x, z) ∧ R(z, y)

On peut ensuite s'en servir en inférence avec

CONSTRUCT { ?x p:Q _:1 . _:1 ps:Q _:z . _:z p:R _:2 . _:2 ps:R ?y } WHERE { ?x p:P _:3 . _:3 ps:Q ?y FILTER NOT EXISTS { ?x p:Q _:1 . _:1 ps:Q _:4 . _:4 p:R _:2 . _:2 ps:R ?y } }

Ça correspond bien à l'idée que les noeuds blancs représentent des variables quantifiées existentiellement.

On peut aussi s'en servir en mode validation avec

SELECT ?x ?y WHERE { ?x p:P _:3 . _:3 ps:Q ?y FILTER NOT EXISTS { ?x p:Q _:1 . _:1 ps:Q _:z . _:z p:R _:2 . _:2 ps:R ?y } }

Edited by gilles.falquet