Title: PROGRAMACI
1PROGRAMACIÓN LOGICA
PROLOG - RESOLUCIÓN Y UNIFICACIÓN - LISTAS -
ARITMÉTICA - ORDEN DE BÚSQUEDA / EJECUCIÓN -
FLUJO DE CONTROL IMPERATIVO - MANIPULACIÓN DE LA
BASE DE DATOS
PROGRAMACIÓN LÓGICA EN PERSPECTIVA
- PARTES DE LA LÓGICA NO CUBIERTA - ORDEN DE
EJECUCIÓN - NEGACIÓN Y EL ASUMIR EL MUNDO CERRADO
2PROGRAMACIÓN LOGICA
La programación lógica permite al programador
declarar una colección de axiomas en la cual los
teoremas pueden ser probados. El usuario de un
programa lógico declara un teorema, y la
implementación del lenguaje intenta encontrar una
colección de pasos de inferencia y axiomas que
juntos llegan al objetivo. Prolog es el lenguaje
lógico más usado extensamente. En casi todos los
lenguajes lógicos, los axiomas son escritos en
una forma estandar conocida como Clausula de
Horn. Una clausula de Horn consta de una cabeza o
consecuente término H, y un cuerpo que contiene
términos Bi H lt- B1, B2, ..., Bn La semántica
de esta sentencia es que cuando los Bi son todos
true, nosotros podemos deducir que H es true
támbien. Se dice H, si B1,B2,..., y Bn
3PROLOG
Tal como un interpretador de Scheme evalua las
funciones en el contexto de un ambiente de
referencia en el cual las otras funciones y
constantes han sido definidos, un interpretador
de Prolog corre en el contexto de una base de
datos de clausulas (clausulas de Horn) que son
asumidas verdaderas. Cada clausula está
compuesta de términos, las cuales pueden ser
constantes, variables, o estructuras. Una
constante es un átomo o un número. Una estructura
puede ser un predicado lógico o una estructura
de datos.
4PROLOG
Las clausulas en una base de datos de Prolog
pueden ser clasificadas como hechos o reglas,
cada uno de los cuales termina con un punto. Un
hecho es una clausula de Horn sin su lado derecho
(right-hand side), este luce como un término
simple (el término de implicación es
implícito) lluvioso(rochester). Una regla
contiene su lado derecho frio(X) -
lluvioso(X), nevado(X). - Es el símbolo de
implicación La coma indica y X es frio si X es
lluvioso y X es nevado
5PROLOG
Resolución y Unificación El principio de
resolución dice que si C1 y C2 son clausulas de
Horn y la cabeza de C1 hace match con uno de los
términos en el cuerpo de C2, entonces podemos
reemplazar el término en C2 con el cuerpo de C1.
Veamos el siguiente ejemplo toma(jose_perez,his
201). toma(jose_perez,cs254). toma(maria_rojas,a
rt302). toma(maria_rojas,cs254). compañeroclase(
X,Y) - toma (X, Z), toma(Y, Z). Si permitimos
que X sea jose_perez y Z sea cs254, podemos
reemplazar el primer término el primer término de
la última clausula con el cuerpo de la segunda
clausula, obteniendo la nueva regla compañerocla
se(jose_perez, Y) - toma(Y, cs254) En otras
palabras, Y es un compañero de clase de
jose_perez si Y toma cs254.
6PROLOG
Resolución y Unificación El proceso usado para
asociar X con jose_perez y Z con cs254 es
conocido como unificación. Las reglas de
unificación son 1) Una constante unifica solo
consigo misma. 2) Dos estructuras unifican si y
solo si ellas tienen al mismo functor y el mismo
número de argumentos, y los correspondientes
argumentos unifican recursivamente. 3) Una
variable unifica con cualquier objeto. Si el otro
objeto tiene un valor, entonces la variable es
instanciada. Si el otro objeto es una variable no
instanciada, entonces las dos variables son
asociadas de tal modo que si dan a cualquiera un
valor más tarde, aquel valor será compartido por
ambas.
7PROLOG
Listas La lista a, b, c puede ser expresada
en Prolog como a b, c , a, b c
ó a , b, c La barra vertical ( )
delimita la cola de la lista, y es
particularmente práctica cuando la cola de la
lista es variable. Ejemplos member(X, X
T). member(X, H T) - member(X, T).
verifica si un elemento pertenece a una
lista sorted(). la lista vacía es
ordenada sorted(X). el único elemento de
la lista es ordenado sorted(A, B T) - A lt
B, sorted(B T). la lista compuesta es
ordenada de menor a mayor lt (menor o igual)
es un predicado que opera sobre numeros
8PROLOG
Aritmética Los operadores aritméticos usuales
están disponibles en Prolog, pero ellos juegan el
rol de functors (estructuras con argumentos), no
de funciones. De esta forma (2, 3), que puede
ser escrito como 2 3, es una estructura con dos
argumentos, y no una llamada a una función. En
particular, no se puede unificar con 5 ?- (2
3) 5 no Prolog provee un constructor de
functors is, que unifica su primer argumento con
el valor aritmético de su segundo argumento ?-
is(X, 12). X 3 ?- X is 12 X 3 ?- Y is
12, X is Y X 3 Y 3
9PROLOG
Orden de Búsqueda / Ejecución Cómo hace Prolog
para resolver un query? Lo que necesita es una
secuencia de pasos de resolución que puedan
construir el objetivo. Existen dos principales
estrategias de búsqueda del objetivo - Forward
Chaining Comienza con las clausulas existentes y
trabaja hacia adelante, intentando derivar el
objetivo. - Backward Chaining Comienza con el
objetivo y trabaja hacia atrás, intentando de no
resolver esto con un conjunto de clausulas
pre-existentes. Si el número de reglas
existentes es muy largo, pero el número de hechos
es pequeño, es posible que forward chaining
consiga una solución más rápido que backward
chaining. En la mayoría de los casos, backward
chaining tiende a ser más eficiente. Prolog
esta definido para usar backward chaining.
10PROLOG Ejecución
11PROLOG
Flujo de Control Imperativo El orden de las
clausulas y de los términos en Prolog es
significante, en razones de eficiencia,
terminación y otras alternativas. En adición al
simple orden, Prolog provee al programador
ciertos flujos de control explicitos. El más
importante es el corte (cut). Veamos la
definición de miembro de una lista member(X,
XT). member(X, HT) - member(X, T) Si un
átomo a aparece en la lista L n veces, entonces
?- member(a,L) puede suceder n veces. Estos
sucesos extras no siempre son apropiados. Usando
el cut (signo de exclamación) member(X,
XT) - ! member(X, HT) - member(X,
T) El cut en el lado derecho de la primera regla
dice que si X es la cabeza de L, no debería
intentar unificar member (X, L) con el lado
izquierdo de la segunda regla, ya que el corte lo
comete la primera regla.
12PROLOG
Manipulación de la base de datos En
Prolog un programa es una base de datos de
cláusulas de Horn. El programa puede ser alterado
dinámicamente. La operación assert coloca una
nueva cláusula al final de la base de datos. La
operación retract elimina una clausula de la
base de datos (la primera que unifique). ?-
rainy(X). ?- assert(rainy(syracuse)). ?-
retract(rainy(rochester)). X
seattle yes. yes. X rochester ?-
rainy(X). ?- rainy(X). no X
seattle X seattle X
rochester X syracuse X
syracuse no no
13PROGRAMACIÓN LÓGICA EN PERSPECTIVA
En lo abstracto, la programación lógica es una
idea muy complicada sugiere un modelo de
computación en el cual se listan las propiedades
lógicas de un valor no conocido, el cual el
computador intentará encontrar (o decirnos que no
existe). Desafortunadamente, existen razones
teoricas y prácticas cortas de visión 1)
Partes de la lógica no cubierta Las clausulas de
Horn no capturan todos los calculos de predicado
de primer orden. En particular, ellos no pueden
ser usados para expresar sentencias en el cual la
forma de la clausula incluye una disjunción con
más de un término no negado. Se puede abordar
este problema en Prolog usando el predicado not,
pero la semántica no es la misma. 2) Orden de
Ejecución Mientras la lógica es inherentemente
declarativa, la mayoría de los lenguajes lógicos
explora el árbol de posibles soluciones en orden
deterministico. Prolog provee una variedad de
predicados para controlar el orden de ejecución y
predicados para manipular su base de datos
durante la ejecución.
14PROGRAMACIÓN LÓGICA EN PERSPECTIVA
2) Orden de Ejecución Debemos frecuentemente
considerar el orden de ejecución para asegurar
que una búsqueda en Prolog pueda terminar. Y
aunque las búsquedas puedan terminar, el código
puede ser muy ineficiente. 3) Negación y el
asumir el Mundo Cerrado Una colección de
clausulas de Horn tal como los hechos y las
reglas de una base de datos en Prolog,
constituyen una lista de cosas que son asumidas
verdad. No incluye cualquier cosa asumida a ser
falso. Esta confianza sobre la lógica puramente
positiva explica el porqué el predicado not es
diferente de la negación lógica. Al menos que la
base de datos asuma contener cualquier cosa que
es verdad (esto es el asumir el mundo cerrado),
el objetivo not T se puede lograr simplemente
debido a que nuestro conocimiento es insuficiente
para probar T. Más aún, la negación en Prolog
ocurre fuera de cualquier cuantificador
existencial implícito en el lado derecho de una
regla.