I1M2012: Ejercicios de definiciones por recursión y comprensión en Haskell (6)

En la clase de hoy de Informática de 1º del Grado en Matemáticas hemos comentado las soluciones de los ejercicios 9 a 12 de la 11ª relación en las que se presentan ejercicios con dos definiciones (una por recursión y otra por comprensión) y la comprobación de la equivalencia de las dos definiciones con QuickCheck.

Los ejercicios, y sus soluciones, se muestran a continuación:
Read More “I1M2012: Ejercicios de definiciones por recursión y comprensión en Haskell (6)”

DAO2012: Razonamiento sobre programas con Isabelle

En la sesión de hoy del seminario Demostración asistida por ordenador (DAO2012) se ha presentado cómo se puede demostrar con Isabelle propiedades de programas.

En el tema 8 del curso de I1M vimos cómo se puede razonar sobre programas funcionales. Hoy hemos visto cómo Isabelle puede hacer automáticamente las demostraciones de dicho tema. Los métodos que hemos usado son

  • simplificación (con simp),
  • automático (con auto),
  • inducción sobre números naturales y listas (con induct),
  • inducción con variables libres (con arbitrary) y
  • inducción en varias variables (con induct rule).

La teoría correspondiente a la clase es T3_Razonamiento_sobre_programas.thy cuyo contenido se muestra a continuación
Read More “DAO2012: Razonamiento sobre programas con Isabelle”

I1M2012: Ejercicios de definiciones por recursión y comprensión en Haskell (5)

En la clase de hoy de Informática de 1º del Grado en Matemáticas hemos comentado las soluciones de los ejercicios 6 a 8 de la 11ª relación en las que se presentan ejercicios con dos definiciones (una por recursión y otra por comprensión) y la comprobación de la equivalencia de las dos definiciones con QuickCheck.

Los ejercicios, y sus soluciones, se muestran a continuación:
Read More “I1M2012: Ejercicios de definiciones por recursión y comprensión en Haskell (5)”

LI2012: Formas normales de Skolem y cláusulas

En la clase de hoy del curso Lógica Informática se estudiado cómo se puede diseñar un procedimiento de forma que dada una fórmula F obtenga otra G que no tenga cuantificadores, que esté en forma normal conjuntiva y que sea equisatisfacible con F (es decir, que G es satisfacible precisamente si lo es F). Con dicho procedimiento se calcula la forma normal de Skolem. A partir de las formas se Skolem se obtienen las formas clausales.

Las transparencias de esta clase son las del tema 10
Read More “LI2012: Formas normales de Skolem y cláusulas”

I1M2012: Suma de números monótonos

En la clase de hoy de Informática de 1º del Grado en Matemáticas hemos comentado la solución con Haskell de un problema propuesto para la Olimpiada Internacional de Matemáticas de 1982 cuyo enunciado es

Calcular la suma de todos los enteros positivos cuyos dígitos forman una sucesión estrictamente creciente o estrictamente decreciente.

Lo resolveremos generando las listas de todos los enteros positivos cuyos dígitos forman una sucesión estrictamente monótona. Para ello nos basaremos en las listas de dígitos que forman una sucesión estrictamente monótona.

Comenzamos con los decrecientes:

  • (listasDecrecientesDesde n) es la lista de las sucesiones estrictamente decrecientes cuyo primer elemento es n. Por ejemplo,
    ghci> listasDecrecientesDesde 3
    [[3],[3,2],[3,2,1],[3,2,1,0],[3,2,0],[3,1],[3,1,0],[3,0]]

  • listasDecrecientes es la lista de las sucesiones estrictamente decrecientes cuyo primer elemento es un dígito. Por ejemplo,
    ghci> take 10 listasDecrecientes
    [[0],[1],[1,0],[2],[2,1],[2,1,0],[2,0],[3],[3,2],[3,2,1]]

  • (listaNumero xs) es el número correspondiente a la lista de dígitos xs. Por ejemplo,
    listaNumero [3,2,5] == 325

  • numerosDecrecientes es la lista de los enteros positivos cuyos dígitos forman una sucesión estrictamente decreciente. Por ejemplo,
    ghci> take 17 numerosDecrecientes
    [0,1,10,2,21,210,20,3,32,321,3210,320,31,310,30,4,43]

    Análogamente se construyen los crecientes:

  • (listasCrecientesDesde n) es la lista de las sucesiones estrictamente crecientes cuyo primer elemento es n. Por ejemplo,
    ghci> listasCrecientesDesde 6
    [[6],[6,7],[6,7,8],[6,7,8,9],[6,7,9],[6,8],[6,8,9],[6,9]]

  • listascrecientes es la lista de las sucesiones estrictamente crecientes cuyo primer elemento es un dígito. Por ejemplo,
    ghci> take 5 listasCrecientes
    [[1],[1,2],[1,2,3],[1,2,3,4],[1,2,3,4,5]]

  • numerosCrecientes es la lista de los enteros positivos cuyos dígitos forman una sucesión estrictamente creciente. Por ejemplo,
    ghci> take 5 numerosCrecientes
    [1,12,123,1234,12345]

    Con las definiciones anteriores la solución es inmediata:

    El cálculo de la solución es