Вы находитесь на странице: 1из 65

INSTITUTO TECNOLÓGICO DE CIUDAD VALLES

DEPARTAMENTO DE SISTEMAS Y COMPUTACIÓN

INGENIERÍA EN SISTEMAS COMPUTACIONALES

ELABORADO POR

Ingeniero en Sistemas Computacionales


Máster en Tecnologías de la Información
Programación Lógica y Funcional 2015

Contenido

INTRODUCCIÓN ................................................................................................... 1

Datos de la Asignatura ........................................................................................... 2

Nombre de la Asignatura: Programación Lógica y Funcional .............................. 2

Objetivo General del Curso de Programación Lógica y Funcional .......................... 4

Competencias específicas a desarrollar por unidad ............................................ 4

PRÁCTICAS DE LA UNIDAD 1 .............................................................................. 5

Unidad 1. Conceptos Fundamentales ................................................................... 6

Práctica no. 1 ....................................................................................................... 11

Nombre de la práctica: Secuencia de Reducción de Expresiones................... 11

Práctica no. 2 ....................................................................................................... 13

Nombre de la práctica: Técnica Perezosa para evaluar expresiones .............. 13

Práctica no. 3 ....................................................................................................... 15

Nombre de la práctica: Definición de funciones .............................................. 15

Práctica no. 4 ....................................................................................................... 16

Nombre de la práctica: Crear Función............................................................. 16

Práctica no. 5 ....................................................................................................... 17

Nombre de la práctica: Funciones con tipos booleanos .................................. 17

Práctica no. 6 ....................................................................................................... 18

Nombre de la práctica: Funciones con tipo caracter........................................ 18

PRÁCTICAS DE LA UNIDAD 2 ............................................................................ 19

Unidad 2. Programación Funcional ..................................................................... 20

Práctica no. 7 ....................................................................................................... 24

Nombre de la práctica: Factorial ..................................................................... 24

ING. ROSA IMELDA GARCIA CHI, MTI i


Programación Lógica y Funcional 2015
Práctica no. 8 ....................................................................................................... 25

Nombre de la práctica: Número de combinaciones ......................................... 25

Práctica no. 9 ....................................................................................................... 26

Nombre de la práctica: Comprobación de número impar ................................ 26

Práctica no. 10 ..................................................................................................... 28

Nombre de la práctica: Cuadrado ................................................................... 28

Práctica no. 11 ..................................................................................................... 29

Nombre de la práctica: Suma de Cuadrados................................................... 29

Práctica no. 12 ..................................................................................................... 30

Nombre de la práctica: Raíces de ecuaciones de segundo grado ................... 30

Práctica no. 13 ..................................................................................................... 31

Nombre de la práctica: Valor absoluto ............................................................ 31

Práctica no. 14 ..................................................................................................... 32

Nombre de la práctica: Signo .......................................................................... 32

Práctica no. 15 ..................................................................................................... 33

Nombre de la práctica: Conjunción ................................................................. 33

Práctica no. 16 ..................................................................................................... 34

Nombre de la práctica: Anterior de un número natural .................................... 34

PRÁCTICAS DE LA UNIDAD 3 ............................................................................ 35

Unidad 3. Evaluación Perezosa .......................................................................... 36

Práctica no. 17 ..................................................................................................... 37

Nombre de la práctica: Lógica Simbólica o Proposicional ............................... 37

Práctica no. 18 ..................................................................................................... 39

Nombre de la práctica: Simbolización Lógica .................................................. 39

Práctica no. 19 ..................................................................................................... 40

ING. ROSA IMELDA GARCIA CHI, MTI ii


Programación Lógica y Funcional 2015
Nombre de la práctica: Simbolización Lógica .................................................. 40

Práctica no. 20 ..................................................................................................... 41

Nombre de la práctica: Simbolización Lógica .................................................. 41

Práctica no. 21 ..................................................................................................... 42

Nombre de la práctica: Simbolización Lógica .................................................. 42

PRÁCTICAS DE LA UNIDAD 4 ............................................................................ 43

Unidad 4. Fundamentos de la programación lógica. ........................................... 44

Práctica no. 22 ..................................................................................................... 46

Nombre de la práctica: Primer elemento ......................................................... 46

Práctica no. 23 ..................................................................................................... 47

Nombre de la práctica: Resto de una lista ....................................................... 47

Práctica no. 24 ..................................................................................................... 49

Nombre de la práctica: Construcción de listas ................................................ 49

Práctica no. 25 ..................................................................................................... 50

Nombre de la práctica: Relación de pertenencia ............................................. 50

Práctica no. 26 ..................................................................................................... 51

Nombre de la práctica: Palíndromo ................................................................. 51

Práctica no. 27 ..................................................................................................... 52

Nombre de la práctica: Máximo de dos números ............................................ 52

Práctica no. 28 ..................................................................................................... 53

Nombre de la práctica: Factorial ..................................................................... 53

Práctica no. 29 ..................................................................................................... 54

Nombre de la práctica: Sucesion de Fibonacci ............................................... 54

Práctica no. 30 ..................................................................................................... 55

Nombre de la práctica: Construir el Árbol Genealógico ................................... 55

ING. ROSA IMELDA GARCIA CHI, MTI iii


Programación Lógica y Funcional 2015
FORMATO DE REPORTE DE PRÁCTICAS ........................................................ 57

Formato de Reporte de Prácticas......................................................................... 58

Reporte por práctica ........................................................................................ 58

Reporte final de todas las prácticas .................................................................. 59

Bibliografía ........................................................................................................... 60

ING. ROSA IMELDA GARCIA CHI, MTI iv


Programación Lógica y Funcional 2015

INTRODUCCIÓN

La Guía Técnica de Programación Lógica y Funcional integra un conjunto


de prácticas sugeridas correspondientes a las cuatro unidades que integran el
programa. Iniciando la unidad 1 con prácticas relacionadas a los conceptos
fundamentales de la Programación Funcional y el estilo de programación
declarativo. En la unidad 2, se proponen prácticas para resolverse con el
Lenguaje Funcional Haskell. En la unidad 3, se aborta la estrategia de evaluación
perezosa incorporando lenguajes lógicos. La unidad 4 presenta prácticas
relacionadas al Lenguaje Lógico de Programación ProLog.

El objetivo es elaborar un Manual de Prácticas para la asignatura de


Programación Lógica y Funcional de la Carrera de Ingeniería en Sistemas
Computacionales, que proporcione al alumno la habilidad y destreza para conocer
los principios lógicos y funcionales de la programación para identificarlos y
aplicarlos en la resolución de problemas a través del diseño de agentes
inteligentes.

La Guía Técnica presenta una serie de prácticas que cubre cada uno de los
objetivos de las unidades del programa de estudios. Las prácticas son sólo una
sugerencia didáctica para que el docente guie al alumno a aplicar los
conocimientos adquiridos en cada una de las unidades.

Se incorpora al presente Manual formatos para elaborar los reportes de las


prácticas realizadas para que el estudiante integre al final un documento con la
aplicación y resultado de cada una de las prácticas seleccionadas para su
realización. Esta Guía es resultado de un proyecto docente y podrá adquirirse en
el Departamento de Sistemas y Computación, así como en Internet en la siguiente
dirección: www.issuu.com, www.slideshare.net, www.scribd.com,
www.googledocs.com

ING. ROSA IMELDA GARCIA CHI,MTI 1


Programación Lógica y Funcional 2015

Datos de la Asignatura

Nombre de la Asignatura: Programación Lógica y Funcional

Ingeniería en Sistemas Computacionales


Carrera

SCC-1019
Clave de la Asignatura
2–2–4
HT- HP- Créditos SATCA
Unidad 1. Conceptos Fundamentales.
Temario General Unidad 2. Programación Funcional.
Unidad 3. Evaluación perezosa.
Unidad 4. Fundamentos de la programación lógica.

1.1. Estilos de programación.


1.2. Evaluación de expresiones.
Temas Unidad 1 1.3. Definición de funciones.
1.4. Disciplina de tipos.
1.5. Tipos de datos.

2.1. El tipo de datos.


2.2. Funciones.
2.3. Intervalos.
Temas Unidad 2 2.4. Operadores.
2.5. Aplicaciones de las listas.
2.6. Árboles.

3.1. La estrategia de evaluación perezosa.


Temas Unidad 3 3.2. Técnicas de programación funcional
perezosa.

ING. ROSA IMELDA GARCIA CHI,MTI 2


