Вы находитесь на странице: 1из 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

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 6

La familia a considerar

Antonio Elena Carlos

Mara Eva David

Fernando

Silvia

Emilio

Principios de Programacin Lgica

Identificando objetos y relaciones


objetos

relaciones

Antonio Carlos

Mara Eva David

Elena

Fernando

Silvia

Emilio

Principios de Programacin Lgica

Representando objetos mediante trminos


Objetos: son las personas que forman la familia representados por trminos (sus nombres en minscula) Ejemplos: Antonio Mara antonio 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 Mara es madre de Carlos padre(antonio,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? quines son los hijos de Eva? quin es el padre de Silvia? :- padre(david,emilio). :- madre(eva,X). :- padre(P,silvia).

Principios de Programacin Lgica

12

Identificando relaciones implcitas


abuelo

Antonio Carlos

Mara Eva David

Elena

Fernando
hermanos
Principios de Programacin Lgica

Silvia

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

padre(antonio,H)
17

Datos: Objetos y Trminos

Datos: objetos y trminos


Los objetos (datos) se representan mediante trminos: tomo constante nmero real trmino variable entero

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)

% fecha/3 % fecha/2

Principios de Programacin Lgica

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

trminos constantes

...

...

functores

programador imperativo
Principios de Programacin Lgica

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 estructuras n-arias hojas nodos n-arios

Ejemplo: cita(silvia,fecha(Da,diciembre,2005)) cita

silvia

fecha

Da

diciembre 2004

Principios de Programacin Lgica

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 la pila P es vaca padre(X,Y) es_vaca(P) padre/2 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)).%

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

Principios de Programacin Lgica

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.

regla = procedimiento

Principios de Programacin Lgica

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) no unifican

Principios de Programacin Lgica

54

Unificacin mediante rboles


A veces resulta conveniente representar los trminos como rboles cita cita fecha

silvia

Persona

fecha

Dia

Mes

2006

12

enero 2006

Principios de Programacin Lgica

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 ((ti= Vj) ti no aparece en A) (2) (3) (1)

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) A = p(Z,f(Z),a) 2) A = p(X,f(Y),a) A = p(Y,f(Y),a)


Principios de Programacin Lgica 60

= {X/Z, Y/Z}

= {X/Y}

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,...,Vn/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 Ak=Bk entonces devolver k; sino (Ai,Bi):= primer par de discordancia de Ak y Bk; 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 Cmo se ejecuta esta invocacin?
Principios de Programacin Lgica 67

cuerpo

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, 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):- c1(Y1), ..., cn(Yn).
cabeza = conclusin cuerpo= condiciones

equivale a la implicacin universalmente cuantificada: X,Y1,..., Yn. (c1(Y1) ... cn(Yn)) p(X) por definicin A B A B, de donde: X,Y1,..., Yn. (c1(Y1) ... cn(Yn)) p(X) aplicando De Morgan obtenemos: X,Y1,..., Yn. c1(Y1) ... cn(Yn) p(X)
literales negativos literal positivo

Principios de Programacin Lgica

93

Frmulas como programas (IV)


El hecho Prolog p(X).
relacin incondicional

equivale a la implicacin universalmente cuantificada: X. p(X)

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

de donde obtenemos: X. p(X)


literal positivo

Principios de Programacin Lgica

94

Frmulas como programas (y V)


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

equivale a la implicacin universalmente cuantificada: Y1,..., Ym. (c1(Y1) ... cm(Ym)) por definicin A B A B, de donde: X,Y1,..., Ym. (c1(Y1) ... cm(Ym)) aplicando De Morgan obtenemos: X,Y1,..., Ym. c1(Y1) ... cm(Ym)
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). :- p(X,b). x,y,z. q(x,y) p(y,z) p(x,z)

x. p(x,x) q(a,b) x. p(x,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) y una clusula C2 donde aparece el literal opuesto A(V). Sea un umg de C1 y C2 = unificar(A(U),A(V)). Si ambas clusulas son ciertas se puede deducir que: A(U) B(X) (B(X) C(Y)) A(V) C(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) x,y. (q(x,y) p(y,z))

equivale a una deduccin por resolucin: x,y,z. q(x,y) p(y,z) p(x,z) x. p(x,b)

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) M() M() M(O) M(O) M(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=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) 1) R:= O 2) ObjAtm_i:= S(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,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

.......

K
...

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

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,Qo,F,A, donde: Q es un conjunto de estados Q es un estado inicial (Q Q) F es un conjunto de estados finales (F Q) A es un alfabeto es una funcin de transicin :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 b q1

q2

d e c q4

q3

Principios de Programacin Lgica

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

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