Você está na página 1de 113

Principios de Programacin Lgica

Ingeniera Informtica
Departamento de Lenguajes y
Ciencias de la Computacin
Universidad de Mlaga

Contenido
1)
2)
3)
4)
5)
6)

Objetos, Relaciones y Objetivos


Datos: Objetos y Trminos
Procedimientos: Hechos y Reglas
Programa Principal: Objetivos
Semntica Operacional de Prolog
Prolog = Programacin Lgica

Principios de Programacin Lgica

Objetos, Relaciones y Objetivos

Programas lgicos y cmputos

Programa lgico (o relacional): conjunto de relaciones entre


objetos
Cmputo: deduccin controlada y constructiva de que un objetivo
O es consecuencia lgica de las relaciones definidas en un
programa lgico P

P  O

Principios de Programacin Lgica

Objetos, relaciones y objetivos


Objetos:
se corresponden con los datos
se representan mediante trminos
Relaciones:
se corresponden con los procedimientos
se definen mediante hechos y reglas
Objetivos:
se corresponden con el programa principal
se definen mediante consultas

Principios de Programacin Lgica

Cmo se escribe un programa lgico?


Para escribir un programa lgico debemos identificar:
qu objetos intervienen en el problema,
cules son las relaciones entre stos, y
qu objetivos queremos alcanzar
Una vez identificados los elementos anteriores debemos:
representar los objetos mediante trminos
definir las relaciones mediante hechos y reglas
definir los objetivos mediante consultas
Ilustraremos la metodologa anterior mediante un ejemplo
Problema: escribir un programa lgico que defina relaciones de
parentesco y deduzca qu personas estn emparentadas
Principios de Programacin Lgica

La familia a considerar

Elena

Antonio

Mara

Carlos

Eva

Fernando

Principios de Programacin Lgica

Silvia

David

Emilio

Identificando objetos y relaciones


objetos

relaciones

Elena

Antonio

Mara

Carlos

Eva

Fernando

Principios de Programacin Lgica

Silvia

David

Emilio

Representando objetos mediante trminos


Objetos:
son las personas que forman la familia
representados por trminos (sus nombres en minscula)
Ejemplos:
Antonio  antonio
Mara  mara

Principios de Programacin Lgica

Definiendo relaciones mediante hechos


Relaciones:
son las relaciones de paternidad y maternidad
definidas mediante hechos (relaciones incondicionales)
Ejemplos:
Antonio es padre de Carlos  padre(antonio,carlos).
Mara es madre de Carlos  madre(mara,carlos).

Principios de Programacin Lgica

10

La familia completa definida en Prolog


padre(antonio,carlos).
padre(antonio,eva).
padre(carlos,fernando).
padre(carlos,silvia).
padre(david,emilio).
madre(mara,carlos).
madre(mara,eva).
madre(elena,fernando).
madre(elena,silvia).
madre(eva,emilio).

Principios de Programacin Lgica

11

Deduciendo objetivos
Objetivos:
son preguntas sobre el parentesco
definidas mediante consultas
Ejemplos:
es David padre de Emilio?
 :- padre(david,emilio).
quines son los hijos de Eva?  :- madre(eva,X).
quin es el padre de Silvia?  :- padre(P,silvia).

Principios de Programacin Lgica

12

Identificando relaciones implcitas


abuelo

Elena

Antonio

Mara

Carlos

Eva

Fernando
hermanos
Principios de Programacin Lgica

Silvia

David

Emilio
primos

13

Una mala idea...


Definimos las relaciones extra mediante hechos:
hermanos(carlos,eva).
hermanos(fernando,silvia).
Inconvenientes:
tamao excesivo
propenso a errores
mantenimiento (nacimientos, etc.)
adaptabilidad a otras situaciones (familias)
Sera preferible definir esta relacin de forma genrica,
identificando las condiciones bajo las cuales dos personas A y
B son hermanos
Principios de Programacin Lgica

14

Definiendo relaciones mediante reglas


Cmo podemos definir la relacin hermanos?
A y B son hermanos si comparten los padres
Definiremos la relacin condicional anterior mediante la regla:
hermanos(A,B) :padre(P,A),
madre(M,A),
padre(P,B),
madre(M,B),
A \== B.
Principios de Programacin Lgica

15

Ejercicios
Define las siguientes relaciones de parentesco:
1.
2.
3.
4.

abuelo(A,B) A es abuelo de B
tio(A,B) A es to de B
primos(A,B) A y B son primos
procrearon(A,B) A y B tienen algn hijo en comn

Principios de Programacin Lgica

16

Reglas para identificar objetos y relaciones


Objetos: nombres propios y comunes, en singular o plural
Relaciones: verbos y formas verbales
A veces es posible ms de una formalizacin, y la diferencia entre
objeto y relacin no est clara...
Una relacin determina un conjunto de objetos: aqullos que la
satisfacen. Por tanto, una relacin puede emplearse para
referirnos a estos objetos.
Ejemplo: Los hijos de Antonio  padre(antonio,H)
Principios de Programacin Lgica

17

Datos: Objetos y Trminos

Datos: objetos y trminos


Los objetos (datos) se representan mediante trminos:
tomo
constante

entero
nmero
real

trmino

variable

estructura
Los trminos son adecuados para el procesamiento simblico
Principios de Programacin Lgica

19

tomos
Uso: representan objetos concretos mediante un nombre; es
decir, denominan a un objeto en particular
Sintaxis:
secuencias de letras, dgitos y _ comenzando por minscula
ejemplos: antonio, x, lista_vaca, nil, x25
secuencias de caracteres entre apstrofos
ejemplos: antonio garca, Antonio
secuencias de smbolos especiales
ejemplos: +, -, =, ===, ::=, :=, <->, :^:
Principios de Programacin Lgica

20

Nmeros
Uso: representan nmeros enteros y reales
Sintaxis:
enteros: 2, 34, -56
reales:

-0.0092, 4.5e-5

