Laboratorio de métodos formales: Z3, SPIN, TLA+ y Alloy en una VM

Este laboratorio da a cada estudiante cuatro herramientas de verificación en una VM Ubuntu. Probar muestra que un diseño funciona en los casos probados. Un método formal pide a una máquina que mire todos los casos y que demuestre la propiedad o devuelva un contraejemplo. Los estudiantes usan Z3, un resolutor, SPIN, un verificador de modelos para Promela, TLA+ con su verificador TLC y Alloy, cada uno con un problema pequeño.

No se instala nada en el ordenador del estudiante. Las herramientas son las auténticas, y el README del laboratorio da los problemas y ninguna respuesta.

Qué aprenden los estudiantes

Qué significa comprobar un diseño en lugar de probarlo, en cuatro partes. Con Z3 escriben las reglas de un calendario de exámenes y luego una afirmación que las reglas hacen cierta, que Z3 demuestra al ver que su contraria no tiene solución. Con SPIN encuentran en una traza una carrera entre dos procesos y luego escriben un cerrojo para que no quede ningún error. Con TLA+ escriben el invariante que dice para qué sirve un cerrojo, leen el contraejemplo que imprime TLC para un cerrojo que no cierra y lo arreglan. Con Alloy leen un contraejemplo dibujado como personas y amistades y reparan el modelo con un hecho nuevo.

Ejecútalo en tu navegador

Los laboratorios de VM se configuran como una tarea de laboratorio en un módulo, y el ejemplo está en la página del laboratorio. La máquina es pequeña: una CPU, 1 GB de memoria y 10 GB de disco. Cada herramienta de Java se limita a 128 MB y todo cabe con holgura. Z3 y SPIN solo necesitan el archivo de Ubuntu. TLA+ y Alloy se descargan de GitHub, adonde no llega una VM de invitado sin cuenta, así que esas dos partes necesitan una VM con la sesión iniciada.

  1. Añade el laboratorio. En un módulo que enseñes, añade una tarea y elige la tarjeta de laboratorio de VM Ubuntu. La página muestra una breve descripción de la máquina en lugar de un archivo compose.
  2. Empieza desde el ejemplo. La página ofrece laboratorios ya hechos para empezar. Elige Formal methods. Usar un ejemplo sustituye el texto, y Deshacer recupera el tuyo.
  3. Publica e inicia tu propia copia. Publica y luego pulsa Iniciar. El script setup del laboratorio instala Z3, SPIN y un entorno de Java desde el archivo de Ubuntu, descarga TLA+ y Alloy de sus versiones publicadas en GitHub y comprueba cada archivo con una suma de verificación fija, la primera vez que arranca la VM, en unos minutos.
  4. Abre el terminal. Abre su terminal y lee README.md en la carpeta personal: dice qué hacer en cuatro partes y no da ninguna respuesta.

Una lección básica sobre este laboratorio

Formal Methods Basics es una lección pequeña trabajada en este laboratorio, que es una VM Ubuntu. Tiene un gancho, un objetivo «Puedo», palabras clave, un punto de partida, una comprobación tras cada idea, un error frecuente y una comprobación final, y cada paso tiene un botón Ejecutar que escribe su comando en el terminal de la máquina. El estudiante hace a Z3 una pregunta que puede responder y otra que no, deja que SPIN encuentre la carrera en el modelo del laboratorio y la reproduce, lee el contraejemplo que imprime TLC para un invariante falso de un cerrojo correcto y ve una instancia de Alloy.

La lección mira alrededor y deja al estudiante las tareas propias del laboratorio, así que no da ninguna respuesta.

Cómo se califica

El laboratorio tiene una comprobación, que cree a las herramientas y nunca las palabras del estudiante. Z3 mismo compara las reglas del calendario del estudiante con las del README, así que una respuesta escrita a mano o una regla que falta suspende, y la afirmación debe seguirse de las reglas sin ser cierta sin ellas. SPIN ejecuta el cerrojo del estudiante dentro de un marco propio de la comprobación y el cerrojo no puede nombrar nada que sea del marco. TLC ejecuta el cerrojo arreglado con el invariante de la comprobación y con el del estudiante, ambos procesos deben poder entrar, y el invariante del estudiante debe romperlo el cerrojo defectuoso que se entrega: un invariante TRUE suspende. Alloy abre el modelo del estudiante desde un archivo propio con sus propias aserciones, que deben cumplirse, y una ejecución que aún debe encontrar un grupo de amigos. La primera línea impresa dice por qué.

  1. Repártelo. Asigna el laboratorio como cualquier tarea, con fecha de entrega si quieres. Cada estudiante recibe una VM propia, que se conserva entre sesiones si tiene cuenta.
  2. Ejecuta la comprobación. En la fila de un estudiante en la lista de la clase, pulsa Ejecutar la comprobación. Inicia una copia de su máquina guardada que no se vuelve a guardar, ejecuta el script de comprobación del laboratorio como root y muestra si pasó, qué imprimió y cuándo. Al estudiante no se le dice el resultado.
  3. Califícalo. Lee la primera línea de lo que imprimió la comprobación: nombra la parte y dice qué no está bien, por ejemplo una regla que Z3 echa en falta, un cerrojo en el que SPIN aún encuentra un error, un invariante que no detecta el cerrojo defectuoso o un modelo que todavía tiene un contraejemplo. Devuelve el trabajo con un motivo si necesita más.

La definición en GitHub

El archivo es toda la definición del laboratorio, el mismo texto que ejecuta la plataforma: tamaño, script setup, comandos de ayuda, README y comprobación. Cópialo y cambia los problemas para hacer un laboratorio más largo.

Prueba este laboratorio, y lo que cuesta

Con una cuenta personal gratuita puedes seguir las lecciones básicas de este laboratorio, con crédito gratuito suficiente cada mes para seguir la mayoría de las lecciones y sin tarjeta. Para una clase, un centro tiene gratis sus primeros 365 días, hasta 50 alumnos, y después paga por alumno y año, con todos los laboratorios incluidos y el profesorado gratis.

Preguntas frecuentes

¿Necesita el laboratorio una licencia?
No. Z3 es MIT, SPIN es BSD, las herramientas de TLA+ son MIT y Alloy es Apache 2.0, con resolutores bajo sus propias licencias abiertas dentro de su jar. Se instalan en la VM del estudiante al arrancar, y nosotros no distribuimos ninguno.
¿Puede hacerlo un estudiante sin cuenta?
Las partes uno y dos, Z3 y SPIN, sí. Una VM sin cuenta solo llega al archivo de Ubuntu, así que allí no se pueden descargar TLA+ y Alloy. La VM de un estudiante con sesión iniciada llega a GitHub y recibe los cuatro.
¿Pueden los estudiantes estropear algo?
Solo su propia copia. Las herramientas comprueban modelos y no ejecutan nada ajeno. Si un estudiante estropea un archivo, la copia original está en /usr/share/formallab.
¿Se probó el laboratorio en una VM de estudiante real?
El script setup, los comandos de la lección y la comprobación se ejecutaron en un Ubuntu 26.04 real dentro de un contenedor que hacía de VM, y se vio que la comprobación suspende cada forma de hacer trampa en cada parte y aprueba con la solución de referencia. Una VM de estudiante realmente arrancada, y la descarga a través del proxy de la plataforma, merecen una prueba antes de una clase.