Beruflich Dokumente
Kultur Dokumente
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
Ejemplos: pedro
x25
x_1
esPadre(X,Y).
Ejemplos: X
Lista
Persona
Comentarios: %
Elementos del lenguaje
• Hechos (átomos).
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.
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:
?-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).
?-gusta(_,maria).
?-gusta(maria,_).
?-gusta(juan,X) , gusta(maria,Y).
?-gusta(juan,X) , gusta(maria,X).
gusta(juan,maria).
gusta(alguien,maria). ∃x (gusta(x,maria))
gusta(alguien,paula). ∃x (gusta(x,paula))
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
∀x (gusta(maria,x) → gusta(juan,x))
gusta(juan,X) :- gusta(maria,X).
:- se lee “si”
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
^
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
ascend(Asc,Desc) :- padre(Asc,Hijo),
ascend(Hijo,Desc). /* Llamada recursiva */
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.
[ Cabeza | Cuerpo]
Definición intuitiva:
miembro(E,[X|Y]) :- X=E.
miembro(E,[X|Y]) :- miembro(E,Y).
miembro(X,[X|Y]).
miembro(E,[X|Y]) :- miembro(E,Y).
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)
• 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
?- 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
Ejemplo:
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).
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.
?- 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.
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).
assert(Clausula)
:- dynamic Predicado/Aridad .
retractall(Clausula)
abolish(Predicado/Aridad)
trace / notrace
spy(Predicado)/nospy(Predicado)
debugging
Permite ver una lista con los puntos espía que se han establecido hasta el momento.
debug /nodebug
Inicia/finaliza el depurador.