L'IA progresse par les analogies qu'elle tisse. C'est pourquoi on commence par solliciter ses compètences sur le domaine concerné :
Connais-tu ce qu'est un monoïde bis-gène ? |
Puis on lui propose de construire un monoïde bis-gène libre.
On représente le monoïde engendré par deux éléments `a`, `b`, par un graphe orienté où les sommets sont les éléments du monoïde. Chaque sommet possède deux arrêtes partantes libellées `a` et `b`. Le sommet racine est l'élément neutre du monoïde. Et pour chaque sommet `x`, l'arrête libellée `a` partant de `x` arrive sur le sommet `x"*"a`, et l'arrête libellée `b` partant de `x` arrive sur le sommet `x"*"b`, où `"*"` est la loi du monoïde. On commence par étape un programme en python qui aura pour but de construire ce graphe en mémoire. On utilise le module numpy qui permet de manipuler des tableaux de façon efficace. On définit le type cellule, structuré comme suit : .
On crée un tableau `M` uni-dimensionnel de 10_000 cellules libres initialisées comme suit : Chaque cellule est désignée par son Indexe dans `M`. La cellule `M[0]` n'est pas utilisée. L'index `0` qui est la valeur minimal représente le rien. Pour chaque cellule libre, l'attribut `L` contient l'indexe de la cellule libre suivante, et la dernière cellule contient comme attribut `L` la valeur `0` qui représente le rien. On crée le premier noeud qui correspond à l'élément neutre du monoïde en `M[1]`.
Les enfants `M[0]"."a` et `M[0]"."b` n'étant pas encore définit, ils ont la valeur `0`. Les cellules occupées sont appelées des nœuds, et correspondent au sommet du graphe, et correspondent aux éléments du monoïde. |
|
Parfait, tu as déjà posé une base claire et structurée pour représenter le monoïde et son graphe orienté. Voici une implémentation fidèle à ta description, en utilisant numpy avec des types structurés pour définir le tableau `M` de cellules :
|
On nomme couramment "x" qui est un uint32, pour désigner la cellule M[x]. Et lorsque x=0 alors "x" ne désigne rien. |
|
Voici la fonction a(x) conforme à ta demande. Elle :
Remarques :
Souhaites-tu aussi une fonction générique prenant un label 'a' ou 'b' en argument, ou tu préfères garder des fonctions spécifiques ? |
|
Créer une fonction équivalente b(x) pour la transition 'b' | |
Voici la fonction b(x) définie sur le même modèle que a(x), pour gérer la transition 'b' :
Points importants :
Tu peux maintenant utiliser a(x) et b(x) pour explorer ou construire dynamiquement le graphe du monoïde. |
Crée une fonction générique qui prend un nœud 'x' de départ et un mot complet (ex: 'abaab') et construit le chemin correspondant dans le graphe partant du nœud 'x' ? | ||
Voici une fonction générique nommée chemin(x, mot) qui : prend en argument un nœud de départ x (index dans le tableau M), ainsi qu’un mot (chaîne composée uniquement de 'a' et 'b'), et construit pas à pas le chemin correspondant dans le graphe du monoïde, en utilisant les fonctions a(x) et b(x) déjà définies, retourne finalement le nœud d’arrivée (index dans M).
Exemple d'utilisation :
Cette fonction construit le chemin de manière paresseuse : elle n’explore que ce qui est nécessaire, et crée les nœuds fils à la volée. Souhaites-tu maintenant une fonction pour afficher le chemin ou les transitions suivies depuis la racine jusqu’au nœud final ? |