El tipo de las fórmulas proposicionales: Variables de una fórmula

Usando el tipo de las fórmulas proposicionales definido en el ejercicio anterior, definir la función

tal que variables p es la lista de las variables de la fórmula p. Por ejemplo,

Soluciones

A continuación se muestran las soluciones en Haskell y las soluciones en Python.


Soluciones en Haskell


Soluciones en Python

El tipo de las fórmulas proposicionales

1. El tipo de las fórmulas proposicionales en Haskell

La fórmula A → ⊥ ∧ ¬B se representa por

usando el tipo de las fórmulas proposicionales definido por

1. El tipo de las fórmulas proposicionales en Haskell

La fórmula A → ⊥ ∧ ¬B se representa por

usando el tipo de las fórmulas proposicionales definido por

El tipo de los árboles binarios

El árbol binario

se puede representar por

El tipo de los árboles binarios se puede definir por

Definir las funciones

tales que

  • ocurre m a se verifica si m ocurre en el árbol a. Por ejemplo,

  • aplana a es la lista obtenida aplanando el árbol a. Por ejemplo,

Soluciones

A continuación se muestran las soluciones en Haskell y las soluciones en Python.


Soluciones en Haskell


Soluciones en Python

El tipo de las listas

El tipo de las listas, con elementos de tipo a, se puede definir por

Por ejemplo, la lista [4,2,5] se representa por Cons 4 (Cons 2 (Cons 5 Nil)).

Definir la función

tal que longitud xs es la longitud de la lista xs. Por ejemplo,

Soluciones

A continuación se muestran las soluciones en Haskell y las soluciones en Python.


Soluciones en Haskell


Soluciones en Python

El tipo de los números naturales

El tipo de los números raturales se puede definir por

de forma que Suc (Suc (Suc Cero)) representa el número 3.

Definir las siguientes funciones

tales que

  • nat2int n es el número entero correspondiente al número natural n. Por ejemplo,

  • int2nat n es el número natural correspondiente al número entero n. Por ejemplo,

  • suma m n es la suma de los número naturales m y n. Por ejemplo,

Soluciones

A continuación se muestran las soluciones en Haskell y las soluciones en Python.


Soluciones en Haskell


Soluciones en Python

El tipo de figuras geométricas

Se consideran las figuras geométricas formadas por circulos (definidos por su radio) y rectángulos (definidos por su base y su altura). El tipo de las figura geométricas se define por

Definir las funciones

tales que

  • area f es el área de la figura f. Por ejemplo,

  • cuadrado n es el cuadrado de lado n. Por ejemplo,

Soluciones

A continuación se muestran las soluciones en Haskell y las soluciones en Python.


Soluciones en Haskell


Soluciones en Python

Movimientos en el plano

Se consideran el tipo de las posiciones del plano definido por

Definir las siguientes funciones

tales que

  • opuesta d es la dirección opuesta de d. Por ejemplo,

  • movimiento p d es la posición reultante de moverse, desde la posición p, un paso en la dirección d. Por ejemplo,

  • movimientos p ds es la posición obtenida aplicando la lista de movimientos según las direcciones de ds a la posición p. Por ejemplo,

Soluciones

A continuación se muestran las soluciones en Haskell y las soluciones en Python.


Soluciones en Haskell


Soluciones en Python

Máximo de una lista

Definir la función

tal que maximo xs es el máximo de la lista xs. Por ejemplo,

Soluciones

A continuación se muestran las soluciones en Haskell y las soluciones en Python.


Soluciones en Haskell


Soluciones en Python

Aplica según propiedad

Definir la función

tal que filtraAplica f p xs es la lista obtenida aplicándole a los elementos de xs que cumplen el predicado p la función f. Por ejemplo,

Soluciones

A continuación se muestran las soluciones en Haskell y las soluciones en Python.


Soluciones en Haskell


Soluciones en Python

Concatenación de una lista de listas

Definir, por recursión, la función

tal que conc xss es la concenación de las listas de xss. Por ejemplo,

Comprobar con QuickCheck que la longitud de conc xss es la suma de las longitudes de los elementos de xss.

Soluciones

A continuación se muestran las soluciones en Haskell y las soluciones en Python.


Soluciones en Haskell


Soluciones en Python

Agrupación de elementos por posición

Definir la función

