/* afd3.pro: Sol Ex III Alberto Pacheco, alberto@acm.org, Oct'99, Nov'00 Use: ? main. Aceptar: "1 2 3" Aceptar: " 7 31 12 " Rechazar: "0 1 2" Símbolo inválido: 0 Aceptar: " 7 7 7 " Rechazar: "1 7 23" Símbolo inválido: 3 */ main:- % printday consult('afd_tst.pro'), test($1 2 3$), test($ 7 31 12 $), test($0 1 2$), test($ 7 7 7 $), test($1 7 23$). /* Gramática: Perl ó JavaScript 1.2 /^\s*[1-7]\s+([12]\d?|3[01]?|[4-9])\s+(1[012]?|[2-9])\s*$/ BNF: P -> N D M N -> 1..7 D -> 1..31 M -> 1..12 */ edo_inicial(s1). f(s1,X,s1):- isSpace(X). f(s1,N,s2):- isBetween(N,`1,`7). f(s2,X,s3):- isSpace(X). f(s3,X,s3):- isSpace(X). f(s3,`1,s4). f(s3,`2,s4). f(s3,N,s6):- isBetween(N,`4,`9). f(s3,`3,s5). f(s4,N,s6):- isBetween(N,`0,`9). f(s4,X,s7):- isSpace(X). f(s5,X,s7):- isSpace(X). f(s5,`0,s6). f(s5,`1,s6). f(s6,X,s7):- isSpace(X). f(s7,X,s7):- isSpace(X). f(s7,N,s9):- isBetween(N,`2,`9). f(s7,`1,s8). f(s8,N,s9):- isBetween(N,`0,`2). f(s9,X,s9):- isSpace(X). isSpace(32). isBetween(N,I,F) :- N >= I, N =< F. % Edos. Aceptación a(s9).