Académique Documents
Professionnel Documents
Culture Documents
Introducción
Introducción a Prolog
Hechos y consultas
Reglas. Recursión
Funcionamiento de prolog
Sintaxis y semántica del lenguaje
Morfología
Enrique Alfonseca
Unificación
(basado en el libro de Iván Bratko)
Funcionamiento procedimental
Escuela Politécnica Superior, UAM
Listas, operadores, aritmética
Control del backtracking
1
Consultas (III) – Varias variables Consultas (IV) – Varios
predicados
En consultas con varias variables, se retornarán Es posible combinar varios predicados en la
todas las combinaciones de valores posibles:
misma consulta. En este caso, para
?- progenitor(X,Y).
satisfacer la consulta deberán satisfacerse
X = juan
Y = luis ;
todos ellos:
X = juan ?- progenitor(juan,Y),
Y = maria ; progenitor(Y,carlos).
X = luis Y = luis ;
Y = carlos ; ?- progenitor(X,luis),
X = luis progenitor(X,maria).
Y = maria ; X = juan
Formula en prolog las siguientes consultas: Podríamos introducir todos los hechos
¿Quién es el progenitor de Luis? inversos acerca de quién es hijo de quién:
hijo(luis,juan).
hijo(maria,juan).
¿Quién es el abuelo de Laura?
Una manera más sencilla sería introducir una
regla:
¿Quién es hermano de Carlos? Para todo X e Y,
Si X es progenitor de Y,
Y es hijo de X
2
Reglas (IV) – Ejemplo Ejercicios
hermano(X,Y) :- Escribe en prolog:
progenitor(Z,X), Todo aquel que tiene un hijo es feliz.
progenitor(Z,Y).
?- hermano(luis,H).
Define las relaciones “abuelo” y “nieto”
H = luis ;
Describe (informalmente) cómo modificarías el predicado
H = maria ;
hermano para que no saliera uno hermano de sí mismo:
3
Funcionamiento de prolog (II) – Funcionamiento de prolog (III)
Ejemplo
Los contenidos de la base de datos son: ?- progenitor(juan,X)
progenitor(juan,luis). Prolog busca el primer hecho o regla con
progenitor(juan,maria). nombre “progenitor”, y cuyo primer
progenitor(luis,carlos) argumento sea el átomo “juan”.
progenitor(luis,laura).
El primer resultado (en la BD) es
antepasado(X,Y) :- progenitor(X,Y).
progenitor(juan,luis).
antepasado(X,Y) :- progenitor(X,Z), por lo que el intérprete devuelve
antepasado(Z,Y). X = luis
Ejercicio Ejercicio
Simula cómo razonaría prolog para devolver Dada la siguiente base de datos (suponiendo que
está definido el predicado “diferentes”):
todos los descendientes de “juan”, utilizando progenitor(juan,carlos).
el predicado “progenitor”. progenitor(juan,maria).
progenitor(carlos,luis).
progenitor(maria,marta).
hermano(X,Y) :- progenitor(Z,X), progenitor(Z,Y),
diferentes(X,Y).
Simula la consulta “primo(luis,X).” dadas las
siguientes dos definiciones alternativas:
primo(X,Y) :-
progenitor(A,X),progenitor(B,Y),hermano(A,B).
primo(X,Y) :-
hermano(A,B),progenitor(A,X),progenitor(B,Y).
4
Índice Átomos
Introducción Los átomos (o constantes simbólicas)
Hechos y consultas pueden tomar los siguientes nombres:
Reglas. Recursión
Cadenas de letras, dígitos y guión bajo,
Funcionamiento de prolog
comenzando por una letra minúscula: juan, x,
Sintaxis y semántica del lenguaje el_pais
Morfología
Cadenas de caracteres especiales: + - * / < > = : .
Unificación & _ ~: <===>, --->, .:., ::=, ...
Funcionamiento procedimental
Cadenas de caracteres entre comillas simples:
Listas, operadores, aritmética 'El_Salvador', 'Nueva_Guinea', 'Juan'
Control del backtracking
Números Variables
Estructuras Ejercicios
Son objetos que tienen varios componentes. ¿Cuáles de los siguientes son objetos
morfológicamente correctos?
La estructura ha de tener un nombre (functor) Diana
El functor tiene atributos: los elementos de la diana
estructura. _diana
'Diana'
Por ejemplo:
'Diana se va al sur'
date(1, mayo, 2001): puede usarse para va(diana, sur)
representar el 1 de mayo de 2001 45
date(Dia, mayo, 2001): para representar 5(x,y)
cualquier día de mayo de 2001. +(north, west)
three(Black(Cats))
5
Unificación (I) Unificación (II)
Dados dos términos, decimos que unifican si: Siempre se escoge la unificación más
Son idénticos, o general:
Las variables de los dos términos se pueden date(D,M,2001) date(D1, mayo, A1)
instanciar a objetos de manera que los dos D = D1 D = 1 D = siete
términos lleguen a ser idénticos. M = mayo D1 = 1 D1 = siete
Ejemplo: date(D,M,2001) date(D1, mayo, A1) A1 = 2001 M = mayo M = mayo
D = D1 A1 = 2001 A1 = 2001
M = mayo
A1 = 2001
6
Semántica procedimental Peligro de bucle infinito
7
Listas (III) - Ejemplo Separación de la cabeza y la cola
?- List1 = [a,b,c], Se puede especificar explícitamente la
List2 = .(a, .(b, .(c, []))), separación entre la cabeza y la cola,
List3 = [a,List1,List2]. mediante una barra vertical:
List1 = [a,b,c] ?- L = [a,b,c], R = [cabeza|L]
L = [a,b,c]
List2 = [a,b,c]
R = [cabeza,a,b,c]
List3 = [a,[a,b,c],[a,b,c]]
?- L=[a,b,c], R=[el1,el2|L], U=[a|[]]
L = [a,b,c]
R = [el1,el2,a,b,c]
U = [a]
L1=[a,b]
L2=[] ;
no
8
Ejercicios Operadores (I)
Define el predicado "last" que devuelva el Aunque las listas son estructuras .(Head,Tail),
último elemento de una lista, de dos se pueden escribir entre corchetes por
maneras: claridad.
Basándose en el predicado "conc" Otros predicados, también por claridad, se
Sin utilizarlo. pueden escribir como operadores (p.ej., con
Escribe un predicado para añadir un notación infija).
elemento a una lista. Ejemplo:
Escribe un predicado para eliminar un +(3, 5)
3 + 5
elemento de una lista.
Existen operadores predefinidos para Los operadores son como cualquier otro
operaciones aritméticas predicado de prolog. Por omisión, no se
+ Suma evalúan.
- Resta ?- X = 1 + 2.
X = 1 + 2
* Multiplicación
/ División Se puede forzar la evaluación utilizando el
// División entera operador "is".
?- X is 1 + 2.
** Elevación a potencia X = 3
mod Módulo (resto de división)
9
Operadores – Ejercicios Índice
Ejemplo:
?- f(1,Y)
Ejemplo(II) Ejemplo(III)
f(X,0) :- X < 3, !. f(X,0) :- X < 3, !.
f(X,2) :- 3 =< X, X < 6, !. f(X,2) :- X < 6, !.
f(X,4) :- 6 =< X. f(X,4).
10
Corte Corte (II)
c(X) :- p(X),q(X),r(X),!,s(X),t(X),u(X).
Sea G el objetivo a satisfacer. c(X) :- v(X).
Si entre los antecedentes de G se encuentra a(X) :- b(X),c(X),d(X).
a(maria).
un corte !,
El corte inmediatamente se da por satisfecho ?- a(X).
Suponemos que b(X) se cumple.
Todas las alternativas a reglas para G dejan de
Suponemos que p,q,r se cumplen, y la X se instancia a un cierto
considerarse valor.
Todas las alternativas a los antecedentes previos ! también se cumple (automáticamente)
?- max(3,1,1).
yes
11
Ejercicios (III) Negación como fallo
Escribe, con y sin cortes, el procedimiento Para evitar la aplicación de una regla, se
“split”, que divide una lista en dos sublistas, puede forzar el fallo con una combinación del
la primera con los números positivos, y la corte, y la constante “fail”.
segunda con los negativos. “fail” es un objetivo que nunca se satisface.
?- split([3,-1,0,5,-2],[3,0,5],[-1,-2]). Por ejemplo, “Todos los pájaros, excepto el
yes avestruz y el pingüino, vuelan”:
vuela(X) :- pinguino(X), !, fail.
vuela(X) :- avestruz(X), !, fail.
vuela(X) :- pajaro(X).
different(X,Y) :-
Muchos intérpretes de prolog traen el predicado not
X = Y , !, fail
predefinido, con un operador asociado \+
;
vuela(X) :- pajaro(X), \+ pinguino(X),
true. \+ avestruz(X).
donde “true” es un objetivo que siempre se cumple.
12
Problema con negación – Causa Negación - Ejercicios
En Prolog, una consulta con una variable no hombre(juan).
hombre(carlos). ?- soltero(juan).
instanciada se satisface si hay al menos una ?- soltero(carlos).
mujer(maria).
asignación de valores a la variable que la cumpla: ?- soltero(X).
mujer(laura).
buena_comida(X) -> X = casa_paco ?- sinHijos(juan).
padre(juan,maria).
?- sinHijos(carlos).
Al usar la negación, esa consulta pasa a ser cierta padre(juan,carlos). ?- sinHijos(X).
si el argumento de la negación fue falso, es decir, si madre(laura,maria). ?- soltero(X), sinHijos(X).
ninguna asignación posible de valores cumplió la madre(laura,carlos). ?- hombre(X), soltero(X),
fórmula: esposo(juan,laura). sinHijos(X).
not(razonable(X)) = no(existe X tal que X razonable) = esposo(laura,juan).
para todo X, X no es razonable soltero(X) :- \+ esposo(X,Y).
sinHijos(X) :- \+ padre(X,Y), \+ madre(X,Z).
13