Se aplican las restricciones tpicas de rango (enteros y reales) y


precisin (reales)

Principios de Programacin Lgica

21

Variables
Uso: representan objetos por determinar. Las variables son
semejantes a incgnitas: no se les puede asignar valores a
voluntad.
Sintaxis:
Secuencia de letras, dgitos y _ comenzando por mayscula o _
Ejemplos:
X1
Padre
_X
Num_Telef
ListaClientes
Principios de Programacin Lgica

22

Estructuras (I)
Uso: representan objetos compuestos que pueden ser concretos
(no contienen variables) o por determinar (contienen variables)
Sintaxis:

sin espacios
tomo(trmino1,...,trminon)

nombre

aridad

Al par nombre/aridad se le denomina functor de la estructura


Ejemplos:
fecha(17,agosto,2004)
% fecha/3
cita(miguel,fecha(Da,enero,2006)) % cita/2
Principios de Programacin Lgica

23

Estructuras (II)

Los functores no se declaran.


Puede emplearse el mismo nombre con diferentes aridades: se
trata de functores distintos
Ejemplo:
fecha(17,agosto,2004)
fecha(14,abril)

Principios de Programacin Lgica

% fecha/3
% fecha/2

24

Sintaxis (simplificada) de los trminos


trmino ::=
|
|
|

tomo
nmero
variable
estructura

estructura ::= tomo(argumentos)


argumentos ::= trmino
| trmino , argumentos
Ms adelante extenderemos esta sintaxis con operadores y
listas
Principios de Programacin Lgica

25

Prolog comprueba la sintaxis de los trminos...


Prolog detecta y seala los siguientes errores sintcticos
2pi
fecha(12,,2001)
fecha()
cita(fernando,fecha(2,diciembre,2001)
lista (a,b,c)
F(X,Y)

Principios de Programacin Lgica

26

Pero la intencin es lo que cuenta...


La intencin es representar las fechas por trminos de la forma:
fecha(da,mes,ao)
donde da {1,...,31}
mes {enero,...,diciembre}
ao {2000,...}
Pero Prolog no puede detectar usos inadecuados:
fecha(enro,2,2001)
La sintaxis es correcta, pero el orden de los argumentos no es el
esperado y enro no es un mes vlido
Prolog no conoce las intenciones del programador: no hay
declaraciones de tipo
Principios de Programacin Lgica

27

Representacin fsica vs. sintctica


punteros
arrays
registros

objeto a
representar

...

programador imperativo
Principios de Programacin Lgica

trminos
constantes

...

functores

programador lgico
28

Cmo se representa un objeto en Prolog?


El programador lgico debe decidir una sintaxis adecuada para
cada tipo de dato:
Constantes:
qu nombre o nmero resulta apropiado
Variables:
se emplean para objetos por determinar (plantillas)
Estructuras:
functor
orden y sintaxis de los argumentos, recursin.
Sin embargo, no hay forma de comunicar a Prolog esta intencin:
no hay declaraciones de tipo
Principios de Programacin Lgica

29

Ejemplo: representacin de pilas (I)


Para representar el TAD pila, el programador debe elegir una
sintaxis adecuada
Sintaxis:
tad_pila ::= pila_vaca
| pila(cima,tad_pila)
cima::= trmino
Pero no es posible comunicar a Prolog esta sintaxis...
Principios de Programacin Lgica

30

Ejemplo: representacin de pilas (II)


Ejemplos de pilas bien formadas:
pila(a,pila(b,pila(c,pila_vaca)))
pila(a,pila(fecha(2,enero,2001),pila_vaca))
pila(pila_vaca,pila_vaca)
Ejemplos de trminos Prolog que no son pilas bien formadas:
pila(pila_vaca)
pila(a,pila(b))
Principios de Programacin Lgica

31

Ejemplo: representacin de pilas (III)


Las estructuras que contienen variables son plantillas:
Ejemplos:
pilas con 2 elementos y a en la cima
pila(a,pila(X,pila_vaca))
pilas de 3 elementos cualesquiera
pila(X,pila(Y,pila(Z,pila_vaca)))
pilas de al menos un elemento
pila(X,Y)
pilas que tienen una b como segundo elemento
pila(X,pila(b,Y))
Las dos ltimas plantillas suponen que Y es una pila
Principios de Programacin Lgica

32

Ejemplo: circuitos digitales (I)


x
y
z

Objetos:
variables de entrada (a,b,c,...,x,y,z)
puertas lgicas (or, and, nand, not)

Principios de Programacin Lgica

33

Ejemplo: circuitos digitales (II)


Representacin:
entradas -> tomos
puertas -> estructuras or/2,and/2,nand/2,not/1
Sintaxis:
circuito::=
|
|
|
|

entrada
or(circuito, circuito)
and(circuito, circuito)
nand(circuito, circuito)
not(circuito)

entrada ::= tomo

Principios de Programacin Lgica

34

Ejemplo: circuitos digitales (III)


El circuito digital:
x
y
z
se representa por el trmino:
or(and(x,y),z)

Principios de Programacin Lgica

35

Representando trminos mediante rboles


Un trmino Prolog puede representarse como un rbol:
constantes y variables  hojas
estructuras n-arias
 nodos n-arios
Ejemplo: cita(silvia,fecha(Da,diciembre,2005))
cita

silvia

fecha

Da

Principios de Programacin Lgica

diciembre 2004

36

Procedimientos: Hechos y Reglas

Procedimientos: relaciones entre objetos (I)

Los procedimientos en programacin lgica se denominan


relaciones o predicados

Cada procedimiento tiene un functor (nombre/aridad) que lo


identifica de manera unvoca
X es padre de Y  padre(X,Y)  padre/2
la pila P es vaca  es_vaca(P) es_vaca/1

Principios de Programacin Lgica

38

Procedimientos: relaciones entre objetos (II)


Los procedimientos pueden satisfacerse o fracasar
padre(antonio,eva) xito
padre(eva,eva)  fracaso
Los procedimientos no son funciones: no devuelven valores
padre(antonio,padre(carlos,silvia)) error
lo anterior no expresa que antonio es abuelo de silvia.
Las llamadas anidadas no se ejecutan: son argumentos (datos)
Los procedimientos se definen mediante un conjunto de hechos
y reglas
Principios de Programacin Lgica

39

Definiendo hechos
Uso: definen relaciones incondicionales
Sintaxis:
sin espacios
tomo.
tomo(trmino1,...,trminon).
Ejemplos:
padre(antonio,eva).
%
es_vaca(pila_vaca).
%
es_par(8).
%
no_es_vaca(pila(Cima,Resto)).%

Principios de Programacin Lgica

padre/2
es_vaca/1
es_par/1
no_es_vaca/1

40

Definiendo reglas (I)


Uso: definen relaciones condicionales
Sintaxis:
cabeza (conclusin)
tomo(trmino1,...,trminop) :tomo1(trmino11,...,trmino1n),
...,
tomok(trminok1,...,trminokm).

cuerpo
(condiciones)

La conclusin es cierta si se satisfacen todas las condiciones

Principios de Programacin Lgica

41

Definiendo reglas (II)


Los caballeros rescatan a las princesas secuestradas por
dragones
procedimiento rescata/2:
rescata(C,P) :es_caballero(C),
es_princesa(P),
es_dragon(D),
secuestrada(P,D).

Principios de Programacin Lgica

42

Un procedimiento puede tener alternativas


P es un pato si tiene plumas y hace cuac, o si es sobrino de un
pato
procedimiento es_pato/1:

misma variable

es_pato(P) :- tiene_plumas(P),
hace_cuac(P).
es_pato(P) :- es_pato(T),
sobrino(P,T).
variables distintas
Las variables son locales a las reglas, no a los procedimientos
Principios de Programacin Lgica

43

Los procedimientos pueden ser recursivos


X es progenitor de Y si es su padre o su madre
procedimiento progenitor/2:
progenitor(X,Y) :- padre(X,Y).
progenitor(X,Y) :- madre(X,Y).
X es antepasado de Y si es su progenitor o progenitor de uno de
sus antepasados
procedimiento antepasado/2:
antepasado(X,Y) :- progenitor(X,Y).
antepasado(X,Y) :- progenitor(X,Z),
antepasado(Z,Y).
Principios de Programacin Lgica

44

Programa Principal: Objetivos

Programa principal: objetivos


Uso: interrogan al programa lgico para determinar si se
satisfacen ciertas relaciones

Sintaxis:
:- tomo1(trmino11,...,trmino1n),
...,
tomok(trminok1,...,trminokm).
Los objetivos pueden o no tener variables.

Principios de Programacin Lgica

46

Objetivos sin variables


Uso: cuestionan si ciertos objetos concretos satisfacen ciertas
relaciones. La respuesta debe ser s (xito) o no (fracaso).
Ejemplos:
es Antonio padre de Carlos?
:- padre(antonio,carlos).
es Mara antepasado de Silvia?
:- antepasado(mara,silvia).
son Antonio y Mara antepasados de Silvia?
:- antepasado(mara,silvia),
antepasado(antonio,silvia).
Principios de Programacin Lgica

47

Objetivos con variables


Uso: cuestionan qu objetos satisfacen ciertas relaciones. El
objetivo se puede interpretar como una ecuacin y sus variables
como incgnitas a determinar
Ejemplos:
quin es el padre de Silvia?
:- padre(X,silvia).
quines son los descendientes de Mara?
:-antepasado(mara,X).
quines son hermanos?
:- hermanos(X,Y).
Principios de Programacin Lgica

48

Semntica Operacional de Prolog

Cmo se ejecuta un Programa Prolog?


objetos
relaciones
objetivos
objetivos

Programa
(Hechos y Reglas)
respuestas

Motor de
Inferencia
Principios de Programacin Lgica

qu es y cmo funciona?...

50

Qu es el motor de inferencia?
Bsicamente es un mecanismo de invocacin de procedimientos
:- hermanos(silvia,X).
objetivo = invocacin
hermanos(A,B) :padre(P,A),
madre(M,A),
padre(P,B),
madre(M,B),
A \== B.

Principios de Programacin Lgica

regla = procedimiento

51

Paso de parmetros por unificacin


La unificacin de trminos es el mecanismo empleado por el
motor de inferencia para el paso de parmetros a
procedimientos
Al invocar un procedimiento, hay que unificar los parmetros
actuales y los formales
Dos trminos (parmetros) unifican si:
1) son idnticos
2) pueden reemplazarse algunas de sus variables por
trminos, de manera que los trminos resultantes son
idnticos
Principios de Programacin Lgica

52

Unificacin de trminos (I)


Ejemplo:
fecha(Da,Mes,2006)
fecha(Ayer,mayo,Ao)

unifican tomando:
Da=Ayer
Mes=mayo
Ao=2006

Las variables Mes y Ao quedan ligadas o instanciadas a sus


respectivos valores (mayo y 2006)
Las variables Da y Ayer quedan libres (su valor est por
determinar, aunque se sabe que ambas se refieren al mismo valor)
La unificacin es la nica forma en que se puede instanciar una
variable Prolog (puede recibir un valor)
Principios de Programacin Lgica

53

Unificacin de trminos (II)


Ejemplo:
fecha(Da,Mes,2006)
fecha(Ayer,mayo,Ao)

unifican tomando:
Da=12
Ayer=12
Mes=mayo
Ao=2006

La unificacin puede no ser nica (Prolog usa la ms general: no


hay necesidad de determinar Da ni Ayer)
Puede ser imposible unificar dos trminos
Ejemplo:

fecha(Da,Mes,2006)
fecha(Ayer,mayo,06)

Principios de Programacin Lgica

no unifican

54

Unificacin mediante rboles


A veces resulta conveniente representar los trminos como rboles
cita

silvia

cita
fecha

Dia

Mes

Persona

2006

