Programaión Orientada a la Inteligenia Artiial NO se permite NINGÚN material auxiliar NI aluladora Advertenias: Deben responderse en hojas Poner el nombre en todas separadas Curso: 3o Tiempo: 2h. las uestiones de LISP y PROLOG. las hojas. Se valorará espeialmente el estilo, la adeuada dou- mentaión del ódigo, que el examen esté ompensado y que no inluya errores oneptuales importantes. 1a Semana. Febrero 2009 PROBLEMA 1 (lisp). VALORACIÓN 2.50 Cree una maro en Lisp LEER-ENTEROS-DE-FICHERO que aepte omo parámetro el nombre (ruta) de un hero que almaena varios números enteros. LEER-ENTEROS-DE-FICHERO devolverá una lista on los enteros que ontiene el hero. Cree también una maro ESCRIBIR-ENTEROS-ENFICHERO que aepte omo parámetros una lista de enteros y el nombre de un hero. ESCRIBIRENTEROS-EN-FICHERO se enargará de almaenar en el hero los enteros de la lista, uno por uno. SOLUCIÓN, por Severino Fernández Galán (defmaro leer-enteros-de-fihero (nombre-de-fihero) `(let (resultado) (with-open-file (entero ,nombre-de-fihero :diretion :input) (do ((e (read entero nil) (read entero nil))) ((not e)) (setf resultado (ons e resultado)))) (reverse resultado))) (defmaro esribir-enteros-en-fihero (lista-de-enteros nombre-de-fihero) `(with-open-file (entero ,nombre-de-fihero :diretion :output) (dotimes (i (length ,lista-de-enteros)) (print (first (nthdr i ,lista-de-enteros)) entero)))) PROBLEMA 2 (lisp). VALORACIÓN 2.50 Considere un grafo on aros dirigidos y suponga que su grafo no dirigido asoiado no ontiene aminos errados. Es deir, en el grafo resultante de transformar el grafo dirigido en grafo no dirigido sólo existe un únio amino entre dos nodos diferentes ualesquiera. Dena en Lisp una funión IMPRIME-DESCENDIENTES que aepte omo parámetros un nodo y un grafo, y que imprima en pantalla, uno a uno, los desendientes del nodo en el grafo. Por ejemplo, > (imprime-desendientes ' '((a g) (a d) (d f) (b e) (e f) ( e) ( h))) h e f donde un aro dirigido entre nodo1 y nodo2 viene representado por la lista '(nodo1 nodo2). 1 SOLUCIÓN, por Severino Fernández Galán (defun imprime-desendientes (nodo grafo) (ond ((null nodo) nil) (t (let ((hijos-de-nodo (hijos nodo grafo))) (dolist (hijo hijos-de-nodo) (print hijo) (imprime-desendientes hijo grafo)))))) (defun hijos (nodo grafo) (let (resultado) (dolist (enlae grafo resultado) (when (eq nodo (first enlae)) (setf resultado (ons (seond enlae) resultado)))))) PROBLEMA 3 (prolog). VALORACIÓN 2.00 Asumiendo que hemos argado en el intérprete Prolog el siguiente programa member(Y,[Y|_℄). member(Y,[_|Ys℄):-member(Y,Ys). subset([℄,_). subset(X,[1,2℄):subset(X,Ys),subset(Xs,Ys). desriba la respuesta del intérprete y la traza de las siguientes onsultas: 1. ?- member(X,[f(X)℄). 2. ?- subset(X,[1,2℄). SOLUCIÓN, por Félix Hernández del Olmo Compruebe la respuesta en un intérprete prolog. PROBLEMA 4 (prolog). VALORACIÓN 3.00 Construya el prediado palindromo/2 que se umple uando el primer parámetro es la adena invertida del segundo parámetro. Ejemplo: ?- palindromo(rata,atar). true ?- palindromo(arroz,Y). Y = zorra 2 SOLUCIÓN, por Félix Hernández del Olmo palindromo([℄,[℄). palindromo([X|Xs℄,Z) :- palindromo(Xs,Zs), append(Zs,[X℄,Z). palindromo(X,Y) :- name(X,XL), palindromo(XL,YL), !, name(Y,YL). 3