Está en la página 1de 19

EJERCICIOS DE

LENGUAJES Y PARADIGMAS
DE PROGRAMACIÓN
(CUESTIONES DE EXAMEN)

PROGRAMACIÓN FUNCIONAL
Marı́a Alpuente y Marı́a José Ramı́rez

1
LENGUAJES Y PARADIGMAS: INTRODUCCIÓN

1. Indica cuál de las siguientes afirmaciones referentes a la Programación


Declarativa (PD) e Imperativa (PI) es falsa:

A Las instrucciones de un programa declarativo son un conjunto de


inferencias lógicas.
B Un programa en PD se corresponde con la especificación de un
problema.
C El modelo de computación de la PI es una máquina de estados.
D Las variables en la PI representan referencias a la memoria.

2. Indica cuál de las siguientes afirmaciones es cierta.

A Un analizador léxico (scanner) es un programa que divide una


secuencia de caracteres (el programa) en una secuencia de com-
ponentes sintácticos primitivos: las instrucciones.
B La compatibilidad de tipos, el alcance de las variables y la sig-
natura de las funciones (coincidencia del número de parámetros
en una llamada con los parámetros formales) forman parte de la
semántica estática del lenguaje.
C La sintaxis define el significado de un programa (es decir, qué pro-
gramas son legales o conformes con la especificación de un len-
guaje).
D La herramienta más empleada para describir la sintaxis de un
lenguaje de programación es la semántica operacional.

3. Indica cuál de las siguientes afirmaciones es cierta:

A una desventaja de los lenguajes de programación declarativos es


que, para resolver un mismo problema, se requieren en general
más lı́neas de código que usando otros lenguajes de programación
más convencionales, como Pascal.
B al ser de mayor nivel, los programas declarativos resultan más
fáciles de mantener que los correspondientes programas impera-
tivos.
C no existe ningún lenguaje orientado a objetos y a la vez declara-
tivo.
D los lenguajes declarativos carecen de aplicaciones prácticas.

2
4. Indica cuál de las siguientes afirmaciones es falsa.

A La notación BNF no es suficiente para describir, por ejemplo, la


compatibilidad de tipos y la coincidencia de parámetros en una
llamada con los parámetros formales
B La notación BNF es una notación definir la sintaxis de un lenguaje
de programación
C La semántica de los lenguajes de programación sirve para definir
exáctamente qué hace un programa (es decir, qué computa)
D Un intérprete es un traductor que genera un programa objeto en
el mismo lenguaje que el programa fuente

5. Indica cuál de las siguientes asociaciones entre lenguaje de programación


y concepto (o propiedad) inherente al mismo es cierta :

A lenguaje imperativo - herencia


B lenguaje funcional - transparencia referencial
C lenguaje lógico - estados explı́citos
D lenguaje imperativo - orden superior

6. Indica el tipo de definición semántica al que pertenece la siguiente regla:


hi0 ,ei→e′′ hi1 ,e′′ i→e′
hi0 ;i1 ,ei→e′

A semántica axiomática
B semántica operacional
C semántica denotacional
D semántica algebraica

7. Indica cuál de las siguientes asociaciones es cierta :

A En la genealogı́a de los lenguajes de programación, el lenguaje


Ada puede verse como un descendiente de C.
B En la genealogı́a de los lenguajes de programación, el lenguaje
Java puede verse como un descendiente de Modula-2.
C En la genealogı́a de los lenguajes de programación, el lenguaje
Haskell puede verse como un descendiente de Simula 67.
D El lenguaje de programación Java incorpora algunas caracterı́sti-
cas que fueron introducidas algunos años atrás, por primera vez,
por algunos lenguajes declarativos.

3
8. Indica cuál de las siguientes afirmaciones es cierta.

A La semántica axiomática es un tipo de semántica declarativa de


los lenguajes de programación.
B La semántica axiomática es el tipo de semántica más natural para
la descripción de los lenguajes de programación declarativos.
C La semántica axiomática no es adecuada para describir el signi-
ficado de los programas del paradigma imperativo.
D ninguna de las anteriores

9. Indica cuál de las siguientes afirmaciones no es una causa de la evolución


de los lenguajes de programación.

A Los avances del hardware.


B El intento de acercar los lenguajes a los avances en compilación.
C La búsqueda por parte de los programadores de un mayor nivel
de abstracción en los programas.
D La aparición de nuevos dominios de aplicación.

10. Indica cuál de las siguientes afirmaciones es falsa.

A La sintaxis de un lenguaje de programación define qué secuencias


de caracteres constituyen un programa legal.
B La semántica estática de un lenguaje de programación define cier-
tas restricciones sintácticas de los programas que no se pueden
expresar mediante reglas de una gramática de contexto libre pe-
ro que se pueden comprobar en tiempo de compilación (e.g. la
compatibilidad de tipos).
C La semántica dinámica de un lenguaje de programación describe
el comportamiento de los programas en tiempo de ejecución.
D Unos de los formalismos más utilizados para definir la sintaxis de
los lenguajes de programación son los sistemas de transición de
Plotkin.

11. Indica cuál de los siguientes aspectos de un lenguaje de programación re-


sulta apropiado como base para las construcción de herramientas automáti-
cas para analizar la equivalencia de programas.

A su gramática generadora.
B su compilador.
C su analizador sintáctico.
D su semántica.

4
12. Indica cuál de las siguientes afirmaciones sobre la programación declarativa
en comparación con la programación imperativa es FALSA:

A mayor potencia expresiva.


B mantenimiento más simple
C menor tamaño del código producido.
D establece el cómo proceder.

13. Indica en cuál de las siguientes caracterizaciones semánticas se utilizan


los conceptos de dominio sintáctico, dominio semántico y función de eva-
luación semántica:

A semántica operacional.
B semántica axiomática.
C semántica por punto fijo.
D semántica denotacional.

5
PROGRAMACIÓN FUNCIONAL

14. Dada la siguiente expresión de tipo

[a] → Int

los constructores de tipo que aparecen en ella son:

A [ ], →
B a, Int
C [a], →, Int
D a

15. Indica cuál de las siguientes expresiones define un tipo polimórfico.

A [a] → Bool
B [Int] → Bool
C Int → Bool
D Bool

16. Indica cuál de las siguientes afirmaciones es cierta en relación al si-


guiente programa funcional:

pippo x
|x>0 =0
| otherwise = “double′′

A La función pippo es de orden superior.


B El programa da un error de tipo.
C La función pippo está indefinida para los negativos.
D La función pippo está definida para datos de cualquier tipo.

17. Dadas dos funciones f y g con definiciones de tipo f :: b → c y g :: a → b,


indica cuál de las siguientes expresiones será el tipo inducido por Hellium
para la composición de funciones (·), sabiendo que (·) se define por la
ecuación (f · g) x = f(g x).

A (·) :: a → c
B (·) :: (b → c) → (a → b)
C (·) :: (b → c) → (a → b) → a → c
D (·) :: (b → c) → (a → b) → c

6
18. Una lista de enteros [x1 , x2 , . . . , xn−1 , xn ] está ordenada si y sólo si (x1 ≤ x2
∧ . . . ∧ xn−1 ≤ xn ) = True. La siguiente definición se basa en la idea an-
terior
esOrdenada xs = and [x ≤ y|(x, y) ← zip xs (tail xs)]
where and . . .

Indica cuál de las siguientes ecuaciones completa la definición de la función


and:

A and (x:xs)= (&&) x xs


B and xs= (&&) True xs
C and xs= foldr (&&) True xs
D and xs= (&&) xs xs

19. Indica qué representa la expresión [x |x ← [1..n], n ‘mod′ x == 0]

A los divisores de n.
B los múltiplos de n.
C los pares comprendidos entre 1 y n.
D los impares comprendidos entre 1 y n.

20. Indica cuál de las siguientes expresiones no es de orden superior

A dosVeces f x = f(f x)
B (f · g)x = f(g x)
C aplicar f x = f ∗ x
D dosVeces f = f · f

21. Indica cuál de las siguientes afirmaciones es falsa:

A El tipo de la función id x = x, inducido por cualquier intérprete


de Haskell (por ejemplo Helium), es id:: Int → Int
B En notación curryficada, las funciones de más de un argumento
se interpretan como funciones que toman un único argumento y
devuelven como resultado otra función con un argumento menos
C En un lenguaje con orden superior, los argumentos o el resultado
de una función puede ser, a su vez, otra función
D En notación curryficada, si t1 , t2 , . . . , tn , tr son tipos válidos, en-
tonces t1 → t2 → . . . → tn → tr es el tipo de una función con n
argumentos

7
22. Indica cuál de las siguientes ecuaciones define una función f :: Int− > Int
que haga válida mitad(f x) = x siendo mitad = (‘div‘ 2)

A fx=x
B f x = f(f x)
C f = 2∗
D fx=x∗x

23. Indica cuál de las siguientes reglas define una función no estricta en su
argumento:

A f (x:xs) = x
B f x = 0
C f x
| x>0 = 1
| otherwise = 0
D f x = if (even x) then 0 else 1

24. Indica cuál de las siguientes afirmaciones es f alsa , en relación con la


regla
fst (x,f) = x

A dicha regla define una función de un único argumento, de tipo


“tupla de dos elementos”
B fst es una función estricta sobre su único argumento de tipo
“tupla de dos elementos”
C dicha regla define una función de orden superior
D dicha regla define una función cuyo tipo es fst :: (a, b) → a

25. Completar la definición de la siguiente función de orden superior que, dada


una función binaria f y dos listas, devuelve una lista cuyos elementos se
calculan aplicando la función f a los correspondientes elementos de la
lista:

zipWith f(a : as) (b : bs) =


zipWith = []

A f (a,b) ++ zipWith f as bs
B [f a b] : zipWith f as bs
C f a b : zipWith f as bs
D ninguna de las anteriores

8
26. Dada la función pair xy = (x, y), indicar cuál de las siguientes ecuaciones
define la función estándar zip usando la función zipWith de la pregunta
anterior:

A zip xs ys = pair (zipWith xs ys)


B zip = zipWith ◦ pair, donde ◦ es la composición de funciones
C zip = zipWith pair
D ninguna de las anteriores

27. Indica cuál de las siguientes afirmaciones es f alsa , en relación con el


siguiente programa:
any p xs = or (map p xs)
or xs = foldr (||) False xs

A aplicada a un predicado y una lista, la función any devuelve True


si cualquiera de los elementos de la lista satisface el predicado, y
Falso en caso contrario.
B la exprexión any (<11) [10..20] se evalúa a True
C el tipo de la función or es :: Bool → Bool → Bool
D el tipo de la función any es :: (a → Bool) → [a] → Bool

28. Indica cuál de las siguientes construcciones de listas es legal en Haskell:


A 1:[]:[]
B 1:1
C [ ] : [1]
D [1] : [1] : [ ]
29. Completa el siguiente programa funcional, que toma como argumentos
una lista de funciones de tipo (a ->b) y un elemento e (de tipo a),
y devuelve la lista de elementos de tipo b que resulta de aplicar cada
función de la lista al elemento de entrada e:
applylist :: [a → b] → a → [b]
applylist [ ] y = [ ].
applylist (x : xs) y = .

A (x y):applylist(xs y)
B [x(y)]:applylist(xs y)
C [(x y):applylist(xs,y)]
D [x:y:applylist(xs)]

9
30. Indica cuál de las siguientes funciones f1, f2, f3, f4 no es equivalente
a las otras (es decir, no computa los mismo valores cuando dicha función
se aplica a un entero y una lista de entradano vacı́a):

A f1 x alist = map (+ x) alist


B f2 x alist = [x+y | y <- alist]
C f3 x (y:ys) = (x+y):f3 x ys
D f2 x = map . (+ x)

31. Indica cuál de las siguientes afirmaciones es cierta.

A En la semántica denotacional de los lenguajes funcionales, el ele-


mento 0 denota el valor de una expresión indefinida.
B La semántica denotacional no puede describir las computaciones
con objetos infinitos.
C Generalmente, la semántica operacional de los lenguajes funcio-
nales se da en el estilo denotacional.
D Los lenguajes funcionales permiten programar cualquier función
computable.

32. Indica cuál de las siguientes afirmaciones referentes a la función

tres :: Int → Int


tres x = 3

es cierta.

A Es no estricta
B La evaluación perezosa y voraz de cualquier expresión de la forma
tres e, siendo e una expresión de tipo Int, devuelve el valor 3
C Se trata de una definición local
D Se trata de una definición parcial

10
33. Dada la siguiente definición

ejFun x y = x + 12

Indica cuál de las siguientes secuencias de reducciones corresponde a la


evaluación perezosa del término “ejFun (9-3) (ejFun 34 3)”:

A ejFun (9-3) (ejFun 34 3) → ejFun (9-3) (34 + 12) → ejFun


(9-3) 46 → ejFun 6 46 → 6 + 12 → 18
B ejFun (9-3) (ejFun 34 3) → ejFun (9-3) (34 + 12) → ejFun
(9-3) 46 → 6 + 12 → 18
C ejFun (9-3) (ejFun 34 3) → ejFun 6 (34 + 12) → 6 + 12
→ 18
D ejFun (9-3) (ejFun 34 3) → (9-3) + 12 → 6 + 12 → 18

34. Dada la siguiente definición

ejFun2 x =x+x

Indica cuál de los siguientes conjuntos representa los redexes de la expre-


sión “ejFun2 (9-3) (ejFun2 34 3)”:

A {ejFun2 (9 − 3)(ejFun2 34 3), (9 − 3), ejFun2 34 3}


B {ejFun2 (9 − 3)(ejFun2 34 3), ejFun2 34 3}
C {ejFun2 (9 − 3)(ejFun2 34 3)}
D {(9 − 3)}

35. Indica cuál de los siguientes es un redex de la expresión f (g x)(g 0)


en el siguiente programa funcional:

f0z=0
g0=0

A (g x)
B (g 0)
C f (g x) (g 0)
D f 0 0

11
36. Indica cuál es la forma normal de la expresión g (f 0) en el siguiente
programa funcional:
g0=0
g (s (s x)) = (s 0)
f x = s (f x)

A 0
B (s 0)
C (s (s 0))
D la expresión no tiene forma normal porque, bajo cualquier estra-
tegia de evaluación, la computación no termina

37. Indicar el conjunto de redexes de la expresión f(x, h(h(y))) con respecto


al siguiente programa funcional:

f(x, y) = h(y)
h(h(x)) = x
h(a) = f(a, a)

A {f(x, h(h(y))), h(h(y))}


B {f(x, h(h(y))), x, h(h(y)), h(y)}
C {f(x, h(h(y)))}
D {f(x, h(h(y))), h(h(y)), h(y)}

38. Indicar la forma normal del término f x con respecto al siguiente progra-
ma:
f Cero = Cero
f (Suc x) = f x

A Cero
B x
C f Cero
D fx

39. La evaluación del término f x de la pregunta anterior es:

A incompleta.
B incorrecta.
C de éxito.
D de fallo.

12
40. Indica cuál de las siguientes afirmaciones referentes a la semántica deno-
tacional de los lenguajes funcionales perezosos es falsa.

A Todos los dominios se extienden con el elemento ⊥ para que cual-


quier expresión sintácticamente correcta tenga una denotación en
el dominio.
B La denotación de la expresión from 0 es la lista 0:1:2:3:...,
siendo
from n = n : from (n + 1)

C La denotación de cualquier expresión cuya evaluación no termina


es el elemento ⊥.
D Un dominio denota un tipo: los dominios primitivos corresponden
a tipos primitivos y la construcción de dominios corresponde a la
construcción de tipos.

41. Indica cuál de las siguientes afirmaciones es cierta :

A Toda función se puede expresar como una lambda abstracción.


B El significado declarativo de un programa funcional es la expre-
sión a la cual se evalúa el programa.
C En los lenguajes impacientes se pierde la transparencia referen-
cial.
D El valor ⊥ es el elemento más grande de un dominio.

42. Sabiendo que f :: a → a, indica cuál es el tipo inferido por Helium para
la función fix que se define mediante la siguiente ecuación

fix f = f(fix f)

A fix :: (a → a) → a
B fix :: (a → a) → a → a
C fix :: a → a
D fix :: a

13
43. El tipo abstracto de datos Pila a (que representa una pila de valores de
tipo a) consta de las siguientes operaciones:

pilaVacia :: Pila a
meteEnPila :: a → Pila a → Pila a
sacaDePila :: Pila a → (a, Pila a)
topeDePila :: Pila a → a
estaVaciaPila :: Pila a → Bool

Suponiendo la implementación de las pilas como listas

type Pila a = [a]

indica cuál de las siguientes ecuaciones define la operación meteEnPila.

A meteEnPila x xs = x + + xs
B meteEnPila x xs = (x : xs)
C meteEnPila x xs = xs + + [x]
D meteEnPila x xs = xs

44. Dado el siguiente tipo algebraico que define un árbol de valores de tipo ⁀a

data Arbol a = Vacio | Nodo a [Arbol a]

indica qué calcula la siguiente función

sobreArbol :: (a → Bool) → Arbol a → Bool


sobreArbol p Vacio = True
sobreArbol p (Nodo x xs) = p x && and (map(sobreArbol p) xs)

donde && y and son los operadores predefinidos de la conjunción sobre


valores booleanos y sobre listas de valores booleanos respectivamente.

A Devuelve True si algún elemento del árbol cumple la condición p


B Devuelve True si todos los elementos del árbol cumplen la condi-
ción p
C Devuelve True si la raı́z del árbol cumple la condición p o si el
árbol es vacı́o
D Devuelve True si el árbol es vacı́o y False en caso contrario

14
45. Dada la siguiente función

triplas :: Int → [(Int, Int, Int)]


triplas n = [(x, y, z)|x ← [1..n], y ← [x..n], z ← [y..n]]

indica cuál es el resultado de evaluar la expresión triplas 3.

A [(1,1,1),(2,2,2),(3,3,3)]
B [(1,1,1),(1,1,2),(1,1,3),(1,2,2),(1,2,3),(1,3,3),(2,2,2),(2,2,3),
(2,3,3),(3,3,3)]
C [(1,1,1),(1,1,2),(1,1,3),(1,2,1),(1,2,2),(1,2,3),(1,3,1),
(1,3,2),
(1,3,3),(2,1,1),(2,1,2),(2,1,3),(2,2,1),(2,2,2),(2,2,3),...]
D [(1,1,1),(1,2,2),(1,3,3),(2,2,2),(2,3,3),(3,3,3)]

46. Dada la siguiente definición

multiploDe :: Int → Int → Bool


multiploDe p n = n ‘mod′ p == 0

que comprueba si su segundo argumento es múltiplo del primero, podemos


obtener una función esPar :: Int → Bool que comprueba si un número
es par mediante la siguiente aplicación parcial:

A esPar = multiploDe 2
B esPar x = multiploDe x 2
C esPar = multiploDe 0
D ninguna de las anteriores

47. Al evaluar en Haskell la siguiente expresión booleana se obtiene un error:

> Prelude > 2 < 3 < 4


ERROR : Ambiguous use of operator “(<)“ with “(<)“

Indica cuál de las siguientes afirmaciones es cierta :

A El error no se puede eliminar usando paréntesis


B El error se elimina si parentizamos la expresión como 2 < (3 < 4)
C El error se elimina si parentizamos la expresión como (2 < 3 < 4)
D El error se elimina si parentizamos la expresión como (2 < 3) < 4

15
48. Indica qué calcula el siguiente programa en Helium:

opera 0 a = [a]
opera n f a = a : opera (n − 1) f (f a)

A la lista [a, f a, . . . , fn a], donde fn a representa la expresión f(f(. . . (a) . . .))


