Вы находитесь на странице: 1из 39

Ejemplo de clasificación de animales con prolog

Disponemos de una base de conocimiento compuesta de reglas sobre clasificación


de animales y hechos sobre características de un animal.

Regla 1: Si un animal es ungulado y tiene rayas negras, entonces es una cebra.


Regla 2: Si un animal rumia y es mamífero, entonces es ungulado.
Regla 3: Si un animal es mamífero y tiene pezuñas, entonces es ungulado

Hecho 1: El animal es mamífero.


Hecho 2: El animal tiene pezuñas.
Hecho 3: El animal tiene rayas negras

Demostrar a partir de la base de conocimientos que el animal es una


cebra.
Para resolver el problema anterior con Prolog vamos a considerar las siguientes cuestiones:

1. cómo se representan en Prolog las reglas,


2. cómo se representan en Prolog los hechos,
3. cómo se representan en Prolog las bases de conocimientos,
4. cómo se inicia una sesión Prolog,
5. cómo se carga en Prolog la base de conocimiento,
6. cómo se representa en Prolog el objetivo a demostrar,
7. cómo se interpreta la respuesta de Prolog,
8. cómo ha realizado Prolog la búsqueda de la demostración,
9. cuál es la demostración obtenida y
10. cómo se corresponde dicha demostración con la anteriormente presentada.
REPRESENTACIÓN DE LAS REGLAS

Lógica Prolog
 Si es_ungulado y tiene_rayas_negras entonces es_cebra es_cebra :- es_ungulado, tiene_rayas_negras.
 es_ungulado ^ tiene_rayas_negras → es_cebra

es_ungulado :- rumia, es_mamífero. % Regla 2


es_ungulado :- es_mamífero, tiene_pezuñas. % Regla 3
es_mamífero. % Hecho 1
tiene_pezuñas. % Hecho 2
tiene_rayas_negras. % Hecho 3
DEDUCCIÓN DE LAS REGLAS
El lenguaje PROLOG

• El PROLOG, cuyo nombre proviene del francés “PROgrammation en LOGique”,


es un lenguaje de programación declarativa muy utilizado en Inteligencia
Artificial.

• Se creó a principios de los años 70 en la Universidad de Aix-Marseille (Marsella,


Francia) por los profesores Alain Colmerauer y Philippe Roussel.

• PROLOG usa la Lógica de Predicados de Primer Orden (restringida a cláusulas de


Horn) para representar datos y conocimiento, utiliza encadenamiento hacia
atrás y una estrategia de control retroactiva (backtracking).
Tokens del lenguaje

Los nombres de predicados y las constantes empiezan con minúscula y


se construyen como cadenas de letras, dígitos y _

Ejemplos: pedro
x25
x_1
esPadre(X,Y).

Variables: Cadenas de letras, dígitos y _ empezando con mayúscula

Ejemplos: X
Lista
Persona

Comentarios: %
Elementos del lenguaje

• Hechos (átomos).

• Reglas (cláusulas de Horn).

• Preguntas u objetivos (conjunciones de átomos).


Hechos

• Átomos en Lógica de Predicados.


• No se permiten disyunciones.
• Los nombres de los predicados empiezan con minúscula.
• El hecho debe terminar con un punto.

Lógica de Predicados PROLOG


esHombre(Juan) esHombre(juan).
gusta(Pedro, Manzana) gusta(pedro, manzana).
esHombre(Pedro) ∧ esHombre(Juan) esHombre(pedro).
esHombre(juan).
esHombre(Pedro) ∨ esPerro(boby) /* No puede representarse */
∃x quiere(x,Juan) quiere(alguien,juan).
Preguntas u objetivos

En tiempo de ejecución, aparece el prompt ?- y el intérprete de PROLOG espera que el


usuario introduzca un objetivo en forma de predicado, con o sin variables.

Los archivos con extensión .pl contienen la base de conocimiento (hechos y reglas).

Ejemplos:

1 ?- esHombre(juan).
true.

2 ?- esHombre(pedro).
true.

3 ?- esHombre(carlos).
false.
4 ?- esMamifero(leon).
ERROR: toplevel: Undefined procedure: esMamifero/1 (DWIM could not correct goal)

5 ?- gusta(juan,manzana).
false.

6 ?- gusta(pedro,manzana).
true.

7 ?- quiere(juan,martha).
false.

8 ?- quiere(_,juan).
true
Preguntas compuestas

?- esHombre(juan), esHombre(pedro).
true.

?- esHombre(juan), esHombre(carlos).
false.

En PROLOG, la coma representa el conectivo ∧. Puede usarse dentro de una pregunta y


(como se verá después) dentro de una regla, pero no en la declaración de un hecho.

PROLOG intenta demostrar los objetivos en el orden especificado. Si no puede


demostrar alguno de ellos, devolverá “false". Si puede demostrarlos todos, devolverá “true".

Cada objetivo de una lista de objetivos tiene asociado un puntero que se encarga
de recorrer la memoria de trabajo buscando átomos que se unifiquen con dicho objetivo.
Ejemplo: ?-esHombre(juan) , quiere(juan,elena).
⇒1 ⇒2

⇒1 esHombre(pedro). /* no */
esHombre(juan).
quiere(juan,maria).
quiere(juan,elena).
quiere(pedro,raquel).
quiere(pedro,belen).

esHombre(pedro).
⇒1 esHombre(juan). /* yes */
⇒2 quiere(juan,maria). /* no */
quiere(juan,elena).
quiere(pedro,raquel).
quiere(pedro,belen).

esHombre(pedro).
⇒1 esHombre(juan). /* yes */
quiere(juan,maria).
⇒2 quiere(juan,elena). /* yes */
quiere(pedro,raquel).
Tipos de preguntas:

• Sin variables: La respuesta es, simplemente, yes(true) o no (false).

?-esHombre(juan), esHombre(pedro).
yes

• Con variables, cuando estamos interesados en obtener todos los objetos que
cumplen un objetivo.

?-esHombre(Persona).
Persona = juan;
Persona = pedro
Más ejemplos:

?-gusta(X,maria).

¿A quién le gusta María ?

?-gusta(_,maria).

¿Hay alguien a quien le gusta María?

?-gusta(maria,_).

¿Hay alguien que le guste a María?

?-gusta(juan,X) , gusta(maria,Y).

¿Quién le gusta a Juan, Quien le gusta a María?

?-gusta(juan,X) , gusta(maria,X).

¿Gustos comunes de Juan y María ?


Especificación de hechos

- Átomos sin cuantificación:

gusta(juan,maria).

- Átomos con cuantificación existencial:

gusta(alguien,maria). ∃x (gusta(x,maria))
gusta(alguien,paula). ∃x (gusta(x,paula))

- Átomos con cuantificación universal,

gusta(X,maria).
gusta(_,maria). ∀x (gusta(x,maria))
Diferencia en el uso de variables anónimas:

Hecho:
gusta(juan,_).
Todo le gusta a Juan

Objetivo:
?-gusta(juan,_).
Existe algo que le guste a Juan?
Reglas

“A Juan le gusta todo lo que le gusta a María”

∀x (gusta(maria,x) → gusta(juan,x))

gusta(juan,X) :- gusta(maria,X).

gusta(juan,X) es el consecuente (la cabecera de la regla).

:- se lee “si”

gusta(maria,X) es el antecedente (el cuerpo de la regla).

El ámbito de la variable X llega hasta el punto .


Estructuras

Una estructura es un único objeto que se compone de una colección de otros objetos,
llamados componentes, lo que facilita su tratamiento.

Ejemplo:
libro(logica_informatica, autor(jose, cuena), 1985).
Operadores

En Prolog están predefinidos los operadores aritméticos y relacionales típicos, con la


precedencia habitual entre ellos:

^
mod
* /
+ -
= \= =< >= < >

Ejemplo:

?-signo(1,4, Signo).
Signo=aries.

horoscopo(aries,21,3,20,4).
horoscopo(tauro,21,4,20,5).
horoscopo(geminis,21,5,20,6).

signo(Dia,Mes,Signo) :- horoscopo(Signo,D1,M1,D2,M2),
( ( Mes=M1, Dia>=D1) ; ( Mes=M2, Dia=<D2) ).
Operador is

cuadrado(X,Y) :- Y is X*X.

?- cuadrado(2,4).
true.

?- cuadrado(2,X).
X = 4.

?- cuadrado(2,_).
true.
Ejemplo:
poblacion(df,8800000).
poblacion(la_paz,250000).

superficie(df,1485)
superficie(la_paz,20275).

densidad(Ciudad,Densidad) :- poblacion(Ciudad,Poblacion),
superficie(Ciudad,Superficie),
Densidad is Poblacion/Superficie.