Principios de Programacin Lgica

12

fecha

enero 2006

55

Reglas de unificacin (informal)


Se pueden aplicar las siguientes reglas para unificar:
1)
2)
3)

una variable unifica con cualquier trmino


una constante slo unifica consigo misma
un estructura unifica con otra estructura si:
a) tienen el mismo functor (nombre/aridad)
b) sus respectivos argumentos unifican
c) las sustituciones son compatibles

Sin embargo, lo anterior no es un algoritmo formal...


A continuacin formalizaremos las definiciones y presentaremos
un algoritmo de unificacin
Principios de Programacin Lgica

56

Ligaduras y sustituciones
Una ligadura es un par V/t donde V es una variable y t es un
trmino distinto de V. Se dice que la variable V queda ligada o
instanciada al trmino t
Ejemplo: Padre/antonio, X/pila(a,Resto)
Una sustitucin es un conjunto finito de ligaduras {Vi/ti}
donde todas las variables ligadas son distintas entre s; es decir,
i j Vi Vj
Ejemplo: {Padre/antonio, X/pila(a,Resto)}

Principios de Programacin Lgica

57

Aplicacin de sustituciones e instancia


Al aplicar una sustitucin a un trmino A, todas las variables
ligadas por deben reemplazarse en A simultneamente
Ejemplo: A = p(X,f(Y),a)

= {X/b, Y/X}

A
= p(X,f(Y),a){X/b, Y/X} = p(b,f(X),a)
Un trmino B es instancia de un trmino A si B = A
; es decir,
B se obtiene aplicando una sustitucin a A
En general, una instancia es un caso particular de un trmino en
que se han determinado (ligado) algunas de sus variables
Principios de Programacin Lgica

58

Renombrado de un trmino (I)


Una sustitucin se dice que es un renombrado de un trmino A
si
(i j ti tj)
Vi/ti ti variable

(1)

((ti= Vj)
ti no aparece en A)

(2)
(3)

Es decir, se reemplazan variables por variables distintas entre s


(1), de manera que las variables introducidas aparecen entre las
variables a sustituir (2), o no aparecen en el trmino A (3)

Principios de Programacin Lgica

59

Renombrado de un trmino (II)


Bsicamente, un renombrado consiste en cambiar los nombres de
las variables sin modificar la generalidad del trmino
Ejemplo: A = p(X,f(Y),a)

= {X/Z, Y/X}

A = p(Z,f(X),a)
Los siguientes no son renombrados:
1)

A = p(X,f(Y),a)

= {X/Z, Y/Z}

A = p(Z,f(Z),a)
2)

A = p(X,f(Y),a)

= {X/Y}

A = p(Y,f(Y),a)
Principios de Programacin Lgica

60

Composicin de sustituciones (I)


Dadas dos sustituciones y
= {V1/t1, V2/t2,...,Vn/tn}
= {U1/s1, U2/s2,...,Um/sm}
su composicin es una sustitucin tal que
(A)
) = A(
()
() A
Bsicamente, se trata de reemplazar una secuencia de
sustituciones (primero , despus ) por una sola sustitucin (
)

Principios de Programacin Lgica

61

Composicin de sustituciones (II)


Dadas dos sustituciones = {V1/t1, V2/t2,...,Vn/tn} y
= {U1/s1, U2/s2,...,Um/sm}
su composicin se calcula:
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}
Eliminar Vi/Vi

Eliminar Ui/si si Ui=Vj

Ejemplo: = {X/f(Y), Y/Z} = {X/a,Y/b,Z/Y}


= {X/f(b),Z/Y}
Principios de Programacin Lgica

62

Unificador de trminos
Una sustitucin es un unificador de dos trminos A y B sii
A = B
Ejemplo: A = p(f(X),Z) B = p(Y,a)
A = p(f(a),a) = B

={Y/f(a),Z/a,X/a}
=

Un unificador se dice que es ms general que otro unificador


si existe una sustitucin tal que
=
Ejemplo: A = p(f(X),Z)
B = p(Y,a)
={Y/f(a),Z/a,X/a}
={Y/f(X),Z/a}
=
A
= p(f(X),a) = B

Principios de Programacin Lgica

={X/a}

63

Unificador de mxima generalidad (umg)


Se dice que es un unificador de mxima generalidad (umg) si
para cualquier otro unificador existe una sustitucin tal que
=
Si y son unificadores de mxima generalidad, entonces
existen renombrados y tales que
=
es decir, pueden existir varios umgs, pero stos se diferenciarn
slo en el nombre de las variables
Ejemplo:
A = p(f(X),Z) B = p(f(Y),V) ={X/Y,Z/V}
={Y/X,Z/V}
=
=
= {X/Y}
= {Y/X}

Principios de Programacin Lgica

64

El algoritmo de unificacin (I)


unificar(A,B: trmino): unificador;
1) K:=0; 0:= (* sustitucin vaca *)
2) Si A
k=B
k entonces
devolver k;
sino
(Ai,Bi):= primer par de discordancia de A
k y B
k;
3) Si (uno de (Ai,Bi) es una variable V) y
(el otro un trmino t donde no aparece V) entonces
k+1:= k{V/t};
test de ocurrencia
k:= k+1;
ir a 2)
sino
parar(no unifican);

Principios de Programacin Lgica

65

El algoritmo de unificacin (y II)


Ejercicio: unificar los siguientes pares de trminos
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))
Para mejorar la eficiencia, las implementaciones de Prolog
omiten el test de ocurrencia, lo que puede dar lugar a trminos
cclicos:
unificar(X,f(X))= {X/f(X)} X= f(f(f...))
Los resultados dependen de la implementacin...
Principios de Programacin Lgica

66

Invocando procedimientos
Una vez formalizado el paso de parmetros, podemos formalizar
el resto del motor de inferencia
Un objetivo
:- p(X1,...,Xn).
es realmente una invocacin al procedimiento p/n
p(Y1, ...,Yn) :- q1(Y11,...,Y1i),
...,
qj(Yj1,...,Yjk).
cabecera

