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.