Programación Lógica y Funcional 2015

4.1. Repaso de la lógica de primer orden.


Temas Unidad 4 4.2. Unificación y resolución.
4.3. Cláusulas de Horn. Resolución SLD.
4.4. Programación lógica con cláusulas de Horn.
4.5. Semántica de los programas lógicos.
4.6. Representación cláusulas del conocimiento.
4.7. Consulta de una base de cláusulas
4.8. Espacios de búsqueda.
4.9. Programación lógica con números, listas y
árboles.
4.10. Control de búsqueda en programas lógicos
4.11. Manipulación de términos. Predicados
metalógicos.

ING. ROSA IMELDA GARCIA CHI,MTI 3


Programación Lógica y Funcional 2015

Objetivo General del Curso de Programación Lógica y Funcional


Conocer los principios lógicos y funcionales de la programación para
identificarlos y aplicarlos en la resolución de problemas a través del diseño
de agentes inteligentes.

Competencias específicas a desarrollar por unidad

Competencia Específica de la unidad 1

 Identificar los paradigmas y lenguajes de programación representativa.

Competencia Específica de la unidad 2

 Conocer los principales puntos fuertes y debilidades del paradigma de


programación funcional.

 Identificar los elementos de la programación funcional.

 Aplicar la programación funcional en la resolución de problemas reales.

 Diseñar herramientas alternativas y complementarias de programación.

Competencia Específica de la unidad 3

 Conocer la evaluación perezosa. Identificar la evaluación perezosa como


una de las funciones de la programación representativa.

 Aplicar la evaluación perezosa en la resolución de problemas.

 Diseñar programación con modularidad.

Competencia Específica de la unidad 4


 Conocer las ventajas y desventajas del paradigma de programación lógica.
 Identificar los elementos de la programación lógica.
 Aplicar la programación lógica en la resolución de problemas reales.
 Diseñar sistemas expertos con programación lógica.

ING. ROSA IMELDA GARCIA CHI,MTI 4


Programación Lógica y Funcional 2015

PRÁCTICAS DE LA UNIDAD 1

Tema

ING. ROSA IMELDA GARCIA CHI,MTI 5


Programación Lógica y Funcional 2015

Unidad 1. Conceptos Fundamentales

1.1. Estilos de programación

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. Por ejemplo el estilo del lenguaje
de programación C variará con respecto al del lenguaje BASIC.

El buen estilo, al tratarse de algo subjetivo, es difícil de categorizar concretamente;


con todo, existen un número de características generales. Con el advenimiento de
software que da formato al código fuente de forma automática, el foco en cómo
éste debe de ser escrito debe evolucionar de forma más amplia a la elección de
nombres, lógica y otras técnicas. Desde un punto de vista práctico, el uso de un
computador para dar formato al código fuente ahorra tiempo, y es posible forzar el
uso de estándares a nivel de una compañía completa sin debates religiosos.

1.2. Evaluación de expresiones

Definiciones tomadas de news: comp.lang.functional

Programación Funcional: es un estilo de programación que enfatiza la


evaluación de expresiones, en lugar de la ejecución de comandos. Las
expresiones en estos lenguajes se forman utilizando funciones para combinar
valores básicos.

Lenguaje Funcional: es un lenguaje que soporta e incentiva la programación en


un estilo funcional.

ING. ROSA IMELDA GARCIA CHI,MTI 6


Programación Lógica y Funcional 2015
1.3. Definición de funciones

Cuando escribas un nuevo programa o biblioteca, sigue un estilo consistente de


ubicación de llaves y de indentación. Si no tienes ninguna preferencia personal de
estilo, recomendamos el estilo de programación del núcleo de Linux o el estilo de
programación de GNU.

Lee el nodo de info (Standards)Writing C en la documentación de GNU. Luego,


obtén el código fuente de Linux y lee el archivo linux/Documentation/CodingStyle,
e ignora los chistes de Linus. Estos dos documentos te darán una buena idea de
nuestras recomendaciones para el código de GNOME.

Estilo de indentación

Para el código del núcleo de GNOME preferimos el estilo de indentación del


núcleo de Linux. Usa tabuladores de 8 espacios para la indentación.

Usar tabuladores de 8 espacios para indentación proporciona un número de


beneficios. Permite que el código sea más fácil de leer, ya que la indentación se
marca claramente. También ayuda a mantener el código ordenado forzando a
dividir funciones en trozos más modulares y bien definidos — si la indentación va
más allá del margen derecho, significa que la función está mal diseñada y que
debiera dividirse para hacerla más modular o bien, repensarla.

Los tabuladores de 8 espacios para indentación también ayudan al diseño de


funciones que encajen bien en la pantalla, lo cual significa que las personas
puedan entender el código sin tener que desplazarse atrás y adelante para
entenderlo.

1.4. Disciplina de tipos

En los lenguajes de programación de la familia C se recomienda también evitar el


uso de caracteres tabulador en medio de una línea, ya que diferentes editores de
textos muestran su anchura de forma diferente.

ING. ROSA IMELDA GARCIA CHI,MTI 7


Programación Lógica y Funcional 2015
El lenguaje de programación Python usa indentación para indicar estructuras de
control, por tanto se requiere obligatoriamente una buena indentación. Haciendo
esto, la necesidad de marcar con llaves ({ y }) es eliminada, y la legibilidad es
mejorada sin interferir con los estilos de codificación comunes. Con todo, esto
lleva frecuentemente a problemas donde el código es copiado y pegado dentro de
un programa Python, requiriendo un tedioso reformateado. Adicionalmente, el
código Python se vuelve inusable cuando es publicado en un foro o página web
que elimine el espacio en blanco.

1.5. Tipos de datos

Al igual que cualquier otro lenguaje de programación, se manejan tipos de datos


que determinan la información que se almacena en las variables y el resultado de
las funciones.

Los tipos de datos básicos de un lenguaje funcional son:

Bool (boleano)

El tipo de dato “bool”, es el tipo de dato lógico, es decir, solo almacena dos
posibles valores, cierto y falso

Char (caracter)

Este tipo de dato almacena un solo caracter alfanumérico, es decir del 0 al 9 y de


la A a la Z, al igual que en la mayoría de los lenguajes los valores de tipo caracter
deben encerrase entre comillas sencillas, por ejemplo: ‘a’ ‘9’

String (cadena de caracteres)

Este tipo de dato almacena una secuencia de caracteres, al igual que en otros
lenguajes, los valores para este tipo de dato se deben encerrar entre comillas
dobles, por ejemplo: “pedro” “GATO”

ING. ROSA IMELDA GARCIA CHI,MTI 8


Programación Lógica y Funcional 2015
Int (enteros de precisión fija)

Se usa para manejar números enteros con un valor de 2 elevado a la 32.

Integer (enteros de precisión arbitraria)

Se usa para almacenar números mayores al tipo Int, pero desgraciadamente no


todas las arquitecturas de hardware son capaces de manejarlo.

Float (reales de simple precisión)

Se emplea para manejar valores con decimales, como: 2.5 o 0.0003.

Ahora bien, veamos como incorporar esto a nuestros ejemplos, la definición de


variables en Haskell es un mapeo de tipos entre el tipo de dato entrante y el tipo
de dato del resultado de la función, para esto debemos escribir el nombre de la
función seguida de un doble dos puntos.

calculo ::

Después colocaremos el tipo de los parámetros de la función seguida del signo ->
y después el tipo de dato del resultado de la función.

calculo :: Int->Int

Recuerde que el nombre de cada tipo de dato se coloca con su primera letra en
mayúscula y en la siguiente línea se coloca la definición de la función, en la
siguiente imagen podemos ver varios ejemplos de este tipo de definición

ING. ROSA IMELDA GARCIA CHI,MTI 9


Programación Lógica y Funcional 2015

Figura 1 Ejemplo de Tipos de Datos en Lenguaje Funcional

ING. ROSA IMELDA GARCIA CHI,MTI 10


Programación Lógica y Funcional 2015

Práctica no. 1

Nombre de la práctica: Secuencia de Reducción de Expresiones

Evaluar expresiones a través de las técnicas de


Objetivo
Reducción: Impaciente y Perezosa.

En la programación Funcional se utilizan dos técnicas


Introducción
de reducción de expresiones; esto es para evaluarlas
y llegar a la forma Normal.

Las dos técnicas utilizadas son la Impaciente y


Perezosa.

 Libreta u hojas blancas de papel bond


