Buscar..


Razonamiento sobre predicados monotónicos.

Los predicados monótonos se pueden depurar aplicando un razonamiento declarativo .

En Prólogo puro, un error de programación puede llevar a uno o todos los siguientes fenómenos:

  1. el predicado tiene éxito incorrectamente en un caso donde debe fallar
  2. el predicado falla incorrectamente en un caso en el que debería tener éxito
  3. el predicado bucles de forma inesperada en el que sólo debe producir un conjunto finito de respuestas.

Como ejemplo, considere cómo podemos depurar el caso (2) mediante el razonamiento declarativo: podemos eliminar sistemáticamente los objetivos de las cláusulas del predicado y ver si la consulta sigue fallando. En el código monotónico, la eliminación de objetivos puede, como máximo, hacer que el programa resultante sea más general . Por lo tanto, podemos identificar los errores al ver cuál de los objetivos conduce al fracaso inesperado.

Ejemplos de predicados monotónicos.

Ejemplos de predicados monotónicos son:

  • unificación con (=)/2 o unify_with_occurs_check/2
  • dif/2 , expresando desigualdad de términos
  • Las restricciones de CLP (FD) como (#=)/2 y (#>)/2 , utilizan un modo de ejecución monotónico.

Los predicados de Prolog que solo usan objetivos monotónicos son a su vez monotónicos.

Los predicados monótonos permiten el razonamiento declarativo:

  1. Agregar una restricción (es decir, un objetivo) a una consulta puede, como máximo, reducir , nunca extender, el conjunto de soluciones.
  2. Eliminar un objetivo de tales predicados puede, como mucho, extender , nunca reducir, el conjunto de soluciones.

Predicados no monotónicos

Aquí hay ejemplos de predicados que no son monotónicos:

  • predicados meta-lógicos como var/1 , integer/1 etc.
  • predicados de comparación de términos como (@<)/2 y (@>=)/2
  • predicados que usan !/0 , (\+)/1 y otras construcciones que rompen la monotonicidad
  • Todas las soluciones predican como findall/3 y setof/3 .

Si se usan estos predicados, entonces agregar metas puede llevar a más soluciones, lo que va en contra de la importante propiedad declarativa conocida por la lógica de que agregar restricciones puede, como máximo, reducir , nunca extender, el conjunto de soluciones.

Como consecuencia, otras propiedades en las que confiamos para la depuración declarativa y otros razonamientos también se rompen. Por ejemplo, los predicados no monotónicos rompen la noción fundamental de conmutatividad de conjunción conocida desde la lógica de primer orden. El siguiente ejemplo lo ilustra:

?- var(X), X = a.
X = a.

?- X = a, var(X).
false.

Los predicados de todas las soluciones, como findall/3 también rompen la monotonicidad: agregar cláusulas puede llevar al fracaso de los objetivos que antes se mantenían . Esto también va en contra de la montonicidad conocida por la lógica de primer orden, donde agregar hechos puede aumentar , como máximo, nunca reducir el conjunto de consecuencias.

Alternativas monotónicas para construcciones no monotónicas.

Aquí hay ejemplos de cómo usar predicados monótonos en lugar de construcciones impuras y no monótonas en sus programas:

  • dif/2 está destinado a ser utilizado en lugar de construcciones no monotónicas como (\=)/2
  • las restricciones aritméticas (CLP (FD), CLP (Q) y otras) están destinadas a ser utilizadas en lugar de predicados aritméticos modificados
  • !/0 casi siempre conduce a programas no monotónicos y debe evitarse por completo.
  • Los errores de creación de instancias se pueden generar en situaciones en las que no puede tomar una decisión acertada en este momento.

Combinando la monotonicidad con la eficiencia.

A veces se argumenta que, en aras de la eficiencia, debemos aceptar el uso de construcciones no monotónicas en los programas Prolog del mundo real.

No hay evidencia de esto. Investigaciones recientes indican que el subconjunto monotónico puro de Prolog no solo puede ser suficiente para expresar la mayoría de los programas del mundo real, sino que también es aceptable en la práctica. Un constructo que recientemente se ha descubierto y alienta esta vista es if_/3 : combina la monotonicidad con una reducción de los puntos de elección. Ver Indización dif / 2 .

Por ejemplo, código del formulario:

pred(L, Ls) :-
    condition(L),
    then(Ls).
pred(L, Ls) :-
    \+ condition(L),
    else(Ls).

Se puede escribir con if_/3 como:

pred(L, Ls) :-
    if_(condition(L),
        then(Ls),
        else(Ls)).

y combina la monotonicidad con el determinismo.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow