Download 2º Certamen ILI-253 Lenguajes de Programación

Document related concepts

Scheme wikipedia , lookup

Expresión lambda wikipedia , lookup

Lisp wikipedia , lookup

Programación funcional wikipedia , lookup

Joy (lenguaje de programación) wikipedia , lookup

Transcript
Nombre:
2º Certamen ILI-253
Lenguajes de Programación
Paralelo:
Nota:
Juan Pablo Menichetti – Jorge Mujica
10 de Junio del 2004
Tiempo: 120 Minutos. Responda con lápiz indeleble para acceder a recorrecciones. Utilice solo las hojas
incluidas en este documento. Preguntas incorrectas no descuentan puntos.
I – Preguntas Teóricas (45 ptos)
A - Matriz de Lenguajes (9 puntos, 3 puntos c/paradigma)
Respecto a su definición pura, marque con una cruz las características requeridas por cada uno de los tres
paradigmas de programación:
Existencia de herencia
Definición de estructuras de control de flujo
Eliminación del efecto lateral
Énfasis en los algoritmos
Énfasis en los resultados
Un programa debe entregar siempre el mismo
resultado bajo la misma entrada
a) Orientación
a objetos
X
X
b) Funcional
c) Lógica
X
X
X
X
X
X
X
X
B - Preguntas de alternativas (24 puntos, 3 puntos c/u)
1.
a)
b)
c)
d)
Prolog es un lenguaje declarativo porque
Permite declarar cláusulas lógicas
Pone énfasis en la declaración de metas, no de algoritmos
El programador no requiere conocer el flujo de ejecución
El flujo de búsqueda está encapsulado y no se puede intervenir
i, ii y iii
i y iii
Solo i
Todas
a)
b)
c)
d)
Respecto a la orientación a objetos, se puede decir que no es una
característica de esta:
La definición de clases
La herencia
El polimorfismo
El efecto lateral
a)
b)
c)
d)
Respecto a la orientación a objetos en Scheme y Prolog se puede decir que
Scheme implementa encapsulamiento en la forma de (let ...)
Scheme permite simular la herencia utilizando funciones lambdas anidadas.
Prolog define comportamiento polimórfico por su debilidad de tipado.
No tiene sentido hablar de herencia en Prolog por que no existe el concepto de asignación.
a)
b)
c)
d)
El operador de “calce” en Prolog:
Genera siempre instanciación de variables en el operando izquierdo
Solo puede generar la instanciación de variables en el operando izquierdo
Puede generar la instanciación de variables tanto en el operando izquierdo como en el derecho
Genera siempre instanciación de variables en el operando derecho
i.
ii.
iii.
iv.
2.
3.
4.
1
A
5
C
2
D
6
B
3
A
7
D
4
C
8
B
1
Nombre:
5.
i.
ii.
iii.
iv.
v.
a)
b)
c)
d)
6.
a)
b)
c)
d)
7.
a)
b)
c)
d)
8.
Paralelo:
Scheme no es un lenguaje funcional puro porque:
Permite definir funciones como parámetros de funciones
Las funciones lambda generan efecto lateral
Los let generan efecto lateral
Utiliza el concepto de variable
Permite le inclusión de lógica imperativa a través de la función begin
i, iv y v
i, ii, iv y v
iv y v
i, iii, iv, v
Se entiende por backtracking:
Una búsqueda en profundidad en un árbol binario
Una búsqueda que elimina ramas infactibles en un árbol de soluciones
Una técnica de programación que puede predecir resultados óptimos de manera eficiente.
Una heurística que parte de una solución inicial que disminuye el tamaño del problema y luego
soluciona, recursivamente, el nuevo problema disminuido.
Respecto al operador “cut” en Prolog podemos decir que:
Permite implementar un operador de negación
Limita el espacio de búsqueda de soluciones
Implica conocer el orden de evaluación de las reglas
Todas las anteriores
Se entiende por transparencia referencial al hecho de que:
Dos variables con igual nombre comparten una misma referencia, en forma transparente al
programador.
b) La evaluación de una función retorna siempre el mismo resultado
c) Una función hace referencias internas a otras funciones en forma transparente al programador
d) Al momento de entrar a una función let donde se usa una variable determinada, cualquier
referencia global a una misma variable (igual nombre) se posterga en forma transparente.
a)
C – Análisis de Prolog (12 puntos, 3 puntos c/u)
Indique la respuesta entregada por Prolog dados los siguientes hechos y reglas (el orden de salida es
relevante):
asesinato(lago).
asesinato(plaza).
lugar(pedro, plaza).
lugar(juan, plaza).
lugar(maria, lago).
lugar(patricia, casa).
consciente(pedro).
sospechoso(X) :- asesinato(Y), lugar(X,Y).
culpable(X) :- sospechoso(X), consciente(X).
Consulta
Respuesta
lugar(X, plaza).
X = pedro ;
X = juan ;
No
sospechoso(X),!.
X = maria ;
No
Culpable(X).
X = pedro ;
No
Sospechoso(X), !, consciente(X).
No
2
Nombre:
Paralelo:
II - Preguntas de desarrollo (55 ptos)
A - Programación en Scheme (30 puntos)
Una posible representación de matrices bidimensionales es utilizar el concepto recursivo de “matrizsubmatriz”. En Scheme podemos implementar este concepto a través de listas como se detalla a
continuación:
Si M es una matriz nula, se representa por una lista nula. En caso contrario, M se define como una lista de
cuatro elementos:
1. El elemento de la diagonal
2. Una lista representando los elementos de la primera fila sin contar la diagonal. Esta lista es nula
en el caso de una matriz 1x1.
3. Una lista representando los elementos de la primera columna sin contar la diagonal. Esta lista es
nula en el caso de una matriz 1x1.
4. Una submatriz S, que será una matriz nula en el caso que M sea una matriz 1x1.
Ejemplos:
(5)
1 2 3 4 


 5 8 9 10 
 6 11 13 14 


 7 12 15 16 


