Está en la página 1de 16

CAPITULO UNO

El mundo del robot

En este capítulo se presenta a Karel1 el robot y se hace un bosquejo del mundo


en el que habita. En los capítulos siguientes, en donde se requiere lograr un
entendimiento a mayores niveles de profundidad, se ampliarán estas ideas preliminares.

1.1 El mundo de Karel


Karel vive en un mundo muy poco excitante de acuerdo con los estándares
actuales (no hay volcanes, ni restaurantes chinos, ni orquestas sinfónicas), pero que
cuenta con la variedad suficiente para permitirle desarrollar ciertas tareas interesantes,
enunciadas en forma sencilla. De manera informal, se podría decir que el mundo de
Karel es un conjuntó de calles por las que éste puede desplazarse. También contiene
objetos especiales que Karel puede sentir y manipular.
La figura 1-1 es un mapa que ilustra la estructura del mundo de Karel, en la
forma de un gran plano con los puntos cardinales comunes: norte, sur, este y oeste. El
mundo está limitado en su lado oeste por una pared vertical infinita que se extiende
hacia el norte. Hacia el sur el mundo está limitado por una pared horizontal infinita que
se extiende hacia el este. Estas paredes limítrofes están hechas de neutronio sólido, un
metal impenetrable que impide que Karel se caiga por los bordes de su mundo.
A lo largo y a lo ancho del mundo de Karel se encuentran calles horizontales
(que corren de este a oeste) y avenidas verticales (que corren de
norte a sur) con intervalos regulares de una cuadra. Una esquina, a la que generalmente
se conoce como la esquina de una calle, se encontrará en donde se crucen una calle y
una avenida. Karel se puede colocar en cualquier esquina, volteando hacia cualquiera de
los puntos cardinales. Tanto las calles como las avenidas están numeradas;
consecuentemente, cada esquina está identificada en forma única y exclusiva por los
números de calle y avenida correspondientes. La esquina en donde se intersectan la
Calle Uno y la Avenida Uno se denomina origen.
Además de Karel, existen otros dos tipos dé objetos que pueden ocupar su
mundo. El primer tipo de estos objetos son las secciones de pared. Las secciones de
pared también están fabricadas del metal impenetrable, neutronio y, pueden ser
fabricadas de cualquier longitud que se desee. Están colocadas lateralmente entre
esquinas de calles adyacentes, bloqueando efectivamente la trayectoria directa de Karel
de una esquina a la siguiente. Las secciones de pared se utilizan para representar
obstáculos que Karel debe evitar o trasponer, tales como vallas o montañas. También
pueden construirse cuartos cerrados, laberintos y otras barreras con las secciones de
pared.
El segundo tipo de objeto que puede encontrarse en el mundo de Karel es un zumbador.
Los, zumbadores son pequeñas bolas de plástico que emiten un sonido suave
intermitente. Están colocados en las esquinas y pueden ser levantados, transportados y
bajados por Karel. Algunas de las tareas de Karel incluyen levantar o colocar ciertos
modelos hechos a base de zumbadores, o encontrar y transportar estos zumbadores.
Figura 1.1 La estructura del mundo de Karel

1.2 Las habilidades de Karel


Ahora se desviará la atención del mundo de Karel y se concentrará en Karel
mismo. Karel es un robot móvil: puede moverse hacia adelante, en la dirección hacia la
cual está volteado y puede dar la vuelta en su lugar. También puede percibir el entorno
que lo rodea: Karel posee rudimentarios sentidos de la vista, el sonido, la dirección y el
tacto.
Karel puede ver, utilizando para ello cualquiera .de las tres cámaras de televisión
con las que está equipado, las cuales se enfocan directamente hacia adelante, hacia su
derecha y hacia su izquierda. Estas tres cámaras están enfocadas para detectar secciones
de pared a una distancia exacta de media cuadra del lugar en el que está colocado Karel.
Karel también tiene la habilidad de poder escuchar un zumbador, pero solamente si
ambos están en la misma esquina; el sonido emitido por los zumbadores es muy tenue.
Al consultar su brújula interna, Karel puede determinar la dirección hacia la que está
volteado. Finalmente, Karel está equipado con un brazo mecánico con el cual puede
levantar y bajar los zumbadores. Para transportar estos zumbadores, Karel emplea una
bolsa para zumbadores a prueba de ruido, la cual está colocada alrededor de su cintura.
Karel también puede determinar si está transportando algún zumbador en esta bolsa
tocándola con su brazo.
Siempre que desee que Karel efectúe una tarea dentro de su mundo se le debe
suministrar un conjunto de instrucciones detalladas que expliquen cómo debe llevarse a
cabo la tarea. Karel puede recibir, memorizar y seguir este conjunto de instrucciones, al
cual se denomina programa.
¿Qué lenguaje se debe emplear para programar (aquí se utiliza “programar" en el
sentido de "escribir instrucciones para") a Karel? En lugar de programar a Karel en
inglés, español ü otro idioma natural, se emplea un lenguaje de programación especial,
el cual ha sido diseñado para ayudar a escribir programas robot. El lenguaje de
programación robot de Karel (como cualquier otro lenguaje natural) tiene un
vocabulario, símbolos de puntuación y reglas gramaticales. Pero este lenguaje, a
diferencia de los demás idiomas, es lo suficientemente sencillo para que Karel lo pueda
comprender; aunque al mismo tiempo es un lenguaje poderoso y conciso que permite
escribir programas breves y faltos de ambigüedad para Karel.

