Final 19/11/2023 (Paradigmas)

De Cuba-Wiki

Prolog: Me pidió dar un programa que genere todos los árboles binarios (con constructores Nil y Bin izq der) de n nodos. Dijo que quizás era muy díficil entones me terminó pidiendo uno que genere las rotaciones de una lista. Sea L=[1, 2,3] => [[1,2,3],[2,3,1],[3,1,2]].

Lambda: Me preguntó si podía existir un término tipable M tal que M M esté bien tipado. Me pidió hacer una derivación de tipos para probar que no existía, acá hubiese estado bueno haber practicado ejercicios de tipo parcial. Me pidió explicar subtipado, lo expliqué conceptualmente dando la semántica y creo que hubiese querido una explicación más sintáctica. Me preguntó si el subtipado era reflexivo, antisimétrico, completo. Martelli Montanari: dar la especificación del algoritmo. El MGU es único? Definir qué es un conjunto de ecuaciones de unificación, qué es la unificación. Dar un ejemplo donde hay varias sustituciones que resuelven un problema de unificación.

Haskell: implementar zipWith :: (a -> b -> c) -> [a] -> [b] -> [c] que toma una función que combina un elemento de la primer lista con uno de la segunda lista (posición por posición no producto cartesiano) usando foldr, acá es el truco de que la función de combinación del foldr devuelva una función.

Objetos: Nada

Fue medio jodido el final con muchos momentos de no saber qué responder pero al final siento que fue copado con la nota.


Prolog: dado un alfabeto generar todas las posibles combinaciones de símbolos (de cualquier tamaño, podían contener repetidos)

Lógica: me dio la fórmula “para todo x existe y tal que x = y” y me preguntó si era válida (rta: no es válida porque depende de que la definición de igualdad haga que sea reflexiva) me dijo que escriba esa propiedad y que pruebe que la fórmula es válida (igualdad reflexiva -> la fórmula que me dio) usando resolución

Al usar resolución apareció un MGU y me pregunto sobre el algoritmo, que le diga la entrada, la salida y qué tiene que cumplir la salida. Me dio un conjunto de ecuaciones y me dijo que lo resuelva con el algoritmo: {x =•= f(y), y =•= x}

JavaScript: me dijo que tenes objetos que son iteradores: tienen un “hayProximo” que te dice si tenes un elemento más, y un “próximo” que te da el próximo elemento. Me pidió armar una función que tome dos iteradores y devuelva un iterador que vaya alternando entre los otros dos (si la función toma o y p queres un iterador que al pedirle próximo te de primero uno de o, si le volves a pedir próximo te da uno de p y así). Yo no llegue a armarla ni terminar la idea pero contandole lo que iba pensando alcanzó.

Objetos: me pregunto si los juicios de evaluación de cálculo sigma se podrían hacer small step y que si podía lo escriba (alcanzó con escribir solo la regla de SEL)

Cálculo lambda: me pregunto si teniendo solo Nat y Bool podía escribir programas que se traben (le dije que no y me preguntó por qué, quería que mencione el teorema de terminación). Me pregunto si agregando fix se podía y que de un ejemplo y lo mismo con referencias

Haskell: me pregunto la diferencia entre recursion estructural y primitiva y que de los tipos de las funciones que lo hacen en Haskell (foldr y recr) y me preguntó si podíamos escribir una en función de la otra para ambas(recr usando foldr y foldr usando recr)


---

Prolog: generarme las rotaciones de una lista. Sea L=[1, 2,3] => [[1,2,3],[2,3,1],[3,1,2]]

Lambda: saber perfectamente el tema de las sustituciones. Dado un término U sin tipos que es tipable, osea Erase(M) = U con M tipable , si hago una sustitución por U' que no se si es tipable o no. Será tipable el resultado de esa sustitución en U?

Haskell: dar los tipos de foldr y recr. Se pueden implementar uno en función del otro? Hice el foldr en función de recr. Al final el otro solo me dijo que le diga la idea, las tuplas y eso. Me pregunto por la notación infija posible para hacer foldr con recr. Al estilo map f = foldr ((:).f)

Martelli Montanari: cual sería la especificación del algoritmo, osea que precondiciones y post condiciones. Onda, decir que espera como input, que da como salida. No hablar de las reglas si no, la especificación.

Occur check