con n ocurrencias del sı́mbolo f.
B la enésima potencia de a, es decir, an
C la lista [a, a, . . . , a] de longitud n
D la lista [f a, . . . , f a] de longitud n

49. ¿Cuál es el tipo inferido por Helium para la función opera de la pregunta
anterior?

A opera :: Int− > a− > a− > [a]


B opera :: Int− > a− > (a− > a)− > [a]
C opera :: Int− > (a− > a)− > a− > [a]
D opera :: Int− > (a− > a)− > a− > (a− > a)

50. Indica cuál de las siguientes asociaciones es cierta :

A En Haskell, la función f(x) = f(fx) compila sin errores y su tipo


es f :: a → [a]
B Un valor de tipo IO t es una acción que devuelve un valor de
tipo t.
C Haskell no infiere tipos.
D En Haskell no se pueden definir nuevos tipos de datos.

16
51. Indica con cuál de las siguientes definiciones de tipo se construyen árboles
binarios de elementos de tipo a:

A data Arbol a = Vacio | Nodo (Arbol a) a (Arbol a)


B data Arbol a = Vacio | Nodo a [Arbol a]
C data Arbol a = Vacio | Nodo a (Arbol a)
D data Arbol a = Vacio | a (Arbol a) (Arbol a)

52. Indica qué computa la siguiente función, siendo max la función que de-
vuelve el mayor de dos números:
pippo (x:xs) = foldl max x xs

A devuelve true si el primer elemento de la lista es el mayor de ésta


B devuelve el primer elemento de la lista
C computa el máximo de la lista
D computa la lista de los elementos más grandes, uno por cada
pareja de elementos de la lista

53. Completar la definición de la función zip3 que toma tres listas y devuelve
una lista de triplas:

zip3 (a : x) (b : y) (c : z) =
zip3 x y z = [ ]

A [a,b,c] ++ zip3(x,y,z)
B (a b c):zip3(x,y,z)
C (a,b,c):zip3 x y z
D a:b:c:(zip3 x y z)

17
54. Indica cuál de los siguientes programas implementa una función que trans-
forma un número entero positivo en una cadena de caracteres que contiene
los mismos dı́gitos, por ejemplo

pasaChar(125) = ”125”

sabiendo que chr(48) =′ 0′ .

pasaChar :: Int− > String


pasaChar n
A
| n < 10 = [chr(48 + n)]
| otherwise = (pasaChar (pasaChar (mod n 10))

pasaChar :: Int− > String


pasaChar n
B
| n < 10 = chr(48 + n)
| otherwise = (pasaChar (div n 10)) + +(pasaChar (mod n 10))

pasaChar :: Int− > String


pasaChar n
C
| n < 10 = [chr(48 + n)]
| otherwise = (pasaChar (div n 10)) + +(pasaChar (mod n 10))

pasaChar :: Int− > String


pasaChar n
D
| n < 10 = chr(48 + n)
| otherwise = (pasaChar (mod n 10)) + +(pasaChar (div n 10))

55. Indicar cuál de las siguientes afirmaciones es cierta, en relación a los pro-
gramas de la pregunta anterior, cuando se evalúa la expresión pasaChar
(-4):

A La evaluación entra en un bucle infinito.


B Se produce un error de tipos.
C Ninguno de los programas da el resultado esperado
D Se necesita añadir en todos ellos la siguiente condición:
| n < 0 = ” − ” + +(pasaChar(tail n))

18
56. Indica cuál de las siguientes opciones define correctamente en Haskell la
función miAccion :: IO(String) que lee un texto introducido desde el
teclado y lo pasa a mayúsculas:
A

miAccion = putStr ”Dame un texto : ”


getLinexs
putStr (map toUpper xs)

miAccion = do putStr ”Dame un texto : ”


xs ← getLine
putStr (map toUpper xs)

miAccion = do putStr ”Dame un texto : ”


xs ← getLine
return (map toUpper xs)

miAccion ys = do putStr ”Dame un texto : ”


xs ← getLine
ys ← map toUpper xs

19

También podría gustarte