CC41A Lenguajes de Programación
Tarea Recuperativa

Prof.: Luis Mateu B.

En esta tarea Ud. deberá programar un predicado en Prolog que determina si una secuencia de carateres corresponde a una expresión regular.

En prolog una secuencia de caracteres como "ab+c" corresponde a una lista de números que representan la codificación en ASCII de las letras a, b, + y c. Por lo tanto "ab+c" y [97, 98, 43, 99] son lo mismo.

Una expresión regular r puede ser:

La concatenación tiene mayor precedencia que la alternancia y por lo tanto "abc+3" equivale a "(abc)+3".

El predicado match-regexp(S, RE) es verdadero cuando la secuencia de caracteres S calza con la expresión regular RE. Este predicado debe verificar las siguientes consultas:

?- match-regexp("a", "a"), not(match-regexp("ab")),
   match-regexp("ab", "ab"), not(match-regexp("ac", "ab")),
     not(match-regexp("cb", "ab")),
   match-regexp("a", "a+b"), match-regexp("b", "a+b"),
     not(match-regexp("c", "a+b")),
   match-regexp("a", "(a)"), match-regexp("ab", "a(b+c)"),
     match-regexp("ab", "(a+c)b"), match-regexp("ab","(a+c)(d+b)"),
     not(match-regexp("ab", "(b+c)(d+b)")), not(match-regexp("ab","(a+b)bc")),
   match-regexp("abc", "(a+b+c)(a+b+c)(a+b+c)"),
     not(match-regexp("abc", "(a+b+c)(a+b+c)(b+d)")).
   Yes
?- between(1,3,X), length(L, X),
     match-regexp(L, "a(b+c+bc+aaa)"), writef("%s",[L]).
   ab

   X = 2
   L = [97, 98] ;
   ac

   X = 2
   L = [97, 99] ;
   abc

   X = 3
   L = [97, 98, 99] ;

   No

Requerimientos

Base su solución en el ejemplo de la pregunta 3 del examen. Para que tenga una idea de la complejidad de este problema, la solución del profesor para esta tarea tiene 11 reglas.

Para aprobar el curso y obtener un 6.0 en esta tarea, su tarea debe verificar obligatoriamente la primera de las consultas que aparece más arriba. Los que verifiquen además la segunda consulta obtendrán nota 7.0.

Plazo de entrega

La tarea se entrega en U-cursos una semana antes que venza el plazo para colocar las notas I.