tal que agrupa xsses la lista de las listas obtenidas agrupando los primeros elementos, los segundos, … Por ejemplo,

Comprobar con QuickChek que la longitud de todos los elementos de agrupa xs es igual a la longitud de xs.

Soluciones

A continuación se muestran las soluciones en Haskell y las soluciones en Python.


Soluciones en Haskell


Soluciones en Python

Elementos consecutivos relacionados

Definir la función

tal que relacionados r xs se verifica si para todo par (x,y) de elementos consecutivos de xs se cumple la relación r. Por ejemplo,

Soluciones

A continuación se muestran las soluciones en Haskell y las soluciones en Python.


Soluciones en Haskell


Soluciones en Python

Segmentos cuyos elementos cumplen una propiedad

Definir la función

tal que segmentos p xs es la lista de los segmentos de xs cuyos elementos verifican la propiedad p. Por ejemplo,

Soluciones

A continuación se muestran las soluciones en Haskell y las soluciones en Python.


Soluciones en Haskell


Soluciones en Python

Reconocimiento de subcadenas

Definir, por recursión, la función

tal que esSubcadena xs ys se verifica si xs es una subcadena de ys. Por ejemplo,

Soluciones

A continuación se muestran las soluciones en Haskell y las soluciones en Python.


Soluciones en Haskell


Soluciones en Python

Posiciones de un carácter en una cadena

Definir la función

tal que posiciones x ys es la lista de la posiciones del carácter x en la cadena ys. Por ejemplo,

Soluciones

A continuación se muestran las soluciones en Haskell y las soluciones en Python.


Soluciones en Haskell


Soluciones en Python

Mayúsculas iniciales

Se consideran las siguientes reglas de mayúsculas iniciales para los títulos:

  • la primera palabra comienza en mayúscula y
  • todas las palabras que tienen 4 letras como mínimo empiezan con mayúsculas

Definir la función

tal que titulo ps es la lista de las palabras de ps con las reglas de mayúsculas iniciales de los títulos. Por ejemplo,

Soluciones

A continuación se muestran las soluciones en Haskell y las soluciones en Python.


Soluciones en Haskell


Soluciones en Python

Poner en mayúscula la primera letra y las restantes en minúsculas

Definir la función

tal que mayusculaInicial xs es la palabra xs con la letra inicial en mayúscula y las restantes en minúsculas. Por ejemplo,

Soluciones

A continuación se muestran las soluciones en Haskell y las soluciones en Python.


Soluciones en Haskell


Soluciones en Python

Suma de los dígitos de una cadena

Definir la función

tal que sumaDigitos xs' es la suma de los dígitos de la cadenaxs`. Por ejemplo,

Soluciones

A continuación se muestran las soluciones en Haskell y las soluciones en Python.


Soluciones en Haskell


Soluciones en Python

Números de Lychrel

Un número de Lychrel es un número para el que nunca se obtiene un capicúa mediante el proceso de invertir las cifras y sumar los dos números. Por ejemplo, los siguientes números no son números de Lychrel:
+ 56, ya que en un paso se obtiene un capicúa: 56+65=121.
+ 57, ya que en dos pasos se obtiene un capicúa: 57+75=132, 132+231=363
+ 59, ya que en dos pasos se obtiene un capicúa: 59+95=154, 154+451=605, 605+506=1111
+ 89, ya que en 24 pasos se obtiene un capicúa.
En esta serie de ejercicios vamos a buscar el primer número de Lychrel.

Ejercicio 1. Definir la función

tal que esCapicua x se verifica si x es capicúa. Por ejemplo,

Ejercicio 2. Definir la función

tal que inverso x es el número obtenido escribiendo las cifras de x en orden inverso. Por ejemplo,

Ejercicio 3. Definir la función

tal que siguiente x es el número obtenido sumándole a x su inverso. Por ejemplo,

Ejercicio 4. Definir la función

tal que busquedaDeCapicua x es la lista de los números tal que el primero es x, el segundo es el siguiente de x y así sucesivamente hasta que se alcanza un capicúa. Por ejemplo,

Ejercicio 5. Definir la función

tal que capicuaFinal x es la capicúa con la que termina la búsqueda de capicúa a partir de x. Por ejemplo,

Ejercicio 6. Definir la función

tal que orden x es el número de veces que se repite el proceso de calcular el inverso a partir de x hasta alcanzar un número capicúa. Por ejemplo,

