Il y a un peu de liberté dans ce que nous considérons comme "la même valeur". Permettez-moi de montrer qu’il n’existe pas un tel algorithme si «la même valeur» signifie «équivalent sur le plan de l’observation». J'utiliserai un fragment du calcul des constructions, à savoir le système T de Gödel (simplement tapé -calculus, les nombres naturels et la récursion primitive sur eux), donc l'argument s'applique déjà à un calcul beaucoup plus faible.λ
Étant donné un nombre , soit soit le chiffre correspondant le représentant, c'est-à-dire, applications de à . Étant donné un mahcine Turing , soit le chiffre codant d'une manière raisonnable.¯ n n s u c c 0 M ⌈ M ⌉ Mnn¯¯¯ns u c c0M⌈ M⌉M
Disons que deux termes fermés sont équivalents , écrits , quand pour tout , et se normalisent tous les deux au même chiffre (ils se normalisent à un chiffre parce que nous sommes dans un claculus fortement normalisant). t ≃ u n ∈ N tt , u : n a t → n a tt ≃ un∈N stn¯¯¯sn¯¯¯
Supposons que nous ayons un algorithme qui, étant donné tout terme fermé de type calcule un terme équivalent minimal. Ensuite, nous pouvons résoudre l'oracle Halting comme suit.nat→nat
Il existe un terme tel que, pour tous les et toutes les machines de Turing ,
normalise en si s'arrête en étapes, et il se normalise en sinon. Ceci est bien connu, car la simulation d'une machine de Turing pour un nombre fixe d'étapes est récursive primitive. n ∈ N M S ( ⌈ M ⌉ , ¯ n ) ¯ 1 T n ¯ 0 nS:nat×nat→natn∈NMS(⌈M⌉,n¯¯¯)1¯¯¯Tn0¯¯¯n
Il existe de nombreux termes fermés qui sont des termes minimaux équivalents à . Notre algorithme de minimisation renvoie l'un d'eux lorsque nous lui donnons , et il peut même arriver que soit en fait le seulement ce terme minimal. Tout cela n'a pas d'importance, la seule chose qui compte, c'est qu'il existe un nombre fini de termes minimaux équivalents à . λ x : n a t .Z1,…,Zkλ x : n a t .λx:nat.0λ x : n a t .λx:nat.0λ x : n a t .λx:nat.0λx:nat.0
Maintenant, étant donné n'importe quelle machine , considérons le terme
Si s'exécute pour toujours, alors normalise en pour chaque et est équivalent à . Pour décider si s'exécute pour toujours, nous introduisons dans notre algorithme de minimisation et vérifions si l'algorithme a renvoyé l'un des . Si c'est le cas, alors s'exécute pour toujours. Si ce n'est pas le cas, cela s'arrête. (Remarque: l'algorithme n'a pas besoin de calculer lesu : = λ x : n a t .MM u ¯ n ¯ 0 n λ x : n a t .
u:=λx:nat.S(⌈M⌉,x)
Mun¯¯¯0¯¯¯nM u Z 1 , … , Z k M Z 1 , … , Z kλx:nat.0MuZ1,…,ZkMZ1,…,Zk en soi, ceux-ci peuvent être codés en dur dans l'algorithme.)
Ce serait bien de connaître un argument qui fonctionne avec une notion plus faible d'équivalence, par exemple juste réductibilité.β
Comme l'a dit Andrej, le problème est indécidable si vous permettez de remplacer un terme par un autre, extensionnellement égal. Cependant, vous pourriez être intéressé par un partage optimal des expressions, dans le sens suivant: étant donné la réduction il est clair que les occurrences de la le terme peut être partagé en mémoire , et chaque réduction appliquée à l'un peut être appliquée à l'autre.
En ce sens, on sait réduire de manière optimale les termes non typés, en réduisant au maximum le partage. Ceci est expliqué ici: /programming//a/41737550/2059388 et la citation pertinente est un algorithme de J. Lamping pour une réduction optimale du calcul lambda . Il ne fait aucun doute que le théorème du calcul non typé peut être étendu au CIC.
Une autre question pertinente est la quantité d'informations de type qui peuvent être effacées lors de la conversion de type, ou bien comment effectuer une conversion efficace, qui est un domaine de recherche actif, voir par exemple la thèse de Mishra-Linger .
la source
Permettez-moi d'insister sur le point de vue abordé par la réponse de Cody.
Pour autant que l'on puisse le voir, la question de trouver un plus petit -term équivalent à un autre -term n'est pas vraiment intéressante, même s'il existait un algorithme le calculant. En fait, la plupart des programmes que vous écrivez dans le -calculus (ou quel que soit le calcul du -cube) sont déjà sous forme normale, ou au moins sous forme normale, donc ils sont déjà à leur "plus petite" dans le sens où vous décris. De plus, être "petit" ne signifie pas être plus efficace comme discuté dans cette question .λ λ λ λ
Ainsi, le problème que vous signalez (que la normalisation fait exploser la taille) est un vrai problème uniquement lorsque vous souhaitez appliquer une fonction à un argument et réduire à la forme normale pour obtenir le résultat. Par exemple, supposons que vous ayez un terme calculant une fonction sur des chaînes binaires. Vous avez alors où est le nombre d'étapes de réduction utilisant la réduction la plus à gauche, ce qui est garanti de trouver une forme normale si elle existe (dans CoC, elle existe toujours, mais ce que je dis s'applique également au cas non typé). Supposons maintenant, en outre, que pour une constante . Pouvez-vous conclure que est calculable en temps polynomial?M f
Il est très facile de construire des exemples de -terms dont la taille augmente de façon exponentielle avec la réduction (la plus à gauche), c'est-à-dire qu'en étapes vous obtenez un terme de taille . Cela peut nous rendre sérieusement douteux en ce qui concerne une réponse positive à la question ci-dessus: il semble que le -calculus soit capable d'effectuer une quantité exponentielle de travail en temps linéaire. En d'autres termes, il semble que le -calculus ne soit pas un modèle raisonnable de calcul en termes de complexité.λ Θ(n) Θ(2n) λ λ
Bien que légitime, le doute ci-dessus provient d'une hypothèse erronée, à savoir que termes sont des représentations efficaces d'eux-mêmes. Ils ne sont pas! En plaisantant moins, termes sont des représentations très inefficaces des états qu'une machine qui les exécute doit réellement passer.λλ λ
Il s'avère qu'il existe une syntaxe, appelée -calculus avec des substitutions explicites linéaires et introduite par Beniamino Accattoli, qui est très bonne pour représenter le phénomène de partage évoqué dans la réponse de cody. En particulier, cette syntaxe peut être utilisée pour fournir des représentations de termes extrêmement fidèles de machines abstraites de toutes sortes (voir l'article de Beniamino ICFP 2014 "Distilling Abstract Machines", dont je suis co-auteur. Je m'excuse pour l'autopromotion, mais cela semble pertinent ici).λ
Cette même syntaxe peut être utilisée pour prouver que, contrairement à l'intuition naïve, la réponse à la question ci-dessus est oui, en effet: le nombre d'étapes les plus à gauche vers la forme normale est une mesure de coût raisonnable, même si la taille explose, car il existe en fait une autre manière de représenter le même calcul (en utilisant des substitutions explicites linéaires) dans laquelle:
Tout cela est expliqué dans le document d'Accattoli et Dal Lago "La réduction bêta est invariante, en effet" (LICS 2014, puis je pense qu'il existe une version de journal plus récente).
Je pense que le point 2 va beaucoup dans le sens de votre question sur les représentations "efficaces de l'espace" des termes : le calcul de substitution linéaire fournit de telles représentations, bien qu'elles ne soient en aucun cas "normales", c'est-à-dire qu'elles ne sont pas les forme normale d'une procédure de réécriture.λ
la source