PROGRAMACIÓN ORIENTADA A LA INTELIGENCIA ARTIFICIAL Códigos: INFORMÁTICA DE SISTEMAS Código Carrera: 40 Septiembre 2003, Original, Duración: 2 HORAS ASIGNATURA: 3144 Material permitido: NINGUNO Advertencias: Deben responderse en hojas separadas las cuestiones de LISP y PROLOG. Poner el nombre en todas las hojas. Se valorará especialmente el estilo, la adecuada documentación del código, que el examen esté compensado y que no incluya errores conceptuales importantes. 1- Considere un sistema basado en reglas que realiza inferencia mediante encadenamiento hacia atrás. Los hechos ciertos se almacenan en una lista asignada a la variable *hechos*: (defvar *hechos* ‘(A H J M) ) y las reglas en otra lista asignada a la variable *reglas*: (defvar *reglas* ‘( ( ( ( ( ( (A H) (C) ) (C D R) (L) ) (B J) (C) ) (J M) (D) ) (D A) (R) ) ) ) donde cada regla consta de dos sublistas. La primera sublista almacena el antecedente: conjunto de condiciones que se deben cumplir conjuntamente para que la regla pueda ser aplicada. La segunda sublista contiene el consecuente: hecho que pasa a ser cierto cuando la regla sea ejecutada. En un proceso de encadenamiento hacia atrás, aquel hecho cuya veracidad pretendamos verificar da lugar a un árbol Y-O en función del contenido de *reglas*. Por ejemplo, > (arbol-YO ‘R) (enlaceY (enlaceY J M) A) > (arbol-YO ‘L) (enlaceY (enlaceO (enlaceY A H) (enlaceY B J) ) (enlaceY J M) (enlaceY (enlaceY J M) A) ) > (arbol-YO ‘A) A Por tanto, cualquier árbol Y-O generado en un proceso de encadenamiento hacia atrás no contendrá ningún hecho que pertenezca al consecuente de una regla perteneciente a *reglas*. Se pide, en primer lugar, escribir el procedimiento LISP, denominado “arbol-YO”, que calcule el árbol Y-O asociado a cierto hecho, teniendo en cuenta el contenido de *reglas*. En segundo lugar, dado un árbol Y-O cualquiera, no generado necesariamente a partir de *reglas*, construir un procedimiento LISP, denominado “evaluar-arbol-YO”, que determine si el hecho asociado a ese árbol puede o no ser considerado como cierto en función del contenido de *hechos*. Por ejemplo, > (evaluar-arbol-YO T > (evaluar-arbol-YO T > (evaluar-arbol-YO NIL > (evaluar-arbol-YO T Valoración: 3,5 puntos. ‘(enlaceY A H)) ‘(enlaceO A B)) ‘K) ‘(enlaceY (enlaceO A K) A M)) CONTINÚA AL DORSO... 2- Escriba un procedimiento LISP que solicite al usuario dos matrices numéricas, las multiplique y muestre el resultado en pantalla de manera que cada fila de la matriz resultante aparezca en un renglón y se reserven 7 espacios para escribir cada número. Valoración: 2,5 puntos. 3- Considere el siguiente programa escrito en Prolog: escritorFrances:- escritor(X), write(X),write(‘es un escritor’),nl, frances(X), write(‘y frances’),nl. escritorFrances:- write(‘error’),nl. escritor(X):- nombre(X). escritor(X):- write(‘no se encuentran mas’),nl, fail. nombre(joyce). nombre(cervantes). nombre(witman). frances(sartre).frances(camus). Indique qué mensajes generaría por pantalla un intérprete de Prolog ante la consulta escritorFrances. A continuación, sitúe predicados de corte donde juzgue conveniente de modo que los mensajes sean: a) b) c) d) e) joyce es un autor no se encuentran mas error joyce es un autor cervantes es un autor witman es un autor no se encuentran mas joyce es un autor error joyce es un autor joyce es un autor cervantes es un autor witman es un autor error Valoración: 2 puntos. 4- Defina en Prolog los siguientes predicados: a) juntoA(X,Y,List), que pueda utilizarse para enumerar los pares consecutivos de una lista (ejemplo: juntoA(X,Y,[1,2,3]) debe generar las soluciones X=1,Y=2 y X=2,Y=3). b) parImpar(List,Par,Impar), que pueda utilizarse para separar una lista en sus elementos pares e impares (ejemplo: parImpar ([a,b,c,d],P,I) debe generar las soluciones P = [b,d], I = [a,c]). Describa las trazas de ejecución de las consultas: juntoA( X,Y,[] ), juntoA ( X, Y, [1,2] ) y juntoA (1,2, List ); y asimismo de las consultas: parImpar ( [], P, I ), parImpar ( [a,b], P, I) y parImpar ( L, [a,b], [c,d] ) Valoración: 2 puntos.