Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Principio S
Principio S
Ingeniería Informática
Departamento de Lenguajes y
Ciencias de la Computación
Universidad de Málaga
Contenido
P O
Relaciones:
se corresponden con los procedimientos
se definen mediante hechos y reglas
Objetivos:
se corresponden con el programa principal
se definen mediante consultas
Antonio María
objetos
Antonio María
relaciones
Objetos:
Ejemplos:
Antonio antonio
María maría
Relaciones:
Ejemplos:
padre(antonio,carlos).
padre(antonio,eva).
padre(carlos,fernando).
padre(carlos,silvia).
padre(david,emilio).
madre(maría,carlos).
madre(maría,eva).
madre(elena,fernando).
madre(elena,silvia).
madre(eva,emilio).
Ejemplos:
abuelo
Antonio María
hermanos primos
Inconvenientes:
tamaño excesivo
propenso a errores
mantenimiento (nacimientos, etc.)
adaptabilidad a otras situaciones (familias)
hermanos(A,B) :-
padre(P,A),
madre(M,A),
padre(P,B),
madre(M,B),
A \== B.
1. abuelo(A,B) – A es abuelo de B
2. tio(A,B) – A es tío de B
3. primos(A,B) – A y B son primos
4. procrearon(A,B) – A y B tienen algún hijo en común
átomo
constante entero
número
real
término variable
estructura
Sintaxis:
Sintaxis:
Sintaxis:
Ejemplos:
X1
Padre
_X
Num_Telef
ListaClientes
Sintaxis:
sin espacios
átomo(término1,...,términon)
nombre aridad
Ejemplo:
fecha(17,agosto,2004) % fecha/3
fecha(14,abril) % fecha/2
2pi
fecha(12,,2001)
fecha()
cita(fernando,fecha(2,diciembre,2001)
lista (a,b,c)
F(X,Y)
punteros términos
arrays
objeto a constantes
registros
representar
functores
... ...
Constantes:
qué nombre o número resulta apropiado
Variables:
se emplean para objetos por determinar (plantillas)
Estructuras:
functor
orden y sintaxis de los argumentos, recursión.
Sintaxis:
cima::= término
pila(a,pila(fecha(2,enero,2001),pila_vacía))
pila(pila_vacía,pila_vacía)
pila(pila_vacía)
pila(a,pila(b))
Ejemplos:
pilas con 2 elementos y a en la cima
pila(a,pila(X,pila_vacía))
x
y
Objetos:
variables de entrada (a,b,c,...,x,y,z)
puertas lógicas (or, and, nand, not)
Sintaxis:
circuito::= entrada
| or(circuito, circuito)
| and(circuito, circuito)
| nand(circuito, circuito)
| not(circuito)
x
y
or(and(x,y),z)
Ejemplo: cita(silvia,fecha(Día,diciembre,2005))
cita
silvia fecha
padre(antonio,eva) éxito
padre(eva,eva) fracaso
padre(antonio,padre(carlos,silvia)) error
Sintaxis:
sin espacios
átomo.
átomo(término1,...,términon).
Ejemplos:
padre(antonio,eva). % padre/2
es_vacía(pila_vacía). % es_vacía/1
es_par(8). % es_par/1
no_es_vacía(pila(Cima,Resto)).% no_es_vacía/1
Sintaxis:
cabeza (conclusión)
átomo(término1,...,términop) :-
átomo1(término11,...,término1n),
..., cuerpo
átomok(términok1,...,términokm). (condiciones)
procedimiento rescata/2:
rescata(C,P) :-
es_caballero(C),
es_princesa(P),
es_dragon(D),
secuestrada(P,D).
misma variable
procedimiento es_pato/1:
es_pato(P) :- tiene_plumas(P),
hace_cuac(P).
es_pato(P) :- es_pato(T),
sobrino(P,T).
variables distintas
procedimiento progenitor/2:
progenitor(X,Y) :- padre(X,Y).
progenitor(X,Y) :- madre(X,Y).
procedimiento antepasado/2:
antepasado(X,Y) :- progenitor(X,Y).
antepasado(X,Y) :- progenitor(X,Z),
antepasado(Z,Y).
Principios de Programación Lógica 44
Programa Principal: Objetivos
Programa principal: objetivos
Sintaxis:
:- átomo1(término11,...,término1n),
...,
átomok(términok1,...,términokm).
Ejemplos:
¿es Antonio padre de Carlos?
:- padre(antonio,carlos).
:- antepasado(maría,silvia).
:- antepasado(maría,silvia),
antepasado(antonio,silvia).
Ejemplos:
¿quién es el padre de Silvia?
:- padre(X,silvia).
:-antepasado(maría,X).
:- hermanos(X,Y).
Principios de Programación Lógica 48
Semántica Operacional de Prolog
¿Cómo se ejecuta un Programa Prolog?
objetos
relaciones
objetivos
objetivos
Programa
(Hechos y Reglas)
respuestas
Motor de
¿qué es y cómo funciona?...
Inferencia
:- hermanos(silvia,X).
objetivo = invocación
hermanos(A,B) :-
padre(P,A),
madre(M,A),
padre(P,B), regla = procedimiento
madre(M,B),
A \== B.
Las variables Día y Ayer quedan libres (su valor está por
determinar, aunque se sabe que ambas se refieren al mismo valor)
Ejemplo: fecha(Día,Mes,2006)
no unifican
fecha(Ayer,mayo,06)
cita cita
θ; es decir,
Un término B es instancia de un término A si B = Aθ
B se obtiene aplicando una sustitución θ a A
∀ Vi/ti ∈ θ ⇒ ti variable ∧
((ti= Vj) ∨ (2)
ti no aparece en A) (3)
2) A = p(X,f(Y),a) θ = {X/Y}
A θ = p(Y,f(Y),a)
(Aθ)τ (θτ) ∀ A
θ)τ = A(θτ
(θτ)
1. aplicando τ a cada ti de θ
2. eliminando las falsas ligaduras Vi/Vi resultantes de 1)
3. eliminando las ligaduras Ui/si tales que Ui=Vj
θτ = {V1/t1τ, V2/t2τ,...,V
τ, n/tnτ,U1/s1, U2/s2,...,Um/sm}
Aττ = Bττ
τ = θβ
τ = θβ
Ejemplo:
A = p(f(X),Z) B = p(f(Y),V) θ ={X/Y,Z/V}
= σ ={Y/X,Z/V}
=
θ = σ{X/Y}
σ σ = θ{Y/X}
1) p(a,X,h(g(Z))) p(Z,h(Y),h(Y))
2) p(f(a),g(X)) p(Y,Y)
3) p(X,X) p(Y,f(Y))
Un objetivo
:- p(X1,...,Xn).
p(X,Y) :- :-p(Z,b).
r(Y),q(X,Y). 1) renombrar la regla del procedimiento p/2
q(X,Y) :-
p(X1,Y1) :- r(Y1),q(X1,Y1).
r(X),r(Y).
q(X,b) :- 2) unificar parámetros actuales y formales
r(X),t(X). p(X1,Y1)θ = p(Z,b)θ
r(a). θ = {X1/Z,Y1/b}
r(b).
3) obtener el nuevo objetivo
t(b).
:- r(Y1),q(X1,Y1)θ =
:- r(b), q(Z,b).
p1(X1,...,Xn):- C1.
... La invocación de p1/n puede
dar lugar hasta a K ramas...
p1(X1,...,Xn):- Ck.
:- p1(X1,..,Xn),.., p(Z1,..,Zi).
1 .... K
θ1.
:- (C1’,.., p(Z1,..,Zi))θ θk.
:- (Ck’,.., p(Z1,..,Zi))θ
:- p(Z,b).
[en pizarra/SLD-Draw]
:- p(A,B).
[en pizarra/SLD-Draw]
Principios de Programación Lógica 74
Ejemplo 3 de árbol de búsqueda
Dado el programa Prolog:
:- p(Z,b).
[en pizarra/SLD-Draw]
:- p(b,Z).
[en pizarra/SLD-Draw]
:- q(Y,X).
[en pizarra/SLD-Draw]
/* 1 */ p(X,Y) :- q(X,Y),r(X).
/* 2 */ p(X,Y):-q(X,Y),r(Y).
/* 3 */ q(X,Y):-t(X),t(Y).
/* 4 */ t(X):-r(X),r(Y).
/* 5 */ t(X).
/* 6 */ r(a).
/* 7 */ r(b).
:- p(c,Y).
:- p(a,Y).
[en pizarra/SLD-Draw]
/* 1 */ p(X,Y):-q(X,Y),r(Y).
/* 2 */ p(X,Y) :- q(X,Y),r(X).
/* 3 */ q(X,Y):-t(X),t(Y).
/* 4 */ t(X).
/* 5 */ t(X):-r(X),q(c,X).
/* 6 */ r(a).
/* 7 */ r(b).
:- p(c,Y).
:- p(a,Y).
[en pizarra/SLD-Draw]
:- p(X,b).
[en pizarra/SLD-Draw]
hermanos(X,Y) :-
padre(P,X),
madre(M,X),
padre(P,Y),
madre(M,Y),
X \= Y.
Un argumento A se dice que está en modo ‘’+’’ en una invocación
de un procedimiento p/n si la ejecución de p/n no instancia
ninguna de las variables de A
Principios de Programación Lógica 83
Usos de la unificación (II)
Parámetros de salida (modo ‘’-’’):
- -
:- padre(P,H)
padre(antonio,carlos).
padre(antonio,eva).
padre(carlos,fernando).
padre(carlos,silvia).
padre(david,emilio).
+ -
:- padre(antonio,H)
padre(antonio,carlos).
padre(antonio,eva).
padre(carlos,fernando).
padre(carlos,silvia).
padre(david,emilio).
p(pila_vacía) :- ...
p(pila(Cima,Resto)) :- ...
q(or(A,B)) :- ...
q(and(A,B)) :- ...
q(nand(A,B)) :- ...
q(not(A)) :- ...
Principios de Programación Lógica 86
Usos de la unificación (V)
Mecanismo de cómputo
Ejemplo:
puntos representados por el functor punto/2:
punto(2,3)
segmentos representados por el functor seg/2:
seg(punto(1,1),punto(2,5))
procedimientos vertical/1 y horizontal/1:
vertical(seg(punto(X,Y1),punto(X,Y2))).
horizontal(seg(punto(X1,Y),punto(X2,Y))).
?- vertical(S), horizontal(S).
S= seg(punto(A,B),punto(A,B))
Sean:
C un conjunto no vacío de constantes
V un conjunto no vacío de variables
F un conjunto no vacío de funciones
relación incondicional
equivale a la implicación universalmente cuantificada:
∀ X. ⇒ p(X
X)
de donde obtenemos:
∀ X. p(XX)
literal positivo
cuerpo= preguntas
equivale a la implicación universalmente cuantificada:
∀ Y1,..., Ym. (c1(Y
Y1) ∧ ...∧ Ym)) ⇒ ⊥
∧ cm(Y
Ejemplo:
p(X,Z) :- ∀ x,y,z.¬
¬ q(x,y)∨
∨ ¬ p(y,z)∨
∨ p(x,z)
q(X,Y),
p(Y,Z).
p(X,X). ∀ x. p(x,x)
q(a,b). q(a,b)
:- p(X,b). ∀ x.¬
¬ p(x,b)
U) y una cláusula
Sean una cláusula C1 donde aparece un literal A(U
C2 donde aparece el literal opuesto ¬ A(VV). Sea Θ un umg de C1
y C2 Θ = unificar(A(U U),A(VV)). Si ambas cláusulas son
ciertas se puede deducir que:
U) ∨ B(X
A(U X)
X) ∨ C(Y
(B(X Y))Θ
Θ
¬ A(V
V) ∨ C(Y
Y)
:- p(X,b).
p(X1,Z1) :- {X1/X,Z1/b}
q(X1,Y1),
p(Y1,Z1). :- q(X,Y1),p(Y1,b)
Ω O ≡ Ω ∪ {¬ O}
M(¬O
¬O)
¬O M(¬O
¬O)
¬O
M(Ω
Ω)
M(Ω
Ω) M(O
O) M(O
O)
ΩO ΩO
En lugar de demostrar que O es consecuencia lógica de Ω (Ω O),
demostramos que Ω ∪ {¬ O} es inconsistente (Ω ∪ {¬ O} )
Ci+1
Resolución lineal ordenada (Kowalski/Kuenner)
Similar a la anterior, estableciendo un orden en los literales
Ci ω∈Ω
Ci+1
Sean:
Un AF es un quíntupla Q,Q
Q Qo,FF,A
A,δ δ donde:
Q es un conjunto de estados
Q es un estado inicial (Q
Q ∈ Q )
F es un conjunto de estados finales (F F ⊆ Q)
A es un alfabeto
δ es una función de transición δ:Q Q × A → Q
c q2 f
a
b
q0 q1 d
q4
e
c
q3 f
Estado inicial Qo
definimos el procedimiento inicial/1
mediante el único hecho inicial(q0).
Estados finales F
definimos el procedimiento final/1
mediante el hecho final(q4).
reconoce(Q,'$') :-
final(Q).
reconoce(Q,cinta(C,Resto)) :-
delta(Q,C,QN),
reconoce(QN,Resto).
delta(q1,c,q3).
reconoce(Q,'$') :-
delta(q2,d,q2). final(Q).
delta(q2,f,q4).
delta(q3,e,q3). % automata/1
delta(q3,f,q4). automata(Cadena) :-
inicial(Q0),
% inicial/1
reconoce(Q0,Cadena),
inicial(q0). write_ln('cadena aceptada').
% final/1
final(q4).
Teorema de adecuación:
Dado un AF, A, el conjunto de cláusulas de Horn Ω que lo
representan y una cadena S: