iniciar-programa
    define-nueva-instruccion gd como repetir 3 veces gira-izquierda;
    define-nueva-instruccion norte como mientras no orientado-al-norte hacer gira-izquierda;
    define-nueva-instruccion sur como mientras no orientado-al-sur hacer gira-izquierda;
    define-nueva-instruccion avanzar como inicio
        si frente-libre entonces inicio
            avanza;
        fin sino inicio
            sur;
            apagate;
        fin;
    fin;
    define-nueva-instruccion progra2(n) como inicio
        si no(si-es-cero(n) y derecha-bloqueada y orientado-al-oeste) entonces inicio
            si frente-libre y orientado-al-este y derecha-bloqueada entonces inicio
                 avanza;
                 progra2(sucede(n));
                 avanzar;
            fin sino inicio
                 si frente-libre y orientado-al-oeste y derecha-bloqueada entonces inicio
                     avanza;
                     progra2(precede(n));
                     avanzar;
                 fin sino inicio
                     si frente-libre y (orientado-al-norte o orientado-al-sur) y derecha-bloqueada entonces inicio
                         avanza;
                         progra2(n);
                         avanzar;
                     fin sino inicio
                         si frente-bloqueado y derecha-bloqueada entonces inicio
                             gira-izquierda;
                             progra2(n);
                             gira-izquierda;
                         fin sino inicio
                             si derecha-libre entonces inicio
                                 gd;
                                 avanza;
                                 si orientado-al-oeste entonces inicio
                                     progra2(precede(n));
                                 fin sino inicio
                                     si orientado-al-este entonces inicio
                                         progra2(sucede(n));
                                     fin sino inicio
                                         progra2(n);
                                     fin;
                                 fin;
                                (* si derecha-libre entonces inicio
                                 gd;
                                 avanzar;
                                 fin sino inicio
                                     avanzar;
                                     gd;
                                 fin;*)
                                 avanzar; gd;
                             fin;
                         fin;
                     fin;
                 fin;
            fin;
        fin;
    fin;
    define-nueva-instruccion progra(n) como inicio
        si no(si-es-cero(n) y izquierda-bloqueada y orientado-al-este) entonces inicio
            si frente-libre y orientado-al-oeste y izquierda-bloqueada entonces inicio
                 avanza;
                 progra(sucede(n));
                 avanzar;
            fin sino inicio
                 si frente-libre y orientado-al-este y izquierda-bloqueada entonces inicio
                     avanza;
                     progra(precede(n));
                     avanzar;
                 fin sino inicio
                     si frente-libre y (orientado-al-norte o orientado-al-sur) y izquierda-bloqueada entonces inicio
                         avanza;
                         progra(n);
                         avanzar;
                     fin sino inicio
                         si frente-bloqueado y izquierda-bloqueada entonces inicio
                             gd;
                             progra(n);
                             gd;
                         fin sino inicio
                             si izquierda-libre entonces inicio
                                 gira-izquierda;
                                 avanza;
                                 si orientado-al-este entonces inicio
                                     progra(precede(n));
                                 fin sino inicio
                                     si orientado-al-oeste entonces inicio
                                         progra(sucede(n));
                                     fin sino inicio
                                         progra(n);
                                     fin;
                                 fin;
                                (* si izquierda-libre entonces inicio
                                 gira-izquierda;
                                 avanzar;
                                 fin sino inicio
                                     avanzar;
                                     gira-izquierda;
                                 fin; *)
                                 avanzar;
                                 gira-izquierda;
                             fin;
                         fin;
                     fin;
                 fin;
            fin;
        fin;
    fin;
    define-nueva-instruccion inicia como inicio
        si frente-libre entonces inicio
            avanza;
            progra(1);
            repetir 2 veces gira-izquierda;
            progra2(1);
        fin sino inicio
            si frente-bloqueado y derecha-libre entonces inicio
                gd;
                avanza;
                progra(0);
                norte;
                progra2(0);
            fin sino inicio
                gd;
                si derecha-libre entonces inicio
                    sur;
                fin;
            fin;
        fin;
    fin;
    inicia-ejecucion
        gira-izquierda;
        inicia;

        norte;
        apagate;
    termina-ejecucion
finalizar-programa
