1) Extender el cálculo Lambda con referencias para que soporte cosas del tipo . Te dejaba usar un for'(M|M') como auxiliar.
Aximoas de tipado:
Semántica operacional:
Esto es porque si reducimos entonces siempre va a evaluar a lo mismo y o no corre o no termina el for.
Algoritmo de inferencia
(falta ver que los tipos de la misma variable en distintos contexto sean el mismo tipo y que i sea de tipo ref Nat en y .
2) Escribir en prolog la función esCamino(+Path,+Graph,+NodoInicial) donde Graph es lista de ejes.
esCamino([N],G,N).
esCamino([A,B|C],G,A) :- member((A,B),G), esCamino([B|C],G,B).
3) ¿Es tipable foldr map? ¿Qué representa foldr map?
foldr :: (a -> b -> b) -> b -> [a] -> b
map :: (a->b) -> [a] -> [b]
Entonces podemos reemplazar por
foldr :: ((a->a) -> [a] -> [a]) -> [a] -> [a->a] -> [a]
map :: (a->a) -> [a] -> [a]
y foldr map va a tener tipo [a] -> [a->a] -> [a]
El resultado de foldr map va a ser aplicarle las funciones de la lista [a->a] una atrás de la otra (como foldr) a los elementos de la lista [a] (como map).
Por ejemplo, foldr map [0,1] (+1,+2,+3) va a hacer [0,1] -> [1,2] -> [3,4] -> [6,7].