Así que estoy tratando de entender cómo funciona Datalog y una de las diferencias entre él y Prolog es que tiene limitaciones de estratificación sobre la negación y la recursión. Para citar Wikipedia:Datalog Stratification
Si un predicado P se deriva positivamente de un predicado Q (es decir, P es la cabeza de una regla, y Q se produce positivamente en el cuerpo de la misma norma ), entonces la número estratificación de P debe ser mayor que o igual al número estratificación de Q
Si un predicado P se deriva de un predicado negada Q (es decir, P es la cabeza de una regla, y Q se produce negativamente en el cuerpo de la misma regla), , entonces el número de estratificación de P debe ser mayor que el estratificado número de solicitud de Q,
De este modo, los dos predicados siguientes no producen un error de estratificación ya que simplemente se les puede asignar el mismo número de estratificación. Entonces estos predicados están bien, a pesar de la definición circular.
- A (x): - B (x)
- B (x): - A (x)
Pero contraste con lo que sucede si tenemos una definición que tiene algo de negación involucrados (donde ~ es la negación)
- A (x): - ~ B (x)
- B (x): - ~ A (x)
Aquí una estratificación es imposible. A (x, y) debe tener un número de estratificación mayor que B (x, y), y B (x, y) debe tener un número de estratificación mayor que A (x, y). Mi primer pensamiento fue que esto no estaba bien porque esta es una definición circular, pero la estratificación está bien con la circularidad en tanto los predicados no se nieguen. ¿Pero por qué? Los valores de verdad son simplemente binarios. Parece extremadamente arbitrario tratar las fórmulas que tienen un símbolo de negación de manera diferente de esta manera. ¿Qué trata de evitar esta estratificación en el segundo caso que no está en el primero?