Programación Declarativa UNIVERSIDAD DE MÁLAGA

Documentos relacionados
Programación Declarativa UNIVERSIDAD DE MÁLAGA

Árboles generales. Un árbol es una estructura no lineal acíclica utilizada para organizar información de forma eficiente. La definición es recursiva:

Práctica N o 1 - Programación Funcional

Tema Árboles binarios fmap para árboles binarios Plegado de árboles binarios

Tema Árboles generales. 9.2 Árboles binarios 9.3 Árboles de búsqueda

Programación Declarativa Universidad de Málaga

Programación Declarativa Haskell Informática Sistemas Curso Pepe Gallardo Universidad de Málaga. Tema 8. Listas

Informática Haskell Matemáticas Curso Pepe Gallardo Universidad de Málaga. Tema 8. Listas

Programación con listas

Tema 8: Funciones de orden superior

Tema 8: Funciones de orden superior

1.1 Define un operador ( ) que devuelva True si y solo si tan solo uno de sus argumentos es True. Por ejemplo:? (3 > 2) (2 > 5)

data Tree a = Tip Node a (Tree a) (Tree a) deriving Show

Tema 23: Técnicas de diseño descendente de algoritmos

n! = 1 2 n 0! = 1 (n+1)! = (n + 1) n!

Informática de 1 o de Matemáticas. Ejercicios de Introducción a Haskell. Ejercicio 1 Consideremos la siguiente definición:

Tema 6: Funciones recursivas

Tema II: Introducción al Lenguaje Funcional

Programación lógica con listas

Guía 2: Listas, recursión e inducción

Tipos algebraicos y abstractos. Algoritmos y Estructuras de Datos I. Tipos algebraicos

Tema 7: Razonamiento sobre programas

Tema 13: Aplicaciones de programación funcional

Programación Funcional

Tema 7. El sistema de clases

Tema 9: Declaraciones de tipos y clases

Tema 4: Definición de funciones

Programación con listas. El tipo lista

Tema 4: Definición de funciones

Tipos en Haskell. Cecilia Manzino

Abstracción de procedimientos

Programación Declarativa Haskell Informática Sistemas Curso Pepe Gallardo Universidad de Málaga

Tema 2. Tipos predefinidos

Estructura de Datos Unidad 6: ARBOLES

Guía 2: Funciones, listas, recursión e inducción

Exámenes de Programación funcional con Haskell ( )

El sistema de clases de Haskell. Introducción

Tema 9: Declaraciones de tipos y clases

Estructuras incompletas. Listas diferencia.

Tipos de datos algebraicos

Tema 6. Definiciones de tipos

Estructura de datos y de la información Boletín de problemas - Tema 10

PROGRAMACIÓN DECLARATIVA

Tema 21: Algoritmos de exploración de grafos

Práctica N o 5 - Programación Lógica

Análisis y Complejidad de Algoritmos. Arboles Binarios. Arturo Díaz Pérez

Programación Declarativa Ejercicios de programación con listas

Introducción a Haskell. Cecilia Manzino

Programación Funcional Haskell Clase 21

Práctica N o 4 - Programación Lógica

Árboles balanceados (AVL) Tablas de dispersión (Hash) Colas de prioridad (Heap)

Metodología de Programación I Tutorial Prolog 2/3

Teoría de los Lenguajes de Programación Práctica curso

Tema IV Programación lógica con estructuras

Curso Básico de Computación

Ejercicios de programación funcional con Haskell

Programación Declarativa

ALPII Práctica 3. Bernardo García Fuentes

EJERCICIOS DE LENGUAJES Y PARADIGMAS DE PROGRAMACIÓN (CUESTIONES DE EXAMEN) PROGRAMACIÓN FUNCIONAL

Tipos paramétricos y recursivos

Manos a la obra: Recursión, división y listas

Tema 3. Patrones y Definiciones de Funciones

PROGRAMACIÓN ORIENTADA A LA INTELIGENCIA ARTIFICIAL

Francisco J. Hernández López

Control en Prolog. Control

Tema 1. Tema 2. Informática Haskell Matemáticas Curso Pepe Gallardo Universidad de Málaga

A) PREORDEN B) INORDEN C) POSTORDEN D) NIVELES

Programación Declarativa

Tema 6: Estructuras de datos recursivas

