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

Entradas populares de este blog

Origami, solo por compartir el interés

Tres nodos: 1 punto de acceso y dos clientes que se conectan entre sí vía el punto de acceso

Ejemplo de prompt para obtener programas desde Bard (sockets y esp32)