Je recherche un calcul simple qui prend en charge le raisonnement sur la réflexion , à savoir l'introspection et la manipulation des programmes en cours d'exécution.
Existe-t-il une extension -calculus non typée qui permet de convertir termes en une forme qui peut être manipulée syntaxiquement puis évaluée par la suite?λ
J'imagine que le calcul a deux termes supplémentaires principaux:
- v v : prend et produit une représentation de modifiable en manipulation syntaxique.
- : prend une représentation syntaxique d'un terme et l'évalue.
Afin de soutenir la réflexion, une représentation syntaxique des termes est requise. Cela ressemblerait à quelque chose comme:
- ( L A M R ( e ) ) R ( e ) e serait représenté comme un terme , où est la version reflétée de ,
- ( A P P R ( e ) R ( e ′ ) ) serait représenté par le terme , et
- ( V A R x ) serait représenté par .
Avec cette représentation, la correspondance de motifs pourrait être utilisée pour manipuler des termes.
Mais nous rencontrons un problème. et doivent être codés en termes, tout comme la correspondance de motifs. Traiter cela semble être simple, en ajoutant , et , mais aurai-je besoin d'ajouter d'autres termes pour prendre en charge leur manipulation?e v a l R E F L E C T E V A L M A T C H
Il y a des choix de conception à faire. Que doit faire la fonction mentionnée ci-dessus avec le corps de et ? Est-ce que devrait transformer le corps ou non?r e f l e c t e v a l R ( - )
Comme je ne suis pas tellement intéressé par l'étude de la réflexion elle-même - le calcul servirait de véhicule à d'autres recherches - je ne veux pas réinventer la roue.
Existe-t-il des calculs qui correspondent à ce que je viens de décrire?
Pour autant que je sache, des calculs tels que MetaML, suggérés dans un commentaire, vont très loin, mais ils n'incluent pas la possibilité de filtrer et de déconstruire des fragments de code qui ont déjà été construits.
Une chose que j'aimerais pouvoir faire est la suivante:
Ensuite, effectuez une correspondance de modèle sur le résultat pour créer une expression complètement différente.
Ce n'est certainement pas une extension conservatrice du -calculus et la méta-théorie est susceptible d'être laide, mais c'est un peu le point pour mon application. Je veux séparer -abstractions.λ
la source
Réponses:
Jean Louis Krivine a présenté un calcul abstrait qui étend la "Machine Krivine" d'une manière très non triviale (notez que la machine Krivine prend déjà en charge l'instruction call / cc de lisp):
Il introduit un opérateur "quote" dans cet article défini de la manière suivante: si est un -term, notez l'image de par une bijection des termes lambda aux nombres naturels. Notez le chiffre de l'église qui correspond à . Krivine définit l'opérateur par la règle d'évaluation: Je pense que la magie de Kleene montrera que cela suffit pour faire ce que vous souhaitez: définir un devis et une évaluation opérateurs, si est calculable.λ n ϕ ϕ π : Λ → N ¯ n n ∈ N χ χ ϕ → ϕ ¯ n ϕ πϕ λ nϕ ϕ π:Λ→N n¯¯¯ n∈N χ
Notez que Krivine est notoirement difficile à lire (s'il vous plaît ne vous fâchez pas si vous lisez ceci, Jean-Louis!), Et certains chercheurs ont fait l'acte de bienfaisance en essayant d'extraire le contenu technique d'une manière plus lisible. Vous pourriez essayer de jeter un œil à ces notes de Christophe Raffali.
J'espère que cela t'aides!
Il me semble qu'il existe une autre référence qui peut être pertinente pour vos intérêts: le Pure Pattern Calculus de Jay et Kesner formalise une variante du -calculus qui étend l'abstraction simple sur une variable à une abstraction sur un motif représentant un motif le calcul lui-même. Ceci est phénoménalement expressif et permet notamment de déconstruire une application elle-même: si je ne me trompe pas, le terme:λ
réduit à . Encore une fois, je pense que c'est plus que suffisant pour implémenter les opérateurs quote et eval .λx.x x
la source
Cela est très difficile, voire impossible, sans renoncer à la confluence. C'est-à-dire que je soupçonne que vous avez raison au sujet d'une méta-théorie velue. D'autre part, il est possible de concevoir un calcul combinateur qui peut exprimer toutes les fonctions calculables de Turing, et qui a la pleine capacité d'inspecter ses termes: voir Jay et Give-Wilson .
Je crois cependant que cette capacité nuit à votre théorie équationnelle. En particulier, vous n'aurez tendance à prouver que deux valeurs sont égales si les sont égales jusqu'aux équivalences alpha.
Je n'ai pas encore lu le livre de Krivine lié à, mais je dois noter que dans la logique classique, vous n'avez essentiellement que deux choses: vrai et faux. Tout est équivalent à l'un d'eux. Autrement dit, vous avez de toute façon tendance à avoir une théorie équationnelle effondrée.
la source
Dans la théorie des langages de programmation, la fonctionnalité dont vous parlez est généralement appelée "citation". Par exemple, John Longley a écrit à ce sujet dans certains de ses travaux, voir cet article .
Si vous êtes juste après des considérations théoriques (par opposition à une implémentation réellement utile), vous pouvez simplifier les choses en déclarant que
quote
(oureflect
comme vous l'appelez) correspond au type d'entiersnat
en renvoyant un code Gödel de son argument. Vous pouvez ensuite décomposer le nombre comme vous le feriez pour un arbre de syntaxe abstraite. De plus, vous n'en avez pas besoineval
car cela peut être implémenté dans la langue - c'est essentiellement un interprète pour la langue.Pour un modèle concret qui possède ces caractéristiques, vous pouvez considérer la première algèbre combinatoire de Kleene: interpréter tout comme un nombre (les considérer comme des codes de Gödel) et définir l'application Kleene pour signifier où est le -th fonction partielle. Cela vous donnera un modèle de -calculus (avec des cartes partielles) dans lequel est simplement la fonction d'identité. Aucune autre fonctionnalité ne doit être ajoutée à la langue.n⋆m φn(m) φn n λ
quote
Si vous me dites ce que vous recherchez, je pourrai peut-être vous donner des références plus précises.
Au fait, voici un problème ouvert:
La règle ,. E_1 ,. indique que -abstraction est une congruence. Cela nous permet de réduire under pour ainsi dire. En combinaison avec cela devient problématique, car est censé être également une congruence, donc par exemple nous voir que ce doit être le cas que Donc, d'une manière ou d'une autre, cela est censé calculer des codes Gödel "très canoniques" - mais même en supposant que nous avons un typéξ λλe1≡e2
quote
quote
quotequote
la source
quote
Voici une réponse alternative, au lieu d'utiliser mon approche nominale qui est encore expérimentale, il existe une approche plus établie qui remonte à l'article:
LEAP: un langage avec éval et polymorphisme
Frank Pfenning et Peter Lee
https://www.cs.cmu.edu/~fp/papers/tapsoft89.pdf
Le document commence par:
Veuillez noter que LEAP est beaucoup plus fort que ce que le PO souhaite. Tout d'abord, il est tapé. Et deuxièmement, il demande la métacircularité, ce qui signifie par exemple que eval peut exécuter sa propre définition. Dans Prolog, vous obtenez la métacircularité pour résoudre / 1:
Si vous ajoutez la clause suivante pour résoudre / 1:
Et si vous faites en sorte que la clause / 2 renvoie également les clauses de résoudre / 1. Vous pouvez alors appeler résoudre (résoudre (...)) et voir comment résoudre s'exécute lui-même.
Les questions d'auto-représentation suscitent encore des recherches, voir par exemple:
Auto-représentation dans le système Girards U
Matt Brown, Jens Palsberg
http://compilers.cs.ucla.edu/popl15/popl15-full.pdf
la source
Le problème est identifié à proximité des assistants de preuve tels que Coq et Isabelle / HOL. Il passe sous l'acronyme HOAS . Il y a certaines affirmations autour de λ-Prolog selon lesquelles, grâce au nouveau quantificateur such, de telles choses peuvent être faites. Mais je n'ai pas encore pu saisir cette affirmation. Je suppose que le principal aperçu que j'ai obtenu jusqu'à présent est qu'il n'y a pas d'approche définitive, il y a quelques approches possibles.
Ma propre version, pas encore terminée , s'inspire d'un article récent de Paulson sur la preuve de l'inachèvement de Gödels. J'utiliserais les classeurs au niveau objet en relation avec une structure de données qui a les noms de niveau méta. Fondamentalement, une structure de données similaire mais distincte de celle de l'OP, et avec le codage de l'Église car je suis intéressé par les types dépendants:
Les expressions de niveau méta peuvent être distinguées des expressions de niveau objet en ce que nous utilisons les noms de variable n, m, .. etc. pour désigner les noms. Alors que nous utilisons les noms de variables x, y, .. etc. au niveau de l'objet. L'interprétation d'un méta-terme dans la logique d'objet fonctionnerait alors comme suit. Écrivons [t] σ pour l'interprétation du terme nominal t dans le contexte nominal σ, qui devrait donner un terme objet. On aurait alors:
Ce qui précède définirait ce que l'OP appelle une fonction EVAL. Petite différence avec Paulson, σ n'est qu'une liste finie et non une fonction. À mon avis, il ne serait possible d'introduire qu'une fonction EVAL et non une fonction REFLECT. Étant donné qu'au niveau de l'objet, vous pouvez avoir une certaine égalité afin que les différentes expressions lambda soient identiques. Ce que vous devez faire serait d'utiliser eval pour raisonner éventuellement sur la réflexion si vous en ressentez le besoin.
Vous auriez besoin d'aller à des extrêmes comme Prolog où rien n'est développé, si vous voulez abattre le mur entre nominal et non nominal. Mais comme le montre l'exemple du système λ-Prolog, dans le cas d'ordre supérieur, il y a des problèmes supplémentaires qui ne peuvent par exemple être surmontés que de manière logique en introduisant de nouveaux moyens tels qu'un quantificateur ∇!
la source