I1M2016: Problema del concurso “Cifras y letras” en Haskell

En la primera parte de la clase de hoy de Informática de 1º del Grado en Matemáticas hemos desarrollado un programa en Haskell para resolver los problemas aritméticos del concurso Cifras y letras que consisten en dada una sucesión de números naturales y un número objetivo, intentar construir una expresión cuyo valor es el objetivo combinando los números de la sucesión usando suma, resta, multiplicación, división y paréntesis. Además, cada número de la sucesión puede usarse como máximo una vez y todos los números, incluyendo los resultados intermedios tienen que ser enteros positivos (1,2,3,…).

Por ejemplo, dada la sucesión 1, 3, 7, 10, 25, 50 y el objetivo 765, una solución es (1+50)x(25−10). Para el problema anterior existen 780 soluciones. En cambio, con la sucesión anterior y el objetivo 831, no hay solución.

Se empieza formalizando el problema y definiendo una función para reconcer las soluciones. A continuación, se presentan tres soluciones: la primera por fuerza bruta, la segunda mediante generación y evaluación y la tercera con simplificaciones algebraicas. Se termina con una comparación de las tres soluciones.

Los apuntes correspondientes a la clase son

Reseña: Formalized linear algebra over elementary divisor rings in Coq

Se ha publicado un artículo de razonamiento formalizado en Coq sobre álgebra titulado Formalized linear algebra over elementary divisor rings in Coq.

Sus autores son

Su resumen es

This paper presents a Coq formalization of linear algebra over elementary divisor rings, that is, rings where every matrix is equivalent to a matrix in Smith normal form. The main results are the formalization that these rings support essential operations of linear algebra, the classification theorem of finitely presented modules over such rings and the uniqueness of the Smith normal form up to multiplication by units. We present formally verified algorithms computing this normal form on a variety of coefficient structures including Euclidean domains and constructive principal ideal domains. We also study different ways to extend Bézout domains in order to be able to compute the Smith normal form of matrices. The extensions we consider are: adequacy (i.e. the existence of a gdco operation), Krull dimension ≤1 and well-founded strict divisibility.

El trabajo se ha publicado en Logical Methods in Computer Science (Volume 12, Issue 2).

El código de las correspondientes teorías en Coq se encuentra aquí.

I1M2016: Uso de las librerías HLint y Trace

En la segunda parte de la clase de hoy de Informática de 1º del Grado en Matemáticas se ha ecplicado el uso de las libretías HLint y Trace.

La librería HLint se instala ejecutando en una consola

Para explicar el uso de HLint se considera el programa ej1.hs en el que está definida la suma de una lista de números y cuyo contenido es

para analizarlo, se ejecuta en una consola

Siguiendo la sugerencia, cambiamos el contenido del programa ej1.hs y queda

Lo volvemos a analizar con HLint

Con lo que finalmente el programa queda

y al analizarlo

El segundo ejemplo que se explicó es en un programa con acumulador. El programa está en el fichero ej2.hs cuyo contenido es

Lo analizamos con HLint

Al incorporar las 2 sugerencias a ej2.hs el programa queda como sigue

Lo volvemos a analizar con HLint

a incorporar la sugerencia a ej2.hs cuyo contenido queda como sigue

Lo vovemos a analizar con HLint

Aunque no ha dado ninguna sugerencia, podemos eliminar la dunción auxiliar aux quedando el contenido de ej2.hs como sigue

Lo analizamos con HLint

Con lo que el program final se reduce a

Para explicar la librería Trace volvemos a considerar la 2ª definición de la suma de los elemntos de una lista; es decir, la versión inicial del ej2.hs

Para usar la librería Trace hauy que importarla añadiendo al principio del fichero la línea

Como la función recursiva es aux, para seguir su traza le añadimos como primera ecuación la siguiente.

Con estos cambios, el contenido del fichero es

Al evaluarlo

se observa la traza. La cadena de la traza se puede construir con la función printf de la librería Printf como se muestra a continuación

en donde se ha ajustado el ancho de la la columna del acumulador a 2 (mediante %2d) como se ve en la evaluación