Material y Equipo
 Lápiz, Sacapuntas y Borrador
 Computadora con Acceso a Internet
 Dispositivo de almacenamiento
 Plataforma Moodle del IT Valles
 Procesador de Textos p.e. Word

1. Considera las funciones cuadrado y max


Metodología estudiadas en el tema 1.1, junto con la definición
cero definida a continuación:

cero :: Int -> Int

cero n = 0

Para cada una de las expresiones siguientes, estudia


las secuencias de reducción correspondientes a las
dos estratégias de evaluación impaciente y perezosa,
respectivamente. Estudia en cada caso si la
secuencia de reducción termina o no en una forma

ING. ROSA IMELDA GARCIA CHI,MTI 11


Programación Lógica y Funcional 2015
normal e indica cual es el valor calculado. (en cada
expresión muestra los pasos del cálculo y escribe si
termina en forma normal)

cuadrado (max 3 5)

cuadrado (max (5*2) (2+3) )

cero infinito

cuadrado infinito

Sugerencia: Subraya el redex que se reduce en cada


Sugerencias
paso. En los pasos que usen ecuaciones con
condiciones, incluye los cálculos necesarios para
evaluar las condiciones.

ING. ROSA IMELDA GARCIA CHI,MTI 12


Programación Lógica y Funcional 2015

Práctica no. 2

Nombre de la práctica: Técnica Perezosa para evaluar expresiones

Aplicar la Técnica de evaluación perezosa para


Objetivo
calcular el valor de las expresiones.

En la teoría de lenguajes de programación, La


Introducción
evaluación perezosa (del inglés lazy evaluation) o
llamada por necesidad es una estrategia de
evaluación que retrasa el cálculo de una expresión
hasta que su valor sea necesario, y que también evita
repetir la evaluación en caso de ser necesaria en
posteriores ocasiones. Esta compartición del cálculo
puede reducir el tiempo de ejecución de ciertas
funciones de forma exponencial, comparado con otros
tipos de evaluación.

Los beneficios de la evaluación perezosa son:

 El incremento en el rendimiento al evitar


cálculos innecesarios, y en tratar condiciones
de error al evaluar expresiones compuestas.
 La capacidad de construir estructuras de datos
potencialmente infinitas.
 La capacidad de definir estructuras de control
como abstracciones, en lugar de operaciones
primitivas.

La evaluación perezosa puede también reducir el


consumo de memoria de una aplicación, ya que los
valores se crean solo cuando se necesitan. Sin

ING. ROSA IMELDA GARCIA CHI,MTI 13


Programación Lógica y Funcional 2015
embargo, es difícil de combinar con las operaciones
típicas de programación imperativa, como el manejo
de excepciones o las operaciones de entrada/salida,
porque el orden de las operaciones puede quedar
indeterminado. Además, la evaluación perezosa
puede conducir a fragmentar la memoria.

 Libreta u hojas blancas de papel bond


Material y Equipo
 Lápiz, Sacapuntas y Borrador
 Computadora con Acceso a Internet
 Dispositivo de almacenamiento
 Plataforma Moodle del IT Valles
 Procesador de Textos p.e. Word

1. La siguiente función booleana devuelve True si


Metodología sus tres parámetros son todos iguales, y False en
caso contrario. Su definición usa la función
predefinida && que escribe en notación infija y
calcula la conjunción de valores booleanos.

tresIguales :: Int-> Int -> Int -> Bool

tresIguales x y z = ( x == y ) && ( y == z )

Usando evaluación perezosa, calcula el valor de las


expresiones siguientes:

tresIguales 3 7 7

tresIguales 4 4 4

tresIguales (max 2 5) 5 (max 4 3)

ING. ROSA IMELDA GARCIA CHI,MTI 14


Programación Lógica y Funcional 2015

Práctica no. 3

Nombre de la práctica: Definición de funciones

Comprobar la incorrección de la definición de una función


Objetivo
calculando su resultado para un caso de prueba bien
elegido

En un lenguaje funcional, un programa consistirá en


Introducción
evaluar una función. Por tanto, se resuelve la evaluación
de funciones en un lenguaje funcional particular: Haskell.

 Libreta u hojas blancas de papel bond


Material y Equipo
 Lápiz, Sacapuntas y Borrador
 Computadora con Acceso a Internet
 Plataforma Moodle del IT Valles
 Procesador de Textos p.e. Word

1. Se desea definir una función tresDiferentes con tres


Metodología argumentos enteros, que calcule el resultado True si
cada uno de sus tres argumentos es diferente de los
otros dos, y el resultado False en caso contrario.

La siguiente definición es incorrecta:


tresDiferentes :: Int -> Int -> Int -> Bool
tresDiferentes x y z = (x /=y) && (y /=z)
2. Comprueba la incorrección de la definición anterior
calculando su resultado para un caso de prueba bien
elegido. Escribe otra definición que te parezca
correcta, y comprueba su corrección en algunos casos
de prueba.
3. Procura elegir casos representativos. (mínimo 3 casos
para la definición que construyas)

ING. ROSA IMELDA GARCIA CHI,MTI 15


Programación Lógica y Funcional 2015

Práctica no. 4

Nombre de la práctica: Crear Función

Definir una función que obtenga el máximo de tres


Objetivo
números.

La definición de funciones es la característica


Introducción
medular de un lenguaje funcional; por tal razón es
importante hacer la relación que existe con la
definición de una ecuación matemática.

 Libreta u hojas blancas de papel bond


Material y Equipo
 Lápiz, Sacapuntas y Borrador
 Computadora con Acceso a Internet
 Dispositivo de almacenamiento
 Plataforma Moodle del IT Valles
 Procesador de Textos p.e. Word

1. Defina una función que calcule como resulta el


Metodología
máximo de sus tres argumentos que serán
números enteros.
2. Llame a la función max3

La signatura de esta función será


Sugerencias
max3 :: Int-> Int-> Int-> Int

ING. ROSA IMELDA GARCIA CHI,MTI 16


Programación Lógica y Funcional 2015

Práctica no. 5

Nombre de la práctica: Funciones con tipos booleanos

Construir definiciones para && y || usando patrones.


Objetivo
Todos los lenguajes de programación utilizan los
Introducción
valores booleanos, que también son llamados valores
lógicos. En los lenguajes funcionales el tipo de los
valores booleanos se llama Bool y contiene dos
valores correspondientes a cierto y falso,
representados por los identificadores True y False.

 Libreta u hojas blancas de papel bond


Material y Equipo
 Lápiz, Sacapuntas y Borrador
 Computadora con Acceso a Internet
 Dispositivo de almacenamiento
 Plataforma Moodle del IT Valles
 Procesador de Textos p.e. Word

1. Construir diferentes definiciones para (&&), (||)


Metodología
usando patrones, de manera que las funciones
resultantes sean:
a) Estrictas con respecto al segundo
parámetro
b) Estrictas con respecto a ambos
parámetros
c) No estrictas con respecto a ambos
parámetros

Usa patrones en las funciones


Sugerencias

ING. ROSA IMELDA GARCIA CHI,MTI 17


Programación Lógica y Funcional 2015

Práctica no. 6

Nombre de la práctica: Funciones con tipo caracter

Definir funciones con tipos de datos carácter.


Objetivo
El tipo de dato carácter en un lenguaje funcional se
Introducción
llama String que es un sinónimo del tipo de las listas
de caracteres, por lo cual todas las funciones de
procesamiento de listas se pueden aplicar a cadenas
de caracteres. El tipo String es ejemplar de las clases
de tipos Eq, Ord, Read y Show.

 Libreta u hojas blancas de papel bond


Material y Equipo
 Lápiz, Sacapuntas y Borrador
 Computadora con Acceso a Internet
 Dispositivo de almacenamiento
 Plataforma Moodle del IT Valles
 Procesador de Textos p.e. Word

1. Define funciones
Metodología
a) isAlpha, isDigit :: Char -> Bool que
reconozcan los caracteres alfabéticos y
los dígitos, respectivamente.

Compara tus definiciones con las que se encuentran


Sugerencias
en el preludio estándar de Haskell.

ING. ROSA IMELDA GARCIA CHI,MTI 18


Programación Lógica y Funcional 2015

PRÁCTICAS DE LA UNIDAD 2

ING. ROSA IMELDA GARCIA CHI,MTI 19


Programación Lógica y Funcional 2015

Unidad 2. Programación Funcional

2.1. Funciones en Haskell

En Haskell, una función es una aplicación que toma uno o más argumentos y
devuelve un valor.

