Documento 1505002

Anuncio
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.
Original. Septiembre 2009
PROBLEMA 1 (lisp). VALORACIÓN 2.50
Considere los siguientes datos orrespondientes a un grupo de países:
Alemania, extensión: 357050, habitantes: 82604000
Bélgia, extensión: 30510, habitantes: 10396241
España, extensión: 504645, habitantes: 46157822
1. Asoie en Lisp una lista propiedad a ada uno de los países anteriores, de modo que se puedan
representar los datos mostrados. Además, agrupe las listas propiedad anteriores en una lista y
asígnela a la variable global *paises*.
2. Dena una funión reursiva ORDENAR que reiba una lista de países omo entrada y devuelva
una lista de dihos países ordenados por extensión dereiente. Por ejemplo:
> *paises*
(ALEMANIA BELGICA ESPANA)
> (ordenar *paises*)
(ESPANA ALEMANIA BELGICA)
SOLUCIÓN, por Severino Fernández Galán
(defvar *paises* nil)
(setf (get 'Alemania 'extension) 357050)
(setf (get 'Alemania 'habitantes) 82604000)
(setf (get 'Belgia 'extension) 30510)
(setf (get 'Belgia 'habitantes) 10396241)
(setf (get 'Espana 'extension) 504645)
(setf (get 'Espana 'habitantes) 46157822)
(setf *paises* (ons 'Espana *paises*))
(setf *paises* (ons 'Belgia *paises*))
(setf *paises* (ons 'Alemania *paises*))
(defun ordenar (paises)
;; Definiion reursiva de la ordenaion por extension dereiente de los 'paises'
1
(ond ((null paises) nil)
((= 1 (length paises)) paises)
(t (oloar (first paises) (ordenar (rest paises))))))
(defun oloar (pais paises)
;; Dada una lista de 'paises' ordenados por extension dereiente,
;; oloa 'pais' en diha lista, de manera que la lista resultante
;; tambien quede en orden dereiente de extension
(let ((oloado nil)
(resultado nil))
(dolist (p paises)
(if (or (mas-extenso p pais) oloado)
(setf resultado (ons p resultado))
(progn
(setf resultado (ons p (ons pais resultado)))
(setf oloado t))))
(if oloado
(reverse resultado)
(reverse (ons pais resultado))))) ; Si todos los 'paises'
; son mas extensos que 'pais'
(defun mas-extenso (pais1 pais2)
(> (get pais1 'extension) (get pais2 'extension)))
PROBLEMA 2 (lisp). VALORACIÓN 2.50
Dena en Lisp, utilizando omandos ondiionales, las funiones lógias MI-OR y MI-AND para un
número variable de argumentos, así omo la funión lógia MI-NOT para un argumento. MI-OR,
MI-AND y MI-NOT deben omportarse igual que los omandos OR, AND y NOT respetivamente,
pero no los pueden utilizar en su odiaión.
SOLUCIÓN, por Severino Fernández Galán
(defun MI-OR (&rest argumentos)
(ond ((equal argumentos '(nil)) nil)
(t
(let ((primer-argumento (evaluar (first argumentos))))
(if primer-argumento
primer-argumento ;; El primer elemento distinto de nil es evaluado
(evaluar (ons 'MI-OR (rest argumentos))))))))
(defun MI-AND (&rest argumentos)
(ond ((equal argumentos '(nil)) nil)
; Si todos los argumentos on que se llamo a la funion (exeptuando el ultimo)
2
; resultaron ser distintos de nil, el ultimo argumento es evaluado.
((= 1 (length argumentos)) (evaluar (first argumentos)))
(t
(let ((primer-argumento (evaluar (first argumentos))))
(if primer-argumento
(evaluar (ons 'MI-AND (rest argumentos)))
nil)))))
(defun MI-NOT (argumento)
(if (evaluar argumento)
nil
t))
(defun evaluar (arg)
;; Implementaion alternativa del omando 'eval' de Lisp
(ond
((atom arg) arg)
(t
(apply (first arg) (rest arg)))))
PROBLEMA 3 (prolog). VALORACIÓN 2.00
Implemente el prediado interseion/3, el ual se umplirá uando el terer argumento sea la
interseión de los dos primeros. Note que las listas de los dos primeros argumentos no deben ontener
elementos dupliados.
Por ejemplo,
?- interseion([1,2,3℄,[3,4,5℄,Z).
Z= [3℄ ;
No
SOLUCIÓN, por Félix Hernández del Olmo
interseion([℄,X,[℄).
interseion([X|A℄,Y,[X|B℄) :member(X,Y),!,
interseion(A,Y,B).
interseion([X|A℄,Y,B) :- interseion(A,Y,B).
PROBLEMA 4 (prolog). VALORACIÓN 3.00
3
Un entero positivo puede denirse omo 0 ó omo un suesor de otro número. De este modo, el
número 1 puede representarse omo s(0), el número 2 omo s(s(0)), et. Se pide que dena los
siguientes prediados en Prolog:
1. s_numero(X) que se verique uando X resulte un número válido en la notaión de suesores
denida más arriba. Por ejemplo, la onsulta s_numero(s(s(0))) debe resultar válida.
2. menos1(X,Y) se veria si X es suesor de Y. Note que los números en X e Y se representan en
notaión de suesores.
3. menos(X,Y,Z) se veria si Z representa la diferenia entre X e Y.Note que los números en X, Y
y Z se representan en notaión de suesores.
4. numero(X,Y) se veria si X es un número en notaión habitual (p.ej. 1, 2, 3) e Y el mismo
número en notaión de suesores. Trate de onseguir que el prediado funione en las dos
direiones: p.ej. numero(3,X), numero(X,s(s(s(0)))).
5. Por último, a partir de los prediados anteriores (se permite el prediado is sólo en el prediado
numero/2 anterior), dena el prediado menos_numerio(X,Y,Z) que se verique uando Z
representa la diferenia entre X e Y. Note que los números en X, Y y Z se representan en la
notaión habitual (sólo enteros positivos).
SOLUCIÓN, por Félix Hernández del Olmo
s_numero(0) :- !.
s_numero(s(X)) :- s_numero(X).
menos1(s(X),X).
menos(X,X,0) :- !.
menos(s(X),Y,s(Z)) :- menos(X,Y,Z).
numero(0,0) :- !.
numero(X,s(Z)) :- var(X),!,numero(X0,Z),X is X0+1.
numero(X,s(Z)) :- X0 is X-1,numero(X0,Z).
menos_numerio(X0,Y0,Z0) :numero(X0,X),numero(Y0,Y),menos(X,Y,Z),numero(Z0,Z).
4
Descargar