Final 17/11/2022 (Paradigmas)

De Cuba-Wiki

Haskell[editar]

L1 y L2 son listas infinitas. Sabemos que un elemento que buscamos esta en alguna de las dos listas. Como podría hacer una función que busque el elemento en ambas?[editar]

(yo propuse que devuelva bool si el elemento esta en alguna de las dos, pero no le importaba tanto que devuelve, lo importante era como encontrar el elemento)

buscarEnListas :: a -> [a] -> [a] -> Bool 
buscarEnListas e L1 = foldr f (const False) L1
    where f x z = (\(l:ls) -> x==e || l==e || z ls)

Cálculo lambda[editar]

Cómo definirías fix en Haskell? Qué pasaría si definis la semántica de fix en calculo lambda de esta manera?[editar]

-----------------------
fix V  -> V (fix V)

Esta la respondi medio mal asi que no dejo la respuesta. Es muy parecida a la de otros finales. Aca en el medio terminamos hablando de valores, de progreso y preservación…

Si se que Gamma |- M : sigma. Que me garantiza W(Erase(M))?[editar]

En particular que relacion tienen el tipo de esa expr y sigma, sea W(Erase(M)) = Gamma’ |- N : tau

  • Garantiza que tau =.= sigma pero no solo eso, mas fuerte aun, algo asi como que tau unifica con todos los tipos posibles de M, o algo así? Es lo que le dije yo, me corrigió pero no me acuerdo como. Así que va por ahi pero responderla mejor.
  • Dije que Gamma’ puede ser mas general que Gamma, menos restrictiva (?) no nos detuvimos en eso asi que no se si estaba bien.
  • N también puede ser mas general que M en cuanto a tipado.

Programación lógica[editar]

Dado este programa, qué responde la consulta p(W)?[editar]

p(X) :- q(X).
p(1).

q(X) :- r(X),!.
q(2).

r(3).
r(4).
Respuesta[editar]

Lo respondí directo haciendo el arbolito y explicando qué ramas se cortan

                         ~p(W).
                  {X/W} /      \{1/W}  <- NO se corta esta rama!!
                    ¬q(X)       W = 1.
                     /  \ <- se corta esta rama porque de ¬q(X) provino el !
                ¬r(X),!
            {3/X} /    \ <- se corta esta rama
                 !
               /
           W=3.

Cálculo Sigma[editar]

Cómo definirias clases en un lenguaje (?) de objetos que no las tiene? Para ayudar, qué metodos tendría que tener un objeto clase?[editar]

Con la segunda pregunta entendí un poco mas y hablamos de new, me preguntó cómo es el objeto que devuelve ese new. No estaba segura que decirle ahí pero me acorde de como hacíamos en calculo sigma, así que empecé a hablarle de como en cálculo sigma teniamos el “objeto clase” donde definiamos el new y los “premetodos”, y el me ayudo a llegar a que las instancias lo que hacen al llamarles un metodo es convocar el metodo de la clase, pero pasandose a si mismas como parámetro. De esa forma conseguis un “self” que sea la instancia y no la clase en sí

Javascript[editar]

Si definimos una clase en javascript así y damos este código ... Qué pasa con a.f()? Tiene acceso a esa función que definí?[editar]

function F() = {
    this.x = 0;
}

a = new F();

pF = Object.getPrototypeOf(F);
pF.f = function () {....} //Acá aclaró que define una función f en pF.

a.f()
Respuesta[editar]

No, porque al hacer getPrototypeOf(F) estoy pidiendo el prototipo de la función constructora, entonces eso me va a devolver Function.prototype. El prototipo de a es F.prototype (cuando definimos una función constructora se genera un nuevo tipo con el mismo nombre que la función, que será el tipo de las instancias generadas por dicha función constructora). a no tiene nada que ver con Function.prototype, así que no va a tener a f() por ningún lado. Si hubiesemos hecho pF = Object.getPrototypeOf(a); ahí sí le quedaría definida f() a a y a cualquier otra instancia generada con la función constructora F!