En Haskell, las funciones se definen mediante ecuaciones formadas por el


nombre de la función, los nombres de los argumentos y el cuerpo que especifica
cómo se calcula el valor a partir de los argumentos.

Ejemplo de definición de función en Haskell:

Doble x = x + x

Ejemplo de evaluación:

doble 3
= 3+3 [def. de doble]
= 6 [def. de +]
Evaluaciones de funciones en Haskell

Ejemplo de evaluación anidada impaciente:


doble (doble 3)
= doble (3 + 3) [def. de doble]
= doble 6 [def. de +]
= 6+6 [def. de doble]
= 12 [def. de +]

Ejemplo de evaluación anidada perezosa:


doble (doble 3)
= (doble 3) + (doble 3) [def. de doble]
= (3 +3) + (doble 3) [def. de doble]
= 6 + (doble 3) [def. de +]
= 6 + (3 + 3) [def. de doble]
= 6+6 [def. de +]
= 12 [def. de +]

ING. ROSA IMELDA GARCIA CHI,MTI 20


Programación Lógica y Funcional 2015
2.2. Programación funcional y programación imperativa
La programación funcional es un estilo de programación cuyo método básico de
computación es la aplicación de funciones a sus argumentos.

Un lenguaje de programación funcional es uno que soporta y potencia el estilo


funcional.

La programación imperativa es un estilo de programación en el que los progra-


más están formados por instrucciones que especifican cómo se ha de calcular
el resultado.

Ejemplo de problema para diferenciar los estilos de programación: Sumar los n


primeros números.

Solución mediante programación imperativa

Programa
suma n:
contador
:= O total
:= O
repetir
contador :=
contador + 1 total
:= total + contador
hasta que contador = n

Evaluación de suma 4:

1O

ING. ROSA IMELDA GARCIA CHI,MTI 21


Programación Lógica y Funcional 2015
Solución mediante programación funcional

Programa:

suma n = sum [1..n]

Evaluación de suma 4:
suma 4
= sum [1..4] [def. de suma]
= sum [1, 2, 3, 4] [def. de [..]]
= 1+2+3+4 [def. de sum]
= 1O [def. de +]

2.3. Rasgos característicos de Haskell

 Programas concisos.
 Sistema potente de tipos.
 Listas por comprensión.
 Funciones recursivas.
 Funciones de orden superior.
 Efectos monádicos.
 Evaluación perezosa.
 Razonamiento sobre programas.

2.4. Antecedentes históricos

 1930s: Alonzo Church desarrolla el lambda cálculo (teoría básica de los


lenguajes funcionales).
 1950s: John McCarthy desarrolla el Lisp (lenguaje funcional con
asignaciones).
 1960s: Peter Landin desarrolla ISWIN (lenguaje funcional puro).
 1970s: John Backus desarrolla FP (lenguaje funcional con orden superior).
 1970s: Robin Milner desarrolla ML (lenguaje funcional con tipos
polimórficos e inferencia de tipos).

ING. ROSA IMELDA GARCIA CHI,MTI 22


Programación Lógica y Funcional 2015

 1980s: David Turner desarrolla Miranda (lenguaje funcional perezoso).


 1987: Un comité comienza el desarrollo de Haskell.
 2003: El comité publica el "Haskell Report".

2.5. El sistema GHC

Los programas funcionales pueden evaluarse manualmente (como en el tema


anterior). Los lenguajes funcionales evalúan automáticamente los programas
funcionales. Haskell es un lenguaje funcional.

GHC (Glasgow Haskell Compiler) es el intérprete de Haskell que usaremos en el


curso.

2.6. Aplicación de funciones en matemáticas y en Haskell

Notación para funciones en matemáticas:

En matemáticas, la aplicación de funciones se representa usando paréntesis y la


multiplicación usando yuxtaposición o espacios.

Ejemplo:

f (a, b) + cd representa la suma del valor de f aplicado a a y b mas el


producto de c por d

Notación para funciones en Haskell:

En Haskell, la aplicación de funciones se representa usando espacios y la


multiplicación usando ∗.

Ejemplo:

f a b + c*d representa la suma del valor de f aplicado a a y b mas el producto de c


por d.

ING. ROSA IMELDA GARCIA CHI,MTI 23


Programación Lógica y Funcional 2015

Práctica no. 7

Nombre de la práctica: Factorial

Definir la función factorial tal que factorial n es el


Objetivo
factorial de n.

Para realizar esta práctica en Haskell se pueden


Introducción
utilizar diferentes definiciones como condicionales,
guardas, mediante patrones, restricción de dominio y
mediante plegado.

 Libreta u hojas blancas de papel bond


Material y Equipo
 Lápiz, Sacapuntas y Borrador
 Computadora con Acceso a Internet
 Dispositivo de almacenamiento
 Plataforma Moodle del IT Valles
 Procesador de Textos p.e. Word

1. Escriba en un editor la función correspondiente


Metodología
a la práctica.
2. Utilice la notación de Haskell (notación de
funciones)
3. Guarde el programa con formato .txt y luego
guarde el programa con formato .hs
4. Abra el intérprete de Haskell
5. Cargue el programa .hs en el prelude de
Haskell
6. Ejecute el programa
7. Verifique resultado

ING. ROSA IMELDA GARCIA CHI,MTI 24


Programación Lógica y Funcional 2015

Práctica no. 8

Nombre de la práctica: Número de combinaciones

Definir la función comb tal que comb n k es el


Objetivo
número de combinaciones de n elementos tomados
de k en k; es decir:

( )
( )

Realizar un programa en Haskell consiste en elaborar


Introducción
la función correspondiente y llevarla al prelude de
Haskell.

 Libreta u hojas blancas de papel bond


Material y Equipo
 Computadora con Acceso a Internet
 Dispositivo de almacenamiento
 Plataforma Moodle del IT Valles
 Procesador de Textos p.e. Word

1. Escriba en un editor la función correspondiente


Metodología
a la práctica.
2. Utilice la notación de Haskell (notación de
funciones)
3. Guarde el programa con formato .txt y luego
guarde el programa con formato .hs
4. Abra el intérprete de Haskell
5. Cargue el programa .hs en el prelude de
Haskell
6. Ejecute el programa
Verifique resultado

ING. ROSA IMELDA GARCIA CHI,MTI 25


Programación Lógica y Funcional 2015

Práctica no. 9

Nombre de la práctica: Comprobación de número impar

Definir la función impar tal que impar x se erifica si


Objetivo
el número x es impar. Por ejemplo:

impar 7  True

impar 6  False

Realizar un programa en Haskell consiste en elaborar


Introducción
la función correspondiente y llevarla al prelude de
Haskell.

 Libreta u hojas blancas de papel bond


Material y Equipo
 Lápiz, Sacapuntas y Borrador
 Computadora con Acceso a Internet
 Dispositivo de almacenamiento
 Plataforma Moodle del IT Valles
 Procesador de Textos p.e. Word

1. Escriba en un editor la función correspondiente


Metodología
a la práctica.
2. Utilice la notación de Haskell (notación de
funciones)
3. Guarde el programa con formato .txt y luego
guarde el programa con formato .hs
4. Abra el intérprete de Haskell
5. Cargue el programa .hs en el prelude de
Haskell
6. Ejecute el programa

ING. ROSA IMELDA GARCIA CHI,MTI 26


Programación Lógica y Funcional 2015
7. Verifique resultado

Como sugerencia puede utilizar:


Sugerencias
 Predefinida odd
 Predefinidas not y even
 Predefinidas not, even y (.)
 Recursión
 Definiciones equivalentes

ING. ROSA IMELDA GARCIA CHI,MTI 27


Programación Lógica y Funcional 2015

Práctica no. 10

Nombre de la práctica: Cuadrado

Definir la función cuadrado tal que cuadrado x es el


Objetivo
cuadrado del número x. Por ejemplo: cuadrado 39.

Para realizar una función en Haskell se pueden


Introducción
abordar distintos formas de representar la función, por
ejemplo mediante (*), mediante (~), mediante
secciones o con una función predefinida
anteriormente.

 Libreta u hojas blancas de papel bond


Material y Equipo
 Lápiz, Sacapuntas y Borrador
 Computadora con Acceso a Internet
 Dispositivo de almacenamiento
 Plataforma Moodle del IT Valles
 Procesador de Textos p.e. Word

1. Escriba en un editor la función correspondiente


