David Camacho Fernández Temas Avanzados en Ingeniería Informática I (Lógica) Fallo Fallo y Negación en Prolog David Camacho Fernández Departamento de Ingenería Informática Despacho: B-306 e-mail: [email protected] http://www.ii.uam.es/~dcamacho Ejemplo 1: Programa que simule una puerta lógica nand Esta puerta lógica sólo da falso en su salida cuando todas que entrada=1 equivale a cierto) Lógica “fail” es un objetivo que nunca se satisface Solución 1: nand7(0, _, _, _, _, _, _). nand7(_, 0, _, _, _, _, _). nand7(_, _, 0, _, _, _, _). nand7(_, _, _, 0, _, _, _). nand7(_, _, _, _, 0, _, _). nand7(_, _, _, _, _, 0, _). nand7(_, _, _, _, _,_, _0). de 7 entradas (equivale a not and) las entradas son ciertas (en este caso vamos a suponer Para evitar la aplicación de una regla, se puede forzar el fallo con una combinación del corte, y la constante “fail” Fallo Es útil cuando queremos detectar casos explícitos que invalidan un predicado Fallo fail (fallo) es un predicado que siempre produce fallo Solución 2: nand7(1, 1, 1, 1, 1, 1, 1) :- !, fail. nand7(_, _, _, _, _, _, _). 1 David Camacho Fernández Fallo Fallo Comprobación de diferencia Ejemplo 2: Por ejemplo, “Todos los pájaros, excepto el different(X,X) :- !, fail. different(X,Y). avestruz y el pingüino, vuelan”: o bien: vuela(X) :- pinguino(X), !, fail. vuela(X) :- avestruz(X), !, fail. vuela(X) :- pajaro(X). different(X,Y) :- X = Y , !, fail ; true. donde “true” es un objetivo que siempre se cumple. Negación Existe un predicado de negación en Prolog (not) que está implementado como negación por fallo Negación saldo_cuenta(maria,1000). saldo_cuenta(flora,3000000). saldo_cuenta(antonio,2000000). padre_de(antonio, maria). millonario(X) :- saldo_cuenta(X, Y), Y > 1000000. pobre(X) :- not millonario(X). Esto quiere decir que se evalúa como falso cualquier cosa que Prolog sea incapaz de verificar que su predicado argumento es cierto Ejemplo: Lógica no_nulo(X) :- not (X =:= 0). Otros ejemplos: Consultas: ?- millonario(X). X = flora ; X = antonio ?- pobre(X). No. 2 David Camacho Fernández Negación Otros ejemplos: Negación La negación en Prolog puede definirse como: persona_interesante(X) :- not padre_de(X, _), millonario(X). not(P) :- ?- persona_interesante(X). No. P, !, fail ; ?- persona_interesante(flora). Yes. persona_interesante(X) :- millonario(X), not padre_de(X, _). ?- persona_interesante(X). X = flora pudiente(X) :- not (pobre(X)). true. Muchos intérpretes de prolog traen el predicado not predefinido, con un operador asociado \+ % ¡No equivale a millonario! vuela(X) :- pajaro(X), \+ pinguino(X), \+ avestruz(X). Negación Problemas con el corte y la negación Corte: ) Negación: ) Lógica Los programas ya no corresponden a la definición declarativa: el orden de las cláusulas importa, y puede ser necesario forzar a que algún argumento sea una variable no instanciada No corresponde a una negación lógica, sino al hecho de que no hay evidencia para demostrar lo contrario Negación Problemas con la negación. Ejemplo de restaurantes: buena_comida(el_meson). caro(el_meson). buena_comida(casa_paco). razonable(Restaurante) :- \+ caro(restaurante). ?- buena_comida(X), razonable(X). X = casa_paco ?- razonable(X), buena_comida(X). no 3 David Camacho Fernández Negación Problemas con la negación. En Prolog, una consulta con una variable no instanciada se satisface si hay al menos una asignación de valores a la variable que la cumpla: buena_comida(X) -> X = casa_paco Al usar la negación, esa consulta pasa a ser cierta si el argumento de la negación fue falso, es decir, si ninguna asignación posible de valores cumplió la fórmula: not(razonable(X)) = no(existe X tal que X razonable) = para todo X, X no es razonable Lógica Negación Problemas con la negación. ?- soltero(juan). hombre(juan). ?- soltero(carlos). hombre(carlos). ?- soltero(X). mujer(maria). mujer(laura). ?- sinHijos(juan). padre(juan,maria). ?- sinHijos(carlos). padre(juan,carlos). ?- sinHijos(X). madre(laura,maria). ?- soltero(X), sinHijos(X). madre(laura,carlos). ?- hombre(X), soltero(X), esposo(juan,laura). sinHijos(X). esposo(laura,juan). soltero(X) :- \+ esposo(X,Y). sinHijos(X) :- \+ padre(X,Y), \+ madre(X,Z). 4