PROGRAMACIÓN LÓGICA Y FUNCIONAL
Héctor Andrade A/D 201 20133
Paradigmas de Programación
Imperativa: Le decimos a la computadora “como debe resolver el problema”.
Lenguages: C, C, C++, Java, Delphi, etc. Declarativa: Le decimos a la computadora “qué debe hacerse”. Lenguajes: SQL, Haskell,
PROLOG, etc. PROLOG, En este curso veremos:
Programación funcional: Haskell (“ jaskl”)
Programación Lógica: PROLOG Así pronuncia!
Ejemplo: Factorial Java:
Haskell:
Haskell (más simple):
Otro Ejemplo Java:
Haskell:
Programa de Estudios
1. Conceptos Fundamentales
1.1. Estilos de programación. 1.2. Evaluación de expresiones. 1.3. Definición de funciones. 1.4. Disciplina de tipos. 1.5. Tipos de datos.
Programa de Estudios
2. Programación Funcional
2.1. El tipo de datos. 2.2. Funciones. 2.3. Intervalos. 2.4. Operadores. 2.5. Aplicaciones de las listas. 2.6. Árboles.
Programa de Estudios
3. Evaluación Perezosa
3.1. La estrategia de evaluación perezosa. 3.2. Técnicas de programación funcional perezosa.
Programa de Estudios
4. Programación Lógica
4.1. Repaso de la lógica de primer orden. 4.2. Unificación y resolución. 4.3. Cláusulas de Horn. Resolución 4.4. Programación lógica con cláusulas de Horn. 4.5. Semántica de los programas lógicos. 4.6. Representación clausada del conocimiento.
Programa de Estudios
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.
Evaluación
Actividades y prácticas (40%) Exámenes en la computadora (60%)
www.haskell.org
Haskell es un lenguaje funcional moderno puro Permite el desarrollo de software de manera concisa y correcta Permite una integración fuerte con otros lenguajes Concurrencia y paralelismo integrados en el lenguaje Debuggers,profilers y una gran cantidad de librerias Comunidad muy activa Haskell facilita la producción de software flexible, mantenible y de alta calidad* *Tomado de la página. Podría estar un poco “sesgado”
Documentación Haskell
www.haskell.org aprendehaskell.es www.learnyouhaskell.com www.fpcomplete.com
Aquí se obtiene también el compilador
Instalar Haskell
http://www.haskell.org
Usando Haskell
Se puede utilizar en modo comando (GHCi)
O en modo ventana (WinGHCi)
Programación funcional
En la programación funcional los programas se ejecutan evaluando expresiones. En la programación imperativa en los programas se componen de instrucciones. Las instrucciones de la programación imperativa cambian el estado global del programa. En la programación funcional el estado es generalmente inmutable
Haskell Programs
Un programa en Haskell es una serie de comentarios y definiciones de funciones Cada comentario comienza con “--” (o entre “{-” y“-}”) Cada definición contiene una declaración del tipo de la función y una o más ecuaciones:
Función
Una función es un “mapeo” entre dos
conjuntos.
El conjunto de valores de “entrada”
(dominio) y el conjunto de valores de “salida” (rango)
Funciones en haskell
Crear un archivo (extensión: .hs) Grabarlo!! Cargarlo desde WinGHCi
Ejemplos
Ejercicios: 1. 2. 3.
Escriba una función que calcule el área de un rectángulo dadas la base y la altura (Use Float para los parámetros y el tipo del valor de retorno) Escriba una función que calcule el área de un circulo dado el radio (Use Float para los parámetros y el tipo del valor de retorno) Escriba una función que calcule el volumen de un cilindro dado el radio y la altura (utilice la función del ejercicio anterior)
If
La función if (en haskell TODO es una función) regresa un valor de acuerdo a una expresión boleana. Ejemplo:
mayorDeDos :: Int->Int->Int mayorDeDos n m = if (n > m) then n else m
Ejercicio: Defina una función que regrese el mayor de tres números. Ejemplo: mayorDeTres 4,5,2 5
Recursión
En la programación funcional pura no hay ciclos!! Por lo tanto se utiliza recursión para resolver problemas que requieren repetición de instrucciones La recursión consiste en definir una función utilizando la misma función!! (Pero siempre con un caso base)
Ejemplos
Factorial: factorial :: Integer -> Integer factorial 0 = 1 factorial n = n * factorial (n - 1)
Números de fibonacci: fibonacci :: Integer -> Integer fibonacci 0 = 1 fibonacci 1 = 1 fibonacci n = fibonacci (n-1) + fibonacci (n - 2) Nota: Em estos ejemplos se usa “pattern matching”
Ejercicios
Escribir funciones haskell para Encuentre la suma angular de un número n (1+2+3+…n)
Multiplicar dos números enteros positivos sin usar el operador de multiplicación (usar la suma)
Dividir dos números enteros (división entera utilizando solo la resta)
Tipos
Haskell es un lenguaje fuertemente “ tipeado” Se conoce el tipo de cada variable y cada expresión al momento de compilación Esto es bueno porque una mayor cantidad de errores se detectan en tiempo de compilación También maneja “inferencia de tipos”.
Aunque no se declaren explícitamente, el compilador puede inferirlos
Tipos de Expresiones
Las funciones también tienen tipos:
Tipos en Haskell
Int – Enteros con límite Integer – Enteros sin límite Float – Flotantes de precisión simple Double – Flotantes de doble precisión
Tipos en Haskell
Bool – b0oleanos (True o False) Char – Caracteres (‘a’, ‘b’, etc..) También se pueden formar tuplas y listas. Por ejemplo: (3,7.2) (Int,Float) [3,4,5][Int] Todos los elementos en una lista deben ser del mismo tipo pero las tuplas pueden tener diferentes tipos de elementos. Ordering – Solo puede tener tres valores LT, EQ y GT
Variables de tipos
Los tipos en Haskell comienzan con mayúsculas También existen variables que representan tipos. Ejemplo: La función fst regresa el primer elemento de una dupla:
¿Cuál es el tipo de la función fst?
Variables de Tipos
:t es una función que regresa el tipo de una expresión La expresión (a,b)-> a significa que la función fst recibe cualquier pareja de elementos de cualquier tipo y regresa un valor del mismo tipo del primer elemento En este caso, a y b son variables de tipos
Ejemplo: La función head
Clases de tipos
Las clases de tipos es un concepto similar a una interface del lenguaje Java. Definen cierto comportamiento de los valores. Num – A esta clase pertenecen los tipos numéricos Eq – A esta clase pertenecen tipos de valores que puede determinarse si son iguales Ord– A esta clase perteneces tipos de valores que se pueden comparar (mayor que, menor que, igual) Show – Son valores que pueden ser representados como strings (Todos excepto las funciones) Enum – Son secuencias de valores Bounded – Valores que tienen mínimo y máximo
Ejemplos
Ejercicios:
Capture las siguientes funciones. Determine su tipo. Posteriormente compruebe si el tipo es el esperado utilizando el comando :t
suma n m = n + m
mayor n m = if m > n then m else n
soloNumerosGrandes n = if n>100 then n else 0
soloLetrasGrandes n = if n>'L' then n else 'A'
misterio k l m o = (k * l) / (m * o)
Declaración explícita de tipos
Podemos realizar una declaración explícita de tipos en las expresiones. Ejemplo:
Comparación de patrones (pattern matching)
Pattern Matching (ejemplos)
Mas ejemplos de P.M.
Mas sobre P.M.
Uso de “Guards”
Se utilizan para verificar condiciones. En algunos casos pueden resultar más convenientes que un if then else
Dejar al menos un espacio!!
Where