Metodología
a la práctica.
2. Utilice la notación de Haskell (notación de
funciones)
3. Guarde el programa con formato .txt y luego
guarde el programa con formato .hs
4. Abra el intérprete de Haskell
5. Cargue el programa .hs en el prelude de
Haskell
6. Ejecute el programa
7. Verifique resultado

ING. ROSA IMELDA GARCIA CHI,MTI 28


Programación Lógica y Funcional 2015

Práctica no. 11

Nombre de la práctica: Suma de Cuadrados

Definir la función suma_de_cuadrados tal que


Objetivo
suma_de_cuadrados 1 es la suma de los cuadrados
de los elementos de la lista 1. Por ejemplo:

suma_de_cuadrados [1,2,3] 14

Para esta función en Haskell se puede recurrir a las


Introducción
funciones básicas de sum, map y cuadrado. Otra
opción es con sum y listas intensionales; con sum,
map y lamda o por recursión.

 Libreta u hojas blancas de papel bond


Material y Equipo
 Computadora con Acceso a Internet
 Dispositivo de almacenamiento
 Plataforma Moodle del IT Valles
 Procesador de Textos p.e. Word o notas

1. Escriba en un editor la función correspondiente


Metodología
a la práctica.
2. Utilice la notación de Haskell (notación de
funciones)
3. Guarde el programa con formato .txt y luego
guarde el programa con formato .hs
4. Abra el intérprete de Haskell
5. Cargue el programa .hs en el prelude de
Haskell
6. Ejecute el programa
7. Verifique resultado

ING. ROSA IMELDA GARCIA CHI,MTI 29


Programación Lógica y Funcional 2015

Práctica no. 12

Nombre de la práctica: Raíces de ecuaciones de segundo grado

Definir la función raíces tal que raíces a b c es la


Objetivo
lista de las raíces de la ecuación ax2+bc+c=0

En Haskell es importante buscar una función que


Introducción
tenga legibilidad y eficiencia. Para lograr esto se
puede definir la función de manera directa o utilizando
entornos locales como el where.

 Libreta u hojas blancas de papel bond


Material y Equipo
 Lápiz, Sacapuntas y Borrador
 Computadora con Acceso a Internet
 Dispositivo de almacenamiento
 Plataforma Moodle del IT Valles
 Procesador de Textos p.e. Word

1. Escriba en un editor la función correspondiente


Metodología
a la práctica.
2. Utilice la notación de Haskell (notación de
funciones)
3. Guarde el programa con formato .txt y luego
guarde el programa con formato .hs
4. Abra el intérprete de Haskell
5. Cargue el programa .hs en el prelude de
Haskell
6. Ejecute el programa
7. Verifique resultado

ING. ROSA IMELDA GARCIA CHI,MTI 30


Programación Lógica y Funcional 2015

Práctica no. 13

Nombre de la práctica: Valor absoluto

Redefinir la función abs tal que abs x es el valor


Objetivo
absoluto de x. por ejemplo: abs (-3)3 abs(3)3

Las funciones de Haskell que se redefinen pueden


Introducción
optar por utilizar condiciones, guardas o
equivalencias.

 Libreta u hojas blancas de papel bond


Material y Equipo
 Computadora con Acceso a Internet
 Dispositivo de almacenamiento
 Plataforma Moodle del IT Valles
 Procesador de Textos p.e. Word

1. Escriba en un editor la función correspondiente


Metodología
a la práctica.
2. Utilice la notación de Haskell (notación de
funciones)
3. Guarde el programa con formato .txt y luego
guarde el programa con formato .hs
4. Abra el intérprete de Haskell
5. Cargue el programa .hs en el prelude de
Haskell
6. Ejecute el programa
7. Verifique resultado

Si es con condicionales: n_abs_1 :: (Num a, Ord a)


Sugerencias
=> a -> a

ING. ROSA IMELDA GARCIA CHI,MTI 31


Programación Lógica y Funcional 2015

Práctica no. 14

Nombre de la práctica: Signo

Redefinir la función signum tal que signum x es -1 si


Objetivo x es negativo, 0 si x es cero y 1 si x es positivo. Por
ejemplo:

Signum 7  1

Signum 0  0

Signum (-4)  -1

Para realizar esta función se deben considerar los


Introducción
operadores relacionales, otra opción es el otherwise.

 Libreta u hojas blancas de papel bond


Material y Equipo
 Computadora con Acceso a Internet
 Dispositivo de almacenamiento
 Plataforma Moodle del IT Valles
 Procesador de Textos p.e. Word

1. Escriba en un editor la función correspondiente


Metodología
a la práctica.
2. Utilice la notación de Haskell (notación de
funciones)
3. Guarde el programa con formato .txt y luego
guarde el programa con formato .hs
4. Abra el intérprete de Haskell
5. Cargue el programa .hs en el prelude de
Haskell
6. Ejecute el programa
7. Verifique resultado

ING. ROSA IMELDA GARCIA CHI,MTI 32


Programación Lógica y Funcional 2015

Práctica no. 15

Nombre de la práctica: Conjunción

Redefinir la función && tal que x && y es la


Objetivo
conjunción de x e y. Por ejemplo True &&
FalseFalse

Para este tipo de funciones utilice las definiciones


Introducción
equivalentes. Verifique en el prelude de Haskell esta
equivalencia.

 Libreta u hojas blancas de papel bond


Material y Equipo
 Lápiz, Sacapuntas y Borrador
 Computadora con Acceso a Internet
 Dispositivo de almacenamiento
 Plataforma Moodle del IT Valles
 Procesador de Textos p.e. Word

1. Escriba en un editor la función correspondiente


Metodología
a la práctica.
2. Utilice la notación de Haskell (notación de
funciones)
3. Guarde el programa con formato .txt y luego
guarde el programa con formato .hs
4. Abra el intérprete de Haskell
5. Cargue el programa .hs en el prelude de
Haskell
6. Ejecute el programa
7. Verifique resultado

ING. ROSA IMELDA GARCIA CHI,MTI 33


Programación Lógica y Funcional 2015

Práctica no. 16

Nombre de la práctica: Anterior de un número natural

Redefinir la función anterior tal que anterior x es el


Objetivo
anterior del número natural x. Por ejemplo:
anterior 32

Las funciones en Haskell pueden utilizar funciones


Introducción
equivalentes y tener como referencia las funciones
booleanas.

 Libreta u hojas blancas de papel bond


Material y Equipo
 Lápiz, Sacapuntas y Borrador
 Computadora con Acceso a Internet
 Dispositivo de almacenamiento
 Plataforma Moodle del IT Valles
 Procesador de Textos p.e. Word

1. Escriba en un editor la función correspondiente


Metodología
a la práctica.
2. Utilice la notación de Haskell (notación de
funciones)
3. Guarde el programa con formato .txt y luego
guarde el programa con formato .hs
4. Abra el intérprete de Haskell
5. Cargue el programa .hs en el prelude de
Haskell
6. Ejecute el programa
7. Verifique resultado

ING. ROSA IMELDA GARCIA CHI,MTI 34


Programación Lógica y Funcional 2015

PRÁCTICAS DE LA UNIDAD 3

ING. ROSA IMELDA GARCIA CHI,MTI 35


Programación Lógica y Funcional 2015

Unidad 3. Evaluación Perezosa

En la teoría de lenguajes de programación, La evaluación perezosa (del inglés


lazy evaluation) o llamada por necesidad es una estrategia de evaluación que
retrasa el cálculo de una expresión hasta que su valor sea necesario, y que
también evita repetir la evaluación en caso de ser necesaria en posteriores
ocasiones. Esta compartición del cálculo puede reducir el tiempo de ejecución de
ciertas funciones de forma exponencial, comparado con otros tipos de evaluación.

Los beneficios de la evaluación perezosa son:

 El incremento en el rendimiento al evitar cálculos innecesarios, y en tratar


condiciones de error al evaluar expresiones compuestas.
 La capacidad de construir estructuras de datos potencialmente infinitas.
 La capacidad de definir estructuras de control como abstracciones, en lugar
de operaciones primitivas.

La evaluación perezosa puede también reducir el consumo de memoria de una


aplicación, ya que los valores se crean solo cuando se necesitan. Sin embargo, es
difícil de combinar con las operaciones típicas de programación imperativa, como
el manejo de excepciones o las operaciones de entrada/salida, porque el orden de
las operaciones puede quedar indeterminado. Además, la evaluación perezosa
puede conducir a fragmentar la memoria.

Lo contrario de la evaluación perezosa sería la evaluación acaparadora, o