1.3 Tareas y situaciones


Una tarea es simplemente algo que se desea que haga Karel. Los siguientes son
ejemplos de tareas para Karel:, ir a la esquina de la Calle Quince y la Avenida Diez,
emprender una carrera de vallas (con secciones de pared representando las vallas),
escapar de un cuarto cerrado en el que hay una puerta, encontrar un zumbador y
depositarlo en el origen, y escapar de un laberinto.
Una situación es una descripción exacta del mundo de Karel. Además de las
estructuras básicas del mundo de Karel, las cuales están siempre presentes, pueden
añadirse secciones de pared y zumbadores. Para especificar completamente una
situación, se debe incluir la siguiente información.
• ¿Cuál es la posición actual de Karel? Hay que especificar tanto la posición de
Karel (la esquina en la que se encuentra) como la dirección hacia la que está volteando.
• ¿Cuál es la posición y el tamaño de cada una de las secciones de pared dentro
del mundo?
• ¿Cuál es la posición de cada uno de los zumbadores dentro del mundo? Esta
información incluye la especificación del número de zumbadores que se encuentran en
la bolsa para zumbadores de Karel.
Las situaciones se especifican en este libro mediante un pequeño mapa o una
breve descripción por escrito. Si se conoce el número de zumbadores que Karel tiene en
su bolsa, entonces el mapa de la figura 1-1 especificará completamente una situación.
La situación inicial para cualquier tarea se define como la situación en la que está Karel
al iniciarse la tarea. La situación final es la situación en la cual está Karel al momento
de apagarse. A menos que se indique lo contrario, se puede suponer que Karel inicia
todas sus tareas con la bolsa para zumbadores vacía.

