Negación y Fallo en Prolog

Anuncio
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
Descargar