Je ne sais pas où poser cette question, j'espère que c'est un bon endroit.
Je suis juste curieux de savoir s'il est possible de faire un générateur de calcul lambda; essentiellement, une boucle qui, avec un temps infini, produira toutes les fonctions de calcul lambda possibles. (comme sous la forme d'une chaîne).
Étant donné que le calcul lambda est si simple, n'ayant que quelques éléments dans sa notation, j'ai pensé qu'il pourrait être possible (mais pas très utile) de produire toutes les combinaisons possibles de ces éléments de notation, en commençant par les combinaisons les plus simples, et ainsi de produire chaque lambda possible fonction de calcul.
Bien sûr, je ne sais presque rien du calcul lambda, donc je ne sais pas si c'est vraiment possible.
C'est ça? Si oui, est-ce assez simple comme je l'ai envisagé, ou est-ce techniquement possible, mais si difficile qu'il est effectivement impossible?
PS. Je ne parle pas des fonctions bêta réduites, je parle juste de chaque notation valide de chaque fonction de calcul lambda.
la source
if n%2==0 ...
Oui. Prenez quelque chose qui énumère toutes les chaînes ASCII possibles. Pour chaque sortie, vérifiez s'il s'agit d'une syntaxe de calcul lambda valide qui définit une fonction; sinon, sautez-le. (Cette vérification peut être effectuée.) Cela énumère toutes les fonctions de calcul lambda.
la source
Comme cela a été mentionné, il s'agit simplement d'énumérer les termes d'un langage sans contexte, donc certainement faisable. Mais il y a des mathématiques plus intéressantes derrière cela, allant dans le domaine de la combinatoire analytique.
L'article Compter et générer des termes dans le calcul lambda binaire contient un traitement du problème d'énumération, et bien plus encore. Pour simplifier les choses, ils utilisent quelque chose appelé le calulus lambda binaire , qui est juste un encodage de termes lambda utilisant des indices De Bruijn , vous n'avez donc pas à nommer de variables.
Ce document contient également du code Haskell concret mettant en œuvre leur algorithme de génération. C'est certainement effectivement possible.
Il se trouve que j'ai écrit une implémentation de leur approche dans Julia.
la source
Sûr. Nous pouvons les générer directement selon la définition des termes lambda.
Dans Haskell, nous définissons d'abord le type de données,
puis avec l'utilisation d'une foire (er)
join
,nous les énumérons, comme par exemple
fjoin
est équivalent à Omega monade s »diagonal
.la source
Je suis tombé sur un outil en ligne qui peut générer des exemples de chaînes à partir d'une expression régulière: https://www.browserling.com/tools/text-from-regex . Vous pouvez générer de nombreux exemples de termes lambda en saisissant quelque chose comme ceci:
Bien sûr, pour obtenir des termes avec des niveaux d'imbrication arbitraires, vous devrez utiliser une grammaire sans contexte, qui est un outil plus descriptif pour définir une langue qu'une expression régulière. Je n'ai pas trouvé d'outil existant pour générer des exemples de phrases de langage basées sur une définition de grammaire sans contexte, mais il n'y a aucune raison pour laquelle il n'a pas pu être construit.
la source