Ejercicio 2 Considere la representación para Lista de Naturales y Árbol Binario de Naturales de la Figura 1.

EJERCICIOS RESUELTOS DE PROLOG

Programación 2 Práctico 9 - TADs Árbol Binario de Búsqueda, Árbol Finitario y Árbol n-ario

PROGRAMACIÓN ORIENTADA A LA INTELIGENCIA ARTIFICIAL

LENGUAJES Y GRAMÁTICAS

Estructura de Datos. Estructuras de Datos no lineales : Árboles

Programación Funcional Haskell Clase 22

Curso Básico de Computación Preliminares

TEMA 0 REPASO DE CONCEPTOS BÁSICOS TEST PARA AUTOEVALUACIÓN DEL ALUMNO

Lenguajes y Compiladores Aspectos Formales (Parte 1) Compiladores

Tema 3. Patrones y Definiciones de Funciones

ESTRUCTURAS DE DATOS Y ALGORITMOS

EJE N 3 : ECUACION LINEAL, CUADRATICA Y SISTEMA DE ECUACIONES

Ejercicios del Tema 3 Estructuras jerárquicas: Árboles

Programación lógica con árboles. Introducción. Contenido. Introducción. 1. Programación con árboles 2. Otras estructuras arbóreas

recursion general 5.1 Heurísticas para la inducción Definición (Definición recursiva de inversa). inversa xs es la inversa de la lista xs.

Árboles. Un grafo no dirigido es un árbol si y sólo si existe una ruta unica simple entre cualquiera dos de sus vértices.

Francisco J. Hernández López

Programación recursiva en Prolog

Tema 3: Tipos y clases

Tema 3: Tipos y clases

Semántica Operacional para la Programación en Lógica Lógica para Ciencias de la Computación

Tema 3: Tipos y clases

Tema 3: Tipos y clases

Análisis Comparativo de Lenguajes - Año 2018 Práctico Nro. 2 Lenguaje Prolog Corresponde al Apunte El lenguaje de programación Prolog

Eliminación en un ABB

Programación Declarativa

Transcripción:

Programación Declarativa UNIVERSIDAD DE MÁLAGA (3 o de Ingeniería Técnica en Informática) E.T.S.I. INFORMÁTICA 17 de Febrero de 2005 Alumno: Grupo: Prolog Ejercicio 1 (a)(2 pts.) Realiza el árbol de búsqueda para el objetivo p([a,b,c,b,a],x) y el programa Prolog p([x],x). p([x Xs],Y) :- concatena(as,[x],xs), p(as,y). concatena([],ys,ys). concatena([x Xs],Ys,[X Zs]):- concatena(xs,ys,zs). 1 p([x], X). 2 p([x Xs], Y):- concatena(as, [X], Xs), p(as, Y). 3 concatena([], Ys, Ys). 4 concatena([x Xs], Ys, [X Zs]):- concatena(xs, Ys, Zs). 1) p([a, b, c, b, a], X) 2 - {X1/a, Xs1/[b, c, b, a], Y1/X} 2) concatena(as1, [a], [b, c, b, a]), p(as1, X) 4 - {As1/[b Xs2], Ys2/[a], X2/b, Zs2/[c, b, a]} 3) concatena(xs2, [a], [c, b, a]), p([b Xs2], X) 4 - {Xs2/[c Xs3], Ys3/[a], X3/c, Zs3/[b, a]} 4) concatena(xs3, [a], [b, a]), p([b, c Xs3], X) 4 - {Xs3/[b Xs4], Ys4/[a], X4/b, Zs4/[a]} 5) concatena(xs4, [a], [a]), p([b, c, b Xs4], X) 3 - {Xs4/[], Ys5/[a]} 4 - {Xs4/[a Xs5], Ys5/[a], X5/a, Zs5/[]} 6) p([b, c, b], X) 2 - {X6/b, Xs6/[c, b], Y6/X} 7) concatena(as6, [b], [c, b]), p(as6, X) 4 - {As6/[c Xs7], Ys7/[b], X7/c, Zs7/[b]} 13) concatena(xs5, [a], []), p([b, c, b, a Xs5], X) fallo 10. Øxito {X/c} 8) concatena(xs7, [b], [b]), p([c Xs7], X) 4 - {Xs7/[b Xs8], Ys8/[b], X8/b, Zs8/[]} 3 - {Xs7/[], Ys8/[b]} 9) p([c], X) 12) concatena(xs8, [b], []), p([c, b Xs8], X) 1 - {X9/c, X/c} fallo 2 - {X9/c, Xs9/[], Y9/X} 11) concatena(as9, [c], []), p(as9, X) fallo

