Herramientas de usuario

Herramientas del sitio


introalg:taller09_soluciones

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
introalg:taller09_soluciones [2009/05/12 16:24] lauraintroalg:taller09_soluciones [2018/08/10 03:03] (actual) – editor externo 127.0.0.1
Línea 556: Línea 556:
 </code> </code>
  
-==== ejercicios para seguir pensando y analizando problemas ====+==== ejercicios de haskell 18/05/2009: aplicando generalizaciones ====
  
-  * ¿Cómo sería un programa para recomendar amigos en una red social tipo //facebook//?+Redefinir todos los ejercicios recursivos en listas propuestos en las clases anteriores aplicando las generalizaciones ''filter'', ''map'' y ''foldr''. En algún caso no es posible aplicar estas generalizaciones.
  
-Algunos de sus compañeros propusieron una solución a este problema, aplicando recursividad. Después del primer parcialito, cuando ya tengan bien asumida la recursividad, vamos a poner en común todo lo que han venido pensando y analizando para ver diferentes formas de encarar este problema. 
  
-  * ¿Cómo podemos hacer un programa **no muy largo** que, dado un animal, nos diga si es ovíparo o vivíparo, si vive en la tierra, en el agua o en el aire, si come carne o vegetales, etc.? Traten de usar generalizaciones del tipo ''si es mamífero, entonces...''. En esta aproximación, cómo tratarían excepciones como "delfín" o "guppi"?+==== ejercicios de prolog 18/05/2009: más recursividad ====
  
-  * Tenemos una lista de las conexiones por tren entre pares de ciudades, por ejemplo ''conectadas(Tarragona,Barcelona). ''. ¿Cómo sería un programa que nos ayudara a saber si podemos llegar de una ciudad a otra, es decirsi existe una lista de conexiones que nos lleve de una ciudad a otrao bien eso es imposible? Primerotraten de hacer un programa que nos diga si podemos llegar de una ciudad a otra directamente o bien en dos o en tres pasos...+  * Definan una función que determine si Clara es mayor que Elenadada la siguiente base de conocimiento: 
 +<code> 
 +mayor(clara,esteban). 
 +mayor(esteban,paula). 
 +mayor(paula,marcos). 
 +mayor(marcos,elena). 
 +</code>
  
