Tout d'abord, désolé si je ne publie pas ceci sur le bon site car je ne suis pas sûr qu'il s'agisse plus d'une question mathématique que d'une question de programmation, mais depuis J'utilise cela avec Haskell et en comparant les résultats avec un interprète Haskell, j'ai juste pensé que je le demanderais ici. Donc, j'essaie essentiellement d'évaluer les expressions lambda dans Haskell et je le fais manuellement (en préparation d'un examen, puisque je serai obligé de le faire sur papier). On me donne des expressions et je dois écrire leurs types généraux après leur évaluation. Pour ce faire, j'utilise un interprète pour obtenir une réponse quelque peu correcte.Haskell: Évaluation des expressions lambda manuellement - déterminer les types généraux
En particulier, je vais évaluer les expressions suivantes:
t2 = (\x y z -> y.x.y);
tx2 = (\x y z -> y.z.z);
tp2 = (\x -> \y -> (x.y.x));
td2 = (\x y z f -> y(z(z(f))));
tm2 = (\z -> \y -> \x -> z.y.x);
Depuis que je ne comprends pas 100% comment faire, je l'ai conçu une méthode. Tout d'abord, je crée un modèle qui ressemble un peu à l'apparence de l'expression évaluée. C'EST À DIRE. si une partie de la variable de taille gauche ('lambda'd') est présente sur le côté droit (car c'est à peu près la composition fonctionnelle dans tous les cas), c'est une fonction. Sinon, c'est juste une variable. Par la suite, j'essaie d'adapter le mieux possible les types généraux de fonctions et j'obtiens des résultats semi-corrects, mais je suis sûr que je fais encore quelques erreurs. Voici tout mon processus d'évaluation:
t2 = (\x y z -> y.x.y);
(_ -> _) -> (_ -> _) -> c -> _ -> _
y(x(y))
assume:
y :: a -> b
x :: b -> a
result: (b -> a) -> (a -> b) -> c -> a -> b
interpreter: (a -> b) -> (b -> a) -> c -> b -> a
z ne figure pas sur le côté droit, il est donc pas une fonction dans ce cas. Je l'attribue c. Maintenant, je regarde la composition du côté droit. Je vais de droite à gauche et j'attribue un -> b à y puisque je n'ai aucune idée de son entrée ou de sa sortie. Puisque x utilise le résultat de y comme entrée, et y utilise de nouveau x 'comme entrée, x est b -> a. Ce que je peux simplement insérer dans mon modèle. Comme vous pouvez le voir, ce n'est pas exactement le même résultat que celui obtenu par l'interpréteur, mais c'est seulement a et b qui sont inversés, donc cela ne semble pas être faux.
tx2 = (\x y z -> y.z.z);
a -> (_ -> _) -> (_ -> _) -> _ -> _
y(z(z))
assume:
z :: b -> b
y :: b -> c
result: a -> (b -> c) -> (b -> b) -> b -> c
interpreter: a -> (b -> c) -> (b -> b) -> b -> c
Identique à ci-dessus. Puisque z s'utilise dans la composition fonctionnelle, je suppose qu'il a les mêmes entrées et sorties. y utilise la sortie de z comme entrée et a une sortie inconnue, d'où c. Cela semble correspondre à mon interprète.
tp2 = (\x -> \y -> (x.y.x));
(_ -> _) -> (_ -> _) -> _ -> _
x(y(x))
assume:
x :: a -> b
y :: b -> a
result: (a -> b) -> (b -> a) -> a -> b
interpreter: (a -> b) -> (b -> a) -> a -> b
À peu près la même chose que le premier exemple, seulement je n'ai pas de variable lambda inutilisée.
td2 = (\x y z f -> y(z(z(f))));
a -> (_ -> _) -> (_ -> _) -> (_ -> _) -> _ -> _
y(z(z(f)))
assume:
f :: _ -> b
z :: b -> b
y :: b -> c
assume: a -> (b -> c) -> (b -> b) -> (_ -> b) -> b -> c
result: a -> (b -> c) -> (b -> b) -> (b -> b) -> b -> c
interpreter: a -> (b -> c) -> (b -> b) -> b -> c
Tout sauf x est une fonction dans ce cas. L'entrée de f n'est pas initialement connue de moi et je la laisse juste vide à ce moment-là. z utilise la sortie de f et sa propre sortie dans la composition, donc je lui assigne juste b -> b. y utilise la sortie de z, et a une sortie inconnue elle-même, donc elle obtient b -> c. Maintenant, je l'insère dans mon modèle, mais il me manque encore une entrée pour f. Puisqu'il y a un b juste après f, je suppose simplement qu'il utilise b comme une entrée, aussi. Maintenant, il y a la première vraie question: où est-ce que f a disparu dans la réponse donnée par l'interprète? Je ne peux que supposer, car il utilise la même entrée/sortie que z et c'est fondamentalement en composition avec ça, ça s'est simplement simplifié en un seul b-> b, mais je n'en suis pas sûr.
tm2 = (\z -> \y -> \x -> z.y.x);
tm2 = (\z y x -> z.y.x);
(_ -> _) -> (_ -> _) -> (_ -> _) -> _ -> _
z(y(x))
assume:
x = a -> b
y = b -> _
z = _ -> _
assume: (_ -> _) -> (b -> _) -> (a -> b) -> _ -> _
result?: (a -> c) -> (b -> a) -> (a -> b) -> a -> c
interpreter: (a -> b) -> (c -> a) -> (d -> c) -> d -> b
est ici où tout se désagrège: z, y et x sont des fonctions. Donc j'attribue juste un -> b à x, ce qui signifie que l'entrée de y est b. La sortie est inconnue pour moi en ce moment. Idem pour z, puisque je n'ai aucune idée de la sortie de y. Donc, après que je les ai entré dans mon modèle, la seule chose qui me reste à faire est simplement de remplir les blancs pour les valeurs inconnues. Puisque x nécessiterait une entrée as, cela signifie qu'il y a un a juste après. Ce qui voudrait dire que c'est la contribution de z, aussi. Puisque c'est l'entrée de z, je peux supposer que c'est la sortie de y. La seule chose qu'il me reste à remplir est la sortie de z, et je lui donne juste un c puisque je ne sais pas vraiment ce que ça pourrait être. Comme vous pouvez le voir, ce n'est pas du tout ce que l'interprète me donne, du moins, c'est ce que l'interprète me donne. Bien que le côté gauche soit encore assez similaire, je ne comprends pas du tout ce qui se passe du côté droit. Pourquoi est-ce d -> b? Ne devrait-il pas être tout ce qui est le résultat de (z (y (x))), qui devrait avoir l'entrée/sortie de z?
Merci d'avance pour toute aide que vous pourriez m'offrir.
De même, pour 'TX2 = (\ xyz -> YZZ); 'vous pouvez voir que 1.' x' est inutilisé, 2. 'y' peut être composé avec' z' et 3. 'z' peut être composé avec lui-même, donc vous obtenez' tx2 :: a -> (b - > c) -> (b -> b) -> b -> c'. –
Comment faites-vous (ou devrions-nous) analyser y.x.y'? Si c'est «y (x y)», alors votre type ne semble pas correct, si c'est «y x y», alors c'est une vérification d'occurrence. –
Je l'ai lu comme composition de fonction, I.e. 'x.y' signifiant' \ a -> x (y a) '. –