Documento 1504993

Anuncio
Programaión Orientada a la Inteligenia Artiial
Curso: 3
Tiempo:
NO se permite NINGÚN material auxiliar NI aluladora
Advertenias: Deben responderse en hojas
Poner el nombre en
todas
separadas
o
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.
Original.
Septiembre 2006
PROBLEMA 1 (lisp). VALORACIÓN 2.75
a) Dena en Lisp una estrutura persona on un solo ampo ohes que ontenga una lista
on las matríulas de los diferentes ohes que posee una persona. Cree las siguientes instanias
de persona: Juan tiene los ohes 3821ADA, 2233BBP, 2156BJP y 2200ABA, Pedro no tiene
ohes y Antonio tiene el ohe 1100CCU.
b) Dena un array de 4 elementos, parque-automovilístio, que almaene informaión de los
ohes que poseen los empleados de ierta empresa. La entrada
lista de aquellas instanias de personas que posean
i
i
del array ontendrá una
ohes, on la salvedad de que la última
entrada del array almaene las instanias de personas que posean más de 2 ohes. Suponga
que iniialmente Juan, Pedro y Antonio son los únios empleados de la empresa.
) Dena una funión inluir-empleado que aepte un array del tipo desrito en el apartado b)
y una instania del tipo desrito en el apartado a) y que inluya a la persona denida por la
instania en el array orrespondiente.
d) Dena una funión matríulas que devuelva una lista on todas las matríulas de los ohes que poseen los empleados de la empresa. Esta funión reibirá omo parámetro el array
orrespondiente al parque automovilístio de la empresa.
SOLUCIÓN, por Severino Fernández Galán
(defstrut persona ohes)
(setf Juan (make-persona :ohes '(3821ADA 2233BBP 2156BJP 2200ABA)))
(setf Pedro (make-persona :ohes nil))
(setf Antonio (make-persona :ohes '(1100CCU)))
(setf parque-automovilistio (make-array 4))
(setf (aref parque-automovilistio 3) (list Juan))
(setf (aref parque-automovilistio 0) (list Pedro))
(setf (aref parque-automovilistio 1) (list Antonio))
1
(defun inluir-empleado (parque empleado)
(let ((nohes (length (persona-ohes empleado))))
(if (< nohes 3)
(setf (aref parque nohes) (ons empleado (aref parque nohes)))
(setf (aref parque 3) (ons empleado (aref parque 3))))))
(defun matriulas (parque)
(let (resultado)
(dotimes (i 4 resultado)
(dolist (j (aref parque i))
(setf resultado (append resultado (persona-ohes j)))))))
PROBLEMA 2 (lisp). VALORACIÓN 2.75
El reorrido seguido por un robot se representa mediante una lista de símbolos tal que s representa
moverse una asilla haia el sur, e representa moverse una asilla haia el este, n representa
moverse una asilla haia el norte y, nalmente, o representa moverse una asilla haia el oeste.
Por ejemplo, la lista (e e e e) representa un reorrido de 4 asillas haia el este.
a) Denir una funión Lisp que determine si un reorrido, representado por ierta lista, se iniia
y termina en la misma asilla.
b) Denir una funión que, dado un reorrido, devuelva el reorrido de vuelta, de manera que la
unión de los dos reorridos siempre onduiría al robot a la misma asilla de la que partió.
) Denir una funión que, dados dos reorridos que partirían de la misma asilla, determine si
existe alguna asilla omún a los dos reorridos, aparte de la asilla iniial.
SOLUCIÓN, por Severino Fernández Galán
(defun misma-asilla (reorrido)
(let ((asilla-atual '(0 0)))
(dolist (movimiento reorrido)
(ase movimiento
('e
(setf asilla-atual
(list (1+ (first asilla-atual)) (seond asilla-atual))))
('o
(setf asilla-atual
(list (1- (first asilla-atual)) (seond asilla-atual))))
('n
(setf asilla-atual
(list (first asilla-atual) (1+ (seond asilla-atual)))))
('s
2
(setf asilla-atual
(list (first asilla-atual) (1- (seond asilla-atual)))))))
(equal '(0 0) asilla-atual)))
(defun reorrido-de-vuelta (reorrido)
(let (resultado)
(dolist (movimiento (reverse reorrido) (reverse resultado))
(ase movimiento
('e (setf resultado (ons 'o resultado)))
('o (setf resultado (ons 'e resultado)))
('n (setf resultado (ons 's resultado)))
('s (setf resultado (ons 'n resultado)))))))
(defun asilla-omun (reorrido1 reorrido2)
;; Primero hallamos las asillas que visita el primer reorrido.
;; Seguidamente, al hallar ada asilla del segundo reorrido,
;; omprobamos si diha asilla pertenee al primer reorrido.
(let ((resultado nil)
(asillas1 '((0 0)))
(ultima-asilla2 '(0 0)))
(dolist (movimiento1 reorrido1)
(ase movimiento1
('e
(setf asillas1
(ons
(list (1+ (first (first asillas1))) (seond (first asillas1)))
asillas1)))
('o
(setf asillas1
(ons
(list (1- (first (first asillas1))) (seond (first asillas1)))
asillas1)))
('n
(setf asillas1
(ons
(list (first (first asillas1)) (1+ (seond (first asillas1))))
asillas1)))
('s
(setf asillas1
(ons
(list (first (first asillas1)) (1- (seond (first asillas1))))
asillas1)))))
(dolist (movimiento2 reorrido2)
(ase movimiento2
('e
(setf ultima-asilla2
(list (1+ (first ultima-asilla2)) (seond ultima-asilla2))))
3
('o
('n
('s
(setf ultima-asilla2
(list (1- (first ultima-asilla2)) (seond ultima-asilla2))))
(setf ultima-asilla2
(list (first ultima-asilla2) (1+ (seond ultima-asilla2)))))
(setf ultima-asilla2
(list (first ultima-asilla2) (1- (seond ultima-asilla2))))))
(when (member ultima-asilla2 asillas1 :test #'equal)
(setf resultado t)))
resultado))
PROBLEMA 3 (prolog). VALORACIÓN 1.50
numeros/3. En diho prediado los dos primeros argumentos orresponden
a dos números enteros, N0 y N1 (N1 >N0), mientras que el terero es una lista. Esta lista debe estar
ompuesta por todos los números enteros que se enuentren entre N0 y N1, ambos inlusive.
Construya el prediado
Por ejemplo:
?- numeros(2,7,[2,3,4,5,6,7℄).
Yes
Compruebe la onsistenia del prediado onstruido mediante la traza no exhaustiva del ejemplo
anterior.
SOLUCIÓN, por Félix Hernández del Olmo
%numeros(N0,N1,L)
numeros(N0,N1,[N0|R℄) :N0<N1,
N0_new is N0+1,
numeros(N0_new,N1,R).
numeros(N0,N0,[N0℄).
PROBLEMA 4 (prolog). VALORACIÓN 3.00
Represente el árbol binario del dibujo en una estrutura de datos
del prediado
arbol_binario(Nodo,RamaIzquierda,RamaDereha)
Prolog
mediante la utilizaión
de manera reursiva. Para tra-
bajar on este árbol posteriormente en el programa, lo almaenaremos armando el prediado
arbol(<arbol>).
en la base de datos
Prolog
(donde
anteriormente).
4
<arbol>
no es sino el árbol representado
h
i
a
s
c
b gw
t
Con lo anterior, se desea reorrer el arbol nodo a nodo dejando onstania del amino seguido
en una lista. El reorrido se realizará mediante una búsqueda en
onstruir el prediado
profundidad/2.
profundidad.
Para ello, debemos
El primer argumento de este prediado debe ser un árbol
binario (representado omo se india en el párrafo anterior). El segundo argumento será una lista
onteniendo el amino reorrido.
Por ejemplo,
?- arbol(X),profundidad(X,[h,i,a,b,,s,w,g,t℄).
X=...<arbol>...
Yes
Se pide,
arbol/1
y
profundidad/2.
1.
El programa ompleto: prediados
2.
Compruebe la onsistenia del programa onstruido mediante la traza no exhaustiva del ejemplo
anterior.
SOLUCIÓN, por Félix Hernández del Olmo
%arbol_binario(nodo,rama_izquierda,rama_dereha).
arbol(arbol_binario(h,arbol_binario(i,a,b),arbol_binario(,s,arbol_binario(w,g,t)))).
%profundidad(Arbol,Lista)
profundidad(arbol_binario(Nodo,RI,RD),[Nodo|Resto℄) :profundidad(RI,Lista1),
profundidad(RD,Lista2),
append(Lista1,Lista2,Resto).
profundidad(A,[A℄) :- atom(A).
5
Descargar