evaluación estricta, que es el modo de evaluación por defecto en la mayoría de los
lenguajes de programación.

ING. ROSA IMELDA GARCIA CHI,MTI 36


Programación Lógica y Funcional 2015

Práctica no. 17

Nombre de la práctica: Lógica Simbólica o Proposicional

Determinar qué tipo de proposiciones: atómica o


Objetivo
moleculares. Si son Moleculares que tipo de conector
utiliza.

La lógica es la que determina si un razonamiento es


Introducción
válido o no.

Algunos precursores de la lógica pudieron verificar


que esta ciencia casi expresada en su totalidad en
palabras no hacía posible una fácil aplicación sobre
temas matemáticos cuyo procedimiento y desarrollo
se quería comprobar, por lo que se introdujo símbolos
que representan las definiciones y reglas dadas por la
lógica, creándose por consiguiente la lógica simbólica,
llamada lógica matemática

 Libreta u hojas blancas de papel bond


Material y Equipo
 Lápiz, Sacapuntas y Borrador
 Computadora con Acceso a Internet
 Dispositivo de almacenamiento
 Plataforma Moodle del IT Valles
 Procesador de Textos p.e. Word

1. Identifique la proposición
Metodología
2. Identifique quien es p, q, r
3. Coloque una A si es una proposición atómica
4. Coloque una M si es una proposición Molecular
e indique el conector: M(y) M(o) M(si,entonces)

ING. ROSA IMELDA GARCIA CHI,MTI 37


Programación Lógica y Funcional 2015
M(si y solo si)

Utilice las siguientes proposiciones para resolver la


Sugerencias
práctica:

1. (Juán está aquí) y (María ha salido).

2. Si (x+1=10) entonces (x=9).

3. O (María no está aquí) o (Juan se ha ido)

4. Si (x= 1) o (y=2) entonces (z=3).

5. Si (x!=1) y (x+y=2) entonces (y=2).

6. Si (Pedro está en casa) o (Juan está en el patio),


entonces (José es inocente).

7. (y=O) y (x=O).

8. O (y=O) y (x!=O) o (z=2).

9. No ocurre que (6=7).

10. No ocurre que si (x+O= 10) entonces (x=5).

ING. ROSA IMELDA GARCIA CHI,MTI 38


Programación Lógica y Funcional 2015

Práctica no. 18

Nombre de la práctica: Simbolización Lógica

Determinar con lógica proposicional la simbolización


Objetivo
de las proposiciones.

La lógica matemática usa lenguajes formales


Introducción
definidos artificialmente para formular enunciados
acerca del mundo al que se refieran en un momento
dado nuestros razonamientos, es por ello que en la
actualidad también se la conoce como la lógica formal
o matemática.

 Libreta u hojas blancas de papel bond


Material y Equipo
 Lápiz, Sacapuntas y Borrador
 Computadora con Acceso a Internet
 Dispositivo de almacenamiento
 Plataforma Moodle del IT Valles
 Procesador de Textos p.e. Word

1. Identifique la proposición
Metodología
2. Simbolizar los razonamientos y demostrar que
la inferencia es válida deduciendo las
conclusiones.

Utilice las siguientes proposiciones:


Sugerencias
Todos los números positivos son mayores que cero.
Tres es un número positivo.
Tres es igual a dos más uno.
Por tanto, dos más uno es mayor que cero.

ING. ROSA IMELDA GARCIA CHI,MTI 39


Programación Lógica y Funcional 2015

Práctica no. 19

Nombre de la práctica: Simbolización Lógica

Determinar con lógica proposicional la simbolización


Objetivo
de las proposiciones.

La lógica matemática usa lenguajes formales


Introducción
definidos artificialmente para formular enunciados
acerca del mundo al que se refieran en un momento
dado nuestros razonamientos, es por ello que en la
actualidad también se la conoce como la lógica formal
o matemática.

 Libreta u hojas blancas de papel bond


Material y Equipo
 Lápiz, Sacapuntas y Borrador
 Computadora con Acceso a Internet
 Dispositivo de almacenamiento
 Plataforma Moodle del IT Valles
 Procesador de Textos p.e. Word

3. Identifique la proposición
Metodología
4. Simbolizar los razonamientos y demostrar que
la inferencia es válida deduciendo las
conclusiones.

Utilice las siguientes proposiciones:


Sugerencias
Todos los miembros del comité viven en esta ciudad.
El presidente de la sociedad es un miembro del
comité.
La Srta. López es la presidente de la sociedad.
Por tanto, la Srta. López vive en esta ciudad.

ING. ROSA IMELDA GARCIA CHI,MTI 40


Programación Lógica y Funcional 2015

Práctica no. 20

Nombre de la práctica: Simbolización Lógica

Determinar con lógica proposicional la simbolización


Objetivo
de las proposiciones.

La lógica matemática usa lenguajes formales


Introducción
definidos artificialmente para formular enunciados
acerca del mundo al que se refieran en un momento
dado nuestros razonamientos, es por ello que en la
actualidad también se la conoce como la lógica formal
o matemática.

 Libreta u hojas blancas de papel bond


Material y Equipo
 Lápiz, Sacapuntas y Borrador
 Computadora con Acceso a Internet
 Dispositivo de almacenamiento
 Plataforma Moodle del IT Valles
 Procesador de Textos p.e. Word

5. Identifique la proposición
Metodología
6. Simbolizar los razonamientos y demostrar que
la inferencia es válida deduciendo las
conclusiones.
Utilice las siguientes proposiciones:
Sugerencias
Eduardo podía haber visto el coche del asesino.
Ramsey fue el primer testigo de la defensa.
O Eduardo estaba en la fiesta o Ramsey dio
testimonio falso.
En efecto, nadie en la fiesta pudo haber visto el coche
del asesino.
Por tanto, el primer testigo de la defensa dio
testimonio falso.
ING. ROSA IMELDA GARCIA CHI,MTI 41
Programación Lógica y Funcional 2015

Práctica no. 21

Nombre de la práctica: Simbolización Lógica

Determinar con lógica proposicional la simbolización


Objetivo
de las proposiciones.

La lógica matemática usa lenguajes formales


Introducción
definidos artificialmente para formular enunciados
acerca del mundo al que se refieran en un momento
dado nuestros razonamientos, es por ello que en la
actualidad también se la conoce como la lógica formal
o matemática.

 Libreta u hojas blancas de papel bond


Material y Equipo
 Computadora con Acceso a Internet
 Dispositivo de almacenamiento
 Plataforma Moodle del IT Valles
 Procesador de Textos p.e. Word

7. Identifique la proposición
Metodología
8. Simbolizar los razonamientos y demostrar que
la inferencia es válida deduciendo las
conclusiones.

Utilice las siguientes proposiciones:


Sugerencias
Samuel Clemens era capitán de barco fluvial.
Ningún capitán de barco fluvial ignora ninguna señal
de peligro.
Mark Twain escribi6 sobre las cosas que él no
ignoraba.
Mark Twain era Samuel Clemens.
Por tanto, si las luces en los puentes son señales de
peligro, entonoces Mark Twain escribió sobre ellas.

ING. ROSA IMELDA GARCIA CHI,MTI 42


Programación Lógica y Funcional 2015

PRÁCTICAS DE LA UNIDAD 4

ING. ROSA IMELDA GARCIA CHI,MTI 43


Programación Lógica y Funcional 2015

Unidad 4. Fundamentos de la programación lógica.

PROLOG es un lenguaje de programación declarativo. Los lenguajes declarativos


se diferencian de los lenguajes imperativos o procedurales en que están basados
en formalismos abstractos (PROLOG está basado en la lógica de predicados de
primer orden y LISP, otro lenguaje de programación declarativa, en lambda
calculo), y por tanto su semántica no depende de la máquina en la que se
ejecutan. Las sentencias en estos lenguajes se entienden sin necesidad de hacer
referencia al nivel máquina para explicar los efectos colaterales. Por tanto, un
programa escrito en un lenguaje declarativo puede usarse como una
especificación o una descripción formal de un problema. Otra ventaja de los
programas escritos en lenguajes declarativos es que se pueden desarrollar y
comprobar poco a poco, y pueden ser sintetizados o transformados
sistemáticamente.

PROLOG es un lenguaje de programación muy útil para resolver problemas que


implican objetos y relaciones entre objetos. Está basado en los siguientes
mecanismos básicos:

 Unificación
 Estructuras de datos basadas en árboles
 Backtracking automático