cuerpo

Cmo se ejecuta esta invocacin?


Principios de Programacin Lgica

67

Pasos para invocar a un procedimiento


1) renombrar las variables del procedimiento invocado p/n
p(Z1, ...,Zn) :- q1(Z11,...,Z1i),
...,
qj(Zj1,...,Zjk).
2) unificar la cabecera del procedimiento renombrado con el
objetivo mediante un umg
p(Z1, ...,Zn)
= p(X1,...,Xn)

Si no unifican, la invocacin no se puede realizar


3) reemplazar la invocacin por el cuerpo del procedimiento
renombrado y aplicar el umg al nuevo objetivo
:- q1(Z11,...,Z1i),...,qj(Zj1,...,Zjk)
.
Principios de Programacin Lgica

68

Ejemplo de invocacin de procedimiento


Ejecutar el objetivo
p(X,Y) :r(Y),q(X,Y).
q(X,Y) :r(X),r(Y).
q(X,b) :r(X),t(X).
r(a).
r(b).
t(b).

:-p(Z,b).
1) renombrar la regla del procedimiento p/2
p(X1,Y1) :- r(Y1),q(X1,Y1).
2) unificar parmetros actuales y formales
p(X1,Y1) = p(Z,b)
= {X1/Z,Y1/b}
3) obtener el nuevo objetivo
:- r(Y1),q(X1,Y1) =
:- r(b), q(Z,b).

Principios de Programacin Lgica

69

Alternativas en la invocacin
Frecuentemente se presentarn alternativas en la invocacin...
p(X,Y) :r(Y),q(X,Y).
q(X,Y) :r(X),r(Y).
q(X,b) :r(X),t(X).
r(a).
r(b).
t(b).

Al ejecutar el objetivo
:-r(b), q(Z,b).
se presentan las siguientes alternativas:
qu subobjetivo ejecutar
qu hecho o regla invocados aplicar
dnde colocar el cuerpo renombrado

cmo resuelve el motor de inferencia estas alternativas?


Principios de Programacin Lgica

70

Resolviendo las alternativas


Eleccin de subojetivo: el que est ms a la izquierda
:- p1(X1,...,Xn), p2(Y1,...,Ym),..., pk(Z1,...,Zi).
Eleccin de hecho o regla: se aplican todos los hechos y reglas
de p1/n cuyas argumentos unifiquen con los de p1(X1,...,Xn);
es decir, la invocacin de p1/n puede originar tantas ejecuciones
diferentes como hechos y reglas tenga p1/n
Estas invocaciones alternativas se realizan en el orden en que
aparecen en el programa las definiciones de p1/n, dando lugar a
un rbol de ejecucin (o de bsqueda)
Eleccin del emplazamiento del cuerpo renombrado: a la
izquierda, sustituyendo al subobjetivo que lo invoca
Principios de Programacin Lgica

71

Arbol de bsqueda
p1(X1,...,Xn):- C1.
...
p1(X1,...,Xn):- Ck.

La invocacin de p1/n puede


dar lugar hasta a K ramas...

:- p1(X1,..,Xn),.., p(Z1,..,Zi).

1
:- (C1,.., p(Z1,..,Zi))
1.

....

K
:- (Ck,.., p(Z1,..,Zi))
k.

donde Cies el cuerpo Ci renombrado.


Observa que i se aplica a todo el objetivo, no slo a Ci
El motor de inferencia construye el rbol primero en profundidad
Principios de Programacin Lgica

72

Ejemplo 1 de rbol de bsqueda


Dado el programa Prolog:
/*
/*
/*
/*
/*
/*

1
2
3
4
5
6

*/
*/
*/
*/
*/
*/

p(X,Y) :- r(Y), q(X,Y).


q(X,Y) :- r(X), r(Y).
q(X,b) :- r(X), t(X).
r(a).
r(b).
t(b).

Obtener el rbol de bsqueda para el objetivo:


:- p(Z,b).
[en pizarra/SLD-Draw]
Principios de Programacin Lgica

73

Ejemplo 2 de rbol de bsqueda


Dado el programa Prolog:
/* 1 */
p(X,Y) :- r(X),s(X,Y).
/* 2 */
p(X,Y) :- t(Z), p(X,Y).
/* 3 */
p(X,Y) :- q(X,Y).
/* 4 */
q(c,c).
/* 5 */
q(f(X),Y) :- q(X,Y).
/* 6 */
s(X,X).
/* 7 */
s(X,Y) :- t(Y),t(X).
/* 8 */
r(a).
/* 9 */
r(b).
/* 10 */ t(b).
Obtener el rbol de bsqueda para el objetivo:
:- p(A,B).
[en pizarra/SLD-Draw]
Principios de Programacin Lgica

74

Ejemplo 3 de rbol de bsqueda


Dado el programa Prolog:
/*
/*
/*
/*
/*
/*

1
2
3
4
5
6

*/
*/
*/
*/
*/
*/

p(X,Y) :- r(Y), q(X,Y).


p(X,Y) :- r(Y), p(X,Y).
q(X,Y) :- r(X), r(Y).
q(b,b).
r(a).
r(b).

Obtener el rbol de bsqueda para el objetivo:


:- p(Z,b).
[en pizarra/SLD-Draw]
Principios de Programacin Lgica

75

Ejemplo 4 de rbol de bsqueda


Dado el programa Prolog:
/*
/*
/*
/*
/*
/*
/*
/*
/*

1
2
3
4
5
6
7
8
9

*/
*/
*/
*/
*/
*/
*/
*/
*/

p(X,Y) :p(X,Y) :q(a,a).


q(X,a) :q(X,Y) :s(b,b).
s(b,X) :r(b).
r(a).

q(X,Y).
q(a,X).
r(Y), s(X,Y).
r(X), p(X,Y).
r(X).

Obtener el rbol de bsqueda para el objetivo:


:- p(b,Z).
[en pizarra/SLD-Draw]
Principios de Programacin Lgica

76

Ejemplo 5 de rbol de bsqueda


Dado el programa Prolog:
/*
/*
/*
/*
/*
/*
/*
/*

1
2
3
4
5
6
7
8

*/
*/
*/
*/
*/
*/
*/
*/

q(X,Y)
q(X,Y)
r(X,Y)
r(X,Y)
s(a).
s(b).
t(b).
t(c).

::::-

s(Y), r(X,Y).
q(Y,X).
t(Y), s(X).
s(Y).

Obtener el rbol de bsqueda para el objetivo:


:- q(Y,X).
[en pizarra/SLD-Draw]
Principios de Programacin Lgica

77

Ejemplo 6 de rbol de bsqueda


Dado el programa Prolog:
/*
/*
/*
/*
/*
/*
/*

1
2
3
4
5
6
7

*/
*/
*/
*/
*/
*/
*/

p(X,Y) :- q(X,Y),r(X).
p(X,Y):-q(X,Y),r(Y).
q(X,Y):-t(X),t(Y).
t(X):-r(X),r(Y).
t(X).
r(a).
r(b).

Obtener los rboles de bsqueda para los objetivos:


:- p(c,Y).
:- p(a,Y).
[en pizarra/SLD-Draw]
Principios de Programacin Lgica

78

Ejemplo 7 de rbol de bsqueda


Dado el programa Prolog:
/*
/*
/*
/*
/*
/*
/*

1
2
3
4
5
6
7

*/
*/
*/
*/
*/
*/
*/

p(X,Y):-q(X,Y),r(Y).
p(X,Y) :- q(X,Y),r(X).
q(X,Y):-t(X),t(Y).
t(X).
t(X):-r(X),q(c,X).
r(a).
r(b).

Obtener los rboles de bsqueda para los objetivos:


:- p(c,Y).
:- p(a,Y).
[en pizarra/SLD-Draw]
Principios de Programacin Lgica

79

Ejemplo 8 de rbol de bsqueda


Dado el programa Prolog:
/*
/*
/*
/*
/*
/*
/*
/*
/*

1
2
3
4
5
6
7
8
9

*/
*/
*/
*/
*/
*/
*/
*/
*/

p(X,Y):p(X,Y):q(a,a).
q(X,a):q(X,Y):s(b,b).
s(b,X):r(b).
r(a).

q(X,Y).
q(a,X).
r(Y),s(X,Y).
r(a),p(X,Y).
r(X).

Obtener el rbol de bsqueda para el objetivo:


:- p(X,b).
[en pizarra/SLD-Draw]
Principios de Programacin Lgica

80

Ramas xito y fallo


rama xito: aqulla cuyo nodo hoja es un objetivo vaco.
Corresponden a ejecuciones completas del objetivo inicial, para el
que aportan una solucin: la respuesta computada
respuesta computada: la sustitucin que se obtiene al aplicar
los unificadores de una rama xito (desde la raz a la hoja) a las
variables del objetivo inicial. Cada rama xito aporta su propia
respuesta computada, que puede ser idntica a la de otra rama
xito
rama fallo: aqulla cuyo nodo hoja contiene un subobjetivo a la
izquierda que no unifica con ninguna regla o hecho del programa.
Corresponden a ejecuciones que no pueden avanzar

Principios de Programacin Lgica

81

Ramas infinitas, cclicas y repetidas


rama cclica: contiene dos nodos A y B tales que A es
predecesor de B y B es un renombrado de A (B=A
) y los
unificadores de los nodos que los separan no instancian las
variables del objetivo (es decir, el cmputo no avanza)
rama infinita: contiene dos nodos A y B tales que A es
predecesor de B y B es un renombrado de A (B=A
) y los
unificadores de los nodos que los separan instancian las variables
del objetivo (es decir, el cmputo avanza)
ramas repetidas: contienen dos nodos A y B tales que uno es
renombrado del otro, ninguno es predecesor/antecesor del otro y
las sustituciones de las ramas que contienen a A y B son iguales
mdulo renombrado
Principios de Programacin Lgica

82

Usos de la unificacin (I)


Parmetros de entrada (modo +):
+
+
:- hermanos(fernando,silvia)
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 invocacin
de un procedimiento p/n si la ejecucin de p/n no instancia
ninguna de las variables de A
Principios de Programacin Lgica

83

Usos de la unificacin (II)


Parmetros de salida (modo -):

- :- padre(P,H)

padre(antonio,carlos).
padre(antonio,eva).
padre(carlos,fernando).
padre(carlos,silvia).
padre(david,emilio).
Un argumento A se dice que est en modo - en una invocacin
de un procedimiento p/n si la ejecucin de p/n instancia alguna
de las variables de A
Principios de Programacin Lgica

84

Usos de la unificacin (III)


Los modos + y - se pueden combinar en una invocacin:
+
:- padre(antonio,H)

padre(antonio,carlos).
padre(antonio,eva).
padre(carlos,fernando).
padre(carlos,silvia).
padre(david,emilio).

Principios de Programacin Lgica

85

Usos de la unificacin (IV)


Mecanismo de seleccin/acceso a estructuras
Ejemplo: una regla para cada caso de pila bien construida
p(pila_vaca) :- ...
p(pila(Cima,Resto)) :- ...
Ejemplo: una regla para cada caso de circuito bien construido
q(or(A,B)) :- ...
q(and(A,B)) :- ...
q(nand(A,B)) :- ...
q(not(A)) :- ...
Principios de Programacin Lgica

86

Usos de la unificacin (V)


Mecanismo de cmputo
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))
Principios de Programacin Lgica

87

Prolog = Programacin Lgica

Prolog= Programacin Lgica


La idea fundamental de la programacin lgica es que:
La lgica puede utilizarse como lenguaje de programacin
Esta idea se fundamenta en tres equivalencias:
trminos como estructuras de datos
frmulas como programas
deducciones como cmputos

Principios de Programacin Lgica

89

Trminos como estructuras de datos


Sean:
C un conjunto no vaco de constantes
V un conjunto no vaco de variables
F un conjunto no vaco de funciones
El conjunto de trminos de primer orden T se define
inductivamente:
1. c C es un trmino
2. v V es un trmino
3. f(t1,...,tn) es un trmino sii f F y ti T
4. no hay ms trminos en T que los definidos por 1-3
Los trminos Prolog equivalen a los trminos de primer orden T
Principios de Programacin Lgica

90

Frmulas como programas (I)


Sean:
P un conjunto no vaco de predicados
el conjunto de conectivas {
, , , , , }
el conjunto de cuantificadores { , }
el conjunto de signos de puntuacin { (, ) }
El conjunto de frmulas bien formadas (fbfs) se define
inductivamente:
1. p(t1,...,tn) donde ti T y p P es una fbf
2. si f y g son fbfs y x V,
V tambin son fbfs:
, , f g, f g, f, f g,
x.f(x), x.f(x), (f)
3. No hay ms fbfs que las definidas por 1-2
Principios de Programacin Lgica

91

Frmulas como programas (II)


Un tomo es una fbf de la forma p(t1,...,tn)
Un literal es un tomo p(t1,...,tn) o su negacin p(t1,...,tn)
Una clusula es una disyuncin de literales L1 ... Ln
Una clusula de Horn es una clusula con a lo ms un literal
positivo
Una clusula de Horn definida es una clusula con
exactamente un literal positivo
Toda regla, hecho u objetivo Prolog puede traducirse a una
clusula de Horn, definida o no

Principios de Programacin Lgica

92

Frmulas como programas (III)


La regla Prolog:
p(X
X):- c1(Y
Y1), ..., cn(Y
Yn).
cabeza = conclusin

cuerpo= condiciones

equivale a la implicacin universalmente cuantificada:


X,Y
Y1,..., Yn. (c1(Y
Y1) ...
cn(Y
Yn)) p(X
X)
por definicin A B A B, de donde:
X,Y
Y1,..., Yn. (c1(Y
Y1) ...
cn(Y
Yn)) p(X
X)
aplicando De Morgan obtenemos:
X,Y
Y1) ...
cn(Y
Yn) p(X
X)
Y1,..., Yn. c1(Y
literales negativos

Principios de Programacin Lgica

literal positivo

93

Frmulas como programas (IV)


El hecho Prolog
p(X
X).
relacin incondicional

equivale a la implicacin universalmente cuantificada:


X. p(X
X)
por definicin A B A B, de donde:
X.  p(X
X)
de donde obtenemos:
X. p(X
X)
literal positivo

Principios de Programacin Lgica

94

Frmulas como programas (y V)


El objetivo Prolog:
:- c1(Y
Y1), ..., cm(Y
Ym).
cuerpo= preguntas

equivale a la implicacin universalmente cuantificada:


Y1,..., Ym. (c1(Y
Y1) ...
cm(Y
Ym))
por definicin A B A B, de donde:
X,Y
Y1,..., Ym. (c1(Y
Y1) ...
cm(Y
Ym))
aplicando De Morgan obtenemos:
X,Y
Y1) ...
cm(Y
Y m)
Y1,..., Ym. c1(Y
literales negativos

Principios de Programacin Lgica

95

Deducciones como cmputos (I)


Un programa y un objetivo Prolog pueden traducirse a un conjunto
de clusulas de Horn.
Ejemplo:
p(X,Z) :q(X,Y),
p(Y,Z).
p(X,X).
q(a,b).

x,y,z.
q(x,y)
p(y,z)
p(x,z)

:- p(X,b).

x.
p(x,b)

x. p(x,x)
q(a,b)

La ejecucin del programa se corresponde entonces con una


deduccin controlada y constructiva; es decir, una deduccin que
se ajusta a cierta estrategia e instancia variables
Principios de Programacin Lgica

96

Deducciones como cmputos (II)


La deduccin se basa en la regla de resolucin de Robinson.
Sean una clusula C1 donde aparece un literal A(U
U) y una clusula
V). Sea un umg de C1
C2 donde aparece el literal opuesto A(V
y C2 = unificar(A(U
U),A(V
V)). Si ambas clusulas son
ciertas se puede deducir que:
A(U
U) B(X
X)
(B(X
X) C(Y
Y))

A(V
V) C(Y
Y)

Principios de Programacin Lgica

97

Deducciones como cmputos (III)


la invocacin del procedimiento Prolog p/2:
:- p(X,b).
p(X1,Z1) :q(X1,Y1),
p(Y1,Z1).

{X1/X,Z1/b}
:- q(X,Y1),p(Y1,b)

equivale a una deduccin por resolucin:


x,y,z. q(x,y) p(y,z) p(x,z)
x. p(x,b)

x,y.
(q(x,y) p(y,z))

donde unificar(p(x1,z1),p(x,b))= {x1/x,z1/b}=


Principios de Programacin Lgica

98

Deducciones como cmputos (IV)


El mtodo de resolucin es un mtodo de refutacin:
 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 lgica de (  O),


demostramos que { O} es inconsistente ( { O}  )
Principios de Programacin Lgica

99

Deducciones como cmputos (V)


Prolog razona por refutacin
Dado el programa Prolog, la pregunta :
existe algn X que sea hermano de silvia?
se formaliza con el objetivo:
:- hermanos(silvia,X).
que equivale a las frmulas:
x. hermanos(silvia,x)
x. hermanos(silvia,x)
El objetivo se niega y Prolog trata de refutarlo encontrando un
contramodelo (X=fernando).

Principios de Programacin Lgica

100

Deducciones como cmputos (VI)


Necesitamos un mtodo que genere una secuencia de resolventes
Resolucin por saturacin (Robinson)
Ro(
{ O})= { O}, ..., Ri+1=R(Ri(
{ O}))
Resolucin lineal (Loveland/Luckham)
Ci

Bi
Bi { O}} Bi=C
Ck,k<i

Ci+1
Resolucin lineal ordenada (Kowalski/Kuenner)
Similar a la anterior, estableciendo un orden en los literales
Estos mtodos no son apropiados como motor de inferencia...
Principios de Programacin Lgica

101

Deducciones como cmputos (VII)


Necesitamos un mtodo de resolucin que genere una secuencia
de resolventes Ci tal que C0 = O y Ci+1=R(Ci,),
Ci

Ci+1
Es decir, los objetivos Ci se va transformando aplicando los
procedimientos definidos en el programa
Esto es posible siempre que las clusulas de sean clusulas de
Horn definidas y los Ci tengan todos los literales negativos
Principios de Programacin Lgica

102

Deducciones como cmputos (VIII)


SLD-Resolucin (Selective Linear for Definite clauses)
Sean:
un conjunto de clusulas de Horn definidas
O una clusula de Horn sin literal positivo
O O1 O2 ... On
S una regla de seleccin que, dada una clusula de Horn sin
literal positivo, devuelva uno de sus literales
S(O1 O2 ... On) = Oi
B una regla de bsqueda que, dados Oi y devuelva una
clusula P C1 ... Cn tal que umg(Oi,P)=

Principios de Programacin Lgica

103

Deducciones como cmputos (IX)


Algoritmo Refutacin_SLD(
,O
O)
1) R:= O
2) ObjAtm_i:= S(O
O1 O2 ...
On )
3) Clusula:= B(
,ObjAtm_i)
donde Clusula= P C1 ... Cm
Si no existe tal clusula
parar(refutacin acabada en fallo)
4) := unificar(P
P,ObjAtm_i)
5) R:= (R ObjAtm_i (
C1 ... Cm))

6) Si R=

parar(refutacin acabada en xito)
sino ir al paso 2)
El algoritmo construye slo una refutacin por SLD-Resolucin
Principios de Programacin Lgica

104

Deducciones como cmputos (X)


Fijadas una S y una B, un rbol SLD contempla todas las
refutaciones posibles ordenando las clusulas para resolver Oj
segn B :
S
O1 ... Oj ... On
B

.......

(
O1 ... C1 ... Cm ... On)
1.

K
...

Las ramas pueden acabar en fallo, xito o ser infinitas


S afecta significativamente a la forma del rbol SLD (n hijos...)
B slo permuta las ramas del rbol SLD
Principios de Programacin Lgica

105

Deducciones como cmputos (XI)


Los rboles de bsqueda Prolog son rboles SLD donde:
La regla de seleccin S elige el literal ms a la izquierda
La regla de bsqueda B elige las clusulas de arriba abajo
El rbol se construye primero en profundidad (se pierde la
completitud por las ramas cclicas/infinitas)
Cada rama del rbol de bsqueda codifica un intento de
refutacin por SLD-Resolucin del objetivo O respecto del
programa

Principios de Programacin Lgica

106

Capacidad expresiva de las clusulas de Horn


Para responder a la pregunta:
Qu capacidad expresiva tienen las clusulas de Horn?
codificaremos un autmata finito (AF) en Prolog
Un AF es un quntupla Q,Q
F,A
A,
 donde:
Q Qo,F
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 funcin de transicin :Q
Q A Q
Un AF reconoce cadenas de un lenguaje regular
Principios de Programacin Lgica

107

Un ejemplo de autmata finito


El autmata finito de la figura reconoce el lenguaje a*bc (d* | e*)f

a
q0

q2

q1

q4

e
c

Principios de Programacin Lgica

q3

108

Objetos del AF
En la definicin del AF, identificamos el alfabeto y los estados
alfabeto
estados

tomos a,b,c,d,e,f,$
tomos q0,q1,q2,q3,q4

Adems, el AF recibir una cadena de entrada en una cinta


cadena
functor cinta/2
Cadena::= cinta(tomo,Cadena)
| $
La cadena abcdf se representa por el trmino
cinta(a,cinta(b,cinta(c,(cinta(d,(cinta(f,$)))))))
Principios de Programacin Lgica

109

Relaciones del AF
Funcin de transicin
definimos el procedimiento delta/3
por cada transicin (qi,s) = qj
introducimos un hecho delta(qi,s,qj).
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).
Principios de Programacin Lgica

110

Reconocimiento de la cadena
El reconocimiento es una relacin entre una cadena y un estado
reconoce(Q,S) - El AF reconoce la cadena S desde el estado Q
El procedimiento reconoce/2 se define recursivamente:
reconoce(Q,'$') :final(Q).
reconoce(Q,cinta(C,Resto)) :delta(Q,C,QN),
reconoce(QN,Resto).

Principios de Programacin Lgica

111

El programa Prolog completo


% delta/3
delta(q0,a,q0).
delta(q0,b,q1).
delta(q1,c,q2).
delta(q1,c,q3).
delta(q2,d,q2).
delta(q2,f,q4).
delta(q3,e,q3).
delta(q3,f,q4).
% inicial/1
inicial(q0).
% final/1
final(q4).
Principios de Programacin Lgica

% reconoce/2
reconoce(Q,cinta(C,Resto)) :delta(Q,C,QN),
reconoce(QN,Resto).
reconoce(Q,'$') :final(Q).
% automata/1
automata(Cadena) :inicial(Q0),
reconoce(Q0,Cadena),
write_ln('cadena aceptada').

112

Teorema de adecuacin y Turing completitud


Cualquier AF puede codificarse en Prolog siguiendo el esquema
anterior.
La anterior codificacin permite:
representar un AF como un conjunto de clusulas de Horn
plantear un reconocimiento de la cadena como una demostracin
Teorema de adecuacin:
Dado un AF, A, el conjunto de clusulas de Horn que lo
representan y una cadena S:
A reconoce S sii  inicial(Q) reconoce(Q,S)
Cualquier mquina de Turing puede codificarse en Prolog
siguiendo un esquema similar al anterior
Principios de Programacin Lgica

113

Você também pode gostar