












Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Asignatura: Programación declarativa, Profesor: , Carrera: Ingeniería Informática en Tecnologías de la Información, Universidad: UNIOVI
Tipo: Apuntes
1 / 20
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!













Jorge Puente Peinador, 1999-
Aquella variable que se encuentra fuera del ámbito de todo cuantificador.
Se define como un predicado ó un predicado negado.
Veamos con un ejemplo las definiciones vistas:
átomo término
término
literal
predicado = literal
pedro y futbol son átomos y por tanto términos. A su vez el predicado juega(futbol,pedro) es un literal, como lo es su negación.
Una cláusula es una fórmula de la siguiente forma:
La notación que se suele utilizar es la siguiente, paso a fórmula de implicación:
se omiten los cuantificadores universales,
se extraen las negaciones,
en definitiva podemos escribir:
La idea de programación Lógica es la de obtener conclusiones a partir de descripciones declarativas.
Estas descripciones consisten en realidad en un conjunto finito de fórmulas lógicas expresadas de acuerdo con una serie de restricciones. Estas restricciones son las que hacen posible la aplicación de la regla de inferencia denominada “principio de SLD-resolución”.
Las restricciones restringen o limitan las sentencias a las denominadas cláusulas lógicas que describen hechos (ó conocimiento positivo) y reglas.
Un hecho establece que se da una relación entre objetos, mientras que una regla establece que se da una relación entre objetos en el caso de que se den otras relaciones entre objetos.
Una cláusula definida es de la forma:
donde B y Bi ∀i ∈{1,…,n} son fórmulas atómicas.
Debemos de observar que:
y
cabeza de la cláusula
cuerpo de la cláusula
que sean ciertas la conjunción de relaciones B1,…,Bn. Ejemplo :
hecho: progenitor(luis,pepa).
Un programa definido no es más que un conjunto de cláusulas definidas.
En programación lógica los objetivos, o cláusulas objetivo, que se van a considerar tienen la siguiente forma:
donde cada fórmula atómica Bi es un subojetivo (o subgoal).
Esta cláusula puede considerarse resultante de :
que en último término podemos considerar como la negación de la pregunta que se realiza al programa, para que averigüe para que determinados valores de X la cláusula objetivo es consecuencia lógica de las cláusulas definidas que constituyen el programa.
Así funciona el mecanismo de inferencia en Prolog para encontrar las soluciones a la pregunta trata de probar la inconsistencia de la negación de la pregunta. Los valores que hacen falso la negación son soluciones a nuestra pregunta.
Una sustitución es un cjto finito de la forma {X 1 / t 1 , …, X (^) n/ tn} de pares X/ t donde
i) X 1 … X (^) n son variables distintas ii) t 1 … tn son términos iii) X (^) i≠ ti ∀i ∈ {1,…,n}
Además:
Para una sustitución σ = {X 1 / t 1 , …, X (^) n/ tn} y un término s , se define como s σ (denominándose “resultado de la sustitución σ sobre el término s ”) como el término obtenido por reemplazamiento simultáneo de cada ocurrencia de X (^) i en s por ti para i = 1,…,n. Así :
i) X (^) i σ = ti ii) Yσ = Y , ∀Y ∉ {X 1 , …, X (^) n } iii) f( s1,…,sm )σ = f( s1 σ ,…,sm σ)
Se denomina instanciación del término s a s σ e instanciación básica si no contiene variables. Este mismo concepto puede ser extendido a fórmulas.
Ejemplos:
sσ={p(f(g(a)), g(Y), g(g(a),c)}
sσ={p(f(g(Y)), a, g(g(Y),Z)}
sσ={p(f(Y), Z, g(Y,X)}
sólo si:
Ejemplo
i) Algunas estructuras no tienen unificador. ii) Las sustituciones cambian únicamente variables. iii) Si dos estructuras unifican, o bien una de ellas es una variable o bien tienen el mismo símbolo principal.
Ejemplos
p(X) y q(Y), no son unificables puesto que su símbolo principal no coincide.
p(a, X) y p(b,b) tampoco, ya que no es posible sustituir constantes sólo variables.
iv) Ninguna variable X y estructura que contenga a X como variable son unificables
Ejemplos
X y f(X) → σ={X/ ???} ??? , f( ??? )
Esta relación es antisimétrica. Sin embargo si dos sustituciones son más generales en reciprocidad, entonces para cualquier estructura S se cumple que (salvo renombramiento de variables)
Ejemplo Dadas dos sustituciones θ={Y/X, Z/X} σ={Y/Z, X/Z} Se puede verificar que ambas son una sustitución más general de otra, ya que existen ω 1 y ω 2 que verifican que:
Sea θ={X 1 / Y 1 ,…, X (^) n/ Y (^) n}, θ es denominada sustitución renombramiento si y sólo si Y 1 ,…, Y (^) n son
{X 1 ,…, X (^) n } = { Y 1 ,…, Y (^) n}
Las sustituciones renombramiento suponen una aplicación biyectiva y por tanto poseen una inversa; se denota por θ-1^ y será { Y 1 / X 1 ,…, Y (^) n / X (^) n }
Un unificador θ de S1 y S2 es un unificador más general (u.m.g.) cuando para cualquier otro unificador σ de S1 y S2 existe una sustitución ω tal que σ=θω.
Sean θ y σ dos u.m.g. de dos estructuras S1 y S2, entonces θ y σ son idénticos salvo renombramiento de variables.
∃ ω sustitución renombramiento | θ=σω , y ∃ δ sustitución renombramiento | σ=θδ
Ejemplo Dadas dos estructuras: p(X,f(Y)) y p(Z,f(Z)) claramente σ={X/a, Y/a, Z/a} es unificador de ambos. También lo es θ={X/Z, Y/Z} éste es más general ya que σ =θ{Z/a} ,, es más θ es el u.m.g.
No es el único u.m.g. Por ejemplo δ={ Z/X, Y/X } es u.m.g. ya que θ=δω y δ=θω- ω={X/Z} ω-1={Z/X}
Para resolver el problema de hallar un u.m.g. de dos estructurras indroduzcamos conceptos auxiliares previamente.
Un par de estructuras discrepantes S1 y S2 es un par de estructuras definidas como sigue:
Ejemplos
Unificar p(f(X,Y),a) p(f(Z,Z),Z)
1º/ Pares discrepantes <X, Z> <Y, Z> <a, Z>
2º/ El u.m.g. para el primer par discrepante θ 1 ={X/Z}
3º/ p(f(X,Y),a)θ 1 = p(f(Z,Y),a) p(f(Z,Z),Z)θ 1 = p(f(Z,Z),Z)
4º/ Pares discrepantes <Y, Z> <a, Z>
5º/ El u.m.g. para el primer par discrepante θ 2 ={Y/Z}
6º/ p(f(Z,Y),a)θ 2 = p(f(Z,Z),a) p(f(Z,Z),Z)θ 2 = p(f(Z,Z),Z)
7º/ Pares discrepantes <a, Z>
8º/ El u.m.g. para el primer par discrepante θ 3 ={Z/a}
9º/ p(f(Z,Z),a)θ 3 = p(f(a,a),a) p(f(Z,Z),Z)θ 3 = p(f(a,a),a)
10º/ Al final aplicando la propiedad asociativa de la sustitución tenemos que el u.m.g. será la composición de las sustituciones que unificarán las estructuras iniciales. u.m.g. = θ 1 θ 2 θ 3 = {X/Z}{Y/Z}{Z/a} = {X/a, Y/a, Z/a}
Ejercicio
Unificar {f(X,g(a,Y),Z), f(h(u,c),g(a,W), k(X)), f(h(u,v),g(a,Y),w)} S1 S2 S
1º/ Unificamos S1 y S2 con θ 1 = σ 1 σ 2 …σn
2º/ Unificamos S1θ 1 ( o S2θ 1 ) con S3θ 1 generándose el u.m.g. θ 2
3º/ El U.M.G(S1,S2,S3) = θ 1 θ 2 = θ
Ejercicios
-Unificar las estructuras anteriores
<X, t>, donde X es una variable de t , y por tanto no es unificable ”, son poco eficientes por lo que normalmente se elimina este módulo del algoritmo, por ejemplo en PROLOG. Esto provoca la posibilidad de entrar en un bucle infinito en la unificación.
Además este algoritmo de unificación tienen complejidad exponencial (2n^ ) siendo n la longitud de las estructuras a analizar.
El punto de partida de la SLD-Resolución es por una parte el conjunto de cláusulas definidas del programa (las premisas).
H← B 1 , …, Bm ,, m≥ 0 (dependiendo de si es un hecho o una regla).
Por otra parte tenemos la cláusula (definida) objetivo de la forma:
← A 1 , …, A (^) n (n ≥ 0)
La cláusula objetivo puede incluir varias fórmulas atómicas como subgoals, que unifiquen con la cabeza de alguna de las cláusulas del programa.
Lo que se hace es introducir una regla para seleccionar que subgoal A (^) i coger en cada paso. Esta regla se denomina “Función de selección o Regla de computación”.
En el caso de la SLD-Resolución, al igual que el Prolog se considerará siempre el primer literal (o subgoal) a la izquierda para tratar de resolverlo con una cláusula del programa.
La resolución va a consistir en determinar la sustitución θ tal que θ=u.m.g.(A1, H) Con ello conseguimos una nueva cláusula objetivo de la forma:
(← B1,…,Bm, A 2 , … , A (^) n )θ
En sucesivas ocasiones iremos cogiendo de izquierda a derecha el resto de subobjetivos para ser resueltos con las cláusulas del programa.
La función de selección junto con la restricción a clásulas definidas en la resolución caracteriza la SLD-Resolución, o Linear Resolution for Definite clauses with Selection function.
i) En cada paso “ La regla de resolución ” trabaja con una cláusula definida y una cláusula objetivo.
ii) Por estar acotadas universalmente las premisas es posible el renombramiento de variables para que las variables de ambas cláusulas sean conjuntos disjuntos, debemos recordar que el ámbito de una variable es la cláusula en la que aparece.
iii) La conclusión será una cláusula objetivo cuantificada universalmente.
iv) En el caso de objetivos con más de un literal la función de selección o regla de computación selecciona el subobjetivo más a la izquierda como primer subobjetivo a resolver.
Es un proceso iterativo que se aplica reiteradamente sobre un conjunto de cláusulas (premisas del programa y el objetivo obtenido en el paso anterior de la resolución).
A continuación se presenta el proceso completo “SLD-resolución general”. La información de partida viene dada por :
Ejemplos
Consideremos el siguiente programa lógico: sabe_logica(X)← buen_estudiante(X),profesor(Y,X),logico(Y). buen_estudiante(antonio). logico(matias). profesor(matias,antonio). Ante este programa planteamos la pregunta ¿quién sabe lógica?, que se traduce al objetivo:
Goal: sabe_logica(Z).
El proceso consiguiente de SLD resolución sería el siguiente:
G 0 : ← sabe_logica(Z).
(renombramos)
C 0 : sabe_logica(X 0 )← buen_estudiante(X 0 ),profesor(Y 0 ,X 0 ),logico(Y 0 ).
θ 1 :{ Z/X 0 }
G 1 : ← buen_estudiante(X 0 ),profesor(Y 0 ,X 0 ),logico(Y 0 ).
C 1 : buen_estudiante(antonio).
La cláusula C 1 es un hecho de P , luego es cierta y se elimina del objetivo. Es lo mismo que insertar por delante el cuerpo de esta cláusula en el objetivo ya que el cuerpo está vacío.
θ 2 :{ X 0 /antonio }
G 2 : ← profesor(Y 0 ,antonio),logico(Y 0 ).
C 2 : profesor(matias, antonio).
De nuevo tenemos un hecho del programa y se elimina del objetivo una vez unificado.
θ 3 :{ Y 0 /matias }
G 3 : ← logico(matias).
C 3 : logico(matias).
De esta forma la respuesta a la pregunta vendrá dada por la Sustitución Computada :
Una SLD-derivación finita: < G 0 ; C 0 >, < G 1 ; C 1 >…< G (^) n ; C (^) n >, G (^) n+1 donde G (^) n+1 = se denomina SLD-refutación de G 0.
La sustitución computada de una SLD-refutación de G 0 restringida a las variables de G 0 se denomina “Sustitución Respuesta Computada” para G 0.
Ejemplo: Para el ejemplo anterior donde la la Sustitución Computada era:
la Sustitución Respuesta Computada teniendo en cuenta que G 0 : ← sabe_logica(Z) será: S.R.C. = { Z / antonio }
Una derivación finita de una cláusula objetivo G 0 cuyo último elemento no está vacío y además no puede ser resuelto con ninguna cláusula del programa se denomina derivación fallida.
Es una refutación, derivación fallida o una derivación infinita.
Generalmente un objetivo G 0 puede tener varias derivaciones completas. El conjunto de todas estas derivaciones pude representarse por un árbol “posiblemente infinito” denominado el SLD-árbol de G (^0)
Sea P un programa definido, G 0 un objetivo definido y ℜ una regla de computación. El árbol-SLD de G 0 de acuerdo con P y G 0 es un árbol etiquetado (posiblemente infinito) que satisface las siguientes condiciones:
con C (^) i. Dicho segmento es el n-simo de izquierda a derecha si C (^) i es la n-sima cláusula que unifica con el
Los nodos de un árbol-SLD son subobjetivos de la derivación. Las conexiones son etiquetadas por las cláusulas del programa.
← r(a,Y 0 )
← q(b,Z 0 ),r(Z 0 ,Y 0 )
← r(Y 1 ,b), r(Y 1 ,Y 0 )
← r(Y 0 ,b)
← p(b,X)
θ 2 ’={Y 0 /a}
θ 4 ={Y 0 /b}
θ 3 ={Y 1 /a}
θ 2 ={X 1 /b,Z 0 /Y 1 }
θ 1 ={X 0 /b,X/Y 0 } θ 1 ’={X 0 /b,X/Y 0 }
e
c d
f
f
f
Ejercicio:
c p(Y) ← q(X,Y), r(Y). d p(X) ← q(X,X). e q(X,X) ← s(X). f r(b) g s(a). h s(b).
y como objetivo G 0 : ← p(X)
Como proceso de inferencia formal que es la resolución conlleva cuestiones de corrección y completitud.
Es una propiedad esencial que garantiza que las conclusiones producidas por el sistema son correctas. Corrección en el sentido de que sean consecuencias lógicas del programa.
El objetivo que se persigue en la resolución de un objetivo es que { P , G 0 } ⇒ Falso , es decir, a partir del programa y el objetivo inicial se obtenga por SLD-Resolución la cláusula VACIA. Para ello sea:
P programa definido ← A 1 ,…, An el objetivo a resolver con θ sustitución respuesta computada
Entonces (^) ∀∗ (A 1 ,…, An)θ es consecuencia lógica de P
Puede verse como la propiedad contraria ya que hace referencia a que toda posible solución a un objetivo inicial se puede obtener por SLD-Resolución.
Sea P un programa definido y ← B el objetivo definido a resolver, entonces se verifica que para cada instancia B’ de B que sea consecuencia lógica de P existe una refutación de P y ← B con sustitución respuesta computada θ tal que B’ es instancia de Bθ.
Aunque aquí únicamente enunciamos estas dos propiedades presentes en el proceso de inferencia existen teoremas que aseguran dichas propiedades.