?- poblacion(la_paz,Poblacion).
P = 250000.

?- superficie(df,Superficie).
S = 1485.

?- densidad(la_paz,Densidad).
D = 12.330456226880395.

?- densidad(df,Densidad).
D = 5925.925925925926.
Funciones aritméticas

(abs, min, max, random, round, integer, float, sqrt, sin, cos, tan, log, log10, exp, ...).

Ejemplos:

?-X is abs(-7.8).
X=7.8

?-X is min(9,7).
X=7

?-X is random(10).
X=8

?-X is sqrt(9).
X=3
Recursividad

Ejemplo: regla para conocer los ascendientes de una persona.

ascend(Asc,Desc) :- padre(Asc,Desc). /* Caso base */

ascend(Asc,Desc) :- padre(Asc,Hijo),
ascend(Hijo,Desc). /* Llamada recursiva */

Ejemplo: regla para obtener el factorial de un número.

factorial(1,F) :- F is 1.
factorial(N,F) :- N>1, N1 is N-1,
factorial(N1,F1),
F is N*F1.
Listas

Una lista es una secuencia ordenada de elementos que puede tener cualquier longitud. Los
elementos de una lista pueden ser cualquier término (constantes, variables, estructuras) u
otras listas.

Una lista puede definirse recursivamente como:

➢ una lista vacía [] (sin elementos), o

➢ una estructura con dos componentes:


• cabeza: primer argumento
• cola: segundo argumento, es decir, el resto de la lista.
Lista Cabeza Cola
Ejemplos:
[a, b, c] a [b, c]
[a] a []
[] (no tiene) (no tiene)
[[a,b], c] [a, b] [c]
[a, [b, c] ] a [ [b, c] ]
[a, [b, c], d] a [ [b, c], d]
Manejo de Listas

Desglose de la cabeza y cuerpo de una lista:

[ Cabeza | Cuerpo]

Para recorrer una lista se requiere utilizar recursividad.

Ejemplo: procedimiento miembro que comprueba si un determinado elemento


pertenece a una lista.

Definición intuitiva:

Un elemento es miembro de una lista si es el primero o está en el resto de la lista.

1ª aproximación: traducción literal

miembro(E,L) :- L=[X|Y], E=X.


miembro(E,L) :- L=[X|Y], miembro(E,Y).
1ª aproximación: traducción literal

miembro(E,L) :- L=[X|Y], E=X.


miembro(E,L) :- L=[X|Y], miembro(E,Y).

2ª aproximación: recepción como parámetro

miembro(E,[X|Y]) :- X=E.
miembro(E,[X|Y]) :- miembro(E,Y).

3ª aproximación: unificación de variables

miembro(X,[X|Y]).
miembro(E,[X|Y]) :- miembro(E,Y).

4ªaproximación: ahorro de espacio en memoria (variable anónima)

miembro(X,[X|_]).
miembro(X,[_|Y]) :- miembro(X,Y).
Predicados de Entrada y Salida

• write(Término)

?- write('Tecnológico de La Paz').
Tecnológico de La Paz

• write_ln(Término)

?- write_ln('Tecnológico'), write_ln('de La Paz').


Tecnológico
de La Paz

• read(Término)

?- read(Nombre), write(Nombre).
|: 'José Pérez'.
José Pérez
Nombre = 'José Pérez'.
• writef (Formato, Argumentos). Ejemplo:

?- padre.
<<Buscar el nombre del padre>>
Hijo: juan.
juan es hijo de mario

padre :- write_ln('<<Buscar el nombre del padre>>'),


write('Hijo:'),
read(Hijo),
hijo(Hijo,Padre),
esHombre(Padre),
writef('%w es hijo de %w',[Hijo,Padre]).
• put(Caracter)

?- write("Tecnológico").
[84,101,99,110,111,108,243,103,105,99,111]

?- desp("Tecnológico").
Tecnológico

desp([C]) :- put(C).
desp([C|L]) :- put(C), desp(L).

• get(Caracter)

captura(Cadena,0) :- Cadena="".
captura(Cadena,N) :- N1 is N-1,
captura(Cadena1,N1),
get(Car),
concatena(Cadena1,[Car],Cadena).
Condición -> Acción

Permite simular la estructura condicional: if-else

Ejemplo:

opcion :- write('Escribe si o no \n'),


