UFOP DECOM 2011/2
Prof. José Romildo Malaquias
BCC222 – Programação Funcional
Lista de Exercícios 11
Avaliação lazy
Exercício 1
Expressões regulares
Expressões regulares são padrões que podem ser usados para descrever
conjuntos de cadeias de caractres de vários formas, como por exemplo:
• os identificadores de uma linguagem de programação: cadeias de caracteres
alfanuméricos que começam com um caracter alfanumérico
• os números inteiros e reais de uma dada linguagem de programação
Existem cinco formas de expressões regulares:
x
(r1 |r2 )
(r1 r2 )
(r)?
casa com a cadeia vazia
casa com o caracter x
casa com uma cadeia s se r1 casa com s, ou r2 casa com s
casa com uma cadeia s se s pode se dividida em duas subcadeias s1 e s2
de forma que s = s1 + +s2 , e r1 casa com s1 e r2 casa com s2
casa com uma cadeia s se s pode se dividida em duas ou mais subcadeias
s = s1 + + · · · + +sn , cada uma das quais casa com r
1. Definir um tipo algébrico RegExp para representar expressões regulares. Utilizar operadores binários para representar (r1 |r2 ) e (r1 r2 ).
2. Defina uma função enumerate :: RegExp -> [String], que recebe uma expressão regular e resulta na lista de todas as cadeias com as quais a expressão regular casa.
Estas listas podem ser infinitas, mas como Haskell usa avaliação lazy, isto
não é um problema.
Para combinar duas listas infinitas, defina a função interleave :: [a] > [a] -> [a], que constrói o resultado pegando alternado valores de cada
uma das listas dadas como argumentos.
Para gerar todas as combinações de elementos de duas listas, defina a função cartesian :: [[a]] -> [[a]] -> [[a]], que concatena ele mentos da
primeira lista com elementos da segunda lista de todas as formas possíveis e
intercalando os elementos.
1
Download

Avaliação lazy - Decom