Razón aurea y corrección de programas
Como se dijo,
fib(n+1)/fib(n)
es la razón áurea 1.6... y es un número que extrañamente aparece en diversos
contextos naturales. Artificialmente, explica muchas obras de arte que son
consideradas bellas. Con la versión de los números de Fibonacci en Haskell
(bastante eficiente):
flujoFibs = 1:1:[a | a <- zipWith (+) flujoFibs (tail flujoFibs)]
la razón áurea se calcula rápidamente, como vimos.
Ahora, un argumento a favor del uso de lenguajes de alto nivel como Haskell
sería en que hacen asequible la demostración de la corrección de programas.
En ocasiones, la claridad de la formulación de los programas (funcionales) en
Haskell ya es bastante razón para suponer que un programa es correcto. Y un
programa es correcto si hace lo que se supone debe hacer. No es tan directo
ver que un programa es correcto en Arduino o en Python, pero sin duda es
también parte de las ambiciones de sus proponentes. Que la corrección de un
programa sea un objetivo a lograr siempre se muestra con un programa a la
Haskell, que implementa parte de las acciones que un "robot enfermero" debe
desempeñar:
cuidadoPaciente temperatura | temperatura > 39 = accion InyectarMedicamentoA
cuidadoPaciente temperatura | temperatura < 39 = accion InyectarMedicamentoB
(f a | a>10 = 100 se lee como "f evaluado en a vale 100 cuando a es mayor que 10")
Suponiendo los intervalos adecuados en donde los inyecciones deberían ponerse
(el tiempo es un gran factor aquí), ¿qué pasaría si temperatura==39? ¿no debería
inyectarse nada? Si se tiene 39.00000001, ¿se debería tomar como temperatura es
mayor que 39? ¿se toma en consideración la caducidad de los medicamentos? ¿se
considera que la alta temperatura podría ser causa de alguna enfermedad no
identificada? Si la temperatura es menor que 10 probablemente el paciente ya
falleció, ¿debe el robot continuar inyectando la medicina B al paciente? (ya para
qué). Notemos que hacer un programa correcto del robot enfermero tiene muchas
más exigencias de lo inicialmente previsto. Y es bueno que el lenguaje ayude a
implementar la especificación de éstas exigencias, pasando de un cuidadoso
análisis de la especificación (preferentemente, formal) a la implementación.
Veremos que intentaremos arduamente que en Arduino o MicroPython se
reflejen nuestros deseos de corrección (o bien, que no esperaríamos que nuestros
programas escritos en estos lenguajes no hagan lo que deben, o lo hagan a veces
bien o a veces mal, o que solo hagan parte bien y no el todo, etc.)
En fin, aún cuando aprender Haskell no es nuestra prioridad, ganamos mucho
en conocer nuevas técnicas de programación y sensibilidad en el tema
de especificación y corrección de programas aprendiendo algo de sus fundamentos.
Más info en:
www.haskell.org
https://book.realworldhaskell.org/
https://learnyouahaskell.com/learnyouahaskell.pdf
y a petición de Deysi:
https://www.amazon.com/Haskell-Analysis-Cookbook-Nishant-Shukla-ebook/dp/B00LB6DIQU
Comentarios
Publicar un comentario