-Para resolver este problema también vamos hacer un uso intensivo de recursividad.+<code> 
 +mayorQue(X,Y) :- mayor(X,Y). 
 +mayorQue(X,Y) :- mayor(X,Z) , mayorQue(Z,Y). 
 +</code> 
 + 
 +  * Tenemos una lista de las conexiones por tren entre pares de ciudades, por ejemplo ''conectadas(Tarragona,Barcelona). ''. ¿Cómo sería un programa que nos ayudara a saber si podemos llegar de una ciudad a otra, es decir, si existe una lista de conexiones que nos lleve de una ciudad a otra, o bien eso es imposible? La solución, en la [[http://www.cs.famaf.unc.edu.ar/wiki/doku.php?id=introalg:taller09_8#conexion_entre_dos_ciudades|clase 8]]. 
 + 
 +==== ejercicios sobre la vida real 1/06/2009 ==== 
 + 
 +Encontrarán una posible solución al problema de recomendar amigos en una red social tipo //facebook// en la [[http://www.cs.famaf.unc.edu.ar/wiki/doku.php?id=introalg:taller09_9#los_amigos_de_mis_amigos|clase 9]]. 
 + 
 +También damos una posible solución al problema de calcular el porcentaje de estudiantes que aprueban o promocionan la materia en la [[http://www.cs.famaf.unc.edu.ar/wiki/doku.php?id=introalg:taller09_9#calculos_numericos_de_bases_de_datos|clase 9]]. 
 + 
 +  * Comprobar si podemos cocinar un determinado platillo dados los ingredientes necesarios para el platillo y los ingredientes que tenemos en la heladera. Se puede ampliar con los utensilios, las técnicas, e implicaciones entre ellos (p.ej., si tenemos que usar la técnica "montar punto de nieve" necesitamos el utensilio "batidora"). 
 +<code> 
 +ingredientes(tortilla,[huevos,papas,cebolla,sal,aceite,pimienta]). 
 +ingredientes(papafrita,[papas,aceite,sal]). 
 +ingredientes(huevofrito,[huevos,aceite,sal]). 
 +ingredientes(pizza,[prepizza,salsa,queso]). 
 +ingredientes(asado,[carne]). 
 +ingredientes(crema,[leche,huevos,azúcar,maicena,canela]). 
 + 
 +tengo(sal). 
 +tengo(azúcar). 
 +tengo(pimienta). 
 +tengo(canela). 
 +tengo(huevos). 
 +tengo(leche). 
 +tengo(queso). 
 +tengo(maicena). 
 + 
 +puedoCocinar(Platillo) :-  
 +   ingredientes(Platillo,Ingredientes) , 
 +   tengoTodos(Ingredientes). 
 + 
 +tengoTodos([]). 
 +tengoTodos([I|Ingredientes]) :- tengo(I) , tengoTodos(Ingredientes). 
 +</code> 
 + 
 +  * Crear un sistema de alertas que cuando se consume un insumo, chequea en la base de datos cuánta reserva queda de ese insumo y, si la reserva está por debajo de un mínimo, devuelve un mensaje diciendo que hay que comprar más de ese insumo. 
 +<code> 
 +queda(jeringas,8). 
 +queda(vendas,20). 
 +queda(curitas,30). 
 + 
 +minimo(jeringas,5). 
 +minimo(vendas,10). 
 +minimo(curitas,20). 
 + 
 +bajoMinimo(Insumo,Cantidad) :- 
 +  queda(Insumo,Reserva) , 
 +  minimo(Insumo,Minimo) , 
 +  (Reserva - Cantidad) =< Minimo . 
 +</code> 
 + 
 +  * Hacer un programa **no muy largo** que, dado un animal, nos diga si es ovíparo o vivíparo, si vive en la tierra, en el agua o en el aire, si come carne o vegetales, etc. Tratar excepciones como "delfín" (mamífero marino), "nutria" (mamífero de agua dulce) o "guppi" (pez vivíparo). 
 +<code> 
 +mamifero(vaca). 
 +mamifero(delfín). 
 +mamifero(nutria). 
 +acuatico(delfín). 
 +acuatico(nutria). 
 +pez(trucha). 
 +pez(guppi). 
 +viviparo(guppi). 
 + 
 +terrestre(X) :- mamifero(X) , not(acuatico(X)). 
 +acuatico(X) :- pez(X). 
 +viviparo(X) :- mamifero(X). 
 +oviparo(X) :- pez(X) , not(viviparo(X)). 
 +</code> 
 + 
 +==== ejercicios de recursividad clásicos 1/06/2009 ==== 
 + 
 +El problema del máximo común divisor se soluciona muy fácilmente si por azar sabemos que hay una recetita maravillosa que dice así: dados dos números, si uno es divisor del otro, entonces ese será el máximo común divisor. Si no, se resta el número menor al mayor y volvemos a comprobar si uno es divisor del otro. Si no, se resta el menor al mayor, y así hasta llegar a algún caso en el que uno de los dos números sea divisor del otro. 
 +<code> 
 +mcd :: Int -> Int -> Int 
 +mcd a b | mod a b == 0 = b 
 +        | mod b a == 0 = a 
 +        | otherwise    = mcd (min a b) ((max a b) - (min a b)) 
 +</code> 
 + 
 +El problema de las n reinas (perdón, no eran 9 :-} ). Está muy bien explicado en el [[http://programacionilogica.wordpress.com/|blog de programación lógica]] de un estudiante de informática, tanto [[http://programacionilogica.wordpress.com/2008/02/11/implementacion-del-problema-de-las-n-reinas-en-haskell-programacion-funcional/|para haskell]] como [[http://programacionilogica.wordpress.com/2008/02/07/implementacion-del-problema-de-las-n-reinas-en-prolog/|para prolog]]. 
 + 
 +El problema de misioneros y caníbales está bien explicado como caso particular de un problema de búsqueda en estas [[https://forja.rediris.es/docman/view.php/82/300/busqueda1.pdf|filminas sobre búsqueda]].
introalg/taller09_soluciones.1242145487.txt.gz · Última modificación: 2018/08/10 03:03 (editor externo)