Temas Avanzados en Ingeniería Informática (I)-Lógica Curso 209-2010 1. Fecha de entrega La fecha límite de entrega será el 22 de Marzo (Lunes) hasta las 20:00 horas. 2. Objetivo El objetivo de esta práctica consiste en realizar una primera toma de contacto con la Programación Lógica, y más concretamente con el lenguaje de programación Prolog. Para ello, se implementarán varios ejercicios simples que permiten definir bases de hechos (o de conocimiento) y reglas en Prolog. En esta, y en el resto de las prácticas de la asignatura, podrá utilizarse el intérprete SWI-Prolog (http://www.swi-prolog.org/), o el intérprete Prolog de GNU (gprolog, http://ftp.gnu.org/gnu/gprolog/). También puede utilizarse cualquier otro intérprete Prolog que se dese, siempre y cuando, no se utilicen predicados, instrucciones, o procedimientos propios. Las prácticas será corregidas utilizando SWI-Prolog, o GProlog, por lo que se recomienda la utilización de uno de estos dos intérpretes. Para aquellos que lo deseen, la instalación en Linux (distribución Ubuntu) tanto de GProlog como de Swi-Prolog (versión 5.6.14 para Linux), puede realizarse ejecutando desde línea de comandos: :~$ sudo apt-get install gprolog :-$ prolog //ejecuta gnu-prolog :-$ gprolog //ejecuta gnu-prolog :-$ sudo apt-get install swi-prolog :-$ swipl //ejecuta swi-prolog :-$ swiprolog //ejecuta swi-prolog La práctica se ha dividido en un conjunto de ejercicios básicos que deben ser implementados y documentados. 1
Figura 1: Ejemplo de árbol genealógico 3. Descripción de la práctica 3.1. Árboles genealógicos (a) Dado el siguiente árbol genealógico (ver Figura1), crear un base de hechos que lo represente y el conjunto de cláusulas necesarias que me permitan establecer las relaciones habituales en cualquier familia. Se pide crear (como mínimo) los siguientes predicados: 1. prole(x,y): cierto, si X es hijo de Y (cualquiera de los dos sexos). 2. hija(x,y): cierto, si X es hija de Y. 3. hijo(x,y): cierto, si X es hijo varón de Y. 4. progenitor(x,y): cierto, si X es un progenitor de Y. 5. padre(x,y): cierto, si X es el padre de Y. 6. madre(x,y): cierto, si X es la madre de Y. 7. fraterno(x,y): cierto, si X e Y son hermanos/as. 8. hermano(x,y): cierto si X es hermano varón de Y. 9. hermana(x,y): cierto si X es hermana de Y. 10. primo(x,y): cierto si X e Y son primos (cualquiera de los dos sexos). 12. abuelo(x,y): cierto si X es abuelo varón de Y. 13. abuela(x,y): cierto si X es abuela de Y. 14. tio(x,y): cierto si X es tío de Y (tanto carnal como político). 15. tia(x,y): cierto si X es tía de Y (tanto carnal como política). 16. suegro(x,y): cierto si X es suegro de Y. 17. suegra(x,y): cierto si X es suegra de Y. 18. yerno(x,y): cierto si X es yerno de Y. 2
19. nuera(x,y): cierto si X es nuera de Y. 20. esposo(x,y): cierto si X e Y están casados. 21. marido(x,y): cierto si X es marido de Y. 22. mujer(x,y): cierto si X es la mujer de Y. 23. varon(x): cierto si X es varón. 24. mujer(x): cierto si X es mujer. También se diseñarán cláusulas que nos permitan relacionar diferentes familias, por ejemplo: 25. cuniado(x,y): cierto si X es cuñado de Y. 26. cuniada(x,y): cierto si X es cuñada de Y. Se crearán cláusulas de carácter recursivo como: 27. antepasado(x,y): cierto si X es antepasado de Y. 28. descendiente(x,y): cierto si X es descendiente de Y. 29. pariente(x,y): cierto si X e Y son parientes. (b) Se modificará el programa anterior, para permitir la inserción de nuevos hechos en nuestra base de conocimiento. Como característica básica se considerará la inserción de este nuevo conocimiento (ver Figura 1): " Juan, cuyos padres son Pilar y Mario, decide casarse con Sara (sus padres no son conocidos para nuestra base de hechos). Como efecto de este matrimonio tienen una hija a la que deciden ponerle el nombre de Sonia." Es decir, podremos ejecutar un predicado desde el intérprete de Prolog (por ejemplo, casados(x,y)) que añadiría automáticamente ese conocimiento a la base de hechos. (c) (opcional) Modificar la base de hechos anterior sobre un caso libre y aplicar los predicados ya definidos. La complejidad de la nueva base de hechos, así como particularidades de la misma (i.e. múltiples padres, múltiples matrimonios) definirán la nota de este apartado. 3.2. Parentesco (OPCIONAL) El parentesco es el vínculo que liga unas personas con otras 1. Puede ser de consanguinidad, que sería el vínculo de sangre que une a las personas y el de afinidad, también denominado político, que sería el que liga a 1 www.iabogado.com/esp/guialegal/guialegal.cfm?idcapitulo=01020000 3
un esposo con los parientes de sangre del otro. Dentro del parentesco de consanguinidad hay que distinguir lo que es la línea recta (ascendente o descendente) de lo que es la línea colateral. Línea recta. La proximidad del parentesco de consanguinidad se mide por grados, siendo un grado la distancia que hay entre dos personas engendradas una de otra. De una a otra hay una generación y por tanto cada generación es un grado. Así padre e hijo son parientes en primer grado. Abuelo y nieto hay dos grados, uno entre padre e hijo y otro entre padre y abuelo. Por lo tanto el grado de parentesco entre el nieto y el abuelo es el de segundo grado de consanguinidad en línea recta. Línea colateral. Nos viene dada por aquellas personas que no descienden unas de otras, sino de un antepasado común (primos entre sí, siendo el antepasado común el abuelo). La medición o el grado de parentesco se calcula de la siguiente manera. Ascendemos hasta llegar al más próximo antepasado común con la otra persona, y luego se baja por la línea recta descendente que une a este antepasado con la otra cuyo parentesco con la primera se mide. Por lo tanto dos hermanos son parientes en segundo grado de consanguinidad en línea colateral. Se pide crear las cláusulas correspondientes para poder calcular consang(x,y,z), afinidad(x,y,z), lrecta(x,y,z), lcolat(x,y,z). 3.3. Diseño de menus para un restaurante (a)sedeseaformalizarenprologeldiseñodemenúsenunrestaurante, para ello se deben construir un conjunto de predicados que contengan los diferentes tipos de alimentos. A partir, de esos predicados se definirán otros que nos permitan construir menús dependiendo del gusto de los posibles clientes. En el siguiente ejemplo damos algunos predicados donde almaceno los distintos alimentos de los que dispone el restaurante: pescados(besugo,atun,emperador,mero,sardina). carnes(cerdo,ternera,pollo,pato,jabali). vegetales(zanahoria,lechuga,repollo,coliflor,acelga). Un menú de este restaurante deberá constar de tres platos compuestos por un primer y segundo plato (entrada y plato principal) y de un postre. Deberemos crear por lo menos un predicado que me permita definir un menú para vegetarianos, y otro para personas que no deseen incluir nunca pescado en su comida. 4
vegetarianos(x,y,z). X = primer plato, Y = segundo plato, Z = postre. no-pescado(x,y,z). Nota: En el segundo tipo de menús es aconsejable emplear la negación. (b) Se trata de refinar el funcionamiento del programa anterior introduciendo estructuras más complejas. En este apartado debemos de modificar el anterior para poder añadir o eliminar un determinado alimento a su lista de comida, además modificaremos la base de cláusulas para permitir la existencia de sublistas, en estas sublistas introduciremos los valores calóricos de cada alimento. Definir el subconjunto de reglas necesarias para poder modificar un conjunto de alimentos, buscar las calorías que contiene un alimento en particular, y crear reglas para definir menús equilibrados. Ej: pescados([besugo,300],[bacalao,350],[emperador,400],[mero,200],[sardina,100]). carnes([cerdo,700],[ternera,450],[pollo,250],[pato,250],[jabali,200]). Se pueden diseñar otro tipo de sublistas que organicen la información de una forma más conveniente, por ejemplo los pescados podríamos definirlos en función de la clase a la que pertenecen: pescados([blanco,[besugo,emperador,mero],azul,[sardina,bonito], marisco,[langosta,centollo,langostino]]). O bien podemos definir una estructura todavía más compleja que la anterior, en base a la cual podemos definir nuevos predicados, Ej: pescados([blanco,[[besugo,300],[emperador,400],[mero,200]],azul[[sardina,100],[bonito,300]], marisco[[langosta,150],[centollo,200],[langostino,100]]). Los nuevos predicados mostrarán, además de los diferentes menús, el valor calórico total de los mismos. 4. Entrega de la memoria y del programa La práctica (tanto el código como la memoria) se entregarán en un fichero comprimido como se indica en la página de la asignatura, y cuyo nombre debe indicar, el número de práctica y el número de grupo del que se trata. Se aceptarán ficheros comprimidos zip, rar, tar.gz, o tgz. Ejemplo: 5
par05prac1.tar.gz, par06prac1.tgz, par02prac1.zip, par04prac1.rar La práctica se entregará utilizando la zona de envío de prácticas de la EPS (http://www.ii.uam.es/esp/alumnos/practicas/envio practicas.php3). El código fuente entregado tendrá todo lo necesario para que se pueda ejecutar los diferentes procedimientos, así como los casos de prueba que se consideren necesarios. El código deberá estar adecuadamente comentado. La memoria constará de las siguientes secciones: 1. Introducción (una hoja de descripción de lo que hay que hacer desde vuestro punto de vista y no copiando el enunciado). 2. Descripción a alto nivel de lo realizado: qué predicados se han definido y porqué, qué problema resuelve cada uno de ellos y cómo se relacionan unos con otros, etc 3. Código fuente completo con comentarios (el código final no debería ser muy largo) 4. Consideraciones sobre la eficiencia del programa, si es que se han tenido en cuenta cuestiones como el orden de las cláusulas, orden de los objetivos en los cuerpos, cut,... 5. Conclusiones (qué se ha aprendido, dificultades encontradas, comentarios sobre PROLOG, etc). 6. Medida del esfuerzo del desarrollo de la práctica, en este último apartado podrá mostrarse una tabla donde los alumnos indiquen (de forma aproximada) el número de horas dedicadas al desarrollo de la misma. Pueden indicarse los siguientes elementos (u otros que se consideren oportunos): Análisis del problema, Desarrollo del programa, Diseño de la solución, Verificación y Pruebas, Creación de la documentación. 5. Criterios de evaluación Se valorará: 1. La corrección del programa (que funcione en todos los casos) 2. La claridad del código 3. La claridad de las explicaciones en la memoria 4. Las consideraciones que haya hecho el alumno para mejorar la eficiencia (cambiar el orden de los objetivos, etc), si estas están justificadas en la memoria 6