(b)(1 pto.) Completa la tabla de comportamiento del predicado p anterior. (+, +) Test Comprueba que la lista es un palíndromo con un número impar de elementos, y que el segundo argumento es el elemento central. (+, ) Generador único Si la lista es un palíndromo con un número impar de elementos, genera en el segundo elemento el central de la lista. (, +) Generador no acotado Genera todos los posibles palíndromos con elemento central el segundo argumento. (, +) Generador no acotado Genera todos los posibles palíndromos con elemento central el segundo argumento. Ejercicio 2 (a)(1,25 pts.) Define el predicado gennat/1 que genera los números naturales:?- gennat(n). N = 0; N = 1; N = 2;... gennat(0). gennat(n) :- gennat(n1), N is N1+1. (b)(1,25 pts.) Define el predicado genent/1 que genera los números enteros (naturales con signo):?- genent(n). N = 0; N = 1; N = -1; N = 2;... signo(1). signo(-1). genent(0). genent(n) :- gennat(n1), signo(s), N is S*(N1+1). Ejercicio 3 (1,5 pts.) Define el predicado posiciones(asxsbs,xs,n) tal que devuelva por revaluación en N las posiciones en las que aparece la sublista Xs en la lista AsXsBs.?- posiciones([a,b,a,b,a,b,c,a,b,a],[a,b,a],n). N = 0; N = 2; N = 7;

posiciones(asxsbs,xs,n) :- concatena(asxs,_,asxsbs), concatena(as,xs,asxs), longitud(as,n). Ejercicio 4 (a)(1,5 pts.) Define el predicado cuenta(xsys,x,ys,n) tal que dadas la lista XsYs y un término X, devuelva en N el número de X que aparecen al principio de XsYs, y en Ys la lista que resulta de eliminar todas las X por las que empieza XsYs?- cuenta([5,5,5,4,4,1,6],5,ys,n). Ys = [4,4,1,6], N = 3 ;?- cuenta([5,5,5,4,4,1,6],1,ys,n). Ys = [5,5,5,4,4,1,6], N = 0 ; cuenta([],_,0,[]). cuenta([y Ys],X,0,[Y Ys]) :- Y \= X. cuenta([x XsYs],X,N,Ys) :- cuenta(xsys,x,t,ys), N is T+1. (b)(1,5 pts.) Define el predicado nombra(xs,ys) que dada una lista de enteros positivos Xs, devuelve una lista Ys que nombra la lista Xs, mencionando cuantas veces consecutivas aparece cada elemento de Xs?- nombra([1,1,1,3,3,7,4,4,3],ys). Ys = [3,1,2,3,1,7,2,4,1,3] ; nombra([],[]). nombra([x XsYs],[N,X Zs]) :- cuenta([x XsYs],X,N,Ys), nombra(ys,zs).

Programación Declarativa UNIVERSIDAD DE MÁLAGA (3 o de Ingeniería Técnica en Informática) E.T.S.I. INFORMÁTICA 17 de Febrero de 2005 Alumno: Grupo: Haskell Ejercicio 1 (a)(0,5 pts.) Cuál es el tipo polimórfico de la función h? h f g (x,y) = (f x, g y) h :: (a -> b) -> (c -> d) -> (a,c) -> (b,d) (b)(0,5 pts.) Cuál es el tipo polimórfico de la función h? h f g (x,y) = (g (f x), f (g y)) h :: (a -> b) -> (b -> a) -> (a,b) -> (a,b) (c)(0,5 pts.) Cuál es el tipo polimórfico de la función f? f g p h = map g. filter p. map h f :: (a -> b) -> (a -> Bool) -> (c -> a) -> [c] -> [b] (d)(0,75 pts.) Define la función f del apartado anterior usando una lista por comprensión f g p h = \xs -> [ g x x <- xs, let x = h x, p x ] (e)(0,75 pts.) Define la función f del apartado anterior usando foldr f g p h = foldr m [] where m x s p x = g x s otherwise = s where x = h x

