iniciar-programa

    define-nueva-instruccion gira-derecha como inicio
        gira-izquierda;
        gira-izquierda;
        gira-izquierda;
    fin;

    define-nueva-instruccion media-vuelta como inicio
        gira-izquierda;
        gira-izquierda;
    fin;

    define-nueva-instruccion orientar como inicio
        mientras no-orientado-al-este hacer gira-izquierda;
    fin;

    define-nueva-instruccion camina(n) como inicio
        si frente-libre y derecha-bloqueada entonces inicio
            avanza;
            si orientado-al-este entonces inicio
                    si derecha-libre entonces inicio
                        camina(sucede(n));
                        si frente-libre y derecha-libre entonces inicio
                            avanza;
                        fin
                        sino inicio
                            mientras no-orientado-al-sur hacer gira-izquierda;
                            apagate;
                        fin;
                    fin
                    sino inicio
                        camina(sucede(n));
                        si frente-libre y derecha-bloqueada entonces inicio
                            avanza;
                        fin
                        sino inicio
                            mientras no-orientado-al-sur hacer gira-izquierda;
                            apagate;
                        fin;
                    fin;
            fin
            sino inicio
                    si orientado-al-oeste entonces inicio
                        si no si-es-cero (precede(n)) o derecha-libre entonces inicio
                            si derecha-libre entonces inicio
                                camina(precede(n));
                                si frente-libre y derecha-libre entonces inicio
                                    avanza;
                                fin
                                sino inicio
                                    mientras no-orientado-al-sur hacer gira-izquierda;
                                    apagate;
                                fin;
                            fin
                            sino inicio
                                camina(precede(n));
                                si frente-libre y derecha-bloqueada entonces inicio
                                    avanza;
                                fin
                                sino inicio
                                    mientras no-orientado-al-sur hacer gira-izquierda;
                                    apagate;
                                fin;
                            fin;
                        fin
                        sino inicio
                            si frente-libre entonces inicio
                                avanza;
                            fin
                            sino inicio
                                mientras no-orientado-al-sur hacer gira-izquierda;
                                apagate;
                            fin;
                        fin;
                    fin
                    sino inicio
                        si derecha-libre entonces inicio
                            camina(n);
                            si frente-libre y derecha-libre entonces inicio
                                avanza;
                            fin
                            sino inicio
                                mientras no-orientado-al-sur hacer gira-izquierda;
                                apagate;
                            fin;
                        fin
                        sino inicio
                            camina(n);
                            si frente-libre y derecha-bloqueada entonces inicio
                                avanza;
                            fin
                            sino inicio
                                mientras no-orientado-al-sur hacer gira-izquierda;
                                apagate;
                            fin;
                        fin;
                    fin;
            fin;
        fin
        sino inicio
            si derecha-libre entonces inicio
                gira-derecha;
                avanza;
                si orientado-al-este entonces inicio
                    si derecha-libre entonces inicio
                        camina(sucede(n));
                        si frente-libre y derecha-libre entonces inicio
                            avanza;
                            gira-derecha;
                        fin
                        sino inicio
                            mientras no-orientado-al-sur hacer gira-izquierda;
                            apagate;
                        fin;
                    fin
                    sino inicio
                        camina(sucede(n));
                        si frente-libre y derecha-bloqueada entonces inicio
                            avanza;
                            gira-derecha;
                        fin
                        sino inicio
                            mientras no-orientado-al-sur hacer gira-izquierda;
                            apagate;
                        fin;
                    fin;
                fin
                sino inicio
                    si orientado-al-oeste entonces inicio
                        si no si-es-cero (precede(n)) o derecha-libre entonces inicio
                            si derecha-libre entonces inicio
                                camina(precede(n));
                                si frente-libre y derecha-libre entonces inicio
                                    avanza;
                                    gira-derecha;
                                fin
                                sino inicio
                                    mientras no-orientado-al-sur hacer gira-izquierda;
                                    apagate;
                                fin;
                            fin
                            sino inicio
                                camina(precede(n));
                                si frente-libre y derecha-bloqueada entonces inicio
                                    avanza;
                                    gira-derecha;
                                fin
                                sino inicio
                                    mientras no-orientado-al-sur hacer gira-izquierda;
                                    apagate;
                                fin;
                            fin;
                        fin
                        sino inicio
                            si derecha-libre entonces inicio
                                si frente-libre y derecha-libre entonces inicio
                                    avanza;
                                    gira-derecha;
                                fin
                                sino inicio
                                    mientras no-orientado-al-sur hacer gira-izquierda;
                                    apagate;
                                fin;
                            fin
                            sino inicio
                                si frente-libre y derecha-bloqueada entonces inicio
                                    avanza;
                                    gira-derecha;
                                fin
                                sino inicio
                                    mientras no-orientado-al-sur hacer gira-izquierda;
                                    apagate;
                                fin;
                            fin;
                        fin;
                    fin
                    sino inicio
                        si derecha-libre entonces inicio
                                camina(n);
                                si frente-libre y derecha-libre entonces inicio
                                    avanza;
                                    gira-derecha;
                                fin
                                sino inicio
                                    mientras no-orientado-al-sur hacer gira-izquierda;
                                    apagate;
                                fin;
                        fin
                        sino inicio
                                camina(n);
                                si frente-libre y derecha-bloqueada entonces inicio
                                    avanza;
                                    gira-derecha;
                                fin
                                sino inicio
                                    mientras no-orientado-al-sur hacer gira-izquierda;
                                    apagate;
                                fin;
                        fin;
                    fin;
                fin;
            fin
            sino inicio
              si no si-es-cero (n) o (derecha-libre) o (orientado-al-este y izquierda-libre) entonces inicio
                gira-izquierda;
                si frente-libre entonces inicio
                    avanza;
                    si orientado-al-este entonces inicio
                        si derecha-libre entonces inicio
                                camina(sucede(n));
                                si frente-libre y derecha-libre entonces inicio
                                    avanza;
                                    si derecha-bloqueada entonces inicio
                                        gira-izquierda;
                                    fin
                                    sino inicio
                                        mientras no-orientado-al-sur hacer gira-izquierda;
                                        apagate;
                                    fin;
                                fin
                                sino inicio
                                    mientras no-orientado-al-sur hacer gira-izquierda;
                                    apagate;
                                fin;
                        fin
                        sino inicio
                                camina(sucede(n));
                                si frente-libre y derecha-bloqueada entonces inicio
                                    avanza;
                                    si derecha-bloqueada entonces inicio
                                        gira-izquierda;
                                    fin
                                    sino inicio
                                        mientras no-orientado-al-sur hacer gira-izquierda;
                                        apagate;
                                    fin;
                                fin
                                sino inicio
                                    mientras no-orientado-al-sur hacer gira-izquierda;
                                    apagate;
                                fin;
                        fin;
                    fin
                    sino inicio
                        si orientado-al-oeste entonces inicio
                            si no si-es-cero (precede(n)) o derecha-libre entonces inicio
                                si derecha-libre entonces inicio
                                        camina(precede(n));
                                        si frente-libre y derecha-libre entonces inicio
                                            avanza;
                                            si derecha-bloqueada entonces inicio
                                                gira-izquierda;
                                            fin
                                            sino inicio
                                                mientras no-orientado-al-sur hacer gira-izquierda;
                                                apagate;
                                            fin;
                                        fin
                                        sino inicio
                                            mientras no-orientado-al-sur hacer gira-izquierda;
                                            apagate;
                                        fin;
                                fin
                                sino inicio
                                        camina(precede(n));
                                        si frente-libre y derecha-bloqueada entonces inicio
                                            avanza;
                                            si derecha-bloqueada entonces inicio
                                                gira-izquierda;
                                            fin
                                            sino inicio
                                                mientras no-orientado-al-sur hacer gira-izquierda;
                                                apagate;
                                            fin;
                                        fin
                                        sino inicio
                                            mientras no-orientado-al-sur hacer gira-izquierda;
                                            apagate;
                                        fin;
                                fin;
                            fin
                            sino inicio
                                si derecha-libre entonces inicio
                                    si frente-libre y derecha-libre entonces inicio
                                        avanza;
                                        gira-izquierda;
                                    fin
                                    sino inicio
                                        mientras no-orientado-al-sur hacer gira-izquierda;
                                        apagate;
                                    fin;
                                fin
                                sino inicio
                                    si frente-libre y derecha-bloqueada entonces inicio
                                        avanza;
                                        gira-izquierda;
                                    fin
                                    sino inicio
                                        mientras no-orientado-al-sur hacer gira-izquierda;
                                        apagate;
                                    fin;
                                fin;
                            fin;
                        fin
                        sino inicio
                            si derecha-libre entonces inicio
                                    camina(n);
                                    si frente-libre y derecha-libre entonces inicio
                                        avanza;
                                        si derecha-bloqueada entonces inicio
                                            gira-izquierda;
                                        fin
                                        sino inicio
                                            mientras no-orientado-al-sur hacer gira-izquierda;
                                            apagate;
                                        fin;
                                    fin
                                    sino inicio
                                        mientras no-orientado-al-sur hacer gira-izquierda;
                                        apagate;
                                    fin;
                            fin
                            sino inicio
                                    camina(n);
                                    si frente-libre y derecha-bloqueada entonces inicio
                                        avanza;
                                        si derecha-bloqueada entonces inicio
                                            gira-izquierda;
                                        fin
                                        sino inicio
                                            mientras no-orientado-al-sur hacer gira-izquierda;
                                            apagate;
                                        fin;
                                    fin
                                    sino inicio
                                        mientras no-orientado-al-sur hacer gira-izquierda;
                                        apagate;
                                    fin;
                            fin;
                        fin;
                    fin;
                fin
                sino inicio
                    si orientado-al-este entonces inicio

                        camina(n);
                        gira-izquierda;

                    fin
                    sino inicio
                        si orientado-al-oeste entonces inicio
                            si no si-es-cero (n) entonces inicio
                                camina(n);
                                gira-izquierda;

                            fin
                            sino gira-izquierda;
                        fin
                        sino inicio
                            camina(n);
                            gira-izquierda;

                        fin;
                    fin;
                fin;
              fin
              sino inicio
                  si frente-bloqueado y derecha-bloqueada y izquierda-bloqueada entonces media-vuelta;
              fin;
            fin;
        fin;
    fin;

    inicia-ejecucion
        orientar;
        camina(0);
        mientras no-orientado-al-norte hacer gira-izquierda;
        apagate;
    termina-ejecucion
finalizar-programa
