Escolar Documentos
Profissional Documentos
Cultura Documentos
MANUAL DE PRÁCTICAS
de
PROGRAMACIÓN LÓGICA
Y FUNCIONAL
CONTENIDO
Objetivo General 3
Práctica 2.1 Investigación sobre las diferentes versiones del lenguaje LISP 15
OBJETIVO GENERAL
PRÁCTICA 1.1
OBJETIVO.
El estudiante conocerá los principales estilos de programación, así como las ventajas y
desventajas de cada uno de ellos. A través de la elaboración de un mapa conceptual
realizado mediante la herramienta de diseño Cmap Tools.
INTRODUCCIÓN.
En esta práctica se aborda el tema 1.1 del programa de estudios denominado Estilos de
Programación. Además de reforzar los conceptos explicados en el aula, se busca
desarrollar las habilidades de análisis y síntesis así como el manejo de recursos de
cómputo como lo es la herramienta Cmap Tools para la elaboración de mapas
conceptuales.
Estilo de programación (también llamado estándares de código o convención de código)
es un término que describe convenciones para escribir código fuente en ciertos lenguajes
de programación.
El estilo de programación es frecuentemente dependiente del lenguaje de programación
que se haya elegido para escribir.
Los aspectos que normalmente se denominan "estilos de programación" son aspectos
relacionados a los lenguajes de programación como medio de comunicación entre
personas, y que usualmente no influyen en la comunicación humano-máquina. El problema
del estilo es muy recurrente en el desarrollo de software. Muchas veces se escribe el código
pensando que la única persona que lo modificará es el mismo programador; y cuando es
necesario que otra persona revise el código pueden surgir serios problemas.
Si bien es cierto que la meta final del programador es construir programas, el ideal es
construir "buenos" programas. No basta con escribir un programa que funcione. El
código tiene que estar bien escrito.
MATERIAL Y EQUIPO.
1. Computadora personal.
2. Software Cmap Tools (o similar).
3. Proyector.
4. Material y apuntes vistos en clase.
METODOLOGÍA.
1. Leer los apuntes, identificar las ideas o conceptos principales y escribirlos en una
lista.
2. Ordenar los conceptos desde el más general al más específico en orden
descendiente.
3. Desglosar los conceptos para ver si la idea principal puede ser dividida en dos o
más conceptos.
4. Usar líneas que conecten los conceptos, y escribir sobre cada línea una palabra o
enunciado que aclare por qué los conceptos están conectados entre sí.
Consideraciones Importantes:
SUGERENCIAS DIDÁCTICAS.
RESULTADOS
1. Nombre de la práctica.
2. Objetivo.
3. Definiciones.
4. Mapa conceptual.
5. Conclusiones
BIBLIOGRAFÍA
• NILSSON, N. J. Inteligencia Artificial. Una nueva síntesis. Mc Graw Hill. 2001.
• HRISTOV, ALEXANDER. Manual de Estilos de Programación. Planetalia. 2007
PRÁCTICA 1.2
EVALUACIÓN DE EXPRESIONES
OBJETIVO.
El alumno identificará los diferentes tipos de expresiones y sus propiedades, así como los
fundamentos relacionados con la definición, construcción y evaluación de las mismas.
INTRODUCCIÓN.
Según sea el tipo de objetos que manipulan, las expresiones se pueden clasificar, en:
• Aritméticas
• Lógicas
• Relacionales
• De caracter.
Las expresiones aritméticas son análogas a las fórmulas matemáticas. Las variables y
constantes son numéricas (reales o enteras) y las operaciones son las aritméticas.
Para las expresiones que tienen dos o más operadores, existen reglas que determinan el
orden de las operaciones. Estas reglas se denominan reglas de prioridad o precedencia, y
son las siguientes:
Las expresiones lógicas o booleanas son aquellas cuyo valor es siempre verdadero o falso.
Recuerde que existen dos constantes lógicas, verdadera (true) y falsa (false) y que las
variables lógicas pueden tomar sólo estos dos valores. Se denominan también expresiones
booleanas en honor del matemático británico George Boole, que desarrolló el álgebra
lógica de Boole.
Las expresiones lógicas se forman combinando constantes lógicas, variables lógicas y otras
expresiones lógicas, utilizando los operadores lógicos not, and y or, y los operadores
relacionales =, <, >, <=, >=, <>.
Los operadores relacionales o de relación, permiten realizar comparaciones de valores
tipo numérico o carácter., y permiten expresar las condiciones en los algoritmos.
Para las expresiones que utilizan caracteres o cadenas de caracteres, se debe tomar en
cuenta el valor numérico de cada caracter con respecto a un código, normalmente el
código ASCII (American Standard Code for Information Interchange) .
Aunque no todas las computadoras siguen el código normalizado en su juego completo de
caracteres, sí son prácticamente estándar los códigos de los caracteres alfanuméricos más
usuales. Estos códigos normalizados son:
MATERIAL Y EQUIPO.
1. Computadora personal.
2. Pizarrón y marcadores
3. Proyector (opcional)
4. Material y apuntes vistos en clase.
METODOLOGÍA.
• 3*4–2
• 3 +2*6
• 8+7*3–4*6
• -4 * 7 + 2^3 / 4 – 5
• (2<6) or (3>5)
• (6<=3) or (4<>4)
• not(8<3) and (7<9)
• not( (5=5) and (3>7) or not(4<8) )
3. Evaluar las siguientes expresiones lógicas que operan cadenas de caracteres y explique
su procedimiento.
SUGERENCIAS DIDÁCTICAS.
RESULTADOS
1. Nombre de la práctica.
2. Objetivo.
3. Definiciones.
4. Ejercicios resueltos con procedimiento incluido
5. Conclusiones
BIBLIOGRAFÍA
PRÁCTICA 1.3
OBJETIVO.
INTRODUCCIÓN.
En esta práctica se abordan los temas 1.4 y 1.5 del programa de estudio denominados
Disciplina de tipos y Tipos de Datos respectivamente. Además de reforzar los conceptos
explicados en el aula, y los aprendidos en materias anteriores, se busca desarrollar las
habilidades de análisis y síntesis, el trabajo en equipo, y el manejo de recursos de
cómputo.
Datos y Tipos de Datos. La palabra “dato” proviene del latín datum, que significa “lo que
se da”. Un dato es un documento, un evento o un testimonio que permite llegar al
conocimiento de algo o deducir las consecuencias legítimas de un hecho.
En informática, los datos son expresiones generales que describen características de las
entidades sobre las que operan los algoritmos. Estas expresiones deben representarse en
una forma que puedan ser tratadas por una computadora.
Los datos por sí solos no constituyen información, sino que ésta surge del adecuado
procesamiento de los datos.
La mayoría de las computadoras pueden trabajar con varios tipos de datos. Los datos de
entrada se transforman, por medio del programa, en datos de salida.
• Registros
• Listas
Datos numéricos.
MATERIAL Y EQUIPO.
1. Computadora personal.
2. Software Cmap Tools (o similar).
3. Proyector.
4. Material y apuntes vistos en clase.
METODOLOGÍA.
SUGERENCIAS DIDÁCTICAS.
RESULTADOS
1. Nombre de la práctica.
2. Objetivo.
3. Definiciones.
4. Mapa conceptual.
5. Conclusiones
BIBLIOGRAFÍA
PRÁCTICA 2.1
OBJETIVO.
El alumno conocerá las principales versiones del lenguaje LISP, e identificará las ventajas y
desventajas de cada versión.
INTRODUCCIÓN.
Características generales
Fue desarrollado por John McCarthy, en 1958. LISP es un lenguaje maduro, aplicable a
diversos escenarios, tales como: Robótica, Inteligencia Artificial, Procesamiento de
lenguaje natural y Demostración automática de teoremas.
Lisp es un lenguaje de notación prefija (polaca), es decir que los operadores van delante
de los operandos, por ejemplo:
• 2+3 (+ 2 3)
• 4*3*2 (* 4 3 2)
• 2+3*5 (+ 2 (* 3 5))
Cualquier sistema LISP, incluye una interfaz interactiva llamada top-level. Uno escribe
expresiones LISP en el top-level, y el sistema despliega sus valores. El sistema
normalmente despliega un indicador llamado prompt (>) señalando que está esperando
que una expresión sea escrita.
Por ejemplo, si escribimos el entero 1 después del prompt y tecleamos enter, tenemos:
MATERIAL Y EQUIPO.
METODOLOGÍA.
SUGERENCIAS DIDÁCTICAS.
RESULTADOS
1. Nombre de la práctica.
2. Objetivo.
3. Definiciones.
4. Características de la versión de LISP
5. Ventajas y desventajas.
6. Programa de ejemplo.
7. Conclusiones
BIBLIOGRAFÍA
PRÁCTICA 2.2
FUNCIONES EN LISP
OBJETIVO.
INTRODUCCIÓN.
En esta práctica se abordan los temas 2.1 y 2.2 del programa de estudio, denominados El
tipo de datos y Funciones respectivamente. Se busca que el alumno comprenda la lógica
de LISP al realizar funciones sencillas y comprobar sus resultados.
Toda expresión LISP es un átomo, o bien es una lista que consiste de cero o más
expresiones delimitadas por paréntesis. La expresión (+ 2 3) es una lista, en la cual el
operador + es en realidad el nombre de una función, mientras que 2 y 3 son los
argumentos. La expresión (+ 2 3) es una llamada a la función suma.
Cuando LISP evalúa una llamada a alguna función, lo hace en dos pasos:
1. Los argumentos de la llamada son evaluados de izquierda a derecha. En este caso, los
valores de los argumentos son 2 y 3, respectivamente.
2. Los valores de los argumentos son pasados a la función nombrada por el operador. En
este caso la función + que regresa 5.
Si alguno de los argumentos es a su vez una llamada de función, será evaluado con las
mismas reglas. Por ejemplo, al evaluar la expresión (/ (- 7 1) (- 4 2)) pasa lo siguiente:
No todos los operadores en LISP son funciones, pero la mayoría lo son. Todas las llamadas
a función son evaluadas de esta forma, que se conoce como regla de evaluación de LISP.
Los operadores que no siguen la regla de evaluación se conocen como operadores
especiales. Uno de estos operadores especiales es quote (’).
La regla de evaluación de quote es: No evalúes nada, despliega lo que el usuario escribió.
Por ejemplo:
LISP provee el operador quote como una forma de evitar que una expresión sea evaluada.
MATERIAL Y EQUIPO.
1. Computadora personal.
2. Software XLISP-PLUS versión 3.05 o más nueva.
3. Material y apuntes vistos en clase.
METODOLOGÍA.
Ejemplos.
1. Definir una función que devuelva la longitud de una circunferencia, dando como
parámetro el radio R de la misma siendo L = 2 π R
2. Definir una función que pase de grados Fahrenheit a grados centígrados, sabiendo
que: C = F -32 * 5/9
3. Definir una función que, dados tres argumentos numéricos, devuelva cuál es el
mediano, utilizando MAX y MIN.
4. Definir una función que devuelva el área de un triángulo, dando como parámetros
su base y su altura.
5. Definir una función GRADO que reciba una calificación C y devuelva un mensaje de
acuerdo a lo siguiente:
100 Excelente
90-99 Notable
80-89 Bien
70-79 Suficiente
<70 Deficiente
Soluciones.
3. (DEFUN mediano (a b c)
(- (+ a b c) (MAX a b c) (MIN a b c))
)
4. (DEFUN at (b h)
(/ (* b h) 2)
)
RESULTADOS
1. Nombre de la práctica.
2. Objetivo.
3. Definiciones.
4. Código fuente y ejemplos resueltos.
5. Conclusiones
BIBILOGRAFÍA
PRÁCTICA 2.3
PREDICADOS EN LISP
OBJETIVO.
INTRODUCCIÓN.
En esta práctica se aborda un tipo especial de funciones del tema 2.1 del programa de
estudio, denominados Predicados. Se busca que el alumno practique la implementación
de predicados a través de ejemplos sencillos y que conozca los diferentes tipos de
predicados que incluye el propio lenguaje.
Un predicado puede representarse en LISP como una función que retorna un valor de
verdad. Se adopta la convención de que NIL denota falso, y que cualquier otra s-expresión
denota verdadero. Por ejemplo:
Además de los predicados lógicos tradicionales AND, OR y NOT, el lenguaje LISP cuenta
con algunos otros predicados, entre los más comunes tenemos:
También se tienen los predicados relacionales comunes >, <, >=, <=, =. Por ejemplo:
MATERIAL Y EQUIPO.
1. Computadora personal.
2. Software XLISP-PLUS versión 3.05 o más nueva.
3. Material y apuntes vistos en clase.
METODOLOGÍA.
Ejemplos.
Soluciones.
(= (REM n 3) 0)
)
5. (DEFUN tr (a b c)
(> (+ (* a a) (* b b)) (* c c))
)
RESULTADOS
1. Nombre de la práctica.
2. Objetivo.
3. Definiciones.
4. Código fuente y ejemplos resueltos.
5. Conclusiones
BIBILOGRAFÍA
PRÁCTICA 2.4
OBJETIVO.
INTRODUCCIÓN.
Esta práctica aborda el tema 2.5 del programa de estudio, denominado Aplicaciones de las
listas. Se busca que el alumno conozca el concepto de listas en LISP, las principales
funciones de manejo de listas que incluye el lenguaje, y que practique la implementación
de listas mediante la elaboración de programas sencillos.
LISP es un lenguaje diseñado para el tratamiento de listas. En una lista se puede acceder
fácilmente a los elementos de la misma. Las listas se construyen internamente utilizando
“celdas cons”. Cada celda está formada por dos punteros: CAR y CDR.
Las listas se representan como cero o más elementos entre paréntesis. Los elementos
pueden ser de cualquier tipo, incluidas las listas. Se debe usar quote con las listas, ya que
de otra forma Lisp las tomaría como una llamada a función. Veamos algunos ejemplos:
Algunas de las funciones de manipulación de listas más comunes son las siguientes:
Función LAMBDA
Para no tener que definir funciones cada vez, existe la función "sin nombre" lambda, que
puede pasarse como argumento a MAPCAR, ahí mismo donde se define. Para el ejemplo
de la función doble, sería así:
Función MAPLIST
Ejemplo:
MATERIAL Y EQUIPO.
1. Computadora personal.
2. Software XLISP-PLUS versión 3.05 o más nueva.
3. Material y apuntes vistos en clase.
METODOLOGÍA.
Ejemplos.
1. Definir una función que tenga por argumento una lista y devuelva el tercer
elemento de dicha lista.
2. Definir una función que tenga por argumento una lista y devuelva otra lista con el
primer y último elemento.
3. Escribir una función que reciba una lista de números y retorne una lista con una
sublista de los pares y otra sublista con los impares.
4. Definir una función que dados tres números X, Y y Z, devuelva una lista con los
números ordenados por orden creciente.
5. Defina una función que reciba una lista de n números y calcule el promedio.
Soluciones.
4. (DEFUN ordena3 (x y z)
(SETF lo '())
(SETF lo (CONS (MAX x y z) lo))
(SETF lo (CONS (medio x y z) lo) )
(SETF lo (CONS (MIN x y z) lo))
)
(DEFUN medio (x y z)
(- (+ x y z) (MAX x y z) (MIN x y z))
)
RESULTADOS
1. Nombre de la práctica.
2. Objetivo.
3. Definiciones.
4. Código fuente y ejemplos resueltos.
5. Conclusiones
BIBILOGRAFÍA
PRÁCTICA 2.5
ARREGLOS EN LISP
OBJETIVO.
INTRODUCCIÓN.
Para abordar el tema 2.6 del programa de estudio denominado Árboles, en esta práctica
es necesario introducir el concepto de arreglos para implementar árboles, se trata
también el concepto de conjunto, y se plantean programas que requieren su
implementación.
Los arreglos son estructuras de datos que pueden almacenar valores en posiciones de
memoria simples o multi-dimensionales, que son indexadas por uno o más enteros. Los
arreglos soportan un acceso muy rápido a los datos basado en índices de enteros. Se
crean arreglos empleando la función constructora MAKE-ARRAY y los elementos del
arreglo se refieren usando la función de acceso AREF. Se pueden establecer elementos
individuales en el arreglo usando SETF:
Observe la respuesta del intérprete al crear el arreglo: Comienza con las dimensiones #3A
(A es el tipo del arreglo) y luego los elementos como listas anidadas.
En LISP, todos los datos en memoria se estructuran mediante pares conocidos como
nodos. Por ejemplo, los elementos a y b se almacenan en un nodo a b
Ejemplo:
1
1
> (SETQ arbol ‘ (1 (2) 3))
(1 (2) 3)
2 3 2 3
NIL NIL
MATERIAL Y EQUIPO.|
1. Computadora personal.
2. Software XLISP-PLUS versión 3.05 o más nueva.
3. Material y apuntes vistos en clase.
METODOLOGÍA.
Ejemplos.
1. Escribir una función que permita leer los elementos de una matriz de n x m.
2. Definir una función REDUCE-CONJUNTO que tome una lista y elimine los
elementos repetidos; es decir, que la convierta en conjunto. Por ejemplo,
(REDUCE-CONJUNTO ' (A B A C)) (B A C)
3. Definir un predicado CIGUALES que determine si dos conjuntos son iguales.
Recuerde que en un conjunto, el orden de los elementos no es esencial.
4. Definir una función que devuelva el número de elementos de un árbol dado como
argumento. (N-ELEM '(A (B C) (C (A)) E)) 6
5. Definir (PROFUNDIDAD L) que devuelva el número de niveles que existen en L; es
decir, el número de arcos de la raíz a la hoja más lejana. Por ejemplo,
(PROFUNDIDAD '(A (B C) (D (A)) E)) 3
Soluciones.
1. (defun leematriz (n m)
(setf a (make-array n))
(dotimes (x n)
(setf (aref a x) (make-array m))
)
(dotimes (i n)
(dotimes (j m)
(format t "Elemento [ ~a , ~a ]:" (+ i 1) (+ j 1))
(setf (aref (aref a i) j) (read))
)))
RESULTADOS
1. Nombre de la práctica.
2. Objetivo.
3. Definiciones.
4. Código fuente y ejemplos resueltos.
5. Conclusiones
BIBILOGRAFÍA
PRÁCTICA 3.1
OBJETIVO.
INTRODUCCIÓN.
En esta práctica se aborda el tema 3.1 del programa de estudio, denominado La Estrategia
de Evaluación Perezosa. Además de reforzar los conceptos explicados en el aula, se busca
desarrollar las habilidades de análisis y síntesis así como el manejo de recursos de
cómputo como lo es la herramienta Cmap Tools para la elaboración de mapas
conceptuales.
Como puede observarse, el primer esquema tarda más ya que puede haber argumentos
que no se utilizan en el resultado y, sin embargo, son evaluados.
Este tipo de modelo también se conoce como evaluación impaciente (del inglés eager) o
estricta. En casos extremos, si alguno de dichos argumentos produce un error (por
ejemplo, una división por cero), o no finaliza, el sistema no devolvería el resultado
adecuado.
= (5+2) * (5 + 2)
= 7 * (5 + 2)
=7*7
= 49
La evaluación perezosa permite solucionar este problema mediante una reducción
basada en un grafo. Por ejemplo, para la expresión anterior se utilizaría la siguiente
secuencia
cuad (5 + 2)
= x * x donde x = 5 + 2
= x * x donde x = 7
= 49
MATERIAL Y EQUIPO.
1. Computadora personal.
2. Software Cmap Tools (o similar).
3. Proyector.
4. Material y apuntes vistos en clase.
METODOLOGÍA.
RESULTADOS
1. Nombre de la práctica.
2. Objetivo.
3. Definiciones.
4. Mapa conceptual.
5. Conclusiones
BIBLIOGRAFÍA
PRÁCTICA 4.1
OBJETIVO.
INTRODUCCIÓN.
La lógica proposicional sólo puede representar hechos acerca del mundo. La lógica de
primer orden describe un mundo que consta de objetos y propiedades (o predicados) de
esos objetos. Una función es una relación en la cual sólo hay un valor para un objeto dado.
Ejemplos:
Objetos: gente, casas, números, planetas,...
Relaciones: progenitor, hermano-de, mayor-que,...
Propiedades: rojo, pequeño, primo,...
Funciones: padre-de, uno-más-que….
La lógica de primer orden es universal porque puede expresar cualquier cosa que pueda
ser programada.
Sintaxis y semántica
La lógica de primer orden tiene sentencias como la lógica proposicional y además, tiene
términos, que representan objetos. Para construir términos se usan símbolos constantes,
variables y funciones; y para construir sentencias, se utilizan cuantificadores y predicados.
Una relación funcional relaciona un objeto a exactamente otro único objeto. El último
elemento en la tupla es el valor de la función para los otros elementos. Por Ejemplo:
Padre_de (María, José).
Términos
Un término es una expresión lógica que se refiere a un objeto. Los símbolos constantes
son términos. Los términos también se pueden construir a partir de símbolos de funciones
y símbolos de constantes, ej., Padrede (Juan).
Sentencias atómicas
Una sentencia atómica está formada por un símbolo predicado seguido por una lista entre
paréntesis de términos, por ejemplo, Hermano (Roberto, Juan) indica que el objeto
referido por Roberto es el hermano del objeto referido por Juan.
Las sentencias atómicas pueden tener argumentos que son términos complejos: Casado
(Padrede (Roberto), Madrede (Juan))
Sentencias complejas
Podemos usar conectores lógicos para construir sentencias más complejas. La semántica
de éstas es la misma usada en lógica proposicional.
Ejemplos:
Hermano (Roberto, Juan) ∧ Hermano (Juan, Roberto) es verdad en el caso en que Juan es
hermano de Roberto y Roberto es hermano de Juan.
Mayor (Juan, 30) ∨ Menor (Juan, 30) es verdad cuando Juan es mayor de 30 o es menor
que 30.
Cuantificadores
Usando esta cuantificación podemos decir cosas tal como, “Todos los hámsteres son
mamíferos." ∀x Hamster(x) ⇒Mamifero(x)
Las afirmaciones universales son verdad si son verdad para cada individuo en el mundo. Se
pueden pensar como una conjunción infinita.
Cuantificación existencial ∃x
Realiza afirmaciones acerca de al menos algún objeto. Para decir, por ejemplo que
Mancha tiene una hermana que es un hamster, escribimos ∃x Hermana(x,mancha) ∧
Hamster(x)
∃x P es verdad si P es verdad para algún objeto en el mundo. Se puede pensar como una
disyunción infinita.
Cuantificadores anidados
Conexiones entre ∀ y ∃
Hay una íntima conexión entre los dos cuantificadores. Para ver esto, considerar la
sentencia ∀x ¬Gusta(x,LideresDecepcionantes)
Otra forma de decir esto es, “No existe un x que guste de los líderes decepcionantes.“
¬∃x Gusta(x,LideresDecepcionantes)
Esto es verdad en general porque ∀ es una conjunción sobre todos los objetos y ∃ es una
disyunción sobre todos los objetos.
MATERIAL Y EQUIPO.
1. Computadora personal.
2. Software Cmap Tools (o similar).
3. Proyector.
METODOLOGÍA.
RESULTADOS
1. Nombre de la práctica.
2. Objetivo.
3. Definiciones.
4. Mapa conceptual.
5. Conclusiones
BIBLIOGRAFÍA
PRÁCTICA 4.2
OBJETIVO.
El alumno conocerá las principales versiones del lenguaje PROLOG, e identificará las
ventajas y desventajas de cada versión.
INTRODUCCIÓN.
ESTRUCTURA DE UN PROGRAMA
Las preguntas son las herramientas que tenemos para recuperar la información desde
Prolog. Al hacer una pregunta a un programa lógico queremos determinar si esa pregunta
es consecuencia lógica del programa. Prolog considera que todo lo que hay en la Base de
Datos es verdad, y lo que no, es falso. De manera que si Prolog responde “yes” es que ha
podido demostrarlo, y si responde “no” es que no lo ha podido demostrar (no debe
interpretarse como “falso” si no que con lo que Prolog conoce no puede demostrar su
veracidad).
Cuando se hace una pregunta a Prolog, éste efectuará una búsqueda por toda la Base de
Datos intentando encontrar hechos que coincidan con la pregunta. Dos hechos
“coinciden” (se pueden unificar) si sus predicados son el mismo (se escriben de igual
forma) y si cada uno de los respectivos argumentos son iguales entre sí.
Cuando a Prolog se le hace una pregunta con una variable, dicha variable estará
inicialmente no instanciada. Prolog entonces recorre la Base de Datos en busca de un
hecho que empareje con la pregunta: los símbolos de predicado y el número de
argumentos sean iguales, y emparejen los argumentos. Entonces Prolog hará que la
variable se instancie con el argumento que esté en su misma posición en el hecho. Prolog
realiza la búsqueda por la Base de Datos en el orden en que se introdujo. La conjunción y
el uso de variables pueden combinarse para hacer preguntas más complejas.
PREDICADOS
• Los nombres de todos los objetos y relaciones deben escribirse con letras
minúsculas.
• Primero se escribe la relación o propiedad (predicado) y los objetos se escriben
separándolos mediante comas y encerrados entre paréntesis (argumentos.)
• Al final del hecho debe ir un punto (".").
Las variables se utilizan para representar objetos cualesquiera del Universo u objetos
desconocidos en ese momento, es decir, son las incógnitas del problema. Se
diferencian de los átomos en que empiezan siempre con una letra mayúscula o con el
signo de subrayado (_). Para trabajar con objetos desconocidos cuya identidad no nos
interesa, podemos utilizar la variable anónima (_).
Una variable está instanciada cuando existe un objeto determinado representado por
ella. Y está no instanciada cuando todavía no se sabe lo que representa la variable.
Explícitamente Prolog no utiliza los símbolos de cuantificación para las variables, pero
implícitamente sí lo están. En general, todas las variables que aparecen están
cuantificadas universalmente, aunque ya no escribamos explícitamente el
cuantificador.
CONECTIVAS LÓGICAS
La conjunción, “y”, se representa poniendo una coma entre los objetivos “,” y
consiste en objetivos separados que Prolog debe satisfacer, uno después de otro: X , Y.
Cuando se le da a Prolog una secuencia de objetivos separados por comas, intentará
satisfacerlos por orden, buscando objetivos coincidentes en la Base de Datos. Para
que se satisfaga la secuencia se tendrán que satisfacer todos los objetivos.
La disyunción, “o”, tendrá éxito si se cumple alguno de los objetivos que la componen.
Se utiliza un punto y coma “;” colocado entre los objetivos: X ; Y. La disyunción lógica
también la podemos representar mediante un conjunto de sentencias alternativas, es
decir, poniendo cada miembro de la disyunción en una cláusula aparte.
La negación lógica no puede ser representada explícitamente en Prolog, sino que se
representa implícitamente por la falta de aserción: “no”, tendrá éxito si el objetivo X
fracasa. No es una verdadera negación, en el sentido de la Lógica, sino una negación
“por fallo”. Se representa con el predicado predefinido not o con \+.
La implicación o condicional, sirve para significar que un hecho depende de un grupo
de otros hechos. En español solemos utilizar las palabras “si ... entonces ...”.
En Prolog se usa el símbolo “:-” para representar lo que llamamos una regla:
cabeza_de_la_regla :- cuerpo_de_la_regla.
La cabeza describe el hecho que se intenta definir; el cuerpo describe los objetivos
que deben satisfacerse para que la cabeza sea cierta. Otra forma de verla es como
una implicación lógica “al revés” o “hacia atrás”:
P Q en prolog sería : Q :- P
Ejemplos
Conjunción de predicados
le_gusta_a(clara,jorge), le_gusta_a(clara,chocolate).
Disyunción de predicados
le_gusta_a(clara,jorge); le_gusta_a(jorge,clara).
Negación de predicados
not(le_gusta_a(clara,jorge)).
Condicional: REGLAS
novios(X,Y) :- le_gusta_a(X,Y), le_gusta_a(Y,X).
hermana_de(X,Y) :- mujer(X), es_padre_de(P,X), es_madre_de(M,X), es_padre_de(P,Y),
es_madre_de(M,Y).
es_hijo_de(X,Y) :- es_padre_de(Y,X).
es_hijo_de(X,Y) :- es_madre_de(Y,X).
MATERIAL Y EQUIPO.
METODOLOGÍA.
SUGERENCIAS DIDÁCTICAS.
RESULTADOS
1. Nombre de la práctica.
2. Objetivo.
3. Definiciones.
4. Características de la versión de PROLOG
5. Ventajas y desventajas.
6. Programa de ejemplo.
7. Conclusiones
BIBLIOGRAFÍA
PRÁCTICA 4.3
OBJETIVO.
El alumno conocerá y describirá las clausulas de Horn y resolución SLD, para identificar
reglas de inferencia lógica y emplearlas en la representación del conocimiento.
INTRODUCCIÓN.
CLÁUSULA DE HORN
En programación lógica una cláusula de Horn es una secuencia de literales que contiene
como máximo un literal positivo. Se llama así en honor a Alfred Horn, el primero en
señalar la importancia de estas cláusulas en 1951.
La sintaxis de una cláusula de Horn en PROLOG tiene el siguiente aspecto:
hija (A, B) :- mujer (A), padre (B,A).
que podría leerse así: "A es hija de B si A es mujer y B es padre de A".
Caso particular son las no tienen más que ese literal positivo, que representan
«hechos» , es decir, conocimiento factual.
• Los objetivos determinados (definite goals), o «cláusulas de Horn sin cabeza» son
las que no tienen ningún literal positivo:
EJEMPLO
Representación de un grafo mediante hechos.
arco(a, b) .
arco(a, c) .
arco(b, d) .
arco(c, d) .
arco(c, e) .
arco(d, e) .
La relación de conexión entre nodos (caminos) puede expresarse mediante las reglas:
camino(X,Y ) :- X=Y.
camino(X,Y ) :- arco(X, Z), camino(Z,Y ).
Ahora, se podría plantear un objetivo, entendiendo los hechos y las reglas que hemos
escrito como premisas podríamos plantear una conclusión y tratar de mostrar la validez
de la argumentación.
Los dos primeros son objetivos cerrados porque no contienen variables, mientras que los
restantes son objetivos abiertos.
implícitamente tenemos:
Es decir, las variables que sólo aparecen a la derecha de la cláusula están localmente
afectadas de una cuantificación existencial. Se dice que son variables existenciales o extra
o locales. Interpretarlas existencialmente facilita la lectura de la cláusula: “Para todo X y
todo Y , hay un camino entre X e Y si existe Z tal que hay arco de X a Z y hay camino entre
Z e Y”
MATERIAL Y EQUIPO.
1. Computadora personal.
2. SWI-PROLOG o similar.
3. Material y apuntes vistos en clase.
METODOLOGÍA
Ejercicio.
Considere el árbol genealógico de la figura, y formalice los hechos en PROLOG de la forma:
progenitor(nombre, nombre).
Solución:
progenitor(juan,jose).
progenitor(juan,saul).
progenitor(juan,omar).
progenitor(jose,alan).
progenitor(jose,abel).
progenitor(saul,ciro).
progenitor(alan,luis).
progenitor(ciro,blas).
progenitor(luis,hugo).
M.C. Sergio Garza Carranza 51
Manual de Prácticas de Programación Lógica y Funcional I.T. de Nuevo Laredo
progenitor(luis,raul).
progenitor(blas,rene).
progenitor(hugo,adan).
progenitor(adan,ivan).
padre(X,Y):-progenitor(X,Y).
hijo(X,Y):-padre(Y,X).
abuelo(X,Y):-padre(X,Z),padre(Z,Y).
nieto(X,Y):-abuelo(Y,X).
hermanos(X,Y):-padre(Z,X),padre(Z,Y),not(X=Y).
primos(X,Y):-padre(Z,X),padre(W,Y),hermanos(Z,W).
tio(X,Y):-padre(Z,Y),hermanos(X,Z).
ancestro(X,Y):-padre(X,Y).
ancestro(X,Y):-padre(X,Z),ancestro(Z,Y).
RESULTADOS
1. Nombre de la práctica.
2. Objetivo.
3. Definiciones.
4. Código fuente y ejemplo resuelto
5. Conclusiones
BIBLIOGRAFÍA
PRÁCTICA 4.4
OBJETIVO.
INTRODUCCIÓN.
En esta práctica se abordan los temas 4.7 y 4.8 del programa de estudios. Se busca
reforzar la capacidad de análisis y síntesis del estudiante, el manejo del lenguaje PROLOG,
y el concepto de base de conocimientos, a través de la realización de un programa de
consultas en PROLOG.
PROLOG cuenta con una serie de predicados predefinidos que nos permiten manipular la
Base de Conocimientos consultando, añadiendo, eliminando o modificando cláusulas.
consult(Archivo)
El predicado predefinido consult añade las cláusulas existentes en el archivo de nombre
Archivo a la base de conocimientos de PROLOG, al final de las ya existentes, sin destruir las
anteriores. Como argumento pasamos un átomo con el nombre del archivo del que
queremos leer las cláusulas.
Recordemos que un átomo está formado por letras, dígitos y el carácter subrayado. Si
queremos que contenga otros caracteres (los dos puntos «:» para la unidad, la barra
invertida «\» para el directorio o el punto «.» para la extensión) deberemos encerrarlo
entre comillas simples.
reconsult(Archivo)
El predicado predefinido reconsult actúa como el consult excepto que, de existir cláusulas
para un mismo predicado (nombre y aridad), las nuevas sustituyen a las existentes.
Por defecto, SWI-PROLOG asume la extensión «.pl» y Prolog-2 toma la extensión «.pro».
Pero esto dependerá del sistema PROLOG utilizado y se puede personalizar.
listing(Predicado)
Todas las cláusulas que tienen como predicado el átomo al que está instanciada la
variable Predicado son mostradas por el archivo de salida activo (por defecto la pantalla).
El predicado de aridad 0 listing (sin parámetro) muestra todas las cláusulas de la Base de
Conocimientos.
asserta(Clausula) y assertz(Clausula)
Estos predicados permiten añadir nuevas cláusulas a la base de conocimientos.
El predicado asserta la añade al principio (letra «a») y assertz la añade al final (letra «z»)
de cualquier otra cláusula del mismo tipo que exista en la base de conocimientos.
En todos los casos, Clausula debe estar previamente instanciada a una cláusula. Dicha
cláusula queda incorporada a la base de conocimientos y no se pierde aunque se haga
reevaluación.
retract(Clausula) y retractall(Clausula)
Este predicado nos permite eliminar una cláusula de nuestra base de conocimientos.
abolish(Predicado/Aridad) y abolish(Predicado,Aridad)
Se utiliza para retirar de la Base de Conocimientos todas las cláusulas del predicado
Predicado. Debe estar identificado completamente el predicado: nombre y aridad.
MATERIAL Y EQUIPO.
1. Computadora personal.
2. SWI-PROLOG o similar.
3. Material y apuntes vistos en clase.
METODOLOGÍA
Ejercicio.
Elabore una base de conocimientos en PROLOG que exprese los siguientes hechos:
le_gusta_a(carlos,ana).
le_gusta_a(carlos,futbol).
le_gusta_a(carlos,informática).
le_gusta_a(ana,cine).
le_gusta_a(ana,informática).
Soluciones.
a) ? le_gusta_a(carlos,ana).
True
b) ? le_gusta_a(ana,X).
X=cine <N>
X=informática <N>
False
c) ? le_gusta_a(carlos,ana) , le_gusta_a(ana,carlos).
False
d) ? le_gusta_a(carlos,X) , le_gusta_a(ana,X).
X=informática <N>
False
e) ? le_gusta_a(X,futbol) ; le_gusta_a(X,cine).
X=carlos <N>
X=ana <N>
False
RESULTADOS
1. Nombre de la práctica.
2. Objetivo.
3. Definiciones.
4. Código fuente y ejemplo resuelto
5. Conclusiones
BIBLIOGRAFÍA
PRÁCTICA 4.5
LISTAS EN PROLOG.
OBJETIVO.
INTRODUCCION.
Ejemplos:
1. L= [perro, gato, ratón, queso]
a) cabeza= perro
b) cola= [gato, ratón, queso]
a) cabeza= NO
b) cola= [] lista vacía
En esta sección se verá el uso de las listas para determinar la existencia de un elemento en
la lista e incluso el uso de recursividad.
En primer lugar, la existencia de un elemento en la lista se puede verificar con una regla
como: pertenece (E, L) :- L= [E|_], que dice que el elemento E pertenece a la lista L si L se
puede hacer teniendo una lista cuya cabeza sea E y cualquier cola, incluso la lista vacía.
Pero esto solamente nos asegura la pertenencia de la cabeza de la lista, y no si un
elemento está dentro de ella. Para esto se necesita una segunda cláusula recursiva:
pertenece (E, [_|T] ) :- pertenece (E,T). Es decir “un elemento E pertenece a una lista
compuesta de cualquier cabeza y una cola T, si ese mismo elemento E es la cabeza del
resto de la lista T”.
Así se tiene el siguiente programa en PROLOG que verifica la pertenencia de un elemento
en una lista:
pertenece (E,L) :- L=[E|_].
pertenece( E,[_|T] ) :- pertenece(E,T).
Unión de listas
Si se desea unir las listas [a,b,c] y [d,e,f] para obtener la lista [a,b,c,d,e,f], una manera de
hacerlo es:
agregar([],L,L).
agregar([X|L1],L2,[X|L3]):-agregar(L1,L2,L3).
enesimo(X,1,[X|_]).
MATERIAL Y EQUIPO.
1. Computadora personal.
2. SWI-PROLOG o similar.
3. Material y apuntes vistos en clase.
METODOLOGÍA
Ejercicios.
Ejemplo:
?elimina(b,[a,b,c,d,e],L).
L=[a,c,d,e]
?elimina(f,[a,b,c,d,e],L).
false
Soluciones.
1.
perros(pastor_aleman, [juli, rocky, pancho]).
perros(san_bernardo, [master, beethoven, tosco]).
perros(french_poodle, [figaro, piojo, chicho]).
2.
enesimo(X,1,[X|R]).
enesimo(X,N,[P|R]):-C is N-1, enesimo(X,C,R).
3.
elimina(X,[X|R],R).
elimina(X,[P|R],[P|R2]):- elimina(X,R,R2).
RESULTADOS
1. Nombre de la práctica.
2. Objetivo.
3. Definiciones.
4. Código fuente y ejemplo resuelto
5. Conclusiones
BIBLIOGRAFÍA
PRÁCTICA 4.6
ÁRBOLES EN PROLOG.
OBJETIVO.
INTRODUCCIÓN.
Árboles binarios.
Un árbol binario es un grafo dirigido acíclico, en el cual cada nodo posee como máximo
dos sucesores y un solo predecesor. Se puede representar en PROLOG utilizando un
predicado de tres argumentos de la forma: arbol (Raiz, Arbol_Izq, Arbol_Der).
Raíz
Árbol_Der a
Árbol_Izq
b c
d e f
g h i
arbol (a, arbol (b, arbol (d, #, arbol (g, #, #)), arbol (e, #, #)), arbol (c, #, arbol (f, arbol
(h,#,#), arbol (i,#,#))))
arbolbin(nill).
arbolbin(arbol(R,HI,HD)):-arbolbin(HI),arbolbin(HD).
Ejemplos:
a
?arbolbin(arbol(a, nill,nill)).
>True.
b c
>True.
altura(nill,-1).
altura(arbol(R,HI,HD),A):-altura(HI,AHI),
altura(HD,AHD),
MA is max(AHI,AHD),
A is MA+1.
Ejemplos:
?- altura(arbol(a,nill,nill),A).
>A = 0.
>A = 2.
MATERIAL Y EQUIPO.
1. Computadora personal.
2. SWI-PROLOG o similar.
3. Material y apuntes vistos en clase.
METODOLOGÍA
Ejercicios.
Soluciones.
1. cuantos(arbol(A,nil,nil),1):-!.
cuantos(arbol(A,X,nil),N):-cuantos(X,K),N is 1 + K.
cuantos(arbol(A,nil,X),N):-cuantos(X,K),N is 1 + K.
cuantos(arbol(A,X,Y),N):-cuantos(X,K),cuantos(Y,T), N is 1 + K + T.
2. perteneceA(arbol(_A,_X,_Y),_A):-!.
perteneceA(arbol(_A,X,_Y),B):-perteneceA(X,B),!.
perteneceA(arbol(_A,_X,Y),B):-perteneceA(Y,B),!.
3. cuentaHoja(arbol(_R,nil,nil),1):-!.
cuentaHoja(arbol(_R,Hi,nil),S):-cuentaHoja(Hi,S).
cuentaHoja(arbol(_R,nil,Hd),S):-cuentaHoja(Hd,S).
cuentaHoja(arbol(_R,Hi,Hd),S):-cuentaHoja(Hi,S1),cuentaHoja(Hd,S2),S is S1+S2.
RESULTADOS
1. Nombre de la práctica.
2. Objetivo.
3. Definiciones.
4. Código fuente y ejemplo resuelto
5. Conclusiones
BIBLIOGRAFÍA
PRÁCTICA 4.7
PREDICADOS METALÓGICOS
OBJETIVO.
INTRODUCCIÓN.
Igualdad de términos
M.C. Sergio Garza Carranza 65
Manual de Prácticas de Programación Lógica y Funcional I.T. de Nuevo Laredo
Entrada / Salida
Los sistemas PROLOG poseen predicados predefinidos para la entrada y salida. Los más
comunes son:
read(X) Lee un término y lo unifica con X (el término debe terminar en punto).
write(T) Escribe el término T (en particular, write(‘texto’) para escribir texto).
display(T) Escribe el término T (sin expandir los operadores)
MATERIAL Y EQUIPO.
1. Computadora personal.
2. SWI-PROLOG o similar.
3. Material y apuntes vistos en clase.
METODOLOGÍA
1. Investigar los predicados metalógicos y de manupulación de términos explicados
en clase.
2. Elaborar un programa que utilice algunos de los predicados explicados en clase.
3. Exponer frente al grupo el programa realizado.
RESULTADOS
1. Nombre de la práctica.
2. Objetivo.
3. Definiciones.
4. Código fuente y ejemplo resuelto
5. Conclusiones
BIBLIOGRAFÍA