Ejercicio 2 (a)(1 pto.) Completa la definición de la función span que se utiliza para dividir una lista en dos de manera que la primera contiene todos los elementos consecutivos de la lista que verifican un predicado dado y la segunda el resto. Por ejemplo: span (<6) [4,3,5,2,7,3,2,5,8,9] ==> ([4,3,5,2],[7,3,2,5,8,9]) span :: (a -> Bool) -> [a] -> ([a],[a]) span p [] = ([],[]) span p (x:xs) p x = (x:ys, zs) otherwise = ([],x:xs) where (ys,zs) = span p xs (a)(1,5 pts.) Un esquema simple de comprensión para cadenas de texto que contienen series de caracteres repetidos consiste en reemplazar cada una de las series por una única copia del carácter repetido y un dígito que indique el número de repeticiones. Por ejemplo, la cadena aaaaabbbbcc sería comprimida a a5b4c2. Como cada carácter va seguido de un único dígito, secuencias de más de 9 caracteres deben ser fraccionadas en bloques de no más de 9 caracteres. Por ejemplo, la cadena aaaaaaaaaaaa podría comprimirse como a9a3. Utilizando la función span anterior, completa las funciones bloque y comprime. La primera toma un carácter y un número y genera el bloque para ese carácter; la segunda toma una cadena de caracteres y la devuelva comprimida. Por ejemplo: bloque a 12 comprime "aaaaabbbbbbbbbbbbcc" ==> "a9a3" ==> "a5b9b3c2" bloque x n n <= 9 = x:show n otherwise = x: 9 :bloque x (n-9) comprime [] = "" comprime (x:xs) = bloque x (1+length cx) ++ comprime rs where (cx,rs) = span (==x) xs (b)(1,5 pts.) Escribe una función descomprime que tome una cadena de caracteres comprimida y devuelva la original. Por ejemplo: descomprime "a5b9b3c2" ==> "aaaaabbbbbbbbbbbbcc" Utiliza la función predefinida read que transforma una cadena en un entero: read "7" ==> 7 descomprime [] = "" descomprime (x:n:xs) = take (read [n]) (repeat x) ++ descomprime xs

Ejercicio 3 Considera la siguiente definición de árboles con nodos de uno y dos hijos, no vacíos, y con información en nodos y hojas: data ArbolI a = Hoja a Uno a (ArbolI a) Dos (ArbolI a) a (ArbolI a) deriving Show Se pretende utilizar este árbol para alojar elementos de manera que simule un árbol binario de búsqueda. En ese sentido, en un nodo Dos, la raíz debe ser mayor o igual que los elementos de la rama izquierda y menor que los de la derecha, mientras que en un nodo Uno, la raíz debe ser mayor o igual que los elementos de la rama inferior. (a)(0,75 pts.) Define la función inserta que inserta un elemento en un árbol ordenado de este tipo de manera que se mantenga ordenado. inserta :: Ord a => a -> ArbolI a -> ArbolI a inserta x (Hoja y) x <= y = Uno y (Hoja x) x > y = Uno x (Hoja y) inserta x (Uno y r) x <= y = Uno y (inserta x r) x > y = Dos r y (Hoja x) inserta x (Dos ri y rd) x <= y = Dos (inserta x ri) y rd x > y = Dos ri y (inserta x rd) (b)(0,75 pts.) Dada la función aarbol (x:xs) = aarbol (Hoja x) xs define la función aarbol que inserta todos los elementos de la lista xs en un árbol ordenado manteniéndolo ordenado. aarbol = foldr inserta (c)(0,5 pts.) Define la función enorden que hace un recorrido en orden de los elementos de manera que la lista resultante estará ordenada. enorden :: ArbolI a -> [a] enorden (Hoja x) = [x] enorden (Uno x r) = enorden r ++ [x] enorden (Dos ri x rd) = enorden ri ++ x:enorden rd (d)(1 pto.) Si consideramos la siguiente función de plegado para estos árboles foldi :: (b -> a -> b -> b) -> (a -> b -> b) -> (a -> b) -> ArbolI a -> b foldi f g h (H x) = h x foldi f g h (Uno x r) = g x (foldi f g h r) foldi f g h (Dos ri x rd) = f (foldi f g h ri) x (foldi f g h rd) Define la función anterior a partir de este plegado. enorden = foldi (\si x sd -> si++x:sd) (\x s-> s++[x]) (:[])