Vers une automatisation du calcul des quines

par Le Grincheux  

L'automate doit comporter une bascule de plus. De huit variables, les tables de vérités passent à neuf, soit cinq cent douze états pour huit variables de sorties. Cela commence à faire beaucoup lorsqu'on le fait à la main. J'ai trouvé un outil en mode texte pour réduire les quines : qmc (en version 0.6.3). Il ne reste plus qu'à générer automatiquement un fichier d'entrée pour cet outil directement depuis les tables de transitions.

#!/usr/local/bin/rpl -csp

/*
 * Format du fichier d'entrée :
 * 010X00X
 * *1111111
 * *X000X01
 *
 * Le X correspond à une valeur indifférente. Les entiers binaires
 * spécifiés doivent donner une combinaison vraie. Les lignes
 * commençant par une étoile indiquent un résultat indifférent.
 */

TRANSITIONS
<<
    { "length*(1)" }
    { { "name" "transitions.in" } "sequential" "old"
            "readonly" "flow" }
    open format

    0
    -> F_IN NB_LIGNES
    <<
        while
            F_IN "end of file" inquire not
        repeat
            ""
            do
                F_IN read 1 get
            until
                if
                    dup "\n" same
                    F_IN "end of file" inquire or
                then
                    drop true
                else
                    +
                    false
                end
            end

            if
                dup "" same not
            then
                'NB_LIGNES' incr
            else
                drop
            end

        end

        F_IN close
        NB_LIGNES ->list
    >>

    1
    -> LISTE I
    <<
        do
            LISTE I get ucase
            -> E
            <<
                if
                    E "X" pos dup
                then
                    // Il y a au moins un X
                    -> P
                    <<
                        { "0" "1" } forall J
                            if
                                P 1 same
                            then
                                J E 2 over size sub +
                            elseif
                                P E size same
                            then
                                E 1 over size 1 - sub J +
                            else
                                E 1 P decr sub J +
                                E P incr E size sub +
                            end
                        next

                        LISTE swap I swap put swap
                        1 ->list + 'LISTE' sto
                    >>
                else
                    // Pas de X, on passe au suivant
                    drop
                    'I' incr
                end
            >>
        until
            LISTE size I same
        end

        LISTE l->t << < >> sort
    >>

    forall I
        if
            I "*" pos
        then
            "x" "# " I 2 over size sub + "b" + str-> b->r ->str +
        else
            "# " I + "b" + str-> b->r ->str
        end

        disp
    next
>>

Je concède que c'est un peu sauvage, mais cela fonctionne parfaitement pour mon usage. Cet outil prend le fichier transitions.in et écrit sur la sortie standard un fichier correspondant et attendu par qmc. Le langage RPL/2 est toujours disponible au même endroit.

Aucun commentaire pour le moment


Formulaire en cours de chargement...