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 S1T1 y otra función f2 del tipo S2T2, 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:
E1E2
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:
E1E2
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 C1v 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.

 

Preguntas y Respuestas entre Usuarios: