Bonjour Alice,
Pour le hash consing des substitutions j’ai directement créé un nouveau module Weak.Make dans «subst.ml » en changeant la représentation du type ‘a subst en ‘a subst = ‘a subst’ * int de la même manière que pour les lexp. J’ai l’impression que le type t de la Hashtbl ne peut pas prendre en compte le paramètre ‘a (qui est dans notre cas une lexp). Je ne peux pas le définir comme tel :
Non, en effet.
struct type ‘a t = ‘a subst ou encore struct type t = ‘a subst. Je pensais éventuellement à placer la table dans « lexp.ml » pour pouvoir utiliser le type subst appliqué à une lexp.
Oui, tu vas devoir faire ça dans lexp.ml.
Les informations fournies à la dernière réunion m’ont parues intéressantes pour peaufiner la fonction de hachage, je ne sais pas trop si vous avez une préférence.
Pas vraiment. Il est clair qu'faudra changer le `xor` en qqchose d'autre, parce que juste `xor` va donner de mauvais résultats. Tu peux y aller avec qqch de simple genre
(a * N) xor b
ou tu peux viser qqch de plus sérieux. J'aurais tendance à opter pour qqch de simple, et ensuite vérifier le nombre de collisions qu'on obtient en pratique dans la table de hachage. S'il y a effectivement trop de collisions, alors ça vaudra peut-être la peine de choisir un hash plus sérieux.
Ceci dit, d'après ce que je vois tu n'as pas encore corrigé le problème du fait que tu n'inclus pas le constructeur dans le hash: i.e. dans `lexp'_hash`, dans la branche `Imm` to voudras combiner 1 dans le hash, dans la branche `SortLevel` tu voudras combiner 2 dans le hash, dans la branche suivante, tu voudras combiner 3 dans le hash, etc... [ Au lieu d'entiers consécutifs, tu peux choisir des nombres plus créatifs, bien sûr. Go wild! ]
Je pensais dans un premier temps me concentrer sur la fonction d’égalité des lexp.
Bonne idée.
Stefan