PRACTICA-9.TXT Problemas de lógica. SLD-resolución. ============================================================================ Durante la clase se solucionará el problema 1. Los problemas 2 y 3 forman un ejercicio puntuable para realizar en casa. El problema 2 es similar al problema 1 y se debe realizar en CLIPS, el problema 3 se debe realizar en Lisp. El código en Lisp de dichos ejercicios debe ser enviado por e-mail a "fmartin@cs.us.es" antes del viernes 7 de Junio con el "Subject" "Ejercicio-puntuable-6". No se admitirá ningún trabajo cuya fecha de envío sea posterior a la del día 7 de Junio. ***************************************************************************** * PROBLEMA 1: * ***************************************************************************** Se dispone de varias cajas A, B, C, D y E que contienen alguna clase de fruta. Cada caja tiene una etiqueta que indica el nombre de una fruta. Determinar que clase de fruta contiene cada caja, sabiendose que: 1) Cada caja tiene una sola clase de fruta. 2) La fruta que contiene una caja no coincide con lo que dice la etiqueta de esta. 3) En cada caja hay una fruta diferente. 4) La caja B contiene manzanas. 5) La caja D no contiene ni platanos ni pomelos. 6) La caja A no contiene ni pomelos ni fresas. Las etiquetas de las cajas son: A(manzanas), B(naranjas), C(platanos), D(fresas) y E(pomelos). Determinar qué fruta contiene cada caja. ***************************************************************************** * PROBLEMA 2: * ***************************************************************************** ************************************************************ * Este problema forma parte de un ejercicio puntuable para * * realizar en casa, el código en CLIPS debe ser enviado * * por e-mail a "fmartin@cs.us.es" antes del viernes 7 de * * Junio con el "Subject" "Ejercicio-puntuable-6". No se * * admitirá ningún trabajo cuya fecha de envío sea * * posterior a la del día 7 de Junio. * ************************************************************ Cuatro parejas participan en una velada. Cada una de las ocho personas habla con otra, y sólo una, persona que no es de su sexo: - Beatriz habla con Manuel. - Ana habla con el marido de Carlota. - Francisco habla con la mujer de Jorge. - Daniela habla con el marido de Ana. - Jorge habla con la mujer de Manuel. Determinar quiénes componen los matrimonios y quiénes están hablando. ***************************************************************************** * PROBLEMA 3: * ***************************************************************************** ************************************************************ * Este problema forma parte de un ejercicio puntuable para * * realizar en casa, el código en Lisp debe ser enviado * * por e-mail a "fmartin@cs.us.es" antes del viernes 7 de * * Junio con el "Subject" "Ejercicio-puntuable-5". No se * * admitirá ningún trabajo cuya fecha de envío sea * * posterior a la del día 7 de Junio. * ************************************************************ Este ejercicio corresponde al Tema 18. En él se usará como base el programa sld-resolucion.lsp Apartado 1: Crear el fichero factorial.pro de forma que asigne a la variable global *conjunto-de-clausulas* las cláusulas que definen los predicados siguientes (suma x y z) <=> z=x+y (producto x y z) <=> z=x*y (factorial x y) <=> y=x! donde x, y y z son números naturales formados con la constante 0 y la función (s x) (que representa el siguiente de x); por ejemplo, (s (s 0)) representa el número 2. Probar el programa con la siguiente sesión > (load "sld-resolucion.lsp") T > (load "factorial.pro") T > (respuesta '((suma (s 0) y (s (s (s 0)))))) Y = (S (S 0)) Si. NIL > (respuesta '((factorial (s (s (s 0))) y))) Y = (S (S (S (S (S (S 0)))))) Si. NIL Apartado 2: Las listas pueden representarse mediante la constante nil (que representa la lista vacía) y la función (cons x y) (que representa la lista obtenida añadiendo x al principio de la lista y); por ejemplo, la lista (a b c) se representa por el término (cons a (cons b (cons c nil))). Crear el fichero append.pro de forma que asigne a la variable global *conjunto-de-clausulas* las cláusulas que define el predicado (append x y z) <=> z es la lista obtenida añadiendo y a continuación de x. Probar el programa con la siguiente sesión > (load "sld-resolucion.lsp") T > (load "append.pro") T > (respuesta '((append (cons a (cons b nil)) (cons c nil) z))) Z = (CONS A (CONS B (CONS C NIL))) Si. NIL Apartado 3: La ausencia del test de ocurrencia en el algoritmo de unificación provoca que la implementación de la resolución SLD del fichero sld-resolucion.lsp no sea adecuada. Por ejemplo, si definimos el siguiente programa (setf *conjunto-de-clausulas* '(((error) (menor x x)) ((menor x (s x))))) y evaluamos la expresión (respuesta '(error)) obtenemos como respuesta "Si." Escribir el fichero adecuado.lsp que contenga las modificaciones de las definiciones contenidas en sld-resolucion.lsp de forma que al cargarlo después de sld-resolucion.lsp sea adecuado. Comprobarlo con el ejemplo anterior. Apartado 4: La implementación de la resolución SLD del fichero sld-resolucion.lsp realiza una búsqueda en profundidad y, por tanto, es incompleto. Por ejemplo, si definimos el siguiente programa (setq *conjunto-de-clausulas* '(((positivo x) (positivo (anterior x))) ((positivo (anterior (anterior a)))))) y evaluamos la expresión (respuesta '((positivo a))) no encuentra la respuesta, aunque es afirmativa. Escribir el fichero completo.lsp que contenga las modificaciones de las definiciones contenidas en sld-resolucion.lsp de forma que al cargarlo después de sld-resolucion.lsp sea completo. Comprobarlo con el ejemplo anterior.