1
Karel ha sido nombrado así en honor del dramaturgo checoeslovaco Karel Capek, quien popularizó la palabra
"robot" en su obra R.U.R. (Rossum's Universal Robots). La palabra "robot" se deriva de la palabra checoeslovaca
"robots" que significa "trabajo forzado".
CAPÍTULO DOS
Instrucciones
primitivas y programas simples

En este Capítulo se inicia el estudio del lenguaje de programación de Karel. Se


comenzará con una explicación detallada de las cinco instrucciones primitivas
incorporadas al vocabulario de Karel. Utilizando estas instrucciones, se puede ordenar a
Karel que se mueva en su mundo y manipule los zumbadores. En la sección 2.4 se
demuestra un programa robot complejo y se estudian la puntuación y reglas
gramaticales elementales del lenguaje de programación de Karel. Al finalizar esta
sección, el lector podrá escribir programas que instruyan a Karel para efectuar tareas
como evitar obstáculos simples y efectuar el transporte de zumbadores.
Antes de explicar las instrucciones primitivas de Karel, se definirá en primer
lugar el término técnico ejecutar: Karel ejecuta una instrucción al llevar a cabo la
acción asociada con ésta. Más aún, Karel ejecuta un programa ejecutando cada una de
las instrucciones del programa.

2.1 Cambio de posición


Karel entiende dos instrucciones primitivas que cambian su posición. La primera
de estas instrucciones es avanza, la cual cambia la posición de Karel.
avanza Cuando Karel ejecuta una instrucción avanza, se mueve hacia adelante
una Cuadra; permanece orientado en la misma dirección. Para evitar
dañarse a sí mismo, Karel no se moverá hacia adelante si detecta una
sección de pared o una pared limítrofe entre él y la esquina hacia la cual
debe moverse. En cambio, en una situación de este tipo Karel ejecuta la
instrucción avanza apagándose a sí mismo. Esta acción, denominada
paro por error se explicará en mayor detalle en la sección 2.5.

Figura 2-1: Ejecución con éxito de una instrucción avanza

A partir de esta definición se puede ver que Karel ejecuta una instrucción avanza
ya sea moviéndose hacia adelante (cuando el espacio al frente está libre hasta la
siguiente esquina) o efectuando un paro por error (cuando el espacio al frente está
bloqueado). Ambas situaciones se ilustran en la siguiente página. En la figura 2-1 se
muestra la ejecución con éxito de una instrucción avanza. La sección de pared mostrada
está más allá del rango de visión de Karel, o sea media cuadra, y por lo tanto no puede
impedir su movimiento. En contraste, la figura 2-2 muestra un intento fallido de
movimiento. Cuando Karel ejecuta una instrucción avanza en esta situación, detecta una
sección de pared que se interpone directamente en su trayectoria. Aplicando su instinto
de conservación, Karel ejecuta esta instrucción avanza efectuando un paro por error.
La segunda instrucción primitiva que modifica la posición de Karel es gira-
izquierda. Esta instrucción cambia la dirección hacia la cual está volteando Karel, pero
no altera su posición.

gira-izquierda Karel ejecuta una instrucción gira-izquierda pivoteando izquierda


90° a la izquierda; por lo tanto, Karel permanece en la misma
esquina mientras ejecuta una instrucción gira-izquierda. Debido a
que es imposible que una sección de pared bloquee el giro de
Karel, la instrucción gira-izquierda no puede provocar un paro por
error.

Antes de moverse Después de moverse: paro por error

Figura 2-2: La ejecución de esta instrucción avanza provoca un paro por error
Karel inicia siempre sus tareas en una esquina, de cara hacia el norte, el sur, el
este o el oeste. No puede desplazarse a distancias equivalentes a fracciones de una
cuadra o girar en ángulos distintos a 90°. Por lo tanto, aunque tanto avanza como gira-
izquierda cambian su posición, después de ejecutar cualquiera de estas instrucciones
Karel se encontrará todavía en una esquina y continuará estando de cara a cualquiera de
los puntos cardinales.
El diseñador de Karel no incluyó una instrucción gira-a-la-derecha a propósito.
Si se añadiera una instrucción gira-a-la-derecha a la lista de instrucciones primitivas de
Karel, ¿le permitiría esto efectuar alguna tarea que no pudiera ejecutar en caso de no
contar con dicha instrucción? Si el lector lo piensa un momento (y aplica una dosis
adecuada de perspicacia), se dará cuenta de que la instrucción gira-a-la-derecha no es
indispensable; no le permite a Karel llevar a cabo ninguna tarea nueva. La observación
clave es que Karel puede lograr el equivalente a una instrucción gira-a-la-derecha
ejecutando tres instrucciones gira-izquierda.

2.2. Manejo de los zumbadores


Karel entiende dos instrucciones primitivas que le permiten manejar los
zumbadores. Estas dos instrucciones efectúan acciones opuestas.
toma-zumbador Cuando Karel ejecuta una instrucción toma-zumbador, levanta un
zumbador de la esquina en la que está colocado y lo deposita en
su bolsa para zumbadores. Si ejecuta una instrucción toma-
zumbador en una esquina en donde no hay ningún zumbador,
Karel efectúa un paro por error. En una esquina en donde hay
varios zumbadores, Karel levanta un zumbador al azar
(solamente uno) de los zumbadores colocados en la esquina y lo
deposita en su bolsa para zumbadores.

deja-zumbador Karel ejecuta una instrucción deja-zumbador sacando zumbador


un zumbador de su bolsa para zumbadores y colocándolo en la
esquina de la calle en la que se encuentra. Si Karel trata de
ejecutar una instrucción deja-zumbador cuando su bolsa para
zumbadores está vacía, efectuará entonces un paro por error.

Los zumbadores son tan pequeños que Karel puede pasar sobre ellos;
únicamente las secciones de pared y las paredes limítrofes pueden bloquear su
movimiento.

2.3. Terminación de una tarea


Finalmente, se necesita contar con una forma para indicarle a Karel que ha
terminado con su tarea. La instrucción apagate cumple con este requisito.
apagate Cuando Karel ejecuta una instrucción apagate, se apaga a sí mismo y es
incapaz de ejecutar instrucciones hasta que vuelve a ser activado para
otra tarea. La última instrucción en cualquier programa robot debe ser
una instrucción apagate.

2.4. Un programa completo


En esta sección se establece una tarea para Karel y posteriormente se muestra un
programa completo que instruye a Karel para que efectúe correctamente dicha tarea. La
tarea de Karel, ilustrada en la figura 2-3, es transportar el zumbador de la calle Dos y
Avenida Cuatro a la Calle Cuatro y Avenida Cinco. Después de colocar el zumbador en
esta posición, Karel debe avanzar una cuadra más hacia el norte antes de apagarse.
Situación inicial Situación final
Figura 2-3: Una tarea de transporte de un zumbador
El siguiente programa robot instruye a Karel sobre la forma correcta de llevar a
cabo su tarea. E1 programa está construido a partir de las cinco instrucciones primitivas,
unas cuantas palabras nuevas del vocabulario de Karel y el símbolo punto y coma (";").
Primero se analizará la forma en que Karel ejecuta el programa y después la estructura
general de todos los programas robot.

INICIAR-PROGRAMA
INICIA-EJECUCION
avanza;
avanza;
toma-zumbador;
avanza;
gira-izquierda;
avanza;
avanza;
deja-zumbador;
avanza;
apagate
TERMINA-EJECUCION
FINALIZAR-PROGRAMA
2.4.1. Ejecución de un programa
¿Qué se debe hacer para lograr que Karel ejecute este programa? Primero, se
activa a Karel oprimiendo el botón de encendido. Al hacer esto, se conecta el suministro
de energía a Karel y queda listo para recibir y memorizar un programa. A continuación
se lee el programa a Karel, asegurándose de incluir todas las palabras y signos de
puntuación. En este ejemplo se empieza por leer: "INICIAR-PROGRAMA, INICIA
EJECUCION, avanza punto y coma avanza punto y coma levanta un zumbador punto y
coma avanza punto y coma gira a la izquierda ..." Desafortunadamente, no se pueden
comunicar a Karel las sangrías del programa; esto es únicamente en beneficio del
programador. Mientras se lee el programa a Karel, él lo va memorizando, pero no
comienza a ejecutar las instrucciones que contiene.
Cuando ya se ha terminado de leerle el programa a Karel, se establece primero la
situación inicial añadiendo las secciones de pared y los zumbadores requeridos al
mundo de Karel. A continuación, se oprime el botón Ejecutar-Programa, el cual indica a
Karel que debe comenzar a ejecutar el programa. En este momento, Karel asume el
control completo del programa y no se puede afectar sus acciones nuevamente sino
hasta que se apague. Si el programa contiene errores, hay que esperar a que éstos se
presenten antes de corregir el programa y leérselo nuevamente a Karel.
¿Cómo ejecuta Karel un programa? Las reglas son bastante sencillas; Karel
ejecuta en forma secuencial cada una de las instrucciones entre las palabras INICIA-
EJECUCION y TERMINA-EJECUCION. Esto se efectúa, sin omitir ninguna
instrucción, en un orden estricto de arriba hacia abajo. Karel continúa ejecutando las
instrucciones hasta que aparezca una instrucción apágate o si se efectúa un paro por
error.
Por supuesto, Karel no es un robot real, así que no se le puede leer un programa
y ver cómo lo ejecuta. Para determinar qué es lo que hace un programa, hay que simular
la forma en que Karel lo ejecuta. Simular un programa robot significa que se debe
ejecutar en forma sistemática el programa exactamente de la forma en que Karel lo
ejecutaría, registrando cada una de las acciones que se llevan a cabo. Se puede simular
manualmente un programa robot utilizando marcas en una hoja de papel (representando
a Karel y a su mundo). Con el fin de llegar a ser programadores eficientes, es necesario
entender exactamente cómo ejecuta Karel los programas robot. La habilidad para
simular el comportamiento de Karel en forma rápida y correcta es una capacidad
importante que se debe adquirir. . .
Ahora ya se puede simular la ejecución del programa por Karel en la situación
inicial. Se presiona el botón de encendido de Karel, se le lee el programa, delinea el
mundo y oprime su botón Ejecutar-Programa. Karel inicia la ejecución del programa en
la instrucción avanza colocada inmediatamente después de las palabras INICIA-
EJECUCION. Karel ejecuta esta instrucción moviéndose una cuadra hacia el este,
llegando a Calle Dos y Avenida Tres. A continuación, ejecuta la siguiente instrucción
avanza; esto provoca que Karel se mueva hacia la misma esquina en que se encuentra el
zumbador. Enseguida Karel ejecuta con éxito la instrucción toma-zumbador. Continúa
ejecutando la siguiente instrucción avanza, la que lo lleva a la esquina de la Calle Dos y
la Avenida Cinco. En este lugar Karel ejecuta la instrucción gira-izquierda; esta
instrucción hace que quede de cara hacia el norte. Ejecuta las siguientes dos
instrucciones avanza, después de las cuales se encuentra en la esquina de la Calle
Cuatro y la Avenida Cinco, en donde Karel ejecuta a continuación la instrucción deja-
zumbador. La última instrucción avanza lo dirige una cuadra más hacia el norte, a la
Calle Cinco y Avenida Cinco. Finalmente, Karel ejecuta la instrucción apágate,
completando el programa y efectuando la tarea requerida. De esta manera, se ha
verificado que el programa es correcto a través de la simulación.

2.4.2 La forma de los programas robot


Ahora que se entiende mejor la forma en que Karel ejecuta un programa, se
explorarán las reglas gramaticales del lenguaje de programación robot. Karel presta una
atención inusitada a las reglas gramaticales y de puntuación (la mente de los robots
pequeños los obliga a lograr consistencia en forma compulsiva), así el lector empleará
su tiempo correctamente si lo dedica a estudiar estas reglas con toda atención. Se
comenzará por dividir en tres tipos los símbolos que Karel entiende. El primer tipo son
los signos de puntuación, y su único componente es el punto y coma. Todos los demás
símbolos se encuentran en el vocabulario de Karel y se clasifican ya sea como
instrucciones, de las cuales ya se vieron algunos ejemplos, o como palabras reservadas.
Las palabras reservadas se utilizan para estructurar y organizar las instrucciones
primitivas en el lenguaje de Karel. En este libro las palabras reservadas están impresas
en mayúsculas, mientras que las instrucciones están impresas en minúsculas. Esta
distinción ayudará al lector a mantener separadas estas dos clases de palabras; sin
embargo, sólo se beneficiará con esta notación, ya que Karel solamente escucha el
programa que se le está leyendo (no puede establecer una diferencia entre mayúsculas y
minúsculas que se le suministran en forma oral). A continuación se explicarán las
cuatro palabras reservadas y las reglas de puntuación utilizadas en este ejemplo de
programación. Pero antes de seguir adelante, se revisará el programa.

INICIAR-PROGRAMA
INICIA-EJECUCION
avanza;
avanza;
toma-zumbador;
avanza;
gira-izquierda;
avanza;
avanza;
coloca zumbador;
avanza;
apagate
TERMINA-EJECUCION
FINALIZAR-PROGRAMA

Cada programa robot debe iniciarse con la palabra reservada INICIAR-


PROGRAMA. Esta palabra va seguida de la palabra reservada INICIA-EJECUCION,
la cual es seguida a su vez por la secuencia de instrucciones. Después de la secuencia de
instrucciones viene la palabra reservada TERMINA-EJECUCION, seguida finalmente
por la palabra reservada FINALIZAR-PROGRAMA. Los pares coincidentes de las
palabras reservadas inicio/fin se denominan delimitantes, debido a que delimitan el
inicio y la terminación de alguna secuencia importante.
La palabra reservada INICIA-EJECUCION le indica a Karel el lugar del
programa en que debe comenzar a ejecutar instrucciones cuando se oprima su botón
Ejecutar-Programa. La palabra reservada TERMINA-EJECUCION no le indica a Karel
que ya ha terminado de ejecutar un programa; para este fin se utiliza la instrucción
apágate. En cambio, la palabra TERMINA-EJECUCION delimita la terminación de las
instrucciones que Karel debe ejecutar. Si Karel está ejecutando un programa y llega a
TERMINA-EJECUCION, significará que se ha omitido una instrucción apagate en el
programa y Karel efectuará un paro por error. Esta no es la forma correcta en que Karel
debe finalizar la ejecución de un programa.
Ahora se analizará la puntuación del programa a base de punto y coma. El punto
y coma (";") sirve para separar instrucciones consecutivas. La regla que se debe seguir
es: "Cada instrucción está separada de la siguiente instrucción por punto y coma". Se
escribe el punto y coma inmediatamente después de la primera de las instrucciones a ser
separadas. Esta sencilla regla de puntuación algunas veces se malinterpreta como:
"Cada instrucción va seguida por un punto y coma", pero, como se verá en el siguiente
párrafo, estas dos reglas de puntuación son ligeramente diferentes. La diferencia entre
estas dos puntuaciones puede ser detectada si se analiza la instrucción apagate del
programa. La instrucción apagate no tiene un punto y coma porque va seguida de
TERMINA-EJECUCION, la cual es una palabra reservada y no una instrucción. No hay
ninguna regla que indique que las palabras reservadas deben ser separadas de las
instrucciones por medio de un punto y coma. Consecuentemente, mientras que la regla
"punto y coma entre instrucciones" sí cumple con su cometido, la regla "punto y coma
después de cada instrucción" no sirve para puntuar correctamente en este caso. Además,
debe hacerse notar que dos palabras reservadas consecutivas, como INICIAR-
PROGRAMA y INICIA-EJECUCION, no están separadas por un punto y coma.
Esta estrategia de puntuación es análoga a la forma en que se escribe un
conjunto de números en matemáticas. Por ejemplo, el conjunto que consiste de los
elementos 1, 4 y 7 se escribe como 1, 4, 7. En la analogía, los corchetes son los
delimitantes, los números son las instrucciones y las comas entre los números toman el
lugar del punto y coma. Si se escribiera este conjunto como 1, 4, 7, (aquí se ha colocado
una coma después de cada número; nótese la extraña coma final), parecería como si se
hubiera olvidado de escribir el último número del conjunto. De la misma manera, si se
incluyera un punto y coma después de apágate, Karel esperaría escuchar otra
instrucción, no la palabra reservada TERMINA-EJECUCION. Se deben puntuar los
programas cuidadosamente, puesto que muchos de los errores gramaticales son
resultado de una incorrecta puntuación con punto y coma.
Finalmente, nótese que los delimitantes y la entidad que limitan tienen una
sangría. Obsérvese que todo el programa tiene sangrías adecuadas, es claro y agradable
a la vista. La importancia de adoptar un estilo adecuado de programación no debe
subestimarse. Se debe adoptar el hábito de no sólo escribir correctamente el programa,
sino además escribirlo de forma que resulte fácil de leer. Cuando se estudien las
distintas facetas del estilo de programación, se debe prestar mucha atención a estas
sugerencias y ejemplos y tratar de emular el estilo de programación que se presenta en
los mismos.
¡Bravo! en este momento se ha dejado atrás una de las secciones con mayor
profusión de datos de este libro. Gran parte de este material se puede aprender
solamente si se memoriza. Pero no se preocupe; lo que en este momento parece ser un
gran número de reglas y convencionalismos arbitrarios, pronto le parecerá natural y
tendrá un sentido lógico. Los lenguajes de programación comparten esta arbitrariedad
con los lenguajes naturales (¿por qué el objeto en que nos, sentamos se llama "silla" y
por qué siempre debe preceder una coma a una conjunción que introduce una oración
independiente de la primera?) Tómese un minuto de descanso antes de pasar a la
siguiente sección.

2.5 Paro por error


Cuando se impide a Karel que complete con éxito la acción asociada con una
instrucción primitiva, ejecuta una instrucción equivocada apagándose a sí mismo. Esta
acción se conoce como paro por error y su efecto es equivalente a la ejecución de una
instrucción apagate. Pero el apagarse no es la única forma en que puede enfrentarse un
problema de este tipo; una estrategia alternativa puede ser el que Karel simplemente
ignore cualquier instrucción que no pueda ejecutar con éxito. Utilizando esta regla,
Karel continuará ejecutando el programa como si nunca se le hubiera pedido que
ejecutara la instrucción fallida. En el siguiente párrafo se explica por qué el diseñador
de Karel seleccionó la primera y más conservadora de estas opciones.
Para justificar esta elección, hay que observar que un paro por error resulta de un
programa incorrecto que induce a Karel a extraviarse. Cuando se presenta una situación
inesperada (una situación que impide que se ejecute con éxito una instrucción, es
probable que Karel no sea capaz de avanzar hacia la consecución de su tarea. El
continuar la ejecución de un programa bajo estas circunstancias puede llevar a una
discrepancia aún mayor entre lo que el programador desea que haga Karel y lo que en
realidad hará Karel; consecuentemente, la mejor estrategia es que Karel se apague a sí
mismo en cuanto aparezca la primera inconsistencia.
Hasta este momento se han estudiado tres instrucciones que pueden provocar
paros por error: avanza, toma-zumbador y deja-zumbador. El lector debe construir sus
programas con todo cuidado y asegurarse de que siempre se cumplan las siguientes
condiciones.
• Karel ejecuta una instrucción avanza únicamente cuando su trayectoria hacia la
siguiente esquina está despejada.
• Karel ejecuta una instrucción toma-zumbador únicamente cuando está en la misma
esquina, cuando menos, un zumbador.
• Karel ejecuta una instrucción deja-zumbador únicamente cuando su bolsa de
zumbadores no está vacía.

Estas condiciones se cumplen fácilmente si antes de escribir el programa se


conoce la situación inicial exacta en la que se colocará a Karel. También, para evitar un
paro por error cuando se concluye un programa, hay que recordar que debe incluirse
una instrucción apagate como la última instrucción de los programas.

2.6 Errores de programación


En esta sección se clasifican todos los errores de programación en cuatro
amplias categorías. Estas categorías se explican por medio de una analogía que ayuda a
clarificar la naturaleza de cada tipo de error. Puede surgir la pregunta: "¿por qué se debe
dedicar tanto tiempo a explicar los errores si nunca deben ocurrir éstos?" La respuesta a
esta pregunta es que la programación requiere de mucha precisión y aunque,
idealmente, estos errores no deben ocurrir, en la práctica se presentan con mucha
frecuencia. En lugar de esperar escribir programas enteramente correctos, hay que tratar
de escribir programas 90% correctos. Uno debe ser capaz de encontrar y corregir los
errores rápidamente a través de la simulación de los programas. Conocer el nombre del
enemigo es el primer paso para derrotarlo2, así que en este momento se pasa a la
siguiente explicación.
Un error lexicológico ocurre siempre que se lee a Karel una palabra que no está
en su vocabulario. A manera de una analogía, supóngase el lector que está parado en
una calle en la ciudad de San Francisco y un automovilista extraviado pregunta, "¿cómo
puedo llegar a Portland, Oregon?" Si le contesta "fsdt jdhpy hqngrpz zgr ghhgh
grmpims", habrá cometido un error lexicológico. El automovilista no puede seguir sus
instrucciones ya que no puede descifrar las palabras que forman sus instrucciones. De
manera similar, Karel debe comprender cada una de las palabras de un programa que se
le pida que ejecute.
Aun cuando Karel reconozca todas las palabras de un programa, es posible que
el programa incluya un error de sintaxis. Este tipo de error se presenta siempre que se
utiliza una forma gramatical o una puntuación incorrecta. Regresando al automovilista
extraviado, también se le puede contestar-"de siga cientas solo millas delante ocho
hacia". Aunque el automovilista reconoce cada una de las palabras por su connotación
individual, se han combinado en una forma que no tiene sentido: las parles de la oración
no están en su posición correcta de acuerdo con las reglas gramaticales. Ya se
explicaron las reglas gramaticales para los programas robot básicos en la sección 2.4.2.
Si los programas contienen errores ya sea lexicológicos o de sintaxis, Karel
descubrirá los errores mientras se le lee el programa. En ambos casos, Karel no tiene
idea de lo que se quiere decir; por lo tanto, no tratará de corregir los errores. En cambio,
informará de los errores que ha detectado y después se apagará, debido a que Karel es
incapaz de ejecutar un programa que no entiende por completo. Esta acción no
constituye un paro por error, ya que en este caso no tiene que ejecutar un programa.
Mientras se explican las dos siguientes categorías de errores, se supondrá que
Karel no ha encontrado errores lexicológicos o de sintaxis en el programa. En
consecuencia, después de oprimir el botón Ejecutar-Programa de Karel, él comenzará a
ejecutar el programa.
La tercera categoría de errores se denomina errores de ejecución. Karel puede
detectar estos errores cuando se presentan, de la misma manera que lo hace con los
errores lexicológicos o de sintaxis. Los errores de ejecución se presentan siempre que
Karel no puede ejecutar con éxito una instrucción y se ve forzado a efectuar un paro por
error. Regresando al automovilista, quien está tratando de llegar de San Francisco a
Portland, se le podría decir: "Sólo siga manejando otras ochocientas millas". Pero si está
volteando hacia el oeste en el momento de darle esta indicación, viajará sólo unas
cuantas millas antes de llegar al Océano Pacífico. En ese momento se detendrá al darse
cuenta de que no puede continuar siguiendo las instrucciones. Del mismo modo, Karel
se apagará si se le pide que ejecute una instrucción primitiva que no puede llevar a cabo
con éxito.
La última categoría de errores es la más peligrosa, ya qué Karel no puede
detectar este tipo de errores cuando se presentan. Esta categoría de errores sé ha
denominado errores de intento. Un error de intento se presenta siempre que Karel
ejecuta con éxito su programa, pero no completa con éxito la tarea que uno desea que
efectúe. Esto significa que el programa no es el adecuado para la tarea, pero no es
incorrecto como para que Karel pueda detectar algún error. Regresando nuevamente
con el automovilista, se le podría decir: ''Sólo siga manejando otras ochocientas millas".
Si en ese momento se encuentra volteando hacia el sur, podrá seguir las instrucciones
con éxito hasta el fin, pero llegará a Tijuana, México.
Hay que recordar que Karel no entiende la tarea para la que se ha programado;
todo lo que Karel sabe es cómo ejecutar las instrucciones que se le han dado en el
programa. Por lo tanto, no existe ninguna forma en la que él sepa que el programa no
logró el cometido que se esperaba.
Con frecuencia los errores de intento se presentan al inicio de un programa y
posteriormente conducen a errores en la ejecución. Una vez que Karel ha dado una
vuelta equivocada o se mueve en forma incorrecta, sólo es cuestión de tiempo el que
trate de moverse contra una pared o de levantar un zumbador, que no, se encuentra en el
lugar que él supone. Pero, el solo hecho de que una instrucción provoca un paro por
error no significa que la instrucción esté equivocada; una instrucción incorrecta al inicio
del programa puede conducir a un error que Karel descubrirá más adelante. En estos
casos, hay que retroceder en el programa hasta encontrar la instrucción que provocó el
paro por error para poder descubrir cuál de las instrucciones provocó inicialmente la
desviación de Karel. Este tipo de interacción entre los errores de intento y los errores de
ejecución se ilustra en forma concreta en el problema 2.7-1.

2.6.1 "Bugs" y depuración


En el argot computacional, los errores de cualquier tipo se denominan "bugs".
Existen muchas historias apócrifas sobre el origen de este término. En una de ellas se
cuenta que el término "bug" fue acuñado por ciertos ingenieros de una compañía
telefónica. Estos ingenieros utilizaron el término para describir la fuente de ruidos
aleatorios transmitidos por sus circuitos electrónicos de comunicación, diciendo que
había bichos en el circuito.
En otra historia, la computadora Mark I de Harvard estaba produciendo
respuestas incorrectas. Cuando los ingenieros la desarmaron, tratando de localizar el
problema, encontraron que una mosca muerta (atrapada entre los contactos de un relé)
era la causa de la falla; por lo tanto, se puede decir que este fue el primer "bug" de una
computadora. Abundan este tipo de historias, así que posiblemente nunca se sepa a
ciencia cierta cuál es la verdadera etimología de esta palabra.
El término "bug" se hizo popular en programación para salvaguardar el ego de aquellos
programadores que no podían admitir que sus programas estaban llenos de errores. En
lugar de esto, preferían decir que sus programas tenían "bugs". En realidad, esta
metáfora es adecuada: los "bugs" son difíciles de encontrar, y aunque se localice un
"bug" que se pueda corregir fácilmente, es difícil asegurar que se han encontrado todos
los "bugs" y que han sido eliminados de un programa. Depuración es el nombre que los
programadores dan a la actividad de eliminar los errores de un programa.

2.7 Problemas
El propósito de este grupo de problemas es probar sus conocimientos respecto a
la forma y contenido de programas robot simples. Los programas que se pide que sean
escritos son extensos pero no complicados. Consulte el programa y la explicación de la
sección 2.4 en cuanto a reglas y ejemplos de puntuación y gramática correctos.
Verifique que los programas sean correctos simulándolos con Karel colocado en la
situación inicial adecuada.
1. Encienda a Karel en la situación inicial que se muestra en la figura 2-4
y simule la ejecución del programa que se indica a continuación. La
tarea de Karel es encontrar el zumbador, levantarlo y apagarse. Dibuje
un mapa de la situación final, indicando los puntos en donde se
encuentre un error. Si ocurre un error de ejecución o de intento,
indique la forma en que corregiría el programa. Este programa no
tiene errores de sintaxis o lexicológicos.

Figura 2-4; Situación inicial para el problema 1


INICIAR-PROGRAMA
INICIA-EJECUCION
avanza;
gira-izquierda;
gira-izquierda;
avanza;
gira-izquierda;
avanza;
gira-izquierda;
avanza;
toma-zumbador;
apagate
TERMINA-EJECUCION
FINALIZAR-PROGRAMA

2. Inspeccione cuidadosamente el siguiente programa y corrija todos los


errores lexicológicos o de sintaxis. Clave: Hay ocho errores: cinco
errores se relacionan con punto y coma, uno es un error gramatical y
los otros dos son errores lexicológicos. Confirme que cada palabra se
encuentra en el lugar apropiado y que sea una instrucción o una
palabra reservada deletreada en forma correcta. Puede utilizarse el
programa en el problema 2.7-1 como modelo de un programa correcto
en cuanto a sintaxis y forma lexicológica.

INICIA-EJECUCION;
INICIAR-PROGRAMA
avanza;
avanza
toma-zumbador;
avanza;;
gira-izquierda;
avanza;
avanza;
gira-a-la-derecha;
deja-zumbador;
avanza;
apagate;
TERMINA-EJECUCION
FINALIZAR-PROGRAMA;

3. ¿Cuál es el más pequeño programa de Karel que resulta correcto en


cuanto a sintaxis y forma lexicológica?
4. Cada mañana Karel es despertado en su cama cuando su periódico,
representado por un zumbador, es arrojado en la puerta de su casa.
Programe a Karel para que recoja su periódico y regrese a la cama con
él. La situación inicial se da en la figura 2-5, y la situación final debe
llevar a Karel de regreso a su cama (misma esquina, misma dirección)
con el periódico.
Figura 2-5: Situación inicial para la tarea de recoger el periódico

5. Las secciones de pared en la figura 2-6 representan una montaña (con


el norte hacia arriba). Programe a Karel para escalar la montaña y
colocar una bandera, representada por un zumbador, en la cima;
Después Karel deberá descender por el otro lado de la montaña.
Suponga que Karel inicia la tarea con la bandera-zumbador en su
bolsa. Recuerde que Karel no es un super-robot del planeta Kriptón
que puede brincar hasta la cima de la montaña, colocar la bandera y
después brincar del otro lado con un solo .impulso (su nombre es
Karel no Kar-el). Como se ilustra, Karel debe seguir estrechamente el
contorno de la montaña en su ascenso y descenso.
Situación inicial Situación final y trayectoria seguida por Karel

Figura 2-6: La tarea de escalar una montaña

6. De regreso a casa del supermercado, la bolsa de mandado de Karel se


rompe ligeramente en el fondo dejando caer unos cuantos artículos
muy costosos. Estos artículos están representados (como seguramente
ya lo adivinó usted) por zumbadores. La situación inicial, en la cual
Karel descubre la ruptura de la bolsa, está representada en la figura 2-
7. Programe a Karel para que levante los artículos caídos y después
regrese a su posición inicial.

Figura 2-7: Situación inicial para la tarea dé recoger los artículos tirados

1
INICIA-EJECUCION no siempre sigue directamente a INICIAR-PROGRAMA. En el siguiente
capitulo se aprenderá qué es lo que puede colocarse entre estas líos palabras reservadas.

2
Antaño, los magos podían controlar los objetos inanimados si conocían su "verdadero” nombré.
Desafortunadamente los nombres verdaderos de los errores de programación se perdieron hace muchos
años, pero los nombres "aproximados”, que se estudian en esta sección, ayudan a que uno se concentre en
la identificación y corrección de errores en los programas.

También podría gustarte