iniciar-programa
define-nueva-instruccion gira(n) como
inicio
repetir n veces gira-izquierda;
fin;
define-nueva-instruccion simetria(n) como
inicio

    si frente-libre y derecha-bloqueada
    entonces
    inicio
        avanza;
        si orientado-al-norte o orientado-al-sur entonces
        inicio
            simetria(n);
            si frente-bloqueado entonces
           inicio
            mientras no-orientado-al-sur hacer gira(1);
            apagate;
          fin;
          avanza;
          si derecha-libre entonces
          inicio
        mientras no-orientado-al-sur hacer gira(1);
        apagate;
        fin;

         fin
         sino
         si orientado-al-este entonces
         inicio
         simetria(sucede(n));
          si frente-bloqueado entonces
           inicio
            mientras no-orientado-al-sur hacer gira(1);
            apagate;
          fin;
          avanza;
          si izquierda-libre y no-orientado-al-este entonces
          inicio
        mientras no-orientado-al-sur hacer gira(1);
        apagate;
        fin;
        si derecha-libre y orientado-al-este entonces
          inicio
        mientras no-orientado-al-sur hacer gira(1);
        apagate;
        fin;
         fin
         sino
         si orientado-al-oeste entonces
         inicio
         si si-es-cero(precede(n)) y derecha-bloqueada entonces
         inicio
         si frente-bloqueado entonces
         inicio
         mientras no-orientado-al-sur hacer gira(1);
         apagate;
         fin;
         avanza;
         sal-de-instruccion;
         fin;
         simetria(precede(n));
            si frente-bloqueado entonces
           inicio
            mientras no-orientado-al-sur hacer gira(1);
            apagate;
          fin;
          avanza;
          si derecha-libre entonces
          inicio
        mientras no-orientado-al-sur hacer gira(1);
        apagate;
        fin;
         fin;
       fin
    sino
    si derecha-bloqueada y frente-bloqueado y izquierda-libre entonces
    inicio

        si si-es-cero (n) y frente-bloqueado entonces
        inicio
        mientras no-orientado-al-sur hacer gira(1);
        apagate;
        fin;
        gira(1);
        avanza;
        si orientado-al-este entonces
        inicio
            simetria(sucede(n));
            si frente-bloqueado entonces
        inicio
        mientras no-orientado-al-sur hacer gira(1);
        apagate;
        fin;
             avanza;
        gira(1);
        fin
        sino
        si orientado-al-oeste entonces
        inicio
        si si-es-cero(precede(n)) y (frente-bloqueado o derecha-bloqueada )entonces
        inicio
        si frente-bloqueado entonces
        inicio
        mientras no-orientado-al-sur hacer gira(1);
        apagate;
        fin;
         avanza;
         gira(1);
        sal-de-instruccion;
        fin;
        simetria(precede(n));
        si frente-bloqueado entonces
        inicio
        mientras no-orientado-al-sur hacer gira(1);
        apagate;
        fin;
         avanza;
        gira(1);
        fin
        sino
        inicio
        simetria(n);
         si frente-bloqueado entonces
        inicio
        mientras no-orientado-al-sur hacer gira(1);
        apagate;
        fin;
         avanza;
         si derecha-libre entonces
        inicio
        mientras no-orientado-al-sur hacer gira(1);
        apagate;
        fin;
        gira(1);
        fin;
        si frente-bloqueado entonces
        inicio
        mientras no-orientado-al-sur hacer gira(1);
        apagate;
        fin;

    fin
    sino
    si derecha-libre entonces
    inicio



        gira(3);
        avanza;

        si orientado-al-este entonces
        inicio
             simetria(sucede(n));

             si frente-bloqueado entonces
              inicio
                mientras no-orientado-al-sur hacer gira(1);
                apagate;
                fin;
             avanza;
             gira(3);
             si orientado-al-oeste entonces
             inicio
             si derecha-libre entonces
              inicio
                mientras no-orientado-al-sur hacer gira(1);
                apagate;
              fin;
              fin
              sino
              si orientado-al-este entonces
              si izquierda-libre entonces
              inicio
                mientras no-orientado-al-sur hacer gira(1);
                apagate;
              fin;

        fin
        sino
        si orientado-al-oeste entonces
        inicio
        si si-es-cero(precede(n)) y frente-bloqueado entonces sal-de-instruccion;
        simetria(precede(n));
        si frente-bloqueado entonces
         inicio
        mientras no-orientado-al-sur hacer gira(1);
        apagate;
        fin;
        avanza;
        gira(3);
        si izquierda-libre y no-orientado-al-norte entonces
         inicio
        mientras no-orientado-al-sur hacer gira(1);
        apagate;
        fin;

        fin
        sino
        inicio
        simetria(n);
        si frente-bloqueado entonces
         inicio
        mientras no-orientado-al-sur hacer gira(1);
        apagate;
        fin;

        avanza;
        si derecha-bloqueada entonces
          inicio
        mientras no-orientado-al-sur hacer gira(1);
        apagate;
        fin;
        gira(3);

        fin;


    fin
    sino
    si frente-bloqueado y derecha-bloqueada y izquierda-bloqueada entonces
    inicio
       si no si-es-cero (n) entonces
       inicio
        gira(2);
        avanza;
       (* simetria(n);*)
        fin ;
        si orientado-al-norte o orientado-al-sur entonces
        inicio
            si orientado-al-norte y frente-bloqueado y  si-es-cero(n) entonces
            inicio
            gira(2);

            sal-de-instruccion;
            fin;
            simetria(n);
        fin
        sino
        si orientado-al-este entonces
        inicio
        simetria(sucede(n));
        fin
        sino
        si orientado-al-oeste  entonces
        inicio
        simetria(precede(n));
        fin;
         si frente-bloqueado entonces
        inicio
        mientras no-orientado-al-sur hacer gira(1);
        apagate;
        fin;
        avanza;
        si frente-libre o izquierda-libre o derecha-libre  entonces
        inicio
        mientras no-orientado-al-sur hacer gira(1);
        apagate;
        fin;
        gira(2);
    fin;

fin;
    inicia-ejecucion
    simetria(0);
    mientras no-orientado-al-norte hacer gira(1);
        apagate;
    termina-ejecucion
finalizar-programa