read(Respuesta),
(
(Respuesta='si') ->
write('Has respondido afirmativamente')
;
write('Has respondido negativamente')
).
El Corte !

El corte permite decirle a Prolog cuales son las opciones previas que no hace falta que
vuelva a considerar en un posible proceso de reevaluación.

Ejemplo:

esHombre(juan).
esHombre(pedro).
esHombre(mario).
esMujer(susana).
esMujer(lupita).

?- esHombre(H), esMujer(M), nl.

H = juan,
M = susana ;

H = juan,
M = lupita ;

H = pedro,
?- esHombre(H), !, esMujer(M), nl.

H = juan,
M = susana ;

H = juan,
M = lupita.
calif(X,insuficiente) :- X < 5.
calif(X,aprobado) :- X >= 5, X < 7.
calif(X,notable) :- X >= 7, X < 9.
calif(X,sobresaliente) :- X >= 9.

Si calculamos la calificación correspondiente a un 6

?- nota(6,Y).
Y = aprobado;
No

calif(X,insuficiente) :- X < 5, !.
calif(X,aprobado) :- X < 7, !.
calif(X,notable) :- X < 9, !.
calif(X,sobresaliente).
Predicado fail: produce que una regla siempre falle.

Ejemplo:

noSoltero(maria).
soltero(martha) :- !.
soltero(Persona) :- noSoltero(Persona), !, fail.
soltero(Persona) :- writef('Es soltero(a) %w: ?', [Persona]),
read(R),
R==si.

1) Que sucede si preguntamos si es soltera martha?

2) Si sabemos de antemano que martha es soltera, como responde ahora?

3) Como responde si le quitamos el corte?

4) Si agregamos el hecho de que maria no es soltera, que responde si preguntamos


si lo es?

5) Ahora que respuesta nos da para maria?


repeat: permite simular bucles junto con la combinación corte-fail.

Ejemplo:

menu :- repeat,
read(Op),
write_ln(Op),
opcion.

opcion :- !, fail.
listing(Predicado)

Muestra todas las cláusulas que tienen como predicado el átomo al que está instanciada la
variable Predicado.

consult(Archivo).

Añade las cláusulas contenidas en el archivo.

assert(Clausula)

Añade nuevas cláusulas a la base de conocimientos.

:- dynamic Predicado/Aridad .

Indica que se podrán agregar o eliminar cláusulas de ese tipo.


(se agrega al inicio del archivo de la base de conocimiento).
retract(Clausula)

Elimina una cláusula de nuestra base de conocimientos. Se quita la primera cláusula de la


base de conocimientos que coincida.

retractall(Clausula)

Elimina todas las clausulas que coincidan.

abolish(Predicado/Aridad)

Retira de la Base de Conocimientos todas las cláusulas de Predicado.


Depuración de programas en Prolog

trace / notrace

Activa/desactiva el seguimiento de la ejecución de las metas, viendo los distintos objetivos


que intenta satisfacer y el resultado de esta acción. Se da una interacción entre el
programador y la máquina Prolog, pidiéndonos que confirmemos cada paso. Podemos
utilizar las siguientes opciones:

Opción Nombre Descripción


<Enter>,<espacio> Avanzar Continua con la depuración.
«a» Abort Retorna a Prolog .
«b» Break Inicia un nuevo nivel de Prolog.
«f» Fail Hace fallar a ese objetivo.
«g» Goal Muestra la pila de objetivos cumplidos .
«i» stack Ignora el actual objetivo (como cumplido).
«l» Ignore Realiza la pausa solamente en los puntos espía.
«n» Leap Continua ejecución en modo “no debug”.
«r» Nodebug Intenta de nuevo satisfacer el objetivo.
«s» Retry Salta el modo interactivo hasta que se cumple o
Skip falla ese objetivo .
Mensajes del modo depuración

• Call : se intenta satisfacer dicho predicado

• Exit : el predicado ha tenido éxito y se ha satisfecho

• Fail: el objetivo ha fracasado

• Redo: se intenta resatisfacer el objetivo al haber fracasado un predicado posterior

spy(Predicado)/nospy(Predicado)

Fija/elimina un punto espía en el Predicado para poder seguir su funcionamiento.

debugging

Permite ver una lista con los puntos espía que se han establecido hasta el momento.

debug /nodebug

Inicia/finaliza el depurador.

Вам также может понравиться