|
|
Línea 1: |
Línea 1: |
| <source lang='haskell'> | | <source lang='haskell'> |
| -- I1M 2021-22
| |
| -- Funciones sobre cadenas.
| |
| -- Departamento de Ciencias de la Computación e I.A.
| |
| -- Universidad de Sevilla
| |
| -- =====================================================================
| |
|
| |
| -- ---------------------------------------------------------------------
| |
| -- Importación de librerías auxiliares --
| |
| -- ---------------------------------------------------------------------
| |
|
| |
| import Data.Char
| |
| import Data.List
| |
| import Test.QuickCheck
| |
|
| |
| -- ---------------------------------------------------------------------
| |
| -- Ejercicio 1.1. Definir, por comprensión, la función
| |
| -- sumaDigitosC :: String -> Int
| |
| -- tal que (sumaDigitosC xs) es la suma de los dígitos de la cadena
| |
| -- xs. Por ejemplo,
| |
| -- sumaDigitosC "SE 2431 X" == 10
| |
| -- Nota: Usar las funciones (isDigit c) que se verifica si el carácter c
| |
| -- es un dígito y (digitToInt d) que es el entero correspondiente al
| |
| -- dígito d.
| |
| -- ---------------------------------------------------------------------
| |
|
| |
| sumaDigitosC :: String -> Int
| |
| sumaDigitosC xs = undefined
| |
|
| |
| -- ---------------------------------------------------------------------
| |
| -- Ejercicio 1.2. Definir, por recursión, la función
| |
| -- sumaDigitosR :: String -> Int
| |
| -- tal que (sumaDigitosR xs) es la suma de los dígitos de la cadena
| |
| -- xs. Por ejemplo,
| |
| -- sumaDigitosR "SE 2431 X" == 10
| |
| -- Nota: Usar las funciones isDigit y digitToInt.
| |
| -- ---------------------------------------------------------------------
| |
|
| |
| sumaDigitosR :: String -> Int
| |
| sumaDigitosR = undefined
| |
|
| |
|
| |
|
| |
| -- ---------------------------------------------------------------------
| |
| -- Ejercicio 1.3. Definir, por orden superior, la función
| |
| -- sumaDigitosMF :: String -> Int
| |
| -- tal que (sumaDigitosMF xs) es la suma de los dígitos de la cadena
| |
| -- xs. Por ejemplo,
| |
| -- sumaDigitosMF "SE 2431 X" == 10
| |
| -- Nota: Usar las funciones isDigit y digitToInt.
| |
| -- ---------------------------------------------------------------------
| |
|
| |
| sumaDigitosMF :: String -> Int
| |
| sumaDigitosMF = undefined
| |
|
| |
| -- ---------------------------------------------------------------------
| |
| -- Ejercicio 1.4. Comprobar con QuickCheck que las definiciones son
| |
| -- equivalentes.
| |
| -- ---------------------------------------------------------------------
| |
|
| |
| -- La propiedad es
| |
| prop_sumaDigitos :: String -> Bool
| |
| prop_sumaDigitos xs = undefined
| |
|
| |
| -- La comprobación es
| |
|
| |
| -- ---------------------------------------------------------------------
| |
| -- Ejercicio 2.1. Definir, por comprensión, la función
| |
| -- mayusculaInicial :: String -> String
| |
| -- tal que (mayusculaInicial xs) es la palabra xs con la letra inicial
| |
| -- en mayúscula y las restantes en minúsculas. Por ejemplo,
| |
| -- mayusculaInicial "sEviLLa" == "Sevilla"
| |
| -- mayusculaInicial "" == ""
| |
| -- Nota: Usar las funciones (toLower c) que es el carácter c en
| |
| -- minúscula y (toUpper c) que es el carácter c en mayúscula.
| |
| -- ---------------------------------------------------------------------
| |
|
| |
| mayusculaInicial :: String -> String
| |
| mayusculaInicial = undefined
| |
|
| |
| -- ---------------------------------------------------------------------
| |
| -- Ejercicio 2.2. Definir, por recursión, la función
| |
| -- mayusculaInicialRec :: String -> String
| |
| -- tal que (mayusculaInicialRec xs) es la palabra xs con la letra
| |
| -- inicial en mayúscula y las restantes en minúsculas. Por ejemplo,
| |
| -- mayusculaInicialRec "sEviLLa" == "Sevilla"
| |
| -- mayusculaInicialRec "s" == "S"
| |
| -- ---------------------------------------------------------------------
| |
|
| |
| mayusculaInicialRec :: String -> String
| |
| mayusculaInicialRec = undefined
| |
|
| |
|
| |
| -- ---------------------------------------------------------------------
| |
| -- Ejercicio 2.3. Definir, por orden superior, la función
| |
| -- mayusculaInicialMF :: String -> String
| |
| -- tal que (mayusculaInicialMF xs) es la palabra xs con la letra
| |
| -- inicial en mayúscula y las restantes en minúsculas. Por ejemplo,
| |
| -- mayusculaInicialMF "sEviLLa" == "Sevilla"
| |
| -- mayusculaInicialMF "s" == "S"
| |
| -- ---------------------------------------------------------------------
| |
|
| |
| mayusculaInicialMF :: String -> String
| |
| mayusculaInicialMF = undefined
| |
|
| |
|
| |
|
| |
| -- ---------------------------------------------------------------------
| |
| -- Ejercicio 2.4. Comprobar con QuickCheck que las definiciones son
| |
| -- equivalentes.
| |
| -- ---------------------------------------------------------------------
| |
|
| |
| -- La propiedad es
| |
| prop_mayusculaInicial :: String -> Bool
| |
| prop_mayusculaInicial xs = undefined
| |
|
| |
| -- La comprobación es
| |
|
| |
| -- ---------------------------------------------------------------------
| |
| -- Ejercicio 3.1. 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, por comprensión, la función
| |
| -- titulo :: [String] -> [String]
| |
| -- 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,
| |
| -- ghci> titulo ["eL","arTE","DE","La","proGraMacion"]
| |
| -- ["El","Arte","de","la","Programacion"]
| |
| -- ---------------------------------------------------------------------
| |
|
| |
| titulo :: [String] -> [String]
| |
| titulo = undefined
| |
|
| |
| -- ---------------------------------------------------------------------
| |
| -- Ejercicio 3.2. Definir, por recursión, la función
| |
| -- tituloRec :: [String] -> [String]
| |
| -- tal que (tituloRec ps) es la lista de las palabras de ps con
| |
| -- las reglas de mayúsculas iniciales de los títulos. Por ejemplo,
| |
| -- ghci> tituloRec ["eL","arTE","DE","La","proGraMacion"]
| |
| -- ["El","Arte","de","la","Programacion"]
| |
| -- ---------------------------------------------------------------------
| |
|
| |
| tituloRec :: [String] -> [String]
| |
| tituloRec = undefined
| |
|
| |
| -- ---------------------------------------------------------------------
| |
| -- Ejercicio 3.3. Comprobar con QuickCheck que ambas definiciones son
| |
| -- equivalentes.
| |
| -- ---------------------------------------------------------------------
| |
|
| |
| -- La propiedad es
| |
| prop_titulo :: [String] -> Bool
| |
| prop_titulo xs = undefined
| |
|
| |
| -- La comprobación es
| |
|
| |
| -- ---------------------------------------------------------------------
| |
| -- Ejercicio 4.1. Definir, por comprensión, la función
| |
| -- posiciones :: String -> Char -> [Int]
| |
| -- tal que (posiciones xs y) es la lista de la posiciones del carácter y
| |
| -- en la cadena xs. Por ejemplo,
| |
| -- posiciones "Salamanca" 'a' == [1,3,5,8]
| |
| -- ---------------------------------------------------------------------
| |
|
| |
| posiciones :: String -> Char -> [Int]
| |
| posiciones xs y = undefined
| |
|
| |
| -- ---------------------------------------------------------------------
| |
| -- Ejercicio 4.2. Definir, por recursión, la función
| |
| -- posicionesR :: String -> Char -> [Int]
| |
| -- tal que (posicionesR xs y) es la lista de la posiciones del
| |
| -- carácter y en la cadena xs. Por ejemplo,
| |
| -- posicionesR "Salamanca" 'a' == [1,3,5,8]
| |
| -- ---------------------------------------------------------------------
| |
|
| |
| posicionesR :: String -> Char -> [Int]
| |
| posicionesR xs y = undefined
| |
|
| |
| -- ---------------------------------------------------------------------
| |
| -- Ejercicio 4.3. Comprobar con QuickCheck que ambas definiciones son
| |
| -- equivalentes.
| |
| -- ---------------------------------------------------------------------
| |
|
| |
| -- La propiedad es
| |
| prop_posiciones :: String -> Char -> Bool
| |
| prop_posiciones xs y = undefined
| |
|
| |
| -- La comprobación es
| |
|
| |
| -- ---------------------------------------------------------------------
| |
| -- Ejercicio 5.1. Definir, por recursión, la función
| |
| -- contieneR :: String -> String -> Bool
| |
| -- tal que (contieneR xs ys) se verifica si ys es una subcadena de
| |
| -- xs. Por ejemplo,
| |
| -- contieneR "escasamente" "casa" == True
| |
| -- contieneR "escasamente" "cante" == False
| |
| -- contieneR "" "" == True
| |
| -- Nota: Se puede usar la predefinida (isPrefixOf ys xs) que se verifica
| |
| -- si ys es un prefijo de xs.
| |
| -- ---------------------------------------------------------------------
| |
|
| |
| contieneR :: String -> String -> Bool
| |
| contieneR = undefined
| |
|
| |
| -- ---------------------------------------------------------------------
| |
| -- Ejercicio 5.2. Definir, por comprensión, la función
| |
| -- contieneC :: String -> String -> Bool
| |
| -- tal que (contiene xs ys) se verifica si ys es una subcadena de
| |
| -- xs. Por ejemplo,
| |
| -- contieneC "escasamente" "casa" == True
| |
| -- contieneC "escasamente" "cante" == False
| |
| -- contieneC "casado y casada" "casa" == True
| |
| -- contieneC "" "" == True
| |
| -- Nota: Se puede usar la predefinida (isPrefixOf ys xs) que se verifica
| |
| -- si ys es un prefijo de xs.
| |
| -- ---------------------------------------------------------------------
| |
|
| |
| contieneC :: String -> String -> Bool
| |
| contieneC xs ys = undefined
| |
|
| |
|
| |
| -- ---------------------------------------------------------------------
| |
| -- Ejercicio 5.2. Definir, por orden superior, la función
| |
| -- contiene :: String -> String -> Bool
| |
| -- tal que (contiene xs ys) se verifica si ys es una subcadena de
| |
| -- xs. Por ejemplo,
| |
| -- contiene "escasamente" "casa" == True
| |
| -- contiene "escasamente" "cante" == False
| |
| -- contiene "casado y casada" "casa" == True
| |
| -- contiene "" "" == True
| |
| -- Nota: Se puede usar la predefinida (isPrefixOf ys xs) que se verifica
| |
| -- si ys es un prefijo de xs.
| |
| -- ---------------------------------------------------------------------
| |
|
| |
| contiene :: String -> String -> Bool
| |
| contiene xs ys = undefined
| |
|
| |
|
| |
| -- ---------------------------------------------------------------------
| |
| -- Ejercicio 5.3. Comprobar con QuickCheck que las definiciones son
| |
| -- equivalentes.
| |
| -- ---------------------------------------------------------------------
| |
|
| |
| -- La propiedad es
| |
| prop_contiene :: String -> String -> Bool
| |
| prop_contiene xs ys = undefined
| |
|
| |
| -- La comprobación es
| |
|
| |
|
| </source> | | </source> |