Dialogue avec Claude Fable 5
sur la conception d'un interpréteur de langage mutable

 

1) Introduction

On discute avec Claude Fable 5 sur les langages algébriques et les automates reconnaissant ces langages. Puis on étend progressivement en plusieurs langages imbriqués associés à leur automate les reconnaissant. Et on étend les langages pour pouvoir programmer les automates eux-mêmes, et pour finalement proposer un interpréteur multilangage mutable à volonté. Voir une étape de la discution

Comme nous somme soucieux de rendre moins ingrate ces recherches pour ne pas décourager les disciples, nous proposerons à chaque étape des résultats intermédiaires sous forme d'outils concrets.

2) Langage algébrique

On définit un langage algébrique en présentant ses éléments générateurs et ses opérateurs générateurs entre crochet `"<...>"`. Chaque opérateur possède une arité indiqué occasionnellement par le suffixe `(".")` pour unaire, `(".,.")` pour binaire, `(".,.,.")` pour ternaire. Exemple :

`"<"a,b,f("."), g(".,."),h(".,.,.")">"`

Sans développer davantage la conception du langage on peut demander à Claude de programmer une fonction nuevo_idioma("<a,b,f(.), g(.,.),h(.,.,.)>") qui retourne l'automate capable de reconnaitre un élément du langage. On demande que le programme principal débute par une petite synopsie à destination de l'utilisateur final : nuevo_idioma.py

================================================================
nuevo_idioma — boîte à outils pour langages algébriques
================================================================
nuevo_idioma(sig) construit l'automate reconnaisseur
à partir d'une signature, p. ex.
"<a, b, f(.), g(.,.), h(.,.,.)>"
( "(.)"=unaire, "(.,.)"=binaire, ... )

A.reconnait(terme) -> True / False
A.reconnait(t, trace=True) affiche pas à pas la pile du PDA
repr(A) résume la signature (symbole/arité)
===============================================================

3) Automate récurcif

On définit un automate récurcif qui reconnait les termes du langage `"<"a,b,f("."), g(".,."),h(".,.,.")">"`. L'automate est représenté par un ensemble de règles de production : `{|--a, |--b, |--f("."), |--g(".,."), |--h(".,.,.")}`. Chaque élément de cet ensemble est une règle de production possible. Le symbole point "." désigne un terme quelconque du langage, et constitue un appel récursif de cet automate.

================================================================
nuevo_idioma — boîte à outils pour langages algébriques
================================================================
nuevo_idioma_recursif(sig) construit l'automate RÉCURSIF, défini
par ses règles de production
{|--a, |--b, |--f(.), |--g(.,.), ...}
où "." = appel récursif de l'automate
R.reconnait(terme) -> True / False
R.reconnait(t, trace=True) affiche les règles appliquées
R.regles() affiche l'ensemble des règles
================================================================

4) Générateur

L'automate peut être transformé en générateur énumérant de tous les termes. Il parcourt les différente règles de productions en procèdant à un parcourt de l'arbre des possibilités en largeur d'abord.

================================================================
nuevo_idioma — boîte à outils pour langages algébriques
================================================================
nuevo_idioma(sig) construit l'automate reconnaisseur
à partir d'une signature, p. ex.
"<a, b, f(.), g(.,.), h(.,.,.)>"
( "(.)"=unaire, "(.,.)"=binaire, ... )

A.reconnait(terme) -> True / False
A.reconnait(t, trace=True) affiche pas à pas la pile du PDA
repr(A) résume la signature (symbole/arité)

nuevo_idioma_recursif(sig) construit l'automate RÉCURSIF, défini
par ses règles de production
{|--a, |--b, |--f(.), |--g(.,.), ...}
où "." = appel récursif de l'automate
R.reconnait(terme) -> True / False
R.reconnait(t, trace=True) affiche les règles appliquées
R.regles() affiche l'ensemble des règles
R.genere() générateur énumérant TOUS les termes
(parcours équitable des règles)
R.premiers(n) les n premiers termes de l'énumérationR
================================================================

L'automate peut être transformé en un générateur de termes aux hasard. Il choisit au hasard selon des probabilités transmise en argument la règle de production qu'il met en oeuvre.

 

 


4) Syntaxe préfixe

 

 

 

 

 

 

 

 

 


On ajoute au langage des variables muettes de nom constiué du nom du langage accolé à un entier, L1,L2,L3,.... Elles sont dites muettes car elles ne correspondent pas à de nouveaux éléments générateurs, ce sont juste des inconnues appartenant au langage L, et qui donc joue le rôle de terme quelconque. Exemple de terme avec variable : h(a,L2,g(L1,L2)).