La sintaxis del lenguaje consiste en lo siguiente:

 Declarar hechos sobre objetos y sus relaciones


 Hacer preguntas sobre objetos y sus relaciones
 Definir reglas sobre objetos y sus relaciones

ING. ROSA IMELDA GARCIA CHI,MTI 44


Programación Lógica y Funcional 2015
Significado declarativo y procedural de los programas

En un lenguaje declarativo puro, sería de esperar que el orden en el que aparecen


los hechos y las reglas en la base fuera independiente de los datos, sin embargo
en PROLOG no es así.

El significado declarativo tiene que ver sólo con las relaciones definidas por el
programa. De esta manera, el significado declarativo determina cuál será la salida
del programa. Por otro lado, el significado procedural determina cómo se ha
obtenido esta salida; es decir, como evalúa las relaciones PROLOG.

Si tenemos un conjunto de hechos y reglas con el mismo nombre de relación y la


misma aridad, puede ser conveniente que los hechos estén situados en la base de
datos antes que las reglas, (sobre todo, si los hechos son excepciones de las
reglas).

Además también suele ser aconsejable poner la regla para salirse de la


recursividad antes que la regla recursiva.

La habilidad de PROLOG para calcular de forma procedural es una de las


ventajas específicas que tiene el lenguaje. Como consecuencia esto anima al
programador a considerar el significado declarativo de los programas de forma
relativamente independiente de su significado procedural.

Es decir, las ventajas de la forma declarativa de este lenguaje son claras (es más
fácil pensar las soluciones y muchos detalles procedurales son resueltos
automáticamente por el propio lenguaje) y podemos aprovecharlas.

Los aspectos declarativos de los programas son, habitualmente, más fáciles de


entender que los procedurales. Esta es la principal razón por la que el
programador debe concentrarse en el significado declarativo y evitar distraerse por
los detalles de cómo se ejecutan los programas.

ING. ROSA IMELDA GARCIA CHI,MTI 45


Programación Lógica y Funcional 2015

Práctica no. 22

Nombre de la práctica: Primer elemento

Definir la relación primero (?L, ?X) que se verifique si


Objetivo
X es el primer elemento de la lista L.

Para definir programas en ProLog es necesario


Introducción
identificar y escribir los hechos, luego las reglas. En
Prolog existen símbolos como las constantes, las
relaciones binarias y las variables.

En el SWI Prolog se realizan las consultas de los


hechos y reglas definidas. Se puede elaborar un árbol
de deducción para conocer la unificación, el cálculo de
respuestas o las respuestas múltiples.

 Libreta u hojas blancas de papel bond


Material y Equipo
 Lápiz, Sacapuntas y Borrador
 Computadora con Acceso a Internet
 Dispositivo de almacenamiento
 Plataforma Moodle del IT Valles
 Procesador de Textos p.e. Word

1. Declarar hechos sobre objetos y sus relaciones


Metodología
2. Hacer preguntas sobre objetos y sus relaciones
3. Definir reglas sobre objetos y sus relaciones
4. Escribir en un editor de texto los programas
5. Grabarlos con extensión .pl
6. Usar SWI-PROLOG y compilar el programa .pl
7. Realizar las consultas

ING. ROSA IMELDA GARCIA CHI,MTI 46


Programación Lógica y Funcional 2015

Práctica no. 23

Nombre de la práctica: Resto de una lista

Definir la relación resto (?L1, ?L2) que se verifique si


Objetivo
L2 es la lista obtenida a partir de la lista L1
suprimiendo el primer elemento. Por ejemplo,

?resto([a,b,c])
L=[b,c]
Para definir programas en ProLog es necesario
Introducción
identificar y escribir los hechos, luego las reglas. En
Prolog existen símbolos como las constantes, las
relaciones binarias y las variables.

En el SWI Prolog se realizan las consultas de los


hechos y reglas definidas. Se puede elaborar un árbol
de deducción para conocer la unificación, el cálculo de
respuestas o las respuestas múltiples.

 Libreta u hojas blancas de papel bond


Material y Equipo
 Lápiz, Sacapuntas y Borrador
 Computadora con Acceso a Internet
 Dispositivo de almacenamiento
 Plataforma Moodle del IT Valles
 Procesador de Textos p.e. Word

1. Declarar hechos sobre objetos y sus relaciones


Metodología
2. Hacer preguntas sobre objetos y sus relaciones
3. Definir reglas sobre objetos y sus relaciones
4. Escribir en un editor de texto los programas
5. Grabarlos con extensión .pl

ING. ROSA IMELDA GARCIA CHI,MTI 47


Programación Lógica y Funcional 2015
6. Usar SWI-PROLOG y compilar el programa .pl
7. Realizar las consultas

Una posible definición de resto es:


Sugerencias
resto([a|L],{b,c]).

resto ([ _ |L], L).

ING. ROSA IMELDA GARCIA CHI,MTI 48


Programación Lógica y Funcional 2015

Práctica no. 24

Nombre de la práctica: Construcción de listas

Definir la relación cons(?X, ?L1, ?L2) que se


Objetivo
verifique si es la lista obtenida añadiéndole X a L1
como primer elemento.

Para definir programas en ProLog es necesario


Introducción
identificar y escribir los hechos, luego las reglas. En
Prolog existen símbolos como las constantes, las
relaciones binarias y las variables.

En el SWI Prolog se realizan las consultas de los


hechos y reglas definidas. Se puede elaborar un árbol
de deducción para conocer la unificación, el cálculo de
respuestas o las respuestas múltiples.

 Libreta u hojas blancas de papel bond


Material y Equipo
 Computadora con Acceso a Internet
 Dispositivo de almacenamiento
 Plataforma Moodle del IT Valles
 Procesador de Textos p.e. Word

1. Declarar hechos sobre objetos y sus relaciones


Metodología
2. Hacer preguntas sobre objetos y sus relaciones
3. Definir reglas sobre objetos y sus relaciones
4. Escribir en un editor de texto los programas
5. Grabarlos con extensión .pl
6. Usar SWI-PROLOG y compilar el programa .pl

Realizar las consultas

ING. ROSA IMELDA GARCIA CHI,MTI 49


Programación Lógica y Funcional 2015

Práctica no. 25

Nombre de la práctica: Relación de pertenencia

Definir la relación pertenece(?X, ?L) que se verifique


Objetivo
si X es un elemento de la lista L.

Para definir programas en ProLog es necesario


Introducción
identificar y escribir los hechos, luego las reglas. En
Prolog existen símbolos como las constantes, las
relaciones binarias y las variables.

En el SWI Prolog se realizan las consultas de los


hechos y reglas definidas. Se puede elaborar un árbol
de deducción para conocer la unificación, el cálculo de
respuestas o las respuestas múltiples.

 Libreta u hojas blancas de papel bond


Material y Equipo
 Computadora con Acceso a Internet
 Plataforma Moodle del IT Valles
 Procesador de Textos p.e. Word

1. Declarar hechos sobre objetos y sus relaciones


Metodología
2. Hacer preguntas sobre objetos y sus relaciones
3. Definir reglas sobre objetos y sus relaciones
4. Escribir en un editor de texto los programas
5. Grabarlos con extensión .pl
6. Usar SWI-PROLOG y compilar el programa .pl
7. Realizar las consultas

Utilizar el SWI Prolog y responder: ¿es un elemento


Sugerencias
de [a, b,c]? ¿Cuáles son los elementos? ¿comunes?

ING. ROSA IMELDA GARCIA CHI,MTI 50


Programación Lógica y Funcional 2015

Práctica no. 26

Nombre de la práctica: Palíndromo

Definir la relación palíndromo (+L) que se verifique si


Objetivo
la lista L es un palíndromo. Por ejemplo, palíndromo
([o, s, o])

Un palíndromo es una palabra que se lee igual en los


Introducción
dos sentidos, por ejemplo “oso”.

 Libreta u hojas blancas de papel bond


Material y Equipo
 Lápiz, Sacapuntas y Borrador
 Computadora con Acceso a Internet
 Dispositivo de almacenamiento
 Plataforma Moodle del IT Valles
 Procesador de Textos p.e. Word

1. Declarar hechos sobre objetos y sus relaciones


Metodología
2. Hacer preguntas sobre objetos y sus relaciones
3. Definir reglas sobre objetos y sus relaciones
4. Escribir en un editor de texto los programas
5. Grabarlos con extensión .pl
6. Usar SWI-PROLOG y compilar el programa .pl
7. Realizar las consultas

