Bonjour Vincent,

I am adding sage-combinat-devel in cc to my answer to your email
because I think it the discussion is pertinent. Although, I realized
it in the end, so everything is in French... Sorry.

> Je viens de poster un brouillon de la classe LanguageOfFullWords.
> Comme j'ai besoin de faire des calculs rapides, j'utilise le plus
> possibles des objets python de base, mais évidemment ça limite
> l'utilisation. En plus, on pourrait aller exponentiellement plus vite
> (et gagner beaucoup de place) en utilisant en SuffixTrie... En effet,
> la construction du langage est locale: pour construire les mots de
> taille n on regarde juste les mots de taille n-1 et on fait
> éventuellement un test de palindrome. Par contre on a besoin de
> regarder à gauche et à droite.

Cool, alors, je vais continuer à travailler sur le suffix trie à la cassaigne.

> sage: L = sage.combinat.words.language.LanguageOfFullWords(2)
> sage: L
> Language of full words over the Ordered Alphabet ['0', '1']
> sage: [L.factor_complexity(i) for i in range(15)]
> [1, 2, 4, 8, 16, 32, 64, 128, 252, 488, 932, 1756, 3246, 5916, 10618]
>
> Quelques remarques, dis-moi ce que tu en penses:
> 1) Ce serait pratique d'avoir un __getitem__ dans Language, pour le
> moment il est implémenté très bas (LanguageOfMorphism,
> LanguageOfFullWords)

D'abord le getitem retourne une liste des facteurs de longueurs n du
langage, c'est bien ça qu'on veut? Je trouve ça pratique, sauf que
souvent le getitem suit le comportement de __iter__ alors qu'ici
__iter__ itère sur le facteurs eux-mêmes.

Tu n'avais peut-être pas une version à jour lorsque tu as fait cette
remarque, car __getitem__ est implémenté dans Language.

> 2) L'utilisation de __new__ complique l'héritage ! Je suis obligé de
> faire une méthode __new__ presque triviale dans ma nouvelle classe.

Le but du __new__ est d'éviter d'appeler LanguageOfFullWords,
LanguageOfMorphism, LanguageOfWord, pour construire une instance et
d'utiliser plutôt et toujours le même mot clé Language. Maintenant, la
question est de savoir comment reconnaître qu'avec certains arguments
donnés l'utilisateur veut construire le language d'un morphisme, des
facteurs d'un mot, des mots pleins, etc.

En fait, je crois qu'une autre solution serait mieux dans ce cas-ci.
L'utilisation de méthodes sur les objets permet d'éviter toute
l'ambiguité due à la création d'un objet plus complexes à partir
d'objets simples (qui peuvent utiliser les mêmes structures de données
python pour représenter des objets différents).

sage: W = Words('ab')
sage: F = W.language_of_full_palindromic_words()
sage: P = W.language_of_palindromes()

De même, on pourrait faire la même chose pour le langage des facteurs d'un mot:

sage: w = Word('aasldnafnasdfl')
sage: L = w.language()

et le langage d'une substitution:

sage: m = WordMorphism('a->ab,b->ba')
sage: L = m.language()

Et on pourrait même éviter l'ajout du mot Language dans le namespace
de Sage, car de toute façon, on doit toujours créer un autre objet
Sage (Morphisme, Mot, Ensemble de mots) avant de créer une instance de
langage.

Qu'en penses-tu?

Sébastien

-- 
You received this message because you are subscribed to the Google Groups 
"sage-combinat-devel" group.
To post to this group, send email to sage-combinat-de...@googlegroups.com.
To unsubscribe from this group, send email to 
sage-combinat-devel+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sage-combinat-devel?hl=en.

Reply via email to