propuesta y estudio de un lenguaje y entorno mínimos para
TRANSCRIPT
GRADO EN INGENIERÍA INFORMÁTICA
Propuesta y estudio de un lenguaje y entorno mínimos para
la enseñanza de la programación de ordenadores.
Proposal and study of a minimum language and
environment for teaching computer programming.
Realizado por José María Pérez Bravo
Tutorizado por Francisco José Vico Vela
Departamento Lenguajes y Ciencias de la Computación
Universidad de Málaga
MÁLAGA, JUNIO, 2020
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA
GRADO EN INGENIERÍA INFORMÁTICA
Propuesta y estudio de un lenguaje y entorno mínimos para la enseñanza de la
programación de ordenadores
Proposal and study of a minimum language and environment for teaching computer
programming.
Realizado por
José María Pérez Bravo
Tutorizado por
Francisco José Vico Vela
Departamento
Lenguajes y Ciencias de la Computación
UNIVERSIDAD DE MÁLAGA
MÁLAGA, JUNIO, 2020
Fecha defensa:
Resumen:
En los ultimos anos cada vez mas paıses han aumentado sus esfuerzos por introducir la
programacion en sus currıculos, ensenando programacion en entornos de programacion
(IDE) adaptados, programacion de robots o desarrollando algun proyecto relacionado con
el mundo de la informatica.
Nuestra aportacion consiste en analizar varios IDE para decidir que elementos son los
necesarios para ensenar programacion de forma sencilla y sin redundancia. Nos centra-
mos en un IDE en concreto: Toolbox Academy, desarrollado en el Dpto. de Lenguajes y
Ciencias de la Computacion de la Universidad de Malaga, que se esta utilizando en los
sistemas educativos de las comunidades autonomas para ensenar programacion en niveles
preuniversitarios. Se propone tambien un currıculo de programacion dividido en unidades
y un conjunto de tareas con los recursos analizados anteriormente.
Ademas se define un lenguaje sencillo y reducido para este IDE a partir del analisis
de lenguajes muy utilizados en la actualidad como JavaScript, Ruby o GNU Octave:
ToyScript.
Palabras Clave: Programacion, Recursos, Lenguaje, IDE, Ensenanza.
Abstract:
In recent years more and more countries have increased their efforts to introduce program-
ming in their curricula, by teaching programming in adapted programming environments
(IDE), programming of robots or developing some project related to the world of compu-
ting.
Our contribution consists of analyze some IDEs to decide which elements are necessary to
teach programming in a simple way and without redundancy. We focus on a specific IDE:
Toolbox Academy, developed in the Department of Languages and Computer Science of
the University of Malaga, which is being used in educational systems of the autonomous
communities to teach programming at pre-university levels. A programming curriculum
divided into units and a set of tasks with the resources previously analyzed are also
proposed.
In addition, a simple and reduced language is defined for this IDE, based on the analysis
of languages that are currently widely used such as JavaScript, Ruby or GNU Octave:
ToyScript.
Keywords: Programming, Resources, Language, IDE, Teaching.
Indice de contenidos
1. Introduccion 1
1.1. Motivacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2. Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3. Metodologıa empleada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2. Estado de la cuestion 5
2.1. Lenguajes existentes no orientados a la ensenanza . . . . . . . . . . . . . . 5
2.2. Lenguajes existentes orientados a la ensenanza . . . . . . . . . . . . . . . . 6
2.2.1. LOGO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2.2. Scratch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.2.3. Blocky . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2.4. Coffeescript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2.5. Elementos comunes y distintivos . . . . . . . . . . . . . . . . . . . . 18
3. Propuesta 19
3.1. Descripcion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.1.1. Toolbox Academy . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.1.2. ToyScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.1.3. Justificacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.2. Funcionamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.2.1. Definicion informal . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.2.2. Definicion formal . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.2.2.1. Definicion de Estado . . . . . . . . . . . . . . . . . . . . . 32
3.2.2.2. Conceptos Previos . . . . . . . . . . . . . . . . . . . . . . 35
3.2.2.3. Semantica . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.3. Tareas de Entorno Mınimo . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.3.1. Currıculo de programacion . . . . . . . . . . . . . . . . . . . . . . . 44
3.3.2. Tareas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4. Conclusiones y lıneas futuras 53
Bibliografıa 55
CAPITULO 1
Introduccion
1.1. Motivacion
Actualmente la programacion es cada vez mas popular en el entorno educativo, no solo
por la cantidad de nuevos puestos de trabajo que estan surgiendo en relacion a las TIC
(Tecnologıas de la Informacion y la Comunicacion), sino tambien por los beneficios que
aporta, como la mejora de capacidad de abstraccion, el pensamiento computacional y la
capacidad de resolucion de problemas analıticos, demostrando ademas que esta mejora en
la capacidad de resolver problemas analıticos ocurre para la totalidad de los alumnos, no
solo para los predispuestos a especializarse en Ciencias de la computacion [1].
Ademas de los nuevos puestos de trabajo y los beneficios cognitivos que la ensenanza
de la programacion aporta, la principal motivacion de nuestro trabajo es la siguiente: Es
necesario encontrar un conjunto de recursos mınimos donde se pueda realizar computacion
para no caer en la redundancia, es decir, para poder ensenar programacion sin elementos
que distraigan, pero sin dejar atras ningun concepto computacional.
Esta es la principal motivacion porque si no se consigue un entorno adecuado, reducido y
adaptado, puede ser difıcil para los estudiantes de programacion aprender sobre un IDE y
lenguaje cualesquiera, por la dificultad y la variedad de estructuras computacionales que
nos permiten hacer la misma funcion y que para un estudiante pueden ser abrumadoras.
1
CAPITULO 1. INTRODUCCION
1.2. Objetivos
El principal objetivo de este trabajo es analizar a traves de un IDE y un lenguaje adapta-
dos, que recursos son los necesarios para poder ensenar programacion de forma intuitiva,
para que el usuario asimile los conceptos computacionales que usa a traves de la resolucion
de tareas.
Los objetivos especıficos consistiran en:
Determinar los elementos usados hasta la actualidad.
Estudiar estos elementos para analizar carencias.
Proponer IDE.
Proponer lenguaje.
Proponer tareas con recursos mınimos.
1.3. Metodologıa empleada
Durante este proyecto hemos utilizado Scrum, una metodologıa agil que consiste en la
ejecucion de iteraciones de duracion fija en las que se consiguen ciertos objetivos del
proyecto. Esta metodologıa destaca por su facilidad para la adopcion de cambios y nuevos
requisitos durante el desarrollo del proyecto.
Hemos complementado esta metodologıa con otra conocida metodologıa llamada kanban
que consiste en organizar las tareas pendientes en un tablero, evaluando la carga de trabajo
de cada una de ellas y dando mayor prioridad a las excepcionales. Esta metodologıa
destaca por la flexibilidad que proporciona.
Para implementar estas dos metodologıas hemos usado Trello, una herramienta online
que permite la administracion de proyectos proporcionando un tablero digital y el uso de
tarjetas, que representan tareas y que se organizan en columnas de forma que podamos
mover las tareas de una columna a otra.
2
CAPITULO 1. INTRODUCCION
Figura 1.1: Trello
3
CAPITULO 1. INTRODUCCION
4
CAPITULO 2
Estado de la cuestion
En este apartado analizaremos las opciones actuales para el aprendizaje de la progra-
macion. Primero haremos una breve introduccion de los lenguajes mas usados de forma
general para centrarnos despues en algunos de los lenguajes mas usados para la ensenanza
de la programacion.
2.1. Lenguajes existentes no orientados a la ensenan-
za
En este apartado vamos a analizar distintas caracterısticas de los lenguajes mas usados
en el mundo de la programacion.
Python: Python es un lenguaje interpretado y multiparadigma (permite progra-
macion Imperativa, Orientada a Objetos y Funcional). Respecto al tipado, estamos
ante un lenguaje de tipado Dinamico y Fuerte. Es un lenguaje multiplataforma que
destaca por la cantidad de frameworks que tiene y la facilidad de aprendizaje.
GNU Octave: GNU Octave es un lenguaje interpretado. Respecto al tipado, esta-
mos ante un lenguaje de tipado Dinamico y Debil.
Ruby: Ruby es un lenguaje interpretado y Orientado a Objetos. Respecto al tipado,
estamos ante un lenguaje de tipado Dinamico y Fuerte. Es un lenguaje multiplata-
forma que destaca por su sintaxis, cercana al lenguaje natural, ademas de ser muy
5
CAPITULO 2. ESTADO DE LA CUESTION
utilizado en el desarrollo web.
Java: Java es un lenguaje compilado y Orientado a Objetos. Respecto al tipado,
estamos ante un lenguaje de tipado Estatico y Fuerte. Destaca por su robustez y
seguridad.
C: C es un lenguaje compilado y de paradigma imperativo. Respecto al tipado,
estamos ante un lenguaje de tipado Estatico y Fuerte. Destaca en la velocidad de
ejecucion, aunque esta mas alejado del lenguaje natural que otros.
Go: Go es un lenguaje compilado y paradigma imperativo aunque permite obje-
tos. Respecto al tipado, estamos ante un lenguaje de tipado Estatico y Fuerte. Su
principal caracterıstica es la sencillez, ademas de la claridad de su sintaxis.
JavaScript: JavaScript es un lenguaje interpretado y Orientado a Objetos. Respec-
to al tipado, estamos ante un lenguaje de tipado Dinamico y Debil. Es interesante
porque todos los navegadores actuales pueden interpretarlo.
2.2. Lenguajes existentes orientados a la ensenanza
En este apartado vamos a analizar los distintos lenguajes de programacion orientados a
la ensenanza de la misma.
2.2.1. LOGO
LOGO es un lenguaje de programacion libre de alto nivel desarrollado con propositos
didacticos basado en el lenguaje Lisp, que aparecio en los anos 60. LOGO es un lenguaje
que no tiene estandar y que posee una gran variedad de implementaciones.
El lenguaje destaco porque podıa producir graficos a traves de una tortuga virtual a la
que se le daba instrucciones. Ademas este lenguaje tiene versiones para distintos idiomas,
entre ellos el espanol.
Hay que tener en cuenta que las instrucciones de desplazamiento pueden cambiar de una
version de LOGO a otra.
6
CAPITULO 2. ESTADO DE LA CUESTION
Caja 2.1 : Comandos basicos de LOGO en espanol
1
2 avanzar 100 (la tortuga avanza 100 pasos)
3 girarderecha 90 (la tortuga gira 90 grados a la derecha)
4 girarizquierda 90 (la tortuga gira 90 grados a la izquierda)
5 BP (borra la pantalla)
6 repite 3 [avanzar 100] (repite 3 veces lo que hay entre [ y ])
7 MT (muestra la tortuga)
8 OT (oculta la tortuga)
9 SP (sin pluma, no dibuja mientras camina)
10 CP (con pluma, dibuja mientras camina)
7
CAPITULO 2. ESTADO DE LA CUESTION
2.2.2. Scratch
Scratch es un lenguaje de programacion usado en la plataforma con el mismo nombre que
implementa las estructuras computacionales de manera grafica, mediante bloques. Estos
bloques se pueden encajar para construir bloques mas grandes que actuan de programa.
when clicked: Nos permitira ejecutar el programa una vez hagamos click en la
bandera verde.
Figura 2.1: Bloque de ejecucion
move: Nos permitira mover al agente por el mapa un numero de pasos. Si este
numero es positivo nos moveremos hacia la derecha, si es negativo nos moveremos
hacia la izquierda y si es 0 nos quedaremos quietos.
Figura 2.2: Bloque de movimiento
turn: Nos permitira girar al agente un numero de grados. Si este numero es positivo
giraremos en el sentido que indica el bloque, si es negativo nos moveremos en sentido
contrario y si es 0 no giraremos.
Figura 2.3: Bloque de rotacion
repeat: Nos permitira repetir un conjunto de comandos, es decir, un conjunto
de bloques un numero determinado de veces. Si este numero es 0, no se ejecutara
ningun bloque dentro del bloque repeat.
8
CAPITULO 2. ESTADO DE LA CUESTION
Figura 2.4: Bloque de repeticion definida
Variables: Nos permitira realizar asignaciones a variables, ademas de poder usar su
valor.
Figura 2.5: Bloques de operaciones con variables
Operaciones aritmeticas: Nos permitira realizar sumas, restas, multiplicaciones y
divisiones de valores numericos.
Figura 2.6: Bloques de operaciones aritmeticas
Comparaciones: Nos permitira hacer comparaciones que podremos usar en bucles y
condicionales.
Figura 2.7: Bloques de comparaciones
9
CAPITULO 2. ESTADO DE LA CUESTION
Operaciones logicas: Nos permitira realizar conjunciones, disyunciones y negaciones.
Figura 2.8: Bloques de operaciones logicas
if : Nos permitira ejecutar un conjunto de comandos si una condicion dada es
verdadera.
Figura 2.9: Bloque de condicion
if - else: Nos permitira ejecutar un conjunto de comandos si una condicion dada
es verdadera, sino, ejecuta otro conjunto de comandos dado.
Figura 2.10: Bloque de condicion
repeat until: Nos permitira repetir un conjunto de comandos hasta que una
condicion dada sea verdadera.
Figura 2.11: Bloque de repeticion indefinida
10
CAPITULO 2. ESTADO DE LA CUESTION
2.2.3. Blocky
Blocky es un lenguaje de programacion dedicado a ensenar programacion mediante blo-
ques. Es similar a Scratch, pero proporciona la opcion de ver el codigo equivalente en
JavaScript, Python y otros lenguajes. En concreto vamos a analizar como la platafor-
ma Code.org implementa este lenguaje ampliamente personalizable, concretamente en su
Express Course.
when run: Nos permitira ejecutar el programa una vez hagamos click en RUN.
Figura 2.12: Bloque de ejecucion
move: Nos permitira mover al agente por el mapa hacia donde este mirando o en
sentido contrario dependiendo de la direccion, que puede ser forward o backward.
Figura 2.13: Bloques de movimiento
turn: Nos permitira girar al agente hacia la derecha o la izquierda.
Figura 2.14: Bloque de rotacion
11
CAPITULO 2. ESTADO DE LA CUESTION
repeat: Nos permitira repetir un conjunto de comandos un numero determinado
de veces. Si este numero es 0, no se ejecutara ningun bloque.
Figura 2.15: Bloque de repeticion definida
Variables: Nos permitira realizar asignaciones a variables, ademas de poder usar su
valor.
Figura 2.16: Bloques de operaciones con variables
Operaciones aritmeticas: Nos permitira realizar operaciones aritmeticas con valores
numericos.
Figura 2.17: Bloques de suma
if at : Nos permitira ejecutar un conjunto de comandos si el personaje se encuen-
tra en una localizacion dada.
Figura 2.18: Bloque de condicion
12
CAPITULO 2. ESTADO DE LA CUESTION
if at - else: Nos permitira ejecutar un conjunto de comandos si el personaje se
encuentra en una localizacion dada, en otro caso ejecuta otro conjunto dado.
Figura 2.19: Bloque de condicion
while: Nos permitira repetir un conjunto de comandos mientras que una condicion
dada sea verdadera.
Figura 2.20: Bloque de repeticion indefinida
13
CAPITULO 2. ESTADO DE LA CUESTION
2.2.4. Coffeescript
CoffeeScript es un lenguaje que compila a JavaScript usado principalmente en la industria
del desarrollo web.
Este lenguaje puede aprenderse en plataformas como CodeMonkey, que introduce fun-
ciones como step, turn o times para poder utilizarlo sobre un mapa bidimensional y
hacerlo mas sencillo.
step: Nos permitira mover al agente por el mapa un numero de pasos. Si este
numero es positivo nos moveremos hacia donde este mirando, si es negativo nos
moveremos en sentido contrario y si es 0 nos quedaremos quietos.
Caja 2.2 : step - Coffeescript
1 step 5
turn: Nos permitira girar al agente dependiendo de si toma el valor left o right.
Caja 2.3 : turn - Coffeescript
1 turn left
2 turn right
times: Nos permitira repetir un conjunto de comandos un numero determinado de
veces. Si este numero es 0, no se ejecutara ninguna sentencia dentro del bloque.
Caja 2.4 : times - Coffeescript
1 3.times ->
2 turn right
14
CAPITULO 2. ESTADO DE LA CUESTION
Variables: Nos permitira realizar asignaciones a variables, ademas de poder usar su
valor.
Caja 2.5 : Variables - Coffeescript
1 x = 10
2 step x
Operaciones aritmeticas: Nos permitira realizar sumas, restas, multiplicaciones y
divisiones de valores numericos.
Caja 2.6 : Operaciones aritmeticas - Coffeescript
1 x = 10
2 y = 5
3
4 z = x + y
5 x = x - y
6 z = x * y
7 x = x / y
Comparaciones: Nos permitira hacer comparaciones que podremos usar en bucles y
condicionales.
Caja 2.7 : Comparaciones - Coffeescript
1 x = 10
2 y = 5
3
4 x == y
5 x > y
6 x < y
7 x >= y
8 x <= y
15
CAPITULO 2. ESTADO DE LA CUESTION
Operaciones logicas: Nos permitira realizar conjunciones, disyunciones y negaciones.
Caja 2.8 : Conjuncion, Disyuncion y Negacion respectivamente -
Coffeescript
1 x = 10
2 y = x == 10
3 z = false
4
5 y and z
6 y or z
7 not z
if: Nos permitira ejecutar un conjunto de comandos si la condicion es verdadera.
Caja 2.9 : if - Coffeescript
1 x = 10
2 direction = right
3 if direction == right
4 turn direction
5 step x
if - else: Nos permitira ejecutar un conjunto de comandos si la condicion dada
es verdadera, en otro caso se ejecuta otro conjunto de comandos.
Caja 2.10 : if-else - Coffeescript
1 x = 10
2 direction = left
3 if direction == right
4 turn direction
5 step x
6 else
7 step 2 * x
16
CAPITULO 2. ESTADO DE LA CUESTION
until: Nos permitira repetir un conjunto de comandos hasta que la condicion dada
sea verdadera.
Caja 2.11 : Bucle until - Coffeescript
1 x = 1
2 until x > 4
3 step x
4 x = x + 2
() -> : Nos permitira crear funciones, con objetivo de reutilizar codigo.
Caja 2.12 : Funcion - Coffeescript
1 moveif10 = (steps) ->
2 if steps == 10
3 step steps
4
5 moveif10 5
6 moveif10 10
17
CAPITULO 2. ESTADO DE LA CUESTION
2.2.5. Elementos comunes y distintivos
En esta seccion analizamos las similitudes y diferencias para ver cuales son las ventajas y
carencias de estos lenguajes, de forma que podamos aprovecharlos en nuestra propuesta.
Elementos comunes: Como podemos observar, todos estos lenguajes comparten unas
estructuras computacionales similares.
Bucles definidos
Variables
Condicionales
Bucles indefinidos
Elementos distintivos:
Forma de implementacion
Lenguajes que implementan la computacion mediante bloques:
• Scratch
• Blockly
Lenguajes que implementan la computacion mediante codigo:
• CoffeeScript
• LOGO
Instrucciones de movimiento
Lenguajes que implementan el movimiento en terminos relativos:
• Scratch
• CoffeeScript
• Blockly
• LOGO
Ninguno de los lenguajes analizados implementan el movimiento en terminos abso-
lutos.
18
CAPITULO 3
Propuesta
Estudios recientes muestran que en un entorno controlado, con un lenguaje reducido
pensado para simplificar la sintaxis y acercarlo mas al lenguaje natural, alumnos de ulti-
mo curso de secundaria son capaces de demostrar competencias en todos los conceptos
computacionales basicos como bucles, condicionales, definicion de funciones, etc.[2]
No solo esto, sino que ademas muestran que las competencias en ciencias de la computacion
se adquieren independientemente del genero.[3]
Despues de haber analizado los lenguajes y plataformas mas usados, en concreto para la
ensenanza de programacion, nuestra propuesta se centra en el lenguaje de programacion
ToyScript implementado en la plataforma ToolBox Academy.
Los motivos principales para la propuesta de este lenguaje son la utilizacion de elementos
sencillos para facilitar la adquisicion de competencias mediante la simplificacion de la
sintaxis y el uso de recursos computacionales reducidos. Este lenguaje no busca el conjunto
mınimo, sino un conjunto de estructuras reducido que permita mantener la sencillez.
19
CAPITULO 3. PROPUESTA
3.1. Descripcion
En esta seccion vamos a describir nuestra propuesta, describiendo primero detalladamente
la plataforma y el lenguaje sobre los que vamos a trabajar, ası como una justificacion sobre
ciertas decisiones que se han tomado.
3.1.1. Toolbox Academy
Toolbox Academy es una plataforma para la ensenanza de programacion en el ambito
preuniversitario desarrollado por el departamento de Lenguajes y Ciencias de la Compu-
tacion de la Universidad de Malaga. Toolbox Academy cuenta con 3 areas diferenciadas:
Una parte donde aparecera el enunciado de una tarea a resolver, una parte para escribir
el codigo para resolver una tarea y una parte donde aparecera una cuadrıcula dividida en
celdas. Toolbox Academy cuenta con un curso basico en ToyScript y otro en JavaScript.
Elementos del entorno:
Roby: Es el personaje al que le vamos a dar ordenes mediante programas. Es el
elemento que se movera por la cuadrıcula. Roby es a Toolbox Academy lo que el
cabezal lector a la Maquina de Turing.
Figura 3.1: Roby
Cuadrıcula: Es el espacio por el cual Roby puede moverse. La cuadrıcula es a Toolbox
Academy lo que la cinta a la Maquina de Turing.
20
CAPITULO 3. PROPUESTA
Figura 3.2: Cuadrıcula
Objeto : Estos elementos pueden ser recogidos por el agente, lo que nos justifi-
ca, entre otras estructuras computacionales, el uso de comandos de movimientos,
pues necesitamos usarlos para recoger estos objetos. Si disponemos estos elementos
alineados, queda justificado la estructura de bucle definido.
Figura 3.3: Objeto
Agentes auxiliares: Estos elementos son agentes a los que Roby puede pedir infor-
macion sobre cierto problema, y gracias a ellos podemos introducir el uso no solo de
variables (para guardar la informacion que proporcionan), sino de funciones como
info (para pedir la informacion que tienen).
Figura 3.4: Agentes auxiliares
21
CAPITULO 3. PROPUESTA
Puertas: Introducimos este recurso computacional para poder justificar el uso de
condicionales en nuestros programas. Ahora no se tratara de recoger tuercas como
en otros casos, sino de entrar por la puerta correcta. Este recurso, junto al uso de
agentes externos, son la clave para la creacion de tareas con condicionales.
Figura 3.5: Puertas
Cajas: Introducimos este recurso computacional para poder justificar el uso de bu-
cles indefinidos. Ahora las tareas trataran sobre encontrar la caja con el contenido
correcto.
Figura 3.6: Caja
Este es el conjunto de recursos mınimos que proponemos, ya que todos ellos son necesarios
para que el uso de las estructuras computacionales del lenguaje que vamos a definir tenga
sentido.
22
CAPITULO 3. PROPUESTA
3.1.2. ToyScript
ToyScript esta inspirado en varios lenguajes, no solo en JavaScript. Esta inspirado en
GNU Octave, pues introduce la palabra end para finalizar estructuras. Ademas introduce
el bucle repeat, cuyo concepto existe en lenguajes como Ruby, aunque con otra sintaxis.
Es muy simple, no solo sintacticamente, pues no tiene llaves, parentesis ni puntos y comas,
sino porque solo cuenta con un bucle definido (repeat), uno indefinido (do-while), y
dos condicionales (if, if-else) como estructuras computacionales.
La razon de esta sencillez sintactica es el acercamiento de este lenguaje al lenguaje natural,
ademas de simplicidad a la hora de escribir el programa. Hay que tener en cuenta que
esta propuesta esta enfocada en cursos K-12 (cursos de primaria y secundaria), y que por
lo tanto habra usuarios que no esten familiarizados con el teclado, o que incluso no hayan
aprendido a leer y escribir correctamente.
Por otro lado, la razon por la que contamos con tan pocas estructuras computacionales es
clara, buscamos introducir los conceptos generales de la programacion en este lenguaje,
es decir, condicionales, bucle definido e indefinido, pero manteniendo la simpleza de tal
forma que el usuario no quede abrumado. Es por esto que no existen estructuras como
for each o switch.
A continuacion presentaremos la sintaxis del lenguaje en notacion EBNF (Extended
Backus-Naur form), una notacion que nos permite describir lenguajes formales a traves
de sus gramaticas. En nuestro caso, el axioma es 〈code〉, que representa el programa que
puede estar formado por una o mas instrucciones.
23
CAPITULO 3. PROPUESTA
Caja 3.1 : Sintaxis de ToyScript
〈letter〉 :: = ‘a’|...|‘z’|‘A’|...|‘Z’
〈digit〉 :: = ‘0’|...|‘9’
〈arithmetic〉 :: = ‘+’|‘-’|‘*’|‘/’
〈relational〉 :: = ‘==’|‘!=’|‘<’|‘>’|‘<=’|‘>=’
〈logical〉 :: = ‘!’|‘&’|‘|’
〈integer〉 :: = [‘-’]〈digit〉{〈digit〉}
〈variable〉 :: = 〈letter〉{〈letter〉|〈digit〉}
〈term〉 :: = 〈integer〉|〈variable〉
〈expression〉 :: = 〈term〉|‘(’〈expression〉‘)’|〈expression〉〈arithmetic〉〈expression〉
〈condition〉 :: = 〈term〉〈relational〉〈term〉|〈term〉〈logical〉〈term〉|‘(’〈term〉‘)’
〈code〉 :: = 〈instruction〉{〈instruction〉}
〈instruction〉 :: = 〈command〉|〈assignment〉|〈repeat〉|〈if 〉|〈while〉|〈info〉
〈command〉 :: = ‘up’|‘down’|‘left’|‘right’
〈info〉 :: = 〈variable〉‘=’‘info’
〈assignment〉 :: = 〈variable〉‘=’〈expression〉
〈repeat〉 :: = ‘repeat’〈expression〉〈code〉‘end’
〈if 〉 :: = ‘if’〈condition〉〈code〉[‘else’〈code〉]‘end’
〈while〉 :: = ‘do’〈code〉‘while’〈condition〉
24
CAPITULO 3. PROPUESTA
3.1.3. Justificacion
En este apartado vamos a discutir sobre algunas decisiones que se han tomado en nuestra
propuesta.
Eliminacion de llaves y adicion de end: La decision de eliminar las llaves surge
por la lejanıa que supone la utilizacion de estos elementos sintacticos con el lenguaje
natural. De esta eleccion emana la decision de anadir la clausula end para cerrar
un bloque, podrıamos haber usado la indentacion como en otros lenguajes como
Python, pero el uso de end esta mucho mas cerca del lenguaje natural que esto o
una llave.
Eliminacion de otros elementos sintacticos: Ademas de lo comentado ante-
riormente, con objeto de acercar ToyScript al lenguaje natural, se eliminan otros
elementos como ’;’ o los parentesis, de forma que queda un codigo mucho mas legible.
Utilizacion de comandos de movimiento absolutos: Como podemos observar
los lenguajes de programacion centrados en la ensenanza analizados anteriormente,
cuentan todos con sistemas de movimientos relativos. Nosotros hemos decidido usar
un sistema absoluto porque es mas visual a la hora de planificar las acciones a
realizar, ya que con un sistema relativo es necesario conocer la rotacion del personaje,
ademas de su posicion.
Numero maximo de palabras o numeros: Este es uno de los recursos mas
interesantes que tenemos. Gracias a el, en ciertas tareas nos aseguramos que se usen
los conceptos computacionales que queremos, y no otros equivalentes. De esta forma,
si queremos que se use un bucle, podremos evitar que se usen las instrucciones que
irıan en su interior de forma repetida.
25
CAPITULO 3. PROPUESTA
Rangos de numeros especiales: Este recurso, nos sirve para que el usuario no
pueda disenar programas a medida, sino que los programas escritos tengan que
satisfacerse para todos los escenarios posibles, es decir, los programas deben ser
generales. Podemos distinguir dos tipos de estos rangos:
• Rango de numeros donde se prueban todas las combinaciones.
Ejemplo: Si establecemos para un recurso un rango de este tipo, desde 5000
hasta 5005, entonces, el programa se probara para cada uno de estos valores
en estos recursos.
• Rango de numeros donde se prueban todas las permutaciones.
Ejemplo: Si establecemos para 3 recursos un rango de este tipo, desde 100
hasta 102, entonces se probaran todas las posibles permutaciones de insertar
estos valores en dichos recursos.
Eleccion de do-while en lugar de while: La eleccion de do-while como bu-
cle indefinido en lugar de while esta fundamentada en el tipo de tareas propuestas
para ser resueltas mediante bucle indefinido. Estas tareas normalmente consisten
en explorar una serie de cajas alineadas de forma consecutiva hasta encontrar la
correcta. Para ello debemos recoger informacion sobre cada caja y despues compro-
bar si se cumple una condicion dada. Esto se puede hacer con ambos bucles, pero
es mucho mas intuitivo con do-while, cuyo funcionamiento encaja perfectamente
con el problema descrito.
Figura 3.7: Ejemplo do-while
26
CAPITULO 3. PROPUESTA
Para resolver el ejemplo anterior con bucle do-while primero debemos movernos
a la derecha, despues obtener informacion de la caja y por ultimo comprobar si la
condicion se ha cumplido.
A continuacion mostramos unos ejemplos que consisten en encontrar la caja con el
valor 5.
Caja 3.2 : Resolucion con do-while
1 do
2 right
3 contenido_caja = info
4 while contenido_caja != 5
Sin embargo, para resolverlo con bucle while, deberemos utilizar un valor por de-
fecto para poder realizar la primera iteracion del bucle o realizar la primera iteracion
fuera del mismo. Esto es mucho menos intuitivo.
Caja 3.3 : Resolucion con while - valor por defecto
1 contenido_caja = 0
2 while contenido_caja != 5
3 right
4 contenido_caja = info
5 end
Caja 3.4 : Resolucion con while - primera iteracion fuera
1 right
2 contenido_caja = info
3 while contenido_caja != 5
4 right
5 contenido_caja = info
6 end
27
CAPITULO 3. PROPUESTA
3.2. Funcionamiento
3.2.1. Definicion informal
En este apartado explicaremos el funcionamiento de cada una de las estructuras compu-
tacionales y comandos que hemos expuesto anteriormente en la sintaxis de ToyScript.
right, left, up, down: Nos permitira mover al agente una cuadrıcula en la di-
reccion que indica la instruccion.
Caja 3.5 : Movimiento - ToyScript
1 up
2 down
3 left
4 right
repeat: Es un bucle definido que nos permitira repetir un conjunto de instrucciones
un numero determinado de veces. Si este numero es 0, no se ejecutara ninguna
sentencia dentro del bucle.
Caja 3.6 : repeat - ToyScript
1 repeat 3
2 right
3 up
4 right
5 end
28
CAPITULO 3. PROPUESTA
Variables: Nos permitira realizar asignaciones a variables, para despues poder usar
su valor.
Caja 3.7 : Variables - ToyScript
1 repeticiones = 3
2 repeat repeticiones
3 right
4 end
Operaciones aritmeticas: Nos permitira realizar sumas, restas, multiplicaciones y
divisiones de valores numericos.
Caja 3.8 : Operaciones aritmeticas - ToyScript
1 x = 10
2 y = 5
3
4 z = x + y
5 x = z - y
6 z = y * y
7 x = z / y
Comparaciones: Nos permitira hacer comparaciones que podremos usar en bucles y
condicionales.
Caja 3.9 : Comparaciones - ToyScript
1 x = 10
2 y = 5
3
4 if x == y
5 down
6 end
7 if x > y
8 right
29
CAPITULO 3. PROPUESTA
9 end
10 if x < y
11 up
12 end
info: Nos permitira recibir informacion del entorno, por ejemplo, para guardar en
una variable la puerta por la que debemos entrar o cuantas tuercas recoger.
Caja 3.10 : Info - ToyScript
1 puerta = info
if: Nos permitira ejecutar un conjunto de comandos si se cumple una condicion.
Caja 3.11 : if - ToyScript
1 puerta = info
2 right
3 if puerta == 2
4 down
5 end
if - else: Nos permitira ejecutar un conjunto de comandos si se cumple una
condicion, en otro caso se ejecuta otro conjunto de comandos.
Caja 3.12 : if-else - ToyScript
1 puerta = info
2 if puerta == 1
3 left
4 else
5 right
6 end
Operaciones logicas: Nos permitira realizar conjunciones, disyunciones y negaciones.
30
CAPITULO 3. PROPUESTA
Caja 3.13 : Operadores logicos - ToyScript
1 puerta = info
2 right
3 if !(puerta == 2 | puerta > 5) & puerta > 3
4 down
5 end
do-while: Nos permitira repetir un conjunto de comandos mientras se de una
condicion. Evaluara la condicion despues de ejecutar los comandos.
Caja 3.14 : Bucle do-while - ToyScript
1 do
2 right
3 tuercas = info
4 while tuercas != 100
31
CAPITULO 3. PROPUESTA
3.2.2. Definicion formal
En este apartado vamos a encargarnos de definir en primer lugar el estado de la compu-
tacion de este modelo de computo para posteriormente poder definir formalmente la
semantica del mismo. Esto es util porque nos permite definir el comportamiento de forma
muy precisa.
3.2.2.1. Definicion de Estado
El estado de la computacion de este modelo incluira informacion sobre la posicion del
agente, sobre el inventario, sobre la cuadrıcula y sobre las variables.
Primero definiremos las 2 clases de objetos que puede haber por el mapa. En primer lugar
objetos que se pueden recoger, como pueden ser tuercas o tornillos, y en segundo lugar
objetos que no se pueden recoger, por ejemplo cajas o puertas. Caracterizaremos estos
objetos con un numero natural (N), que en caso de ser un objeto que se puede recoger
servira para indicar distintos tipos de objetos, y en caso de que no se pueda recoger, sera
un valor que al que podremos acceder desde un programa a traves de info. Es decir, en
caso de poderse recoger nos servira para saber si es una tuerca, tornillo, ..., pero en caso
de no poderse recoger, por ejemplo una caja, servira para saber cuantos objetos contiene
dicha caja.
Definimos la cuadrıcula del mundo como una cinta bidimensional, infinita hacia la derecha
y hacia abajo, en la que en cada cuadrıcula tendremos 2 valores, uno de ellos nos indicara
si el objeto se puede recoger y el otro sera un valor que actuara de identificador o podra
ser usado en un programa dependiendo de si se puede o no recoger.
Por lo tanto, la cuadrıcula quedara representada por una funcion Cuadricula : N2 →
(N, {0, 1}), que dada una posicion de la cuadrıcula, nos devolvera el valor que contiene, y
0 en caso de no poderse recoger o 1 en caso de serlo.
Ademas, sera necesario definir una funcion que nos permita vaciar una casilla de la
cuadrıcula, para actualizarla por ejemplo, una vez recojamos un objeto. Definimos
clearC : (Cuadricula,N2) → Cuadricula, que dada una Cuadrıcula y una posicion, nos
devuelve la misma Cuadrıcula con esa posicion vacıa. Es decir, siendo c′ = clearC(c, x, y):
32
CAPITULO 3. PROPUESTA
c′(x′, y′) =
(0, 0) si x = x′ e y = y′
c(x, y) en otro caso
Si aplicamos clearC a una cuadrıcula c y una posicion (x, y), esto nos devolvera una nueva
cuadrıcula (recordemos que hemos definido la cuadrıcula como una funcion), que para una
entrada (x′, y′) devolvera (0, 0) si esa posicion coincide con la usada como argumento.
Definimos la posicion del agente en la cuadrıcula como posicion ∈ N2, es decir, como un
vector de naturales de 2 dimensiones. Siendo p la posicion del agente, denotaremos como
p1 y p2 para referirnos a la primera y segunda componente del mismo respectivamente.
Definimos el inventario del agente como Inventario = N→ N, es decir, una funcion que
dado un natural que represente un objeto, nos devolvera la cantidad de dicho objeto que
el agente posee.
Para incrementar el inventario definimos updateI : (Inventario,N) → Inventario, que
dado un inventario y un natural que representa un tipo de objeto, se devolvera un inven-
tario actualizado. Es decir, siendo i′ = updateI(i, n):
i′(n′) =
i(n) + 1 si n = n′
i(n′) en otro caso
Si aplicamos updateI a un inventario i y un objeto representado por n, se devolvera un
nuevo inventario, que en caso de aplicarse a la misma entrada, nos devolvera el valor
incrementado.
Por ultimo definimos el estado de las variables como V ariables = variable→ Z, que sera
una funcion que dada una variable, nos devolvera su valor.
Para poder actualizar el estado de una variable definimos la funcion updateV .
updateV : (V ariables, variable,Z) → V ariables que dado el estado de unas variables,
una variable y un valor, devolvera un nuevo estado de variables, con el valor de la variable
tratada actualizado. Es decir, siendo v′ = updateV (v, x, n):
33
CAPITULO 3. PROPUESTA
v′(y) =
n si x = y
v y si x 6= y
Es decir, al aplicar updateV a un estado de variables v, a una variable x y a un valor n,
se nos devuelve un nuevo estado de variables que para la misma entrada, nos devolvera
el valor actualizado.
Finalmente definimos el estado de la computacion como State = (a, b, c, d), a ∈ Posicion,
b ∈ Inventario, c ∈ Cuadricula, d ∈ V ariables.
En nuestra plataforma, el estado inicial estara caracterizado unicamente por la posicion
del agente y la cuadrıcula, pues el estado inicial de las variables y el inventario sera siempre
el mismo.
inventario0(n) = 0, ∀n ∈ N, inventario0 ∈ Inventario
variable0(x) = 0,∀x ∈ variable, variable0 ∈ V ariables
34
CAPITULO 3. PROPUESTA
3.2.2.2. Conceptos Previos
En este apartado vamos a encargarnos de definir funciones auxiliares y conceptos pre-
vios que seran necesarios en el siguiente apartado, donde presentaremos la semantica del
modelo.
Vamos a definir la semantica de este modelo de computacion mediante la utilizacion de
semantica Denotacional. Para ello necesitamos apoyarnos en funciones cuya definicion es
composicional. Es decir, nuestras funciones solo podran estar definidas en funcion de sus
constituyentes inmediatos.
La razon por la que necesitamos este tipo de funciones es sencilla. Sobre estas estructuras
podrıamos realizar, si fuera necesario, demostraciones utilizando induccion estructural,
por ejemplo, para demostrar que dos programas son semanticamente equivalentes, es
decir, para cualquier estado inicial, obtenemos el mismo resultado.
Definiremos ⊥ como divergencia, es por eso que a partir de ahora veremos alguna funcion
especificada con ↪→ en lugar de →, esto lo haremos para hablar de funciones parciales.
El objetivo sera definir la funcion semantica, S : (Stm, State) ↪→ State, es decir, una fun-
cion que dado un programa (Stm) y un estado (State) nos devuelva el estado resultante.
Necesitamos una funcion que nos permita evaluar expresiones aritmeticas y booleanas.
Este no es el proposito del trabajo, por lo tanto supondremos que existen 2 funciones,
A : (Aexp, State)→ Z y B : (Bexp, State)→ Bool, Bool ∈ {true, false}, siendo Aexp y
Bexp expresiones aritmeticas y booleanas respectivamente, A y B nos permitiran evaluar
expresiones aritmeticas y booleanas respectivamente.
Por legibilidad, cuando una funcion tenga un estado ∈ State como argumento, lo pondre-
mos separado por un espacio.
Definimos la funcion identidad para nuestros estados como id : State→ State.
id state = state
Definimos una funcion que sera necesaria para poder especificar bucles y condicionales,
35
CAPITULO 3. PROPUESTA
cond : ((State→ Bool), (State ↪→ State), (State ↪→ State))→ (State ↪→ State).
cond(p, g1, g2) state =
g1 state si p state = true
g2 state si p state = false
(3.1)
Es decir, cond es una funcion que recibe un predicado y dos funciones semanticas, y
devolvera una u otra dependiendo del valor del predicado para un estado dado.
Ademas definimos la composicion de funciones semanticas como:
(SJS2K ◦ SJS1K) state =
state′′ si ∃ state′, SJS1K state = state′ y
SJS2K state′ = state′′
⊥ si SJS1K state = ⊥ o
∃ state′, SJS1K state = state′ y
SJS2K state′ = ⊥
Esta funcion nos devolvera el resultado de la composicion, a menos que alguna de las dos
funciones diverja.
Denotaremos fn(d), f : D → D y d ∈ D como la aplicacion repetida de f sobre d, n
veces.
f 0(d) = d (3.2)
fn+1(d) = f(fn(d))
Para poder especificar el bucle indefinido tenemos que definir la funcion fix : (D → D)→
D, que sirve para calcular el punto fijo de F . Un punto fijo de una funcion f , es un punto
x tal que f(x) = x.
fix(F ) =⋃i≥0
F i(⊥) (3.3)
36
CAPITULO 3. PROPUESTA
Esta funcion fix toma como argumento una funcion de un dominio a ese mismo dominio,
y devuelve otro elemento de ese dominio. En concreto este dominio D sera el de las
funciones semanticas, es decir, en nuestro caso D = (State ↪→ State).
37
CAPITULO 3. PROPUESTA
3.2.2.3. Semantica
En este apartado nos encargaremos de definir la funcion semantica encargada de dado un
programa y un estado, devolver el estado resultante.
SJrightK(p, i, c, v) =
(p + (1, 0), updateI(i, n), clearC(c, p1, p2), v) si b = 1,
(n, b) = c(p1, p2)
(p + (1, 0), i, c, v) en otro caso
SJleftK(p, i, c, v) =
(p− (1, 0), updateI(i, n), clearC(c, p1, p2), v) si b = 1,
(n, b) = c(p1, p2),
p1 ≥ 1
(p− (1, 0), i, c, v) si b = 0,
(n, b) = c(p1, p2)
si p1 ≥ 1
⊥ en otro caso
SJdownK(p, i, c, v) =
(p + (0, 1), updateI(i, n), clearC(c, p1, p2), v) si b = 1,
(n, b) = c(p1, p2)
(p + (0, 1), i, c, v) en otro caso
38
CAPITULO 3. PROPUESTA
SJupK(p, i, c, v) =
(p− (0, 1), updateI(i, n), clearC(c, p1, p2), v) si b = 1,
(n, b) = c(p1, p2),
p2 ≥ 1
(p− (0, 1), i, c, v) si b = 0,
(n, b) = c(p1, p2)
p2 ≥ 1
⊥ en otro caso
Como se puede observar, la funcion semantica para los comandos de movimientos nos
cambia la posicion del agente (si no se puede diverge), en caso de que haya algun objeto
que se pueda recoger, lo recoge.
SJvariable = infoK(p, i, c, v) = (p, i, c, updateV (v, variable, c(p1, p2)))
SJS1 S2K state = (SJS2K ◦ SJS1K) state
SJvariable = expressionK(p, i, c, v) = (p, i, c, updateV (v, variable, AJexpressionK v))
Aquı podemos ver como hacemos uso de la funcion A para expresiones aritmeticas de la
que hablamos anteriormente para asignar un valor a una variable.
SJrepeat expression S endK state = (SJSK)n state
39
CAPITULO 3. PROPUESTA
SJif condition S endK state = cond(BJconditionK, SJSK, id) state
SJif condition S1 else S2 endK state = cond(BJconditionK, SJS1K, SJS2K) state
Para los condicionales hacemos uso de la funcion cond (3.1) que nos permite elegir entre
2 funciones dependiendo de un predicado.
Podrıamos pensar que la funcion semantica de do S while condition es tan sencilla
como:
SJdo S while conditionK state = cond(BJconditionK ◦ SJSK,
SJdo S while conditionK ◦ SJSK,
SJSK) state
Pero esta definicion no es composicional, pues se apoya en si misma, por lo tanto defini-
remos la semantica de do S while condition como el menor punto fijo de F . Es decir,
se busca una funcion f tal que F (f) state = f state, ∀state ∈ State.
SJdo S while conditionK state = fix(Fcondition, S) state
donde:
Fcondition,S(f) state = cond(BJconditionK ◦ SJSK, f ◦ SJSK, SJSK) state (3.4)
A esta funcion F se le exige que sea monotona y continua, tema que no trataremos aquı.
Podemos encontrar demostraciones de la monotonıa y continuidad de funciones similares
en otros documentos a la hora de definir la semantica del bucle while[6][7], muy similar
a do-while.
40
CAPITULO 3. PROPUESTA
Caja 3.15 : Ejemplo de Semantica do x = x + 1 while x != 2
Consideremos p = do x = x + 1 while x != 2 con state = (p, i, c, v).
SJpK = fix(Fx!=2,x=x+1) donde
Fx!=2,x=x+1(f) state = (Segun 3.4)
= cond(BJx != 2K ◦ SJx = x + 1K, f ◦ SJx = x + 1K, SJx = x + 1K) state =
(Segun 3.1) =
(p, c, i, updateV (v, x, 2)) si v(x) = 1
f (p, c, i, updateV (v, x, v(x) + 1)) en otro caso
Calculos para la aproximacion del punto fijo:
Por legibilidad denotaremos fk state = F k(⊥) state.
f0 state = F 0(⊥) state = ⊥ (segun 3.2)
f1 (p, c, i, v) = F (f0) (p, c, i, v) =
=
(p, c, i, updateV (v, x, 2)) si v(x) = 1
f0 (p, c, i, updateV (v, x, v(x) + 1)) = ⊥ en otro caso
f2 (p, c, i, v) = F (f1) (p, c, i, v) =
=
(p, c, i, updateV (v, x, 2)) si v(x) = 1
f1 (p, c, i, updateV (v, x, v(x) + 1)) en otro caso
=
(p, c, i, updateV (v, x, 2)) si v(x) = 1
f1 (p, c, i, updateV (v, x, 1)) = (p, c, i, updateV (v, x, 2)) si v(x) = 0
f1 (p, c, i, updateV (v, x, v(x) + 1)) = ⊥ en otro caso
41
CAPITULO 3. PROPUESTA
A partir de aquı podemos conjeturar su semantica y demostrarla por induccion.
fn (p, c, i, v) =
(p, c, i, updateV (v, x, 2)) si 2− n ≤ v(x) ≤ 1
⊥ en otro caso
(3.5)
Caso Base: n = 0
Sabemos por definicion (3.2) que f0 state = ⊥, si sustituimos en (3.5) obtenemos:
f0(p, c, i, v) =
(p, c, i, updateV (v, x, 2)) si 2 ≤ v(x) ≤ 1
⊥ en otro caso
Y por lo tanto f0 state = ⊥, ya que no se puede dar el primer caso.
Caso inductivo: n = k + 1
Asumiendo f(k) queremos demostrar
fk+1(p, c, i, v) =
(p, c, i, updateV (v, x, 2)) si 1− k ≤ v(x) ≤ 1
⊥ en otro caso
Por definicion fk+1 state = F (fk) (p, c, i, v)
=
(p, c, i, updateV (v, x, 2)) si v(x) = 1
fk (p, c, i, updateV (v, x, v(x) + 1) en otro caso
Por Hipotesis Inductiva tenemos que:
fk (p, c, i, v) =
(p, c, i, updateV (v, x, 2)) si 2− k ≤ v(x) ≤ 1
⊥ en otro caso
Por lo tanto:
42
CAPITULO 3. PROPUESTA
F (fk) (p, c, i, v) =
(p, c, i, updateV (v, x, 2)) si v(x) = 1
(p, c, i, updateV (v, x, 2)) si 1− k ≤ v(x) ≤ 0
⊥ en otro caso
=
(p, c, i, updateV (v, x, 2)) si 1− k ≤ v(x) ≤ 1
⊥ en otro caso
Esta es la definicion de fk+1.
Por lo tanto, queda demostrada nuestra conjetura y
SJdo x = x + 1 while x != 2K state
= fix(Fx != 2, x = x + 1) state
=⋃i≥0
F ix != 2, x = x + 1(⊥)
=⋃i≥0
fi state
=
(p, c, i, updateV (v, x, 2)) si v(x) ≤ 1
⊥ en otro caso
= cond(BJx <= 1K, (p, c, i, updateV (v, x, 2)), ⊥) state
Es decir, si x ≤ 1, la variable x acaba con valor 2, en cualquier otro caso el programa
diverge.
43
CAPITULO 3. PROPUESTA
3.3. Tareas de Entorno Mınimo
En esta seccion vamos primero a proponer un currıculo que recogera los conceptos compu-
tacionales que consideramos basicos a la hora de aprender programacion. Despues de esto
nos centraremos en proponer un modelo de tarea para cada uno de estos conceptos.
3.3.1. Currıculo de programacion
El currıculo propuesto esta organizado por unidades, cada una centrada en un concepto
computacional.
Caja 3.16 : Currıculo propuesto
Unidad 1: Instruccion Simple
Unidad 2: Secuencia de Instrucciones
Unidad 3: Bucle repeat con cuerpo simple
Unidad 4: Bucle repeat con cuerpo multiple
Unidad 5: Secuencia de bucles repeat
Unidad 6: Bucles repeat anidados
Unidad 7: Variables
Unidad 8: Entrada / Salida
Unidad 9: Operadores Aritmeticos
Unidad 10: Condicional If
Unidad 11: Condicional If-else
Unidad 12: Condicional If-else-if
Unidad 13: Bucle do-while
Unidad 14: Operadores Relacionales
Unidad 15: Operadores Logicos
44
CAPITULO 3. PROPUESTA
3.3.2. Tareas
En este apartado vamos a proponer tareas mınimas para cada unidad de forma que quede
justificada la utilizacion de los conceptos que representan.
Unidad 1: El objetivo de estas tareas sera recoger un unico objeto que estara en una
de las cuatro posibles direcciones.
Figura 3.8: Tarea de instruccion simple
Unidad 2: El objetivo de estas tareas sera recoger varios objetos que estaran dis-
puestos por la cuadrıcula.
Figura 3.9: Tarea de secuencia de instrucciones
45
CAPITULO 3. PROPUESTA
Unidad 3: El objetivo de estas tareas sera recoger varios objetos que estaran dis-
puestos por la cuadrıcula alineados en una direccion. Ademas, para asegurar el uso
de bucle repeat, estableceremos un numero de palabras y numeros maximo de tal
forma que no se pueda resolver con instrucciones de movimiento individuales.
Figura 3.10: Tarea de repeat con cuerpo simple
Unidad 4: El objetivo de estas tareas sera recoger varios objetos que estaran dispues-
tos por la cuadrıcula siguiendo algun patron. Al igual que en el anterior, pondremos
un lımite de palabras y numeros de tal forma que solo se pueda resolver usando
bucle repeat.
Figura 3.11: Tarea de repeat con cuerpo multiple
46
CAPITULO 3. PROPUESTA
Unidad 5: El objetivo de estas tareas sera recoger varios objetos que estaran dis-
puestos por la cuadrıcula siguiendo varios patrones. Al igual que en el anterior,
pondremos un lımite de palabras y numeros de tal forma que solo se pueda resolver
usando bucles repeat.
Figura 3.12: Tarea de secuencia de repeat
Unidad 6: El objetivo de estas tareas sera recoger varios objetos que estaran dis-
puestos por la cuadrıcula siguiendo algun patron que se repite. Al igual que en el
anterior, pondremos un lımite de palabras y numeros de tal forma que solo se pueda
resolver usando bucles repeat.
Figura 3.13: Tarea de repeat anidados
47
CAPITULO 3. PROPUESTA
Unidad 7: El objetivo de estas tareas sera observar como se comporta un progra-
ma dependiendo del valor de sus variables. De esta forma es sencillo comprender
que el comportamiento de una variable es similar al de un valor cualquiera, con la
peculiaridad de que se puede cambiar.
Figura 3.14: Tarea de Variables
Caja 3.17 : Tarea Unidad 7
1 tipos_tuercas = 3
2 columnas_tipo = 2
3
4 repeat tipos_tuercas * columnas_tipo
5 right
6 down
7 up
8 end
48
CAPITULO 3. PROPUESTA
Unidad 8: El objetivo de estas tareas sera recoger el numero de objetos que un
agente auxiliar nos pida. Normalmente estaran alineados para ser resueltas usando
un bucle repeat. Ademas, el agente auxiliar no devolvera un numero fijo, sino que
se comprobara todo un rango de valores para obligar al usuario a resolverla usando
los recursos que se ensenan en dicha unidad.
Figura 3.15: Tarea de entrada/salida
Unidad 9: El objetivo de estas tareas sera recoger el numero de tuercas resultante
de hacer una operacion aritmetica con la informacion de dos agentes auxiliares.
Figura 3.16: Tarea de operadores aritmeticos
49
CAPITULO 3. PROPUESTA
Unidad 10: El objetivo de estas tareas sera entrar por la puerta por una de dos
puertas que estan alineadas. El programa se prueba para ambas puertas.
Figura 3.17: Tarea de if
Unidad 11: El objetivo de estas tareas sera entrar por una de dos puertas que estan
en direcciones distintas. El programa se prueba para ambas puertas.
Figura 3.18: Tarea de if - else
50
CAPITULO 3. PROPUESTA
Unidad 12: El objetivo de estas tareas sera entrar por una de varias puertas que
estan en cualquier disposicion. El programa se prueba para todas las puertas.
Figura 3.19: Tarea de if - else - if
Unidad 13: El objetivo de estas tareas sera encontrar la caja que tiene un numero
requerido de objetos en su interior. Solo hace uso de condiciones con == y !=. En
estas tareas, se comprobara el programa para todas las permutaciones de los valores
de las cajas.
Unidad 14: El objetivo de estas tareas sera encontrar la caja que tiene un numero
requerido de objetos dentro de un rango en su interior.
Unidad 15: El objetivo de estas tareas sera encontrar la caja que tiene un numero
requerido de objetos teniendo varias condiciones en conjuncion o disyuncion.
Figura 3.20: Tarea Unidades 13/14/15
51
CAPITULO 3. PROPUESTA
52
CAPITULO 4
Conclusiones y lıneas futuras
Como conclusion podemos decir que este proyecto, realizado en el marco de una beca de
iniciacion a la investigacion, esta centrado en la busqueda de sencillez en todos los sentidos.
Proponemos un modelo de computo centrado en la ensenanza que se apoya fuertemente
en la visualizacion. Hemos cogido elementos de otros lenguajes buscando siempre reducir
la dificultad en la sintaxis, ya que hay que tener en cuenta que esta herramienta sera
usada por personas que pueden no saber leer y escribir correctamente. Es decir, nuestro
objetivo respecto a la sintaxis ha sido acercarlo al lenguaje natural y evitar parentesis,
llaves, etc, para no tener que realizar complicadas combinaciones de teclas para escribir
caracteres especiales.
La sencillez es la razon por la que este lenguaje es tan reducido, de hecho, es la razon
principal por la que incluimos el bucle repeat en lugar del bucle for. Usamos un sistema
de movimiento absoluto, por la sencillez de planificar visualmente las acciones a realizar,
sin tener en cuenta el angulo en el que se encontrara el agente en un determinado momento.
Todas las estructuras computacionales que incluye quedan justificadas por las tareas que
hay que resolver con ellas, forzando que se use el concepto computacional adecuado para
completarla. Esto se puede ver especialmente en las tareas que incluyen puertas y cajas,
en las que tuvimos que introducir ciertos elementos ya descritos para que desde el lado
del usuario se perciba aleatoriedad. Gracias a esto nos aseguramos que no se realicen
programas a medida y que los programas escritos sean generales.
53
CAPITULO 4. CONCLUSIONES Y LINEAS FUTURAS
Durante la realizacion de este proyecto hemos utilizado muchos scripts, tanto en Bash [8]
como en GNU Octave [4]. Han sido usados principalmente para procesamiento de texto,
pues las tareas se organizan en un formato propio, parecido a JSON(JavaScript Object
Notation), por lo que cualquier cambio que quisieramos hacer en masa, se hizo usando
tecnicas como expresiones regulares.
Con respecto a las unidades, nos hemos centrado en que la dificultad entre ellas sea
gradual. Hemos propuesto un currıculo que cubra la programacion basica destinada a los
alumnos desde 1º de primaria hasta 2º de bachiller.
Aun queda trabajo por hacer en este campo, por un lado, la generacion automatica de
tareas es un campo interesante, en el que podemos utilizar tecnicas como busqueda con
retroceso para generar caminos validos de cierta longitud dentro de la cuadrıcula y repartir
objetos por este.
Otro tema interesante serıa la utilizacion de este modelo para la ensenanza de otras
asignaturas como Matematicas, Fısica o incluso Lengua Castellana.
Finalmente esta herramienta nos abre la posibilidad de crear nuevos cursos para ademas de
ensenar programacion basica, anadir campos como Inteligencia Artificial, Programacion
Orientada a Objetos, Programacion funcional, Algoritmia, etc. Incluso se podrıa estudiar
la capacidad de aprendizaje de los estudiantes de los cursos K-12 para aprender sobre
todos estos campos.
54
Bibliografıa
[1] Michele Van Dyne y Jeffrey Braun. ((Effectiveness of a Computational Thinking (CS0)
Course on Student Analytical Skills)). En: Proceedings of the 45th ACM Technical
Symposium on Computer Science Education. SIGCSE ’14. Atlanta, Georgia, USA:
Association for Computing Machinery, 2014, pags. 133-138. isbn: 9781450326056.
doi: 10.1145/2538862.2538956. url: https://doi.org/10.1145/
2538862.2538956.
[2] F. Vico, M. Molina, D. Orden, J. Ortiz, R. Garcıa y J. Masa. ((A coding curriculum
for K-12 education: the evidence-based approach)). En: EDULEARN19 Proceedings.
11th International Conference on Education and New Learning Technologies. Palma,
Spain: IATED, jul. de 2019, pags. 7102-7106. isbn: 978-84-09-12031-4. doi: 10.
21125/edulearn.2019.1698. url: http://dx.doi.org/10.21125/
edulearn.2019.1698.
[3] F. Vico, M. Molina, D. Orden, F. Rivas-Ruiz, R. Garcıa y J. Masa. ((coding skills
are acquired gender-independently in the K-12 system: the Toolbox Academy expe-
rience)). En: EDULEARN19 Proceedings. 11th International Conference on Education
and New Learning Technologies. Palma, Spain: IATED, jul. de 2019, pags. 7076-7079.
isbn: 978-84-09-12031-4. doi: 10.21125/edulearn.2019.1692. url: http:
//dx.doi.org/10.21125/edulearn.2019.1692.
[4] John W. Eaton, David Bateman, Søren Hauberg y Rik Wehbring. GNU Octave ver-
sion 5.2.0 manual: a high-level interactive language for numerical computations. 2020.
url: https://www.gnu.org/software/octave/doc/v5.2.0/.
[5] Referencia de JavaScript. url: https://developer.mozilla.org/es/
docs/Web/JavaScript/Referencia.
55
BIBLIOGRAFIA
[6] Hanne Riis Nielson y Flemming Nielson. Semantics with Applications: An Appetizer
(Undergraduate Topics in Computer Science). Berlin, Heidelberg: Springer-Verlag,
2007. isbn: 1846286913.
[7] Roberto Bruni y Ugo Montanari. Models of Computation. 1st. Springer Publishing
Company, Incorporated, 2017. isbn: 3319428985.
[8] Case Western Reserve University Chet Ramey y Free Software Foundation Brian
Fox. Bash Reference Manual. Mayo de 2019. url: https://www.gnu.org/
software/bash/manual/bash.pdf.
56
E.T.S de Ingeniería Informática Bulevar Louis Pasteur, 35 Campus de Teatinos 29071 Málaga E.T.S. DE INGENIERÍA INFORMÁTICA