Puede utilizar la siguiente definición:


Sugerencias
Palíndromo(L) :- reverse(L,L).

ING. ROSA IMELDA GARCIA CHI,MTI 51


Programación Lógica y Funcional 2015

Práctica no. 27

Nombre de la práctica: Máximo de dos números

Definir la relación máximo(+X, +Y, ?Z) que se


Objetivo
verifique si Z es el máximo de X e Y .

En Prolog está definida la función max(X,Y) que


Introducción
devuelve el máximo de X e Y. Puede hacer referencia
a esta función.

 Libreta u hojas blancas de papel bond


Material y Equipo
 Lápiz, Sacapuntas y Borrador
 Computadora con Acceso a Internet
 Dispositivo de almacenamiento
 Plataforma Moodle del IT Valles
 Procesador de Textos p.e. Word

1. Declarar hechos sobre objetos y sus relaciones


Metodología
2. Hacer preguntas sobre objetos y sus relaciones
3. Definir reglas sobre objetos y sus relaciones
4. Escribir en un editor de texto los programas
5. Grabarlos con extensión .pl
6. Usar SWI-PROLOG y compilar el programa .pl
7. Realizar las consultas

Defina su propia función para esta práctica en Prolog


Sugerencias

ING. ROSA IMELDA GARCIA CHI,MTI 52


Programación Lógica y Funcional 2015

Práctica no. 28

Nombre de la práctica: Factorial

Definir la relación factorial(+X, ?Y) que se verifique si


Objetivo
Y es el factorial de X .

La definición de factorial está dada por una recursión,


Introducción
la cual hay que considerar para realizar esta práctica.

 Libreta u hojas blancas de papel bond


Material y Equipo
 Lápiz, Sacapuntas y Borrador
 Computadora con Acceso a Internet
 Dispositivo de almacenamiento
 Plataforma Moodle del IT Valles
 Procesador de Textos p.e. Word

1. Declarar hechos sobre objetos y sus relaciones


Metodología
2. Hacer preguntas sobre objetos y sus relaciones
3. Definir reglas sobre objetos y sus relaciones
4. Escribir en un editor de texto los programas
5. Grabarlos con extensión .pl
6. Usar SWI-PROLOG y compilar el programa .pl
7. Realizar las consultas

Puede empezar utilizando la función:


Sugerencias
Factorial(1,1).

Factorial (X;Y):- x>1, factorial (X1,Y1), Y is X*Y1.

ING. ROSA IMELDA GARCIA CHI,MTI 53


Programación Lógica y Funcional 2015

Práctica no. 29

Nombre de la práctica: Sucesion de Fibonacci

Definir la relación Fibonacci(+N,-X) que se verifique


Objetivo
si X es el N–ésimo término de la sucesión de
Fibonacci.

La sucesión de Fibonacci es 0,1,1,2,3,5,8,13,21,. . . n


Introducción
la que cada término, salvo los dos primeros, es la
suma de los dos anteriores.

 Libreta u hojas blancas de papel bond


Material y Equipo
 Lápiz, Sacapuntas y Borrador
 Computadora con Acceso a Internet
 Dispositivo de almacenamiento
 Plataforma Moodle del IT Valles
 Procesador de Textos p.e. Word

1. Declarar hechos sobre objetos y sus relaciones


Metodología
2. Hacer preguntas sobre objetos y sus relaciones
3. Definir reglas sobre objetos y sus relaciones
4. Escribir en un editor de texto los programas
5. Grabarlos con extensión .pl
6. Usar SWI-PROLOG y compilar el programa .pl
7. Realizar las consultas

Se recomienda el uso de inducción en N para


Sugerencias
resolver esta práctica.

ING. ROSA IMELDA GARCIA CHI,MTI 54


Programación Lógica y Funcional 2015

Práctica no. 30

Nombre de la práctica: Construir el Árbol Genealógico

Construir con prolog el árbol genealógico de la familia


Objetivo
que se muestra en la sugerencia.

En prolog es necesario definir hechos y reglas.


Introducción
Los hechos son certezas, las reglas son proposiciones
que contienen conectores para deducir una consulta y
llegar a construir la decisión deseada.

 Libreta u hojas blancas de papel bond


Material y Equipo
 Lápiz, Sacapuntas y Borrador
 Computadora con Acceso a Internet
 Dispositivo de almacenamiento
 Plataforma Moodle del IT Valles
 Procesador de Textos p.e. Word

1. Declarar hechos sobre objetos y sus relaciones


Metodología
2. Hacer preguntas sobre objetos y sus relaciones
3. Definir reglas sobre objetos y sus relaciones
4. Escribir en un editor de texto los programas
5. Grabarlos con extensión .pl
6. Usar SWI-PROLOG y compilar el programa .pl
7. Realizar las consultas

ING. ROSA IMELDA GARCIA CHI,MTI 55


Programación Lógica y Funcional 2015

Sugerencias

ING. ROSA IMELDA GARCIA CHI,MTI 56


Programación Lógica y Funcional 2015

FORMATO DE REPORTE DE PRÁCTICAS

ING. ROSA IMELDA GARCIA CHI,MTI 57


Programación Lógica y Funcional 2015

Formato de Reporte de Prácticas

Reporte por práctica

Nombre del
Alumno

Práctica No. Nombre de la


práctica

Unidad No. Fecha de realización

1. ¿En qué consistió la práctica?

2. ¿Cómo la vinculó con sus conocimientos?

3. ¿Cómo la desarrolló?

4. ¿A qué resultados llegó?

5. ¿Qué problemas se le presentaron?

6. ¿Qué dudas no pudo resolver?

ING. ROSA IMELDA GARCIA CHI,MTI 58


Programación Lógica y Funcional 2015

Reporte final de todas las prácticas

Los elementos que debe contener el reporte final de las prácticas realizadas en la
asignatura de Lenguajes y Autómatas son:

 Portada
 Índice
 1. Introducción
 2. Marco Teórico
 3. Desarrollo de la práctica (la descripción de la práctica del manual)
 4. Resultados (cada uno de los reportes por práctica)
 5. Conclusiones y Recomendaciones (de todas las prácticas)
 6. Bibliografía (utilizar formato APA o ISO 690 b)
 7. Anexos (opcional)
o Tales como:
 Finalidad de la práctica
 Síntesis del contenido.
 Definiciones, conceptos, fórmulas, etc.
 Descripción del método utilizado
 Materiales y equipo
 La ejecución del trabajo, aplicación de fórmulas, duración de
la práctica.
 Explicación de los resultados que se obtuvieron en el
desarrollo de la práctica.
 Respecto a la práctica, al desempeño del maestro,
consideraciones respecto a la experiencia obtenida al realizar
la práctica.
 La experiencia que el estudiante utilizó para planear y
desarrollar su práctica.
 Tablas, formatos, dibujos, planos, diagramas, fotografías, etc.

ING. ROSA IMELDA GARCIA CHI,MTI 59


Programación Lógica y Funcional 2015

Bibliografía

1. NILSSON, N. J. Inteligencia Artificial. Una nueva síntesis. Mc Graw Hill. 2001.

2. POOLE, D., Mackworth, A. y Goebel, R. Computational Intelligence (A


Logical
Approach). Oxford University Press. 1998.

3. BRATKO, I. Prolog Programming for Artificial Intelligence (2nd ed.).


Addison
Wesley. 1990.

4. MITCHELL, T. M. Machine Learning. Mc Graw Hill. 1997.

5. FLACH, P. Simply Logical (Intelligent Reasoning by Example). John Wiley.


1994.

6. BIRD, Richard. Introducción a la Programación Funcional con Haskell.


Segunda
Ed. Prentice Hall. 2000.

7. FOKKER, Jeroen. Programación Funcional. Universidad de


Utrecht, Departamento de Informática. 1995.

8. JULIAN, P., Alpuente, M. Programación Lógica. Teoría y Práctica.


Pearson
Prentice Hall. 2007.

9. HOGGER, C. Essentials of Logic Programming. Clarendon Press, Oxford.


1990.

10. BRATKO. Prolog Programming for Artificial Intelligence. Segunda


Edición).
Addison Wesley. 1991.

11. STERLING & Shapiro. The art de Prolog. MIT. 1994.

12. LUCAS, P. y Gaag, L.v.d. Principles of Expert Systems. (Addison–Wesley.


1991.

ING. ROSA IMELDA GARCIA CHI,MTI 60

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