Ejercicio 7. Definir la función

tal que ordenMayor x n se verifica si el orden de x es mayor o igual que n. Dar la definición sin necesidad de evaluar el orden de x. Por ejemplo,

Ejercicio 8. Definir la función

tal que ordenEntre m n es la lista de los elementos cuyo orden esmayor o igual que m y menor que n. Por ejemplo,

Ejercicio 9. Definir la función

tal que menorDeOrdenMayor n es el menor elemento cuyo orden es mayor que n. Por ejemplo,

Ejercicio 10. Definir la función

tal que menoresdDeOrdenMayor m es la lista de los pares (n,x) tales que n es un número entre 1 y m y x es el menor elemento de orden mayor que n. Por ejemplo,

Ejercicio 11. A la vista de los resultados de menoresdDeOrdenMayor 5 conjeturar sobre la última cifra de menorDeOrdenMayor.

Ejercicio 12. Decidir con QuickCheck la conjetura.

Ejercicio 13. Calcular menoresdDeOrdenMayor 50

Ejercicio 14. A la vista de menoresdDeOrdenMayor 50, conjeturar el orden de 196.

Ejercicio 15. Comprobar con QuickCheck la conjetura sobre el orden de 196.

Soluciones

A continuación se muestran las soluciones en Haskell y las soluciones en Python.


Soluciones en Haskell


Soluciones en Python

El algoritmo de Luhn

El objetivo de este ejercicio es estudiar un algoritmo para validar algunos identificadores numéricos como los números de algunas tarjetas de crédito; por ejemplo, las de tipo Visa o Master Card.

El algoritmo que vamos a estudiar es el algoritmo de Luhn consistente en aplicar los siguientes pasos a los dígitos del número de la tarjeta.

  1. Se invierten los dígitos del número; por ejemplo, [9,4,5,5] se transforma en [5,5,4,9].
  2. Se duplican los dígitos que se encuentra en posiciones impares (empezando a contar en 0); por ejemplo, [5,5,4,9] se transforma en [5,10,4,18].
  3. Se suman los dígitos de cada número; por ejemplo, [5,10,4,18] se transforma en 5 + (1 + 0) + 4 + (1 + 8) = 19.
  4. Si el último dígito de la suma es 0, el número es válido; y no lo es, en caso contrario.

A los números válidos, se les llama números de Luhn.

Definir las siguientes funciones:

tales que

  • digitosInv n es la lista de los dígitos del número n, en orden inverso. Por ejemplo,

  • doblePosImpar ns es la lista obtenida doblando los elementos de ns en las posiciones impares (empezando a contar en cero y dejando igual a los que están en posiciones pares. Por ejemplo,

  • sumaDigitos ns es la suma de los dígitos de ns. Por ejemplo,

  • ultimoDigito n es el último dígito de n. Por ejemplo,

  • luhn n se verifica si n es un número de Luhn. Por ejemplo,

Soluciones

A continuación se muestran las soluciones en Haskell y las soluciones en Python.


Soluciones en Haskell


Soluciones en Python

Subconjuntos de un conjunto

Definir la función

tal que subconjuntos xs es la lista de las subconjuntos de la lista xs. Por ejemplo,

Comprobar con QuickChek que el número de elementos de subconjuntos xs es 2 elevado al número de elementos de xs.

Soluciones

A continuación se muestran las soluciones en Haskell y las soluciones en Python.


Soluciones en Haskell


Soluciones en Python

Producto cartesiano de dos conjuntos

Definir la función

tal que producto xs ys es el producto cartesiano de xs e ys. Por
ejemplo,

Comprobar con QuickCheck que el número de elementos de producto xs y es el producto del número de elementos de xs y de ys.

Soluciones

A continuación se muestran las soluciones en Haskell y las soluciones en Python.


Soluciones en Haskell

El código se encuentra en GitHub.


Soluciones en Python

El código se encuentra en GitHub.

Exponente de la mayor potencia de x que divide a y

Definir la función

tal que mayorExponente a b es el exponente de la mayor potencia de a que divide a b. Por ejemplo,

Nota: Se supone que a > 1 y b > 0.

Soluciones

A continuación se muestran las soluciones en Haskell y las soluciones en Python.


Soluciones en Haskell

El código se encuentra en GitHub.


Soluciones en Python

El código se encuentra en GitHub.