iniciar-programa
define-nueva-instruccion sur como mientras no-orientado-al-sur hacer gira-izquierda;
define-nueva-instruccion norte como mientras no-orientado-al-norte hacer gira-izquierda;
define-nueva-instruccion ver(n) como inicio
  si no si-es-cero(n) o no-orientado-al-oeste o derecha-libre entonces inicio
      si (orientado-al-norte o orientado-al-sur) y derecha-bloqueada y frente-libre entonces inicio
          avanza;
          ver(n);
          si frente-libre entonces inicio
              avanza;
              si derecha-libre entonces inicio
                  sur;
                  apagate;
              fin;
          fin sino inicio
              sur;
              apagate;
          fin;
      fin sino inicio
          si orientado-al-este y derecha-bloqueada y frente-libre entonces inicio
              avanza;
              ver(sucede(n));
              si frente-libre entonces inicio
                  avanza;
                  si derecha-libre entonces inicio
                      sur;
                      apagate;
                  fin;
              fin sino inicio
                  sur;
                  apagate;
              fin;
          fin sino inicio
              si orientado-al-oeste y derecha-bloqueada y frente-libre entonces inicio
                  avanza;
                  ver(precede(n));
                  si frente-libre entonces inicio
                      avanza;
                      si derecha-libre entonces inicio
                          sur;
                          apagate;
                      fin;
                  fin sino inicio
                      sur;
                      apagate;
                  fin;
              fin sino inicio
                  si derecha-libre entonces inicio
                      repetir 3 veces gira-izquierda;
                      si orientado-al-norte o orientado-al-sur y derecha-bloqueada entonces inicio
                          avanza;
                          si si-es-cero(n) y izquierda-libre y derecha-bloqueada y frente-bloqueado y orientado-al-norte y algun-zumbador-en-la-mochila entonces inicio
                              sur;
                              apagate;
                          fin;
                          ver(n);
                          si frente-libre entonces inicio
                              avanza;
                              repetir 3 veces gira-izquierda;
                              si derecha-bloqueada entonces inicio
                                  sur;
                                  apagate;
                              fin;
                          fin sino inicio
                              sur;
                              apagate;
                          fin;
                      fin sino inicio
                          si orientado-al-norte o orientado-al-sur y derecha-libre entonces inicio

                              avanza;
                              ver(n);
                              si frente-libre entonces inicio
                                  avanza;
                                  repetir 3 veces gira-izquierda;
                                  si derecha-bloqueada entonces inicio
                                      sur;
                                      apagate;
                                  fin;
                              fin sino inicio
                                  sur;
                                  apagate;
                              fin;

                          fin sino
                          si orientado-al-este y derecha-bloqueada entonces inicio
                              avanza;
                              ver(sucede(n));
                              si frente-libre entonces inicio
                                  avanza;
                                  si derecha-libre entonces inicio
                                      sur;
                                      apagate;
                                  fin;
                                  repetir 3 veces gira-izquierda;
                              fin sino inicio
                                  sur;
                                  apagate;
                              fin;
                          fin sino inicio
                              si orientado-al-este y derecha-libre entonces inicio

                                  avanza;
                                  ver(sucede(n));
                                  si frente-libre entonces inicio
                                      avanza;
                                      si derecha-bloqueada entonces inicio
                                          sur;
                                          apagate;
                                      fin;
                                      repetir 3 veces gira-izquierda;
                                  fin sino inicio
                                      sur;
                                      apagate;
                                  fin;

                              fin sino
                              si orientado-al-oeste y derecha-bloqueada entonces inicio
                                  avanza;
                                  ver(precede(n));
                                  si frente-libre entonces inicio
                                      avanza;
                                      si derecha-libre entonces inicio
                                          sur;
                                          apagate;
                                      fin;
                                      repetir 3 veces gira-izquierda;
                                  fin sino inicio
                                      sur;
                                      apagate;
                                  fin;
                              fin sino inicio
                                  si orientado-al-oeste y derecha-libre entonces inicio

                                      avanza;
                                      ver(precede(n));
                                      si frente-libre entonces inicio
                                          avanza;
                                          si derecha-bloqueada entonces inicio
                                              sur;
                                              apagate;
                                          fin;
                                          repetir 3 veces gira-izquierda;
                                      fin sino inicio
                                          sur;
                                          apagate;
                                      fin;

                                  fin;
                              fin;
                          fin;
                      fin;
                  fin sino inicio
                      si izquierda-libre y derecha-bloqueada y frente-bloqueado entonces inicio
                          gira-izquierda;
                          si orientado-al-norte o orientado-al-sur entonces inicio
                              avanza;
                              ver(n);
                              si frente-libre entonces inicio
                                  avanza;
                                  si izquierda-bloqueada o derecha-libre o frente-libre entonces inicio
                                      sur;
                                      apagate;
                                  fin;
                                  gira-izquierda;
                              fin sino inicio
                                  sur;
                                  apagate;
                              fin;
                          fin sino inicio
                              si orientado-al-este entonces inicio
                                  avanza;
                                  ver(sucede(n));
                                  si frente-libre entonces inicio
                                      avanza;
                                      gira-izquierda;
                                  fin sino inicio
                                      sur;
                                      apagate;
                                  fin;
                              fin sino inicio
                                  avanza;
                                  ver(precede(n));
                                  si frente-libre entonces inicio
                                      avanza;
                                      gira-izquierda;
                                  fin sino inicio
                                      sur;
                                      apagate;
                                  fin;
                              fin;
                          fin;
                      fin sino inicio
                          si no si-es-cero(n) entonces inicio
                              repetir 2 veces gira-izquierda;
                              ver(n);
                              repetir 2 veces gira-izquierda;
                          fin sino inicio
                              repetir 2 veces gira-izquierda;
                          fin;
                      fin;
                  fin;
              fin;
          fin;
      fin;
  fin;
fin;
    inicia-ejecucion
    si derecha-bloqueada y frente-bloqueado y izquierda-bloqueada entonces inicio
        apagate;
    fin;
    ver(0);
    norte;
        apagate;
    termina-ejecucion
finalizar-programa
