Altillo.com
> Exámenes > 
Universidad Nacional del Nordeste > 
Paradigmas y Lenguajes de Programación
Final A  |  
Paradigmas y Lenguajes de Programación (2016)  |  
UNNE
1. Explique en qué consiste la ligadura de variables y a que se llama VARIABLES 
DE ÁMBITO LÉXICO EN PROGRAMACIÓN FUNCIONAL, CON QUE OTRO TIPO DE PROGRAMACIÓN LO 
RELACIONARÍA.
El concepto de ligadura se refiere a la asociación o a la unión que se realiza 
entre una variable y su valor. Es decir se establece el nexo entre ambos. Según 
el momento de la ligación puede ser de dos tipos:
Una ligadura es estática si se establece antes de la ejecución y no se puede 
cambiar.
Una ligadura es dinámica si se establece en el momento de la ejecución y puede 
cambiarse de acuerdo a alguna regla específica del lenguaje.
Estas variables solo tienen sentido dentro del ámbito en el que este definida la 
función. Las variables de ámbito léxico son las que se definen localmente dentro 
de la sentencia defun en el cuerpo de un programa. Consiste en ligar las 
variables internamente para ser manipuladas al ser llamadas las subrutinas donde 
estas estén definidas. Se pueden relacionar con el concepto de “variables 
locales” proveniente de la programación estructurada, puesto que solo existen 
dentro del cuerpo de una función o procedimiento, y no se pueden acceder desde 
afuera.
2. Explique el concepto de lista impropia y de un par de ejemplos de las mismas.
Cuando el CDR de una estructura CONS apunta a un átomo en lugar de a una 
estructura CONS o NIL, la lista formada es una lista punteada, también conocida 
como lista impropia.
Cuando el último elemento de una lista no apunta a NIL, se genera una lista 
punteada. La ventaja de las listas punteadas es el ahorro de una casilla CONS. 
Sin embargo, se pierde en flexibilidad ya que el tratamiento de una lista no 
podrá depender de la marca de fin de lista. Además en una lista, que apunta como 
último elemento a NIL, permite la modificación de la misma añadiendo nuevas 
casillas CONS. Sin embargo una lista punteada no permite estas modificaciones ya 
que se eliminaría el último elemento de la lista punteada. Es decir el segundo 
apuntador de la casilla CONS de la lista punteada quedaría modificado por el 
nuevo valor. Un ejemplo erróneo: (LU MA MI JU VI SEMANA SABADO . DOMINGO 
FIN-DE-SEMANA) Esta lista no es sintácticamente correcta. Una lista punteada 
precisa que después del punto aparezca un objeto simple y después un paréntesis.
3. Explique qué diferencia existe entre el paradigma imperativo y el paradigma 
declarativo. Presente un ejemplo.
En la programación imperativa se describe paso a paso un conjunto de 
instrucciones que deben ejecutarse para variar el estado del programa y hallar 
la solución, es decir, un algoritmo en el que se describen los pasos necesarios 
para solucionar el problema. Ej: un lenguaje imperativo es el C.
En la programación declarativa las sentencias que se utilizan lo que hacen es 
describir el problema que se quiere solucionar, lo que se busca, pero no las 
instrucciones necesarias para solucionarlo. Esto último se realizara mediante 
mecanismos internos de inferencia de información a partir de la descripción 
realizada. Ejemplo de este modelo: el lenguaje funcional LISP.
4. Explique qué se entiende por función predicado en programación funcional. De 
tres ejemplos explicando a que se refiere cada uno.
Los predicados son funciones en las que se verifican los argumentos para ciertas 
condiciones y devuelven Falso o NIL si la condición no es verdadera, o True o 
NO-NIL si es correcta. Sirven para comparar valores de números, verificar tipos 
de datos, detener el proceso iterativo y controlar el flujo de ejecución.
Ej: NUMBERP objeto: devuelve T si el objeto evaluado es un número.
LISTP objeto: devuelve T si el objeto es CONS o NIL (la lista vacia).
TYPEP objeto tipo-especificado: es cierto cuando el objeto pertenece al tipo 
especificado.
5. ¿Qué entiende por funciones destructivas? De dos ejemplos de cómo funcionan 
las mismas.
Son aquellas funciones que modifican el estado de los argumentos sobre los que 
operan, es decir, un atributo se modifica al terminar de ejecutarse la función.
Ej: (RPLACA lista elem): sustituye la cabeza o primer elemento de una lista por 
elem.
>>(setq a ‘(1 2 3))
<<(1 2 3)
>>(rplaca a ‘7)
<<(7 2 3)
>>a
<<(7 2 3)
(POP lista): elimina el primer elemento de la lista.
>>(pop a)
<<7
>>a
<<(2 3)
6. ¿En programación, que entiende por enlace? ¿Este concepto tiene relación con 
el alcance y la visibilidad de una declaración? 
Un concepto común a todos los lenguajes de programación es la habilidad del 
programador para enlazar o relacionar identificadores con entidades tales como 
constantes, variables, procedimientos, funciones y tipos.
La buena elección de identificadores ayuda a hacer que los programas sean más 
comprensibles y fáciles de interpretar.
Más aún, relacionar un identificador con una entidad en un lugar y luego 
utilizar ese identificador para hacer referencia a esa entidad en otros lugares, 
hace que los programas sean más flexibles: si la implementación de la entidad 
cambiara, los cambios se deberían hacer en un único lugar y no en todos los 
lugares donde se usa.
Si, tiene relación. Se puede entender los efectos de las declaraciones teniendo 
en cuenta al enlace y ámbito. Una declaración produce una asociación o un enlace 
entre el identificador declarado y la entidad que denotará. Un ámbito es un 
conjunto de enlaces.
En general cada declaración tiene un cierto alcance, que tiene que ver con la 
porción del programa sobre el cual la declaración es efectiva. 
Cuando se habla de alcance y visibilidad los identificadores pueden aparecer en 
dos contextos diferentes. Se denomina ocurrencia de enlace al punto en donde un 
identificador se declara, y ocurrencia de aplicación a cada aparición del 
identificador cuando denota a la entidad a la cual fue enlazado. 
De acuerdo a lo anterior, el enlace puede ser estático a dinámico y tiene que 
ver con el momento en que se determina que ocurrencia de enlace de un 
identificador I se corresponda con la ocurrencia de aplicación de I. La 
asociación entre la ocurrencia de aplicación y enlace es fija.
- Enlace estático: se puede hacer en tiempo de compilación determinando que 
ocurrencia de enlace de I se corresponde con una ocurrencia de aplicación de I 
dada, solo con examinar el código del programa, encontrando el bloque que 
contiene una ocurrencia de aplicación de I que también contiene una ocurrencia 
de enlace de I. 
- Enlace dinámico: la ocurrencia de enlace de I que se corresponde con una 
ocurrencia de aplicación de I depende del flujo de control dinámico del 
programa. La entidad denotada por I es la declaración elaborada más 
recientemente de I dentro del bloque activo actual.
7. Diga cuando un identificador está sobrecargado. Enuncie que tipos de 
sobrecarga conoce.
Un identificador u operador se dice que está sobrecargado si denota 
simultáneamente dos o más funciones distintas, es decir si existen dos o más 
cuerpos de función definidos con ese nombre, las cuales proporcionan acciones 
semánticas similares sobre diferentes tipos de datos. La sobrecarga es aceptable 
solo cuando cada llamada a función no es ambigua (f puede ser identificada 
unívocamente)
Considerando un identificador u operador I que denota una función f1 del tipo 
S1T1 y otra función f2 del tipo S2T2, podemos diferenciar dos tipos de 
sobrecarga:
Sobrecarga independiente del contexto (como en Pascal y ML): requiere que S1 y 
S2 sean distintos. Considere la llamada a la función I (E).
Si el parámetro actual E es del tipo S1, entonces I denota a f1 y el resultado 
es del tipo T1; si E es del tipo S2, entonces I denota f2 y el resultado será 
del tipo T2. Con la sobrecarga independiente del contexto la función que se 
llama es identificada unívocamente por el parámetro actual.
Sobrecarga dependiente del contexto (como en Ada): requiere que S1 y S2 sean 
distintos o que T1 y T2 sean distintos. Si S1 y S2 son distintos, la función a 
llamar puede identificarse como anteriormente. Si S1 y S2 no son distintos, pero 
T1 y T2 son distintos, el contexto debe tenerse en cuenta para identificar la 
función que se llamará. Considere la llamada a la función I(E), donde E es del 
tipo S1 (S2). Si la llamada a la función ocurre en un contexto donde se espera 
una expresión del tipo T1, entonces I debe denotar a f1; si la llamada a la 
función ocurre en un contexto donde se espera una expresión del tipo T2, 
entonces I debe denotar f2. Con la sobrecarga dependiente del contexto, es 
posible formular expresiones en las cuales la función a llamar no pueda ser 
identificada unívocamente pero el lenguaje debe prohibir esas expresiones 
ambiguas.
8. En programación lógica, defina que entiende por sustitución, unificador y 
UNIFICADOR MAS GENERAL (MGU). ¿Qué utilidad tiene un unificador?
Sustitución: Una sustitución es un conjunto de asignaciones del tipo X:= t dónde 
X es una variable y t es un término. En la sustitución no puede existir más de 
una sustitución a la misma variable. Es necesario aclarar que una sustitución 
tiene alcance clausular.
Ejemplos:
{ X:= juan, Y:= noel}
{ W:= Z, R := EMPLEADO (T, 3200)}
{ Q:= [], R:= [X, Z]}
Aplicación de una sustitución: Dada una sustitución y un predicado P, la 
aplicación de  a P, produce un nuevo predicado que se denota P , y que 
corresponde al predicado inicial P donde toda variable asignada en q se cambia 
por el término correspondiente, y las otras variables permanecen incambiadas.
Unificador: Dadas dos expresiones del lenguaje definido (por ejemplo dos 
predicados) E1 y E2. Se llama unificador, a una sustitución tal que cumple que:
E1E2
Es decir que la aplicación de la sustitución a ambas expresiones da la misma 
expresión.
Ejemplos:
i) Dadas los predicados padre (Z, diego) y padre (jorge, diego).
La sustitución  = {Z := jorge} es un unificador de las mismas.
ii) Dadas los predicados tio (X, diego) y tio (W, diego).
La sustitución  = {X := W} es un unificador de las mismas.
La sustitución  = {W := X} es un unificador de las mismas.
La sustitución  = {X := guille, W:= guille} es un unificador de las mismas.
iii) Dadas los predicados r (Z, diego) y r (diego, jorge).
No existe unificador para ambos.
Unificador más general
De la definición y de los ejemplos presentados anteriormente, surge que existen 
expresiones para las cuales no existe un unificador y en otros casos, es posible 
encontrar más de un unificador.
Para el procedimiento de demostración, y en el caso de existir más de un 
unificador entre dos predicados que permita aplicar la regla de resolución, va a 
interesar aquel que sea “más general”, en el sentido que necesita asignaciones 
menos específicas de términos a variables. En el ejemplo 2, los dos primeros 
unificadores son más generales (a menos de un renombramiento) que el tercero.
Definimos ahora que es un MGU (unificador más general).
Dadas dos sustituciones  1 y  2 y ambas son unificadores de las expresiones E1 
y E2, se dice que  1 es más general que 2 si existe una sustitución  3 tal 
que:
E1  1  3 = E2  2
9. Calculo Lambda. Sintaxis. ¿Qué buscan los operadores alfa y beta? ¿Qué 
utilidad tienen? Ejemplo.
El cálculo lambda es un sistema formal diseñado para investigar: la definición 
de funciones, la aplicación de una función, la recursividad. La principal 
característica del cálculo lambda es su simplicidad, ya que permite efectuar 
solo dos operaciones:
Abstracción funcional: Definir funciones de un solo argumento y con un cuerpo 
especifico, denotado por la siguiente terminología: x . B.
Aplicación de función: Aplicar alguna de las funciones definidas sobre un 
argumento real (A). Es decir (x.B) A.
Sintaxis
Consideramos un conjunto finito de variables {a, b, c, ..., x, y, z}.
El conjunto de todas las -expresiones por la siguiente gramática libre de 
contexto en BNF.
<expr> ::= <var>
| (<var>.<expr>) Abstracción
| (<expr><expr>) Aplicación
Las dos primeras reglas generan funciones y la tercera, describe la aplicación 
de una función a un argumento.
Ejemplos
x.x
x .(y.y)
f.f (x.x)
10. ¿Qué ventajas tienen los sistemas polimórficos respecto de los monomórficos? 
Explique características de cada uno.
Sistema Monomórfico: Un sistema de tipos monomórfico es aquel en dónde las 
constantes, variables, parámetros y resultado de función, tienen un único tipo. 
El sistema de tipos de Pascal es básicamente monomórfico.
Cada constante, variable, resultado de función y parámetro formal, deben 
declararse con un tipo específico. Es insatisfactorio, especialmente para 
escribir software reusable.
Hay algoritmos estándares que solo deben cambiar el tipo de los valores con que 
operan. (Por ej. Algoritmos de Ordenación). Surgen conceptos como: Sobrecarga, 
Polimorfismo y Herencia.
Polimorfismo: es una propiedad de una única abstracción que tiene una (amplia) 
gama de tipos relacionados; la abstracción opera uniformemente sobre sus 
argumentos cualquiera sea su tipo.
Las ventajas de estos sistemas es la posibilidad de reutilización de código, 
puesto que sirve para una amplia gama de tipos y no se tiene que hacer uno nuevo 
para cada caso. Además se puede hacer código genérico, y así más general.
11. Describa los tipos de pasos de parámetros a una abstracción. ¿Cuál es la 
diferencia fundamental que existe?
Parámetros: Aumentan la potencia del concepto de Abstracción.
Parámetro formal: Es un identificador que se usa en una abstracción para hacer 
referencia a un argumento. 
Parámetro actual: Una expresión o frase que se devuelve un argumento. 
Argumento: es el valor u otra entidad que se pasa a una abstracción.
Paso de Parámetros
Mecanismo de copia: Un mecanismo de copia permite que valores se copien a y/o 
desde una abstracción cuando se la llama. El parámetro formal X denota una 
variable local para la abstracción. Un valor se copia en X a la entrada de la 
abstracción, y/o se copia de X (a una variable no local) a la salida de la 
abstracción. Debido a que X es una variable local, se crea a la entrada de la 
abstracción y se elimina a la salida.
Paso de Parámetros
Un parámetro por valor es una variable local X que se crea a la entrada de la 
abstracción y se le asigna el valor del argumento. Debido a que X se comporta 
como una variable local, su valor puede ser inspeccionado y actualizado. Sin 
embargo cualquier actualización de X no tiene efecto en ninguna variable fuera 
del procedimiento.
Un parámetro resultado es todo lo contrario del anterior. En este caso, el 
argumento debe ser una referencia a una variable. De nuevo una variable local X 
se crea, pero su valor inicial es indefinido. A la salida de la abstracción el 
valor final de X es asignado a la variable argumento.
Parámetros valor-resultado. El argumento, de nuevo, debe ser una referencia a 
variable. En la entrada de la abstracción, la variable local X se crea y se le 
asigna el valor actual de la variable argumento. A la salida, el valor final de 
X se asigna nuevamente a la variable argumento.
Mecanismo por referencia: este mecanismo permite que un parámetro formal, sea 
enlazado directamente al argumento. Proporciona una semántica uniforme para el 
paso de parámetros de cualquier tipo de valores.
- parámetro constante: el argumento debe ser un valor. El parámetro formal se 
enlaza al valor del argumento durante la activación del procedimiento. 
- parámetro variable: el argumento debe ser una referencia a una variable. El 
parámetro se enlaza a la variable argumento durante la activación del 
procedimiento. Por lo tanto cualquier actualización o inspección del parámetro 
formal es realmente una actualización o inspección indirecta de la variable 
argumento. 
- parámetro procedural: el argumento debe ser un procedimiento. El parámetro 
formal se enlaza al procedimiento durante la activación del procedimiento 
llamado. Por lo tanto cualquier llamada a FP es una llamada indirecta al 
procedimiento que se pasa como argumento.
- Parámetro funcional: el argumento es una abstracción de función. El parámetro 
formal se enlaza a la función durante la activación de la llamada a la 
abstracción. Por lo tanto cualquier llamada indirecta es una llamada a la 
función.
• Estos anteriores no son mecanismos distintos, hay que pensar a la abstracción 
rodeada por un bloque que contiene una definición que enlaza al parámetro formal 
con cada argumento. 
12. Explique confluencia y terminación en calculo Lambda.
Propiedad de Confluencia: Teorema (de Church-Rosser):
Para toda -expresión M, si M * Py M * Q, existe una -expresión E tal que P 
*Ey Q * E(es la "propiedad del diamante").
M
P Q
E
Consecuencia (corolario): Si M admite forma normal N, ésta es única salvo 
-reducción (renombramiento de variables).
Propiedad de Terminación: Observación: No toda secuencia de -reducciones 
termina como en el caso visto: = (x.x x) (y.y y)
Teorema: Si una secuencia M *… termina, entonces lo hace en una forma normal. 
Es decir, entonces M admite forma normal.
Propiedad de Terminación. Observación: Si M admite forma normal, esto no 
significa que cualquier secuencia que empiece en M, termine.
Ejemplo: (y.y) (z.z) admite forma normal (z.z). Para intentar obtenerla 
podemos seguir varios (dos) caminos:
Voraz: empezando "por dentro" (...)
(y.y) (z.z) (y.y) (z.z) ...(no termina)
Perezoso: empezando por fuera
(y.y) (z.z) z.z
Teorema (de "estandarización"): Si E admite forma normal, y reducimos eligiendo 
los -redex "de izquierda a derecha, y de fuera hacia dentro", (forma 
"perezosa") entonces la reducción termina (en la forma normal de E).
13. DEFINICION DE VARIABLES EN PARALELO. DESCRIBA DOS FUNCIONES QUE UTILICEN 
ESTE TIPO DE DEFINICION.
La asignación de variable en paralelo se refiere a las funciones que van dándole 
valores a variables creadas en su estructura y que todas se asignan al mismo 
tiempo, por ende, no se puede asignar una de estas variables a otra, puesto que 
al momento de la asignación ninguna tiene contenido. Una de estas funciones es 
la llamada LET, que permite crear variables locales interiores a otra función. 
Su forma general consta de dos partes: asignación de variables, que es una lista 
de listas donde cada lista consta de un nombre de variable y una forma de 
evaluar, y un cuerpo, que es como el cuerpo de un DEFUN. Cuando un LET es 
llamado las formas se evalúan asignando paralelamente valores a todas las 
variables. Un segundo ejemplo es la función DO, que consta de 3 partes: lista de 
parámetros, test de final y cuerpo, y sirve para iterar tantas veces como lo 
permita ese test. La lista de parámetros liga a las variables con sus valores 
iniciales y en cada ciclo se asignan nuevos valores dependiendo de la función de 
incremento indicada. Primero se activa la ligadura de los parámetros y después 
se evalúa el test final y si no se cumple, se ejecuta el cuerpo.
14. ¿Qué conceptos relacionarías con un sistema de tipo polimórfico? Cuáles son 
sus características y sus ventajas.
Polimorfismo: es una propiedad de una única abstracción que tiene una (amplia) 
gama de tipos relacionados; la abstracción opera uniformemente sobre sus 
argumentos cualquiera sea su tipo. Los conceptos asociados a estos sistemas son 
los de herencia (subtipos heredan características de súper tipos o tipos padre), 
reutilización, sobrecarga, ligadura dinámica.
Las ventajas de estos sistemas es la posibilidad de reutilización de código, 
puesto que sirve para una amplia gama de tipos y no se tiene que hacer uno nuevo 
para cada caso. Además se puede hacer código genérico, y así más general y de 
mayor aplicación.
15. ¿Qué entiende por ámbito, alcance y visibilidad? ¿tienen relación entre si 
estos conceptos? ¿para qué sirven?
Un concepto común a todos los lenguajes de programación es la habilidad del 
programador para enlazar o relacionar identificadores con entidades tales como 
constantes, variables, procedimientos, funciones y tipos.
La buena elección de identificadores ayuda a hacer que los programas sean más 
comprensibles y fáciles de interpretar.
Más aún, relacionar un identificador con una entidad en un lugar y luego 
utilizar ese identificador para hacer referencia a esa entidad en otros lugares, 
hace que los programas sean más flexibles: si la implementación de la entidad 
cambiara, los cambios se deberían hacer en un único lugar y no en todos los 
lugares donde se usa.
La mayoría de los lenguajes de programación permiten diefinir un identificador 
en diferentes partes de un programa, inclusive representando entidades 
distintas.
Para entender los efectos de las declaraciones se considera al enlace y ámbito. 
Una declaración produce una asociación o un enlace entre el identificador 
declarado y la entidad que denotará.
Un entorno o ámbito es un conjunto de enlaces. Cada expresión y comando se 
interpreta en un ámbito particular y todos los identificadores que se encuentran 
en la expresión o comando, deben haberse enlazado en ese entorno. Expresiones y 
comandos en diferentes partes del programa deben interpretarse como diferentes 
ámbitos.
Si, tiene relación. En general cada declaración tiene un cierto alcance, que 
tiene que ver con la porción del programa sobre el cual la declaración es 
efectiva. 
Cuando se habla de alcance y visibilidad los identificadores pueden aparecer en 
dos contextos diferentes. Se denomina ocurrencia de enlace al punto en donde un 
identificador se declara, y ocurrencia de aplicación a cada aparición del 
identificador cuando denota a la entidad a la cual fue enlazado. 
De acuerdo a lo anterior, el enlace puede ser estático a dinámico y tiene que 
ver con el momento en que se determina que ocurrencia de enlace de un 
identificador I se corresponda con la ocurrencia de aplicación de I. La 
asociación entre la ocurrencia de aplicación y enlace es fija.
- Enlace estático: se puede hacer en tiempo de compilación determinando que 
ocurrencia de enlace de I se corresponde con una ocurrencia de aplicación de I 
dada, solo con examinar el código del programa, encontrando el bloque que 
contiene una ocurrencia de aplicación de I que también contiene una ocurrencia 
de enlace de I. 
- Enlace dinámico: la ocurrencia de enlace de I que se corresponde con una 
ocurrencia de aplicación de I depende del flujo de control dinámico del 
programa. La entidad denotada por I es la declaración elaborada más 
recientemente de I dentro del bloque activo actual.
16. Defina sustitución y unificador. ¿tienen relación entre sí? ¿para que se 
utilizan?
Sustitución: Una sustitución es un conjunto de asignaciones del tipo X:= t dónde 
X es una variable y t es un término. En la sustitución no puede existir más de 
una sustitución a la misma variable. Es necesario aclarar que una sustitución 
tiene alcance clausular.
Ejemplos: 
{ X:= juan, Y:= noel}
{ W:= Z, R := EMPLEADO (T, 3200)}
{ Q:= [], R:= [X, Z]}
Aplicación de una sustitución: Dada una sustitución y un predicado P, la 
aplicación de  a P, produce un nuevo predicado que se denota P , y que 
corresponde al predicado inicial P donde toda variable asignada en qse cambia 
por el término correspondiente, y las otras variables permanecen incambiadas.
Unificador: Dadas dos expresiones del lenguaje definido (por ejemplo dos 
predicados) E1 y E2. Se llama unificador, a una sustitución tal que cumple que:
E1E2
Es decir que la aplicación de la sustitución a ambas expresiones da la misma 
expresión.
Ejemplos:
i) Dadas los predicados padre (Z, diego) y padre (jorge, diego).
La sustitución  = {Z := jorge} es un unificador de las mismas.
ii) Dadas los predicados tio (X, diego) y tio (W, diego).
La sustitución  = {X := W} es un unificador de las mismas.
La sustitución  = {W := X} es un unificador de las mismas.
La sustitución  = {X := guille, W:= guille} es un unificador de las mismas.
iii) Dadas los predicados r (Z, diego) y r (diego, jorge) no existe unificador 
para ambos.
17. ENUNCIE Y DESCRIBA LAS CARACTERISTICAS DE COMMON LISP.
Portabilidad: Excluye aquellas características que puedan ser implementadas en 
la mayoría de las máquinas. Se diseñó para que fuera fácil construir programas 
lo menos dependiente posible de las máquinas. 
Consistencia: muchas implementaciones LISP son internamente inconsistentes en el 
sentido de que el intérprete y el compilador pueden asignar distintas semánticas 
al mismo programa. Esta diferencia radica fundamentalmente en el hecho de que el 
intérprete considera que todas las variables tienen alcance dinámico. 
Expresividad: recoge las construcciones más útiles y comprensibles de dialectos 
Lisp anteriores. 
Eficiencia: tiene muchas características diseñadas para facilitar la producción 
de código compilado de alta calidad. 
Potencia: suministradas por multitud de paquetes que corren sobre el núcleo. 
Estabilidad: se pretende que el corazón cambie lentamente y solo cuando el grupo 
de expertos encargados del estándar así lo decidan por mutuo acuerdo después de 
examinar y experimentar con las nuevas características. 
18. ¿Qué aplicabilidad tiene el desarrollo en programación funcional? ¿Se puede 
utilizar para el desarrollo de programas administrativos? ¿Por qué?
La programación funcional tiene una aplicabilidad en el modelo matemático de 
composición funcional donde el resultado de un cálculo es la entrada del 
siguiente, y así sucesivamente hasta que una composición produce el valor 
deseado. 
Como su nombre lo dice operan solamente a través de funciones. Cada función 
devuelve un solo valor, dada una lista de parámetros. No se permiten 
asignaciones globales, llamados efectos colaterales. La programación funcional 
proporciona la capacidad para que un programa se modifique así mismo, es decir 
que pueda aprender.
Cualquier lenguaje de programación se puede utilizar para el desarrollo de 
programas administrativos, algunos tiene mejor destaque en ciertas áreas y otros 
no, pero de poder se puede. En este caso la programación funcional tiene mejor 
enfoque y robustez en programas matemáticos, estadísticos y análisis, justamente 
por su semejanza con las funciones matemáticas y sus raíces en el cálculo 
lambda.
19. DESCRIBA QUE ES EL LISP LISTENER. DESCRIBA SU ESTRUCTURA.
El Lisp Listener es el ciclo que realiza constantemente Lisp, siempre está a la 
espera de nuevas entradas. Cuando recibe una entrada, evalúa la s-expresión, 
espera al return, si la forma es atómica o espera a paréntesis de cierre si es 
una lista. Finalmente imprime el resultado y el ciclo comienza de nuevo. A este 
ciclo se llama ciclo READ-EVAL-PRINT expresado a través de las funciones Lisp 
(PRINT (EVAL (READ))). Por tanto, el evaluador es el mecanismo que ejecuta las 
formas y los programas LISP. Lisp siempre tratará de evaluar todo lo que se le 
suministre; esto es realizado a través de la función eval; (eval form) se evalúa 
la forma y se devuelve el valor. Los números, caracteres y strings tienen reglas 
de evaluación simples cuya evaluación devuelve su propio valor.
20. Describa la forma clausal de Horn. Regla de resolución. Explique cómo se 
realiza la deducción en programación lógica.
Forma clausal de Horn: Todas las variables de la formula están cuantificadas 
universalmente, no es necesario incluir cuantificadores universales. Todos los 
cuantificadores se eliminan y todas las variables de la formula quedan 
cuantificadas implícitamente.
La formula se compone de varias clausulas y cada clausula se compone de varias 
literales conectadas exclusivamente por conectores lógicos OR. Entonces toda 
clausula es una disyunción de literales.
Las clausulas mismas se conectan exclusivamente mediante conectores lógicos AND 
para construir una formula. Entonces la forma clausal de una formula es una 
conjunción de clausulas.
Regla de Resolución: Es una regla de inferencia que se utiliza en la 
programación lógica para realizar deducciones. Un programa lógico consiste en un 
conjunto de clausulas de programa, que son consideradas como un conjunto de 
hipótesis. La regla de resolución puede aplicarse a la hipótesis para deducir 
consecuentes. Sin embargo, hay un método particular usado en programación lógica 
para realizar estas deducciones denominado refutación. Deduccion: Si queremos 
deducir r de un programa, debemos agregar a la hipótesis –r mediante el método 
de refutación o contradicción.
21. ¿Qué entiende por orden de evaluación de parámetros? Explique las técnicas 
que conoce.
El orden de evaluación se refiere exactamente al momento en que cada parámetro 
actual se evalúa cuando se llama a una abstracción. Hay dos posibilidades: 
evaluar el parámetro actual en el punto de llamada; retardar su evaluación hasta 
que el argumento realmente se use.
Evaluación impaciente (aplicativo): se evalúa el parámetro actual una sola vez, 
y en efecto se sustituye el resultado en cada ocurrencia del parámetro formal.
Evaluación en orden normal: no se evalúa inmediatamente el parámetro actual, si 
no que se sustituye el parámetro actual por cada ocurrencia del parámetro 
formal.
- Evaluación perezosa (lazy evaluation): la evaluación de orden normal es 
ineficiente cuando causa que el mismo argumento sea evaluado varias veces. SI el 
valor del argumento siempre es el mismo, puede ahorrarse tiempo si el valor del 
argumento es almacenado tan pronto como sea evaluado por primera vez, y el valor 
almacenado pueda ser usado cada vez que se necesite. Esta evaluación se denomina 
perezosa, el argumento se evalúa solo cuando se lo necesita por primera vez.
22. Diferencia entre control de tipo estático y dinámico. Ventajas y 
desventajas.
Control de Tipos Estático: cada variable y parámetro tiene un tipo fijo y es 
elegido por el programador. El tipo de cada expresión puede ser deducido y la 
comprobación de tipo se realiza en tiempo de compilación. La mayoría de los 
lenguajes de alto nivel son estáticamente tipeados. EJ: PASCAL. 
En síntesis:
- Cada variable y parámetro tiene un tipo fijo.
- Se conoce el tipo de cada expresión.
- La comprobación se realiza en tiempo de compilación.
Control de Tipos Dinámico: solo las constantes tienen un tipo fijo. Ninguna 
variable o parámetro tiene un tipo designado, pero pueden tomar valores de 
diferente tipo en diferentes momentos. El tipo de los operandos deben ser 
chequeados antes de realizar una operación en tiempo de ejecución. EJ: LISP.
En síntesis: 
- Solo los valores tienen un tipo fijo.
- Las variables y parámetros no tienen un tipo designado, pero pueden tomar 
valores de diferente tipo en diferentes momentos.
- La comprobación se realiza en tiempo de ejecución.
23. ¿Para qué sirve el operador beta en cálculo lambda? De una definición 
formal. Ejemplifique. 
Igualdad en expresiones lambda
Escribimos M=βN si M y N son iguales según la igualdad beta (la cual se explica 
posteriormente) y se dice que tienen el mismo valor. Dicho de otra forma, es 
aplicar una abstracción M.M a un argumento N. 
Ejemplo:
Observemos de nuevo la función cuadrado: escrita en LISP.
(defun cuadrado(x) (* x x));
(Cuadrado 5) = 5 *5: es la invocación de la función con parámetro 5, también la 
evaluación remplazando en el cuerpo de la función el parámetro5.
Utilizando expresiones lambda se puede escribir:
A x. (* x x) es la abstracción de la función cuadrado. Sea M el cuerpo *(xx) y N 
la función constante 5, entonces (Ax. (*xx))5 =β25 según la igualdad beta.
24. ¿QUÉ ES UN PARADIGMA DE PROGRAMACION? DESCRIBA PROGRAMACION LOGICA Y 
FUNCIONAL.
Un paradigma es un marco de referencia que impone reglas sobre cómo se deben 
hacer las cosas, indican que es válido dentro del paradigma y que esta fuera de 
sus límites, por ende un paradigma distinto implica nuevas reglas, elementos, 
limites y maneras de pensar, o sea implica un cambio.
También pueden ser considerados como patrones de pensamiento para la resolución 
de problemas.
UN PARADIGMA DE PROGRAMACION es una forma de representar y manipular el 
conocimiento. Representa un enfoque particular o filosofía para la construcción 
del software. No es mejor uno que otro sino que cada uno tiene ventajas y 
desventajas. Además, hay situaciones donde un paradigma resulta más apropiado 
que otro.
- Paradigma funcional: es un modelo matemático de composición funcional (las 
funciones son tratadas como valores de primera clase) con orígenes en el cálculo 
Lambda, donde el resultado de un cálculo es la entrada del siguiente y así hasta 
que una composición produce e valor deseado. Operan solamente a través de 
funciones. Cada función devuelve un solo valor, dada una lista de parámetros. La 
programación funcional proporciona la capacidad para que un programa se 
modifique a sí mismo.
o Existen dos categorías de lenguajes funcionales: puros e híbridos. Donde los 
híbridos son menos dogmaticos que los puros al admitir conceptos tomados de los 
lenguajes imperativos, como la secuencias de instrucciones o la asignación de 
variables. EJ: Haskell(puro); LISP(hibrido)
- Paradigma lógico: se basa en un subconjunto del cálculo de predicados, 
incluyendo instrucciones escritas en formas conocidas como clausulas de Horn 
(sentencias de lógica de primer orden). Este paradigma puede deducir nuevos 
hechos a partir de otros hechos conocidos, utilizando un método mecánico de 
demostración llamado resolución. Representa conocimiento mediante relaciones 
(predicados) entre objetos (datos).
Las relaciones se especifican con reglas y hechos. La ejecución consiste en la 
demostración de hechos sobre las relaciones por medio de preguntas.
25. EXPLIQUE REGLA DE RESOLUCION EN LA LOGICA DE PREDICADOS.
Supongamos que t1,…,tn y s1,…,sn son términos tales que ti y si son unificables 
con un MGU (Unificador Mas General) para 1<=i<=n y C1 y C2 son clausulas.
La resolución dice que:
C1 v R(t1,…,tn) y C2 v ¬R(s1,…,sn) podemos derivar C1v C2
Donde R es un símbolo predicativo.
Podemos usar los mismo métodos que en la lógica proposicional para mostrar que 
para clausulas de Horn:
(Q1^…^Qn)  R(t1,…,tn), (R(s1,…,sn)^…^P1^Pm)  S
|
----- (Q1^…^Qn^P1^…^Pm)  S
| Res
Donde es un MGU para ti, y si (1<=i<=n)
26. ¿EN QUE SE BASA LA LOGICA DE PREDICADOS?
Debido a que mediante el uso del Cálculo proposicional el conocimiento pierde 
mucho de su significado cuando se la representa, se desarrollo una forma lógica 
mas general capaz de representar todos los detalles expresados en las 
sentencias. S la lógica de Predicados.
La lógica de predicados está basada en la idea de las sentencias realmente 
expresan relaciones entre objetos, así como también cualidades y atributos de 
tales objetos. Los objetos pueden ser personas, objetos físicos, o conceptos. 
Tales cualidades, relaciones o atributos, se denominan predicados. Los objetos 
se conocen como argumentos o términos de predicado.
27. DESCRIBA TIPOS COMPUESTOS Y LOS DISTINTOS METODOS DE COMPOSICION.
Un tipo compuesto es un tipo cuyos valores están compuestos o estructurados a 
partir de valores más simples (primitivos). Los lenguajes de programación 
soportan una amplia variedad de estructuras de datos: tuplas, registros, 
arreglos, conjuntos, strings, listas, arboles, archivos secuenciales, archivos 
directos, etc. 
Estos pueden ser estudiados a partir de distintos conceptos:
- Producto cartesiano (tuplas y registros): un tipo simple de composición de 
valores, donde los valores de dos tipos son apareados. SxT es el conjunto de 
todos los pares ordenados de valores, donde el primer valor de cada par se toma 
del conjunto S y el segundo de T.
• S x T={ (x,y) / x € S; y € T}
• Cardinalidad: #S x #T
- Uniones disjuntas (variantes y uniones): los valores se toman de uno de dos 
tipos. S+T es el conjunto de valores donde cada valor es tomado ya sea de S o de 
T y es rotulado (izq o der) para indicar de que conjunto fue tomado. No es lo 
mismo que la unión común ya que el rotulo nos permite identificar de donde un 
valor fue tomado.
• S+T={ izq x / x € S } U { der y / y € T}
• Cardinalidad: #S + #T
- Mapeo (arreglos y funciones): considerando la función m que relaciona cada 
valor de x en S con un valor de T. Los valores de T son llamados imágenes de x 
bajo m y se escribe m(x).
M: S  T significa que es una función de S en T
S  T definimos el conjunto de todas las funciones posibles de S en T.
• S  T = {m / x € S m(x) € T }
• Cardinalidad: (#T) ^ #S
- Conjunto potencia (conjuntos): considerando un conjunto de valores denominado 
S, nos interesan los valores que son entre sí, subconjuntos de S. El conjunto 
potencia de S es el conjunto de todos los subconjuntos. Las operaciones básicas 
son: pertenencia, inclusión, unión e intersección.
• Con. Potencia S = { s / s Ç S }
• Cardinalidad: #(Con. Potencia S) = 2 ^ #S
- Tipos recursivos (estructuras de datos dinámicas): aquel que se compone de 
valores del mismo tipo y se define en términos de sí mismo.
• Cardinalidad: infinito.
28. DESCRIBA λLAMBDA REDUCCIONES
La evaluación de una expresión se compone de pasos de reducción donde cada uno 
de los pasos se obtiene por reescritura:
e  e’
Se parte de un estado inicial (expresión inicial) y mediante un proceso de 
reescritura se obtiene un estado final (expresión final)
Cada reducción de e, reemplaza cierta subexpresion de acuerdo con ciertas 
reglas; tales subexpresiones se llaman redex (reducible expression)
Las reglas de reescritura que se utilizan para reescribir un redex son:
- S-Reducción: transforma constantes.
- Alfa-Reducción o Conversión: renombramiento de variables.
- Beta-Reducción: proceso de copia del argumento sobre el cuerpo de la 
abstracción, reemplazando todas las ocurrencias de la variable instanciable por 
el argumento.
- N-Reducción: expresa la idea de que dos funciones son lo mismo si dan el mismo 
resultado para todos sus argumentos.