1 0


0 1
1 2 3


 2 2 4
 3 4 3


(5 () () ())
(1 (2 3 4) (5 6 7) (8 (9 10) (11 12) (13 (14) (15) (16 () () ()))))
(1 (0) (0) (1 () () ()))
(1 (2 3) (2 3) (2 (4) (4) (3 () () ())))
Dada la definición anterior, y asumiendo matrices cuadradas y solo con valores numéricos,
implemente:
a) Una función en Scheme que entregue la matriz transpuesta de una matriz dada. (15 ptos)
b) Una función en Scheme que entregue la suma de los elementos de la diagonal de una matriz
utilizando solo recursión de cola. (15 ptos)
3
Nombre:
Paralelo:
Solución II-A
a)
(define traspuesta
(lambda (x)
(if
(null? x)
'()
(list
(car x)
(caddr x)
(cadr x)
(traspuesta (cadddr x))
)
)
)
)
b)
(define suma-diag
(lambda (x)
(let s-d ((ls x) (s 0))
(if
(null? ls)
s
(s-d (cadddr ls) (+ s (car ls)))
)
)
)
)
4
Nombre:
Paralelo:
B.- Programación en Prolog (25 puntos)
Una lista palíndrome es aquella lista no vacía que se puede leer de igual forma tanto de izquierda a
derecha como de derecha a izquierda. Por ejemplo,
A = [1,2,3,2,1]
a) Implemente el predicado inverse(X,R) el cual asigna a R la lista X invertida. (15 ptos)
b) Implemente el predicado palindrome(X) el cual utiliza a inverse(X,R) para determinar
si la lista X (no vacía) posee dicha particularidad. (10 ptos)
Puede implementar hechos y reglas auxiliares adicionales si lo considera necesario.
5
Nombre:
Paralelo:
Solución II-B
inverso([], []).
inverso([X | L], L1) :inverso(L, L2),
conc(L2, [X], L1).
palindrome(L)
:-
inverso(L, L).
6