iniciar-programa
define-nueva-instruccion media-vuelta como repetir 2 veces gira-izquierda;
define-nueva-instruccion gira-derecha como repetir 3 veces gira-izquierda;

define-nueva-instruccion bloqueado(n) como inicio
 media-vuelta; mientras frente-libre hacer avanza; gira-izquierda;
 si frente-libre entonces inicio
  avanza; gira-izquierda;
 fin
 sino inicio
 media-vuelta;
 mientras frente-libre hacer avanza;
 mientras junto-a-zumbador hacer coge-zumbador;
 repetir n veces deja-zumbador;
 apagate;
 fin;
fin;

define-nueva-instruccion compara(n) como inicio
 si junto-a-zumbador y no si-es-cero(n) entonces inicio
  coge-zumbador;
  compara(precede(n));
  deja-zumbador;
  sal-de-instruccion;
 fin
 sino
 si si-es-cero(n) y junto-a-zumbador entonces inicio
  media-vuelta;
  sal-de-instruccion;
 fin;
 si si-es-cero(n) y no junto-a-zumbador entonces inicio
  media-vuelta;
  sal-de-instruccion;
 fin;
fin;

define-nueva-instruccion prueba(n) como inicio
 si frente-libre y orientado-al-norte entonces inicio
  avanza;
  compara(n);
  si orientado-al-sur entonces inicio
   avanza;
   sal-de-instruccion;
  fin
  sino inicio
   media-vuelta; avanza; gira-izquierda;
  fin;
 fin
 sino inicio
 gira-derecha;
 fin;

 si frente-libre y orientado-al-este entonces inicio
  avanza;
  compara(n);
  si orientado-al-oeste entonces inicio
   avanza;
   sal-de-instruccion;
  fin
  sino inicio
   media-vuelta; avanza;  gira-izquierda;
  fin;
 fin
 sino inicio
 gira-derecha;
 fin;

  si frente-libre y orientado-al-sur entonces inicio
  avanza;
  compara(n);
  si orientado-al-norte entonces inicio
   avanza;  gira-derecha;
   sal-de-instruccion;
  fin
  sino inicio
   media-vuelta; avanza;  gira-izquierda;
  fin;
 fin
 sino inicio
 gira-derecha;
 fin;

  si frente-libre y orientado-al-oeste entonces inicio
  avanza;
  compara(n);
  si orientado-al-este entonces inicio
   avanza;
   sal-de-instruccion;
  fin
  sino inicio
   media-vuelta; avanza;   gira-izquierda;
  fin;
 fin
 sino inicio
 gira-derecha;
 fin;


 mientras no orientado-al-norte hacer gira-izquierda;

 si frente-libre y orientado-al-norte y izquierda-libre entonces inicio
   avanza;
   gira-izquierda; avanza;
   compara(n);
   si orientado-al-este entonces inicio
    avanza;
    gira-derecha;
    avanza;
    mientras no orientado-al-este hacer gira-izquierda;
    sal-de-instruccion;
   fin
   sino inicio
    media-vuelta; avanza;
    gira-derecha; avanza;  media-vuelta;
   fin;
   fin;

   si frente-libre y orientado-al-norte y derecha-libre entonces inicio
   avanza;
   gira-derecha; avanza;
   compara(n);
   si orientado-al-oeste entonces inicio
    avanza;
    gira-izquierda;
    avanza;
    mientras no orientado-al-este hacer gira-izquierda;
    sal-de-instruccion;
   fin
   sino inicio
    media-vuelta; avanza;
    gira-izquierda; avanza;  media-vuelta;
   fin;
   fin;

   mientras no orientado-al-sur hacer gira-izquierda;

   si frente-libre y orientado-al-sur y derecha-libre entonces inicio
   avanza;
   gira-derecha; avanza;
   compara(n);
   si orientado-al-este entonces inicio
    avanza;
    gira-izquierda;
    avanza;
    mientras no orientado-al-este hacer gira-izquierda;
    sal-de-instruccion;
   fin
   sino inicio
    media-vuelta; avanza;
    gira-izquierda; avanza; media-vuelta;
    mientras no orientado-al-norte hacer gira-izquierda;
   fin;
   fin;
    mientras no orientado-al-sur hacer gira-izquierda;

   si frente-libre y orientado-al-sur y izquierda-libre entonces inicio
   avanza;
   gira-izquierda; avanza;
   compara(n);
   si orientado-al-oeste entonces inicio
    avanza;
    gira-derecha;
    avanza;
    mientras no orientado-al-este hacer gira-izquierda;
    sal-de-instruccion;
   fin
   sino inicio
    media-vuelta; avanza;
    gira-derecha; avanza;
    mientras no orientado-al-norte hacer gira-izquierda;
    fin;
   fin;


     mientras no orientado-al-norte hacer gira-izquierda;


fin;


define-nueva-instruccion uno(n) como inicio
 si junto-a-zumbador entonces inicio
  coge-zumbador;
  uno(sucede(n));
 fin
 sino inicio
 repetir n veces deja-zumbador;
 prueba(n);
 fin;
fin;


define-nueva-instruccion recorre(n) como inicio
 si frente-libre y no junto-a-zumbador entonces inicio
  avanza;
 fin
 sino
 si junto-a-zumbador entonces inicio
  uno(0);
  si orientado-al-norte  entonces inicio
   si frente-libre entonces inicio
   avanza;
   recorre(sucede(n));
   fin
   sino inicio
   si derecha-libre entonces
   bloqueado(n)
   sino
   bloqueado(sucede(n));
   recorre(sucede(n));
   fin;
  fin
  sino inicio
   mientras no orientado-al-norte hacer gira-izquierda;
    si frente-libre entonces inicio
     avanza;
     recorre(n);
    fin
    sino inicio
     bloqueado(n);
     recorre(n);
    fin;
  fin;
 fin;
 fin;

    inicia-ejecucion
    mientras no orientado-al-oeste hacer gira-izquierda;
    mientras frente-libre hacer avanza;
    gira-izquierda;
    mientras frente-libre hacer avanza;
    media-vuelta;
    recorre(0);
      apagate;
    termina-ejecucion
finalizar-programa

