¿Prolog se basa realmente en la suposición del mundo cerrado?
Bajo la suposición del mundo cerrado ,
lo que actualmente no se sabe que sea cierto, es falso
A menudo se dice que la semántica de Prolog sigue el supuesto de mundo cerrado, por ejemplo, aquí :
Prolog se basa en el supuesto de mundo cerrado (CWA); es decir, si una proposición no está en la base de datos de hechos y no es derivable de la base de datos de hechos, entonces no es verdadera.
Sin embargo, no se comporta de esta manera. Bajo CWA, esperaría
?- a.
false.
Pero en cambio, en SWI-Prolog, obtengo:
?- a.
ERROR: Undefined procedure: a/0 (DWIM could not correct goal)
¿Porqué es eso? ¿Está mal decir que Prolog se basa en CWA?
Respuestas
Cuando se habla de suposición de mundo cerrado (CWA) en el contexto de Prolog, se debe hacer una distinción entre predicados desconocidos versus predicados conocidos en el sistema (tiempo de ejecución). En ambos casos, predicados con o sin cláusulas.
Llamar a un predicado desconocido generará, de forma predeterminada, un error de existencia de predicado. Hay una marca estándar unknown, cuyo valor predeterminado es error, que se puede establecer en fail. Eso le dará el comportamiento que aparentemente está buscando. Aún así, le recomiendo encarecidamente que mantenga la bandera establecida en su valor predeterminado de error, ya que permite una detección más fácil de los predicados de programación (por ejemplo, errores tipográficos en los nombres de predicados o arity).
¿Qué hace que un predicado sea conocido por el tiempo de ejecución? Directivas de predicado o cláusulas de predicado. El ejemplo más conocido es la dynamic/1directiva. Si su código consta únicamente del siguiente texto:
:- dynamic(foo/1).
Luego, después de compilar y cargar, puede esperar:
?- foo(_).
no.
Pero otras directivas tienen el mismo efecto (por ejemplo , multifile/1y discontiguous/1, ¡asumiendo que es una implementación estándar de Prolog!).
Por lo tanto, para los predicados conocidos , la interpretación de CWA en Prolog es simple: lo que no podemos probar que sea cierto, es falso. Es decir, negación por fracaso , que no es lo mismo que negación lógica . El nombre Prolog proviene de la programación en lógica, pero Prolog también pretende ser un lenguaje de programación pragmático y práctico.
Lo que falta en Prolog (y lo proporciona, por ejemplo, Logtalk ) es poder declarar un predicado sin estar obligado a declararlo como dinámico, o multifile, o ... o requerir que se proporcionen cláusulas para él (ver, por ejemplo, este ejemplo ). Esto proporciona una semántica CWA más simple y clara: llamar a un predicado declarado sin cláusulas falla (sin la necesidad de jugar con el unknownindicador problemático ); llamar a un predicado no declarado genera un error de existencia de predicado.
Espero que esto ayude. La búsqueda de la negación como fracaso debería proporcionar más aclaraciones.
Su consulta debe estar en el lenguaje mismo, porque apara ser una proposición a/0debe estar en el lenguaje, es decir, definida como un predicado. Todos los predicados nulares del lenguaje son proposiciones. No puede consultar un nuevo término como predicado sin antes agregarlo al idioma.
Porque a/1cuando lo define tal como a(b).está en el lenguaje, entonces la consulta a(X), dif(X,b)fallará ya que el sistema de prólogo no conoce ningún otro término que lo satisfaga y asumiendo mundo cercano no hay otro.