PROGRAMACIÓN LÓGICA YFUNCIONAL Héctor Andrade A/D 2013 Paradigmas de Programación Imperativa: Le decimos a la computadora “como debe resolver el problema”. Lenguages: C, C++, Java, Delphi, etc. Declarativa: Le decimos a la computadora “qué debe hacerse”. Lenguajes: SQL, Haskell, PROLOG, etc. 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: Conceptos Fundamentales 1.Programa de Estudios 1.5. Definición de funciones. 1. . 1. Disciplina de tipos. Estilos de programación. Evaluación de expresiones.1. Tipos de datos. 1.3. 1.4.2. 5.Programa de Estudios 2. Funciones.4. Programación Funcional 2. Intervalos. El tipo de datos. 2.1.3. 2.6. Aplicaciones de las listas. 2. 2. Árboles. .2. 2. Operadores. Evaluación Perezosa 3. Técnicas de programación funcional perezosa.2.Programa de Estudios 3. La estrategia de evaluación perezosa. .1. 3. Cláusulas de Horn.Programa de Estudios 4. Unificación y resolución. 4.4. 4.5. . Programación lógica con cláusulas de Horn. Repaso de la lógica de primer orden. 4. Representación clausada del conocimiento.2.1. Semántica de los programas lógicos. Programación Lógica 4.3. 4.6. Resolución 4. Control de búsqueda en programas lógicos 4. listas y árboles.8. Consulta de una base de cláusulas 4.10. Espacios de búsqueda. 4.11. Predicados metalógicos. Manipulación de términos.9.7. Programación lógica con números. . 4.Programa de Estudios 4. Evaluación Actividades y prácticas (40%) Exámenes en la computadora (60%) . 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.haskell.www. Podría estar un poco “sesgado” . mantenible y de alta calidad* *Tomado de la página.profilers y una gran cantidad de librerias Comunidad muy activa Haskell facilita la producción de software flexible. org aprendehaskell.Documentación Haskell www.com Aquí se obtiene también el compilador .fpcomplete.haskell.es www.com www.learnyouhaskell. haskell.Instalar Haskell http://www.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. En la programación funcional el estado es generalmente inmutable . Las instrucciones de la programación imperativa cambian el estado global del programa. 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) . hs) Grabarlo!! Cargarlo desde WinGHCi .Funciones en haskell Crear un archivo (extensión: . Ejemplos . Ejercicios: 1. 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) . 2. If La función if (en haskell TODO es una función) regresa un valor de acuerdo a una expresión boleana.2 5 .5. 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. 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) . 2) Nota: Em estos ejemplos se usa “pattern matching” .1) Números de fibonacci: fibonacci :: Integer -> Integer fibonacci 0 = 1 fibonacci 1 = 1 fibonacci n = fibonacci (n-1) + fibonacci (n .Ejemplos Factorial: factorial :: Integer -> Integer factorial 0 = 1 factorial n = n * factorial (n . 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) . Aunque no se declaren explícitamente. el compilador puede inferirlos .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”. 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 . ) También se pueden formar tuplas y listas. Por ejemplo: (3.7. Ordering – Solo puede tener tres valores LT.Float) [3.Tipos en Haskell Bool – b0oleanos (True o False) Char – Caracteres (‘a’.4.. EQ y GT .2) (Int. ‘b’. etc.5][Int] Todos los elementos en una lista deben ser del mismo tipo pero las tuplas pueden tener diferentes tipos de elementos. 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? . 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 .Variables de Tipos :t es una función que regresa el tipo de una expresión La expresión (a. Ejemplo: La función head . 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. 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 . menor que. Definen cierto comportamiento de los valores.Clases de tipos Las clases de tipos es un concepto similar a una interface del lenguaje Java. Ejemplos . . 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) . Determine su tipo.Ejercicios: Capture las siguientes funciones. . 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) . .M.Mas ejemplos de P. 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 . Let.. in Estas identaciones no son opcionales!! .