You are on page 1of 4

David Camacho Fernndez

Temas Avanzados en Ingeniera Informtica I (Lgica)


Fallo
fail (fallo) es un predicado que siempre produce fallo Es til cuando queremos detectar casos explcitos que invalidan un predicado
Para evitar la aplicacin de una regla, se puede forzar el fallo con una combinacin del corte, y la constante fail

Fallo y Negacin en Prolog


David Camacho Fernndez Departamento de Ingenera Informtica Despacho: B-306 e-mail: David.Camacho@uam.es http://www.ii.uam.es/~dcamacho

fail es un objetivo que nunca se satisface

Fallo

Fallo
Solucin 1:
nand7(0, _, _, _, _, _, _). nand7(_, 0, _, _, _, _, _). nand7(_, _, 0, _, _, _, _). nand7(_, _, _, 0, _, _, _). nand7(_, _, _, _, 0, _, _). nand7(_, _, _, _, _, 0, _). nand7(_, _, _, _, _,_, _0).

Ejemplo 1: Programa que simule una puerta lgica nand de 7 entradas (equivale a not and)

Esta puerta lgica slo da falso en su salida cuando todas las entradas son ciertas (en este caso vamos a suponer que entrada=1 equivale a cierto)

Solucin 2:
nand7(1, 1, 1, 1, 1, 1, 1) :- !, fail. nand7(_, _, _, _, _, _, _).

Lgica

David Camacho Fernndez

Fallo

Fallo
Comprobacin de diferencia different(X,X) :- !, fail. different(X,Y).

Ejemplo 2: Por ejemplo, Todos los pjaros, excepto el avestruz y el pingino, 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.

Negacin

Negacin

Existe un predicado de negacin en Prolog (not) que est implementado como negacin por fallo Esto quiere decir que se evala como falso cualquier cosa que Prolog sea incapaz de verificar que su predicado argumento es cierto

Otros ejemplos:
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).

Consultas: ?- millonario(X). X = flora ; X = antonio ?- pobre(X). No.

Ejemplo:

no_nulo(X) :- not (X =:= 0).

Lgica

David Camacho Fernndez

Negacin

Negacin

Otros ejemplos: persona_interesante(X) :- not padre_de(X, _), millonario(X). ?- persona_interesante(X). No. ?- persona_interesante(flora). Yes.
persona_interesante(X) :- millonario(X), not padre_de(X, _). ?- persona_interesante(X). X = flora pudiente(X) :- not (pobre(X)). % No equivale a millonario!

La negacin en Prolog puede definirse como:


not(P) :P, !, fail ; true.

Muchos intrpretes de prolog traen el predicado not predefinido, con un operador asociado \+
vuela(X) :- pajaro(X), \+ pinguino(X), \+ avestruz(X).

Negacin

Negacin

Problemas con el corte y la negacin


Problemas con la negacin. 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

Corte:

Los programas ya no corresponden a la definicin declarativa: el orden de las clusulas importa, y puede ser necesario forzar a que algn argumento sea una variable no instanciada

Negacin:

No corresponde a una negacin lgica, sino al hecho de que no hay evidencia para demostrar lo contrario

Lgica

David Camacho Fernndez

Negacin

Negacin

Problemas con la negacin.


En Prolog, una consulta con una variable no instanciada se satisface si hay al menos una asignacin de valores a la variable que la cumpla:
buena_comida(X) -> X = casa_paco

Problemas con la negacin.

Al usar la negacin, esa consulta pasa a ser cierta si el argumento de la negacin fue falso, es decir, si ninguna asignacin posible de valores cumpli la frmula:
not(razonable(X)) = no(existe X tal que X razonable) = para todo X, X no es razonable

?- 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).

Lgica

You might also like