RA2013: Razonamiento automático sobre programas con Isabelle/HOL

En la clase de hoy del curso de Razonamiento automático se ha presentado cómo se puede demostrar automáticamente propiedades de programas funcionales con Isabelle/HOL.

En primer lugar, se ha estudiado cómo se pueden demostrar manualmente propiedades de programas Haskell. Para ello, se han usado las transparencias del tema 7 del curso de Programación declarativa (de 3º del Grado en Informática). Como lectura complementaria se recomienda el capítulo 13 del libro de G. Hutton Programming in Haskell.

A continuación se ha explicado cómo demostrar automáticamente las propiedades anteriores con Isabelle/HOL.

El enunciado de las propiedades es inmediato: basta escribir la palabra lemma y a continuación la propiedad entre comillas dobles; por ejemplo,

También se puede poner un nombre al lema, por ejemplo,

La demostración es la palabra by seguida por el método de demostración. Los métodos que hemos usado son

  1. by simp: que es el método de simplificación por reescritura,
  2. by (induct x) auto: que es por inducción en x (donde x es un número natural o una lista) y simplificación automática de ambos casos,
  3. by (induct rule: fn.induct) auto: que es por inducción según la definición de la función fn y simplificación automática de todos los casos,
  4. by (cases x) auto: que hace distinción de casos según el tipo x y simplificación automática de todos los casos,
  5. by (induct x arbitrary: y) auto: que es por inducción en x (donde y se considera una variable arbitraria) y simplificación automática de todos los casos y
  6. by (simp add: lema_auxiliar): que es el método de simplificación por reescritura añadiéndole a las reglas de reescritura la correspondiente al lema_auxiliar,

La teoría con los ejemplos presentados en la clase es la siguiente:
Read More “RA2013: Razonamiento automático sobre programas con Isabelle/HOL”

Sucesión con radicales en Haskell

Uno de los problemas de las Olimpiadas matemáticas de este año es el siguiente

Dada la sucesión, definida por
x_0 = 1
x_{n+1} = 2x_n+\sqrt{3x_n^2 -2},
calcular el término 2013 de la misma.

A partir del problema he elaborado, con la colaboración de María J. Hidalgo, la siguiente relación de ejercicios en Haskell para la asignatura de Informática (de 1º del Grado en Matemáticas).

En la relación se presenta 5 definiciones distintas de la sucesión:

  • la primera es traducción directa usando números flotantes con doble precisión,
  • la segunda es una adaptación de la anterior usando números enteros,
  • la tercera es una definición sin radicales basada en propiedades de la sucesión conjeturadas usando la segunda definición,
  • la cuarta es una versión con memoria de la anterior y
  • la quinta es una traducción directa usando números construibles mediante la librería Data.Real.Constructible.

Se observa que las dos primeras definiciones son incorrectas (debido a errores de redondeo), la tercera es correcta pero basada en propiedades no evidentes y además es ineficiente, la cuarta es más eficiente y la quinta es correcta, elemental y eficiente.

La relación de ejercicios, y sus soluciones, es la siguiente
Read More “Sucesión con radicales en Haskell”