¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Modelos y contraejemplos en Alloy

Después de esta lección: Puedo leer un contraejemplo de Alloy y decir qué regla falta en el modelo.

Lección de 50 min6 comandosLaboratorio de métodos formales: Z3, SPIN, TLA+ y Alloy en una VM

Dos asignaturas que se exigen entre sí

Alloy es un lenguaje para describir cosas y las relaciones entre ellas, y una herramienta que busca un ejemplo pequeño que rompa una afirmación. Cuando lo encuentra, ese ejemplo es el contraejemplo.

Una universidad guarda qué asignatura es previa de cuál. Nadie quiere un plan donde Álgebra exige Cálculo y Cálculo exige Álgebra: nadie podría matricularse. La regla "ninguna asignatura es previa de sí misma" no basta para evitarlo.

Al final de esta lección

Nota

Puedo leer un contraejemplo de Alloy y decir qué regla falta en el modelo.

Palabras clave

PalabraQué significaEjemplo
Conjuntoun tipo de cosas del modeloCourse
Relaciónlos enlaces entre cosas, escritos como paresprereq
Hechouna regla que el modelo siempre cumple
Afirmaciónalgo que Alloy comprueba sin imponerlo
Instanciaun ejemplo concreto de cosas y enlaces que cumple las reglas
Alcanceel tamaño máximo de cada conjunto que Alloy pruebafor 4

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Un modelo son conjuntos y relaciones

En Alloy dices qué tipos de cosas hay, los conjuntos, y cómo se enlazan, las relaciones. Aquí hay asignaturas, y la relación prereq enlaza cada una con sus previas.

Una relación es una lista de pares. Que Algoritmos tenga como previa Programación es el par Algoritmos -> Programación.

Ejemplo: la relación prereq como pares

ParSe lee
Algoritmos -> ProgramaciónProgramación es previa de Algoritmos
Programación -> MatemáticasMatemáticas es previa de Programación
Matemáticas -> AlgoritmosAlgoritmos es previa de Matemáticas
c.prereqlas previas directas de c
c.^prereqlas previas directas e indirectas de c

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Un hecho se impone, una afirmación se comprueba

Un hecho es una regla que Alloy da por cierta en todos los ejemplos que busca. Una afirmación es algo que quieres saber si se sigue de los hechos.

Con check le pides un contraejemplo de la afirmación. Con run, un ejemplo cualquiera que cumpla las reglas. El alcance limita cuántas cosas prueba.

El modelo de las asignaturas previas

Código: c
sig Course { prereq: set Course }   // cada asignatura tiene un conjunto de previas

fact noSelfPrereq { no c: Course | c in c.prereq }   // ninguna es previa de sí misma

assert NoCycles { no c: Course | c in c.^prereq }    // ninguna lo es, ni de forma indirecta
check NoCycles for 4                                 // busca un contraejemplo de hasta 4 asignaturas

run HasPrereqs { some prereq } for 3                 // pide un ejemplo con alguna previa

Crea una carpeta para el modelo

Comando
mkdir -p ~/courses

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Escribe el modelo en un archivo

Comando
printf '%s\n' 'sig Course { prereq: set Course }' '' 'fact noSelfPrereq { no c: Course | c in c.prereq }' '' 'assert NoCycles { no c: Course | c in c.^prereq }' 'check NoCycles for 4' '' 'run HasPrereqs { some prereq } for 3' > ~/courses/plan.als

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Mira qué contestó Alloy a cada orden

Comando
alloy ~/courses/plan.als | grep -oE 'UNSAT|SAT'

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Lee las dos instancias que encontró

Comando
alloy ~/courses/plan.als | grep -E 'instance|prereq='

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Cómo se lee un contraejemplo

Alloy llama Course$0 y Course$1 a las dos asignaturas del ejemplo. No tienen nombre propio: son cualquier par de asignaturas que se comporte así.

En el contraejemplo, cada una es previa de la otra. Como la regla del modelo solo prohíbe que una lo sea de sí misma, un ciclo de dos pasa. La herramienta de la máquina lo imprime como texto; la aplicación gráfica de Alloy lo dibuja con flechas.

Un error frecuente

Advertencia

Mucha gente cree que SAT en un check es una buena noticia. Es al revés. En un check, SAT significa que Alloy encontró un contraejemplo. Lo que quieres ver es UNSAT: no hay ninguno dentro del alcance.

Añade una regla que prohíba los ciclos

Comando
printf '%s\n' 'fact noCycles { no c: Course | c in c.^prereq }' >> ~/courses/plan.als

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Vuelve a comprobar el modelo

Comando
alloy ~/courses/plan.als | grep -oE 'UNSAT|SAT'

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

UNSAT vale dentro del alcance

Ahora el check da UNSAT, y el run sigue dando SAT. El run importa: si también diera UNSAT, el modelo sería tan estricto que no admitiría ningún plan.

Pero for 4 quiere decir que Alloy solo miró hasta cuatro asignaturas. Es muy buena señal, porque casi todos los fallos aparecen con pocas cosas, pero no es una demostración para cualquier tamaño.

Sobre este laboratorio y su código: Laboratorio de métodos formales: Z3, SPIN, TLA+ y Alloy en una VM

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.