Las propiedades como brújula: programación precisa ✛ ✎

Original: "Accurate Programming: Thinking about programs in terms of properties"
arXiv:1109.0786 · 2011-09-05 · arXiv non-exclusive · análisis propio · 3 min
Los programas no son solo código, sino también propiedades matemáticas que se pueden verificar automáticamente.

La niebla se espesa sobre la línea «def max(a: Int, b: Int): Int». ¿Qué hace? Devuelve el mayor de dos números, pero ¿cómo comprobarlo? Se pueden escribir una docena de pruebas con pares concretos: max(2,3)=3, max(5,5)=5, max(-1,0)=0. Y aun así queda la inquietud: ¿y si para algún millón y menos un millón falla? En lugar de mirar fijamente la niebla, el desarrollador puede tomar una brújula, y esa brújula se llama propiedad.

Una propiedad es una afirmación sobre el programa que debe ser cierta para todos los datos de entrada. No «para 2 y 3 devuelve 3», sino «para cualquier a y b, el resultado no es menor que cada uno de ellos». Tal afirmación se puede escribir no solo en papel, sino también en código. La biblioteca ScalaCheck sabe generar cientos de valores aleatorios, sustituirlos en la propiedad y avisar si alguna se incumple. Esto es el testing basado en propiedades: en lugar de enumerar ejemplos a mano, se verifica automáticamente la ley.

La propiedad como brújula: no te guía por una única ruta, sino que marca una dirección válida para cualquier camino. Para la función max, tres direcciones son la simetría (max(a,b)=max(b,a)), la idempotencia (max(a,a)=a) y la propiedad del supremo (el resultado no es menor que cada argumento ni mayor que cualquier otro número con esa condición). Juntas definen por completo qué significa «máximo».

Pero las propiedades no solo verifican código ya escrito, también ayudan a escribirlo. Tomemos la función sum, que suma una lista de números. Una de sus propiedades es la monotonía: si tomamos una lista y le añadimos un número positivo, la suma crece. Parece obvio. Pero ScalaCheck encuentra un contraejemplo: para la lista [65536] y el añadido 1, la suma no crece, sino que se queda en 65537, debido al desbordamiento del tipo entero en algunos lenguajes. La brújula señaló una roca que las pruebas habituales no veían.

Las propiedades se pueden afinar, como el ajuste de una brújula. La función count cuenta los elementos de una lista. La primera propiedad, «el resultado no es negativo», es demasiado débil: la satisface incluso una función que siempre devuelve cero. Añadimos la propiedad «para una lista de un solo elemento, el resultado es 1»: el cero se descarta, pero quedan otros impostores. Poco a poco, paso a paso, las propiedades convergen hacia la única implementación correcta.

Y aquí viene el giro: el propio programa también es una propiedad. Si una función siempre devuelve 42, se puede describir con la propiedad «para cualquier entrada, el resultado es 42». La frontera entre especificación (lo que queremos) e implementación (cómo lo hacemos) se difumina. La programación precisa es un enfoque en el que el desarrollador tiene en mente no solo el código, sino también las propiedades que ese código debe cumplir. Es un puente entre el testing y la verificación formal: no demostramos el programa entero, pero obtenemos la mayoría de las garantías por una fracción del coste.

La niebla se disipa. La línea «def max» ya no parece un enigma: tiene tres propiedades-brújula, y cada una se puede verificar automáticamente. La programación deja de ser adivinación y se convierte en navegación por un mapa que nosotros mismos trazamos.

El nombre de la biblioteca ScalaCheck alude a la idea de verificación automática de propiedades, no a una 'comprobación de Scala'; es una herramienta para verificar propiedades en Scala.

En la serie 'Westworld', el comportamiento de los robots está determinado por reglas complejas, pero su corrección no está garantizada. La programación precisa podría ayudar a formular y verificar propiedades de comportamiento, previniendo fallos inesperados.

Científicos
Erwin SchrödingerHugh Everett IIIMax BornAlbert EinsteinJohn von NeumannAugustin-Louis Cauchy
Conceptos
exactitud automatización optimización precisión diagnóstica procesamiento del lenguaje natural tiempo real algoritmo cuántico diseño de fármacos código abierto convergencia aprendizaje automático simulación por computadora reconocimiento del habla medicina personalizada inteligencia artificial robótica cálculo clasificación solución exacta precisión