/* leer una frase suministrada como una lista de caracteres */

leer([P|Ps]) :- get0(C), leepalabra(C, P, C1), restofrase(P, C1, Ps).

/* lee el resto de una frase a partir de una palabra leída (P) y el siguiente carácter C1, lo que se almacenara en Ps */

restofrase(P, _, []) :- ultimapalabra(P), !.
restofrase(_, C, [P1|Ps]) :- leepalabra(C, P1, C1), restofrase(P1, C1, Ps).


/* leer palabra, con el primer carácter conocido (C), la palabra en sí (P) y con el último almacenado en C1 */

leepalabra(C, P, C1) :- caracter_unico(C), !, name(P, [C]), get0(C1).
leepalabra(C, P, C2) :- en_palabra(C, NuevoC), !, get0(C1),
                        restopalabra(C1, Cs, C2), name(P, [NuevoC|Cs]).
leepalabra(_, P, C2) :- get0(C1), leepalabra(C1, P, C2).


/* Si el primer carácter C1 es de por sí una palabra, se producirá un corte, evitando la reevaluación, almacenará en P la lista formada solamente por el código ASCII de C y leerá el siguiente carácter C1 */

/* En caso contrario, llama a "en_palabra", que se le pasa el primer carácter C y se retornara el carácter transformado, si fuera mayúscula. Asimismo, para evitar la resatisfacción, se produce un corte, se lee el siguiente carácter, el resto de la palabra y se almacenara en P lo que queda */

/* Si la relación "en_palabra" no fuera satisfecha, se aplicaría esta regla por defecto. Simplemente lee el siguiente carácter y llama de nuevo a la "leepalabra" */

restopalabra(C, [NuevoC|Cs], C2) :-
                   en_palabra(C, NuevoC), !, get0(C1), restopalabra(C1, Cs, C2).
restopalabra(C, [], C). 


/* Caracteres que forman na palabra por sí mismos */

caracter_unico(44). /* , */
caracter_unico(59). /* ; */
caracter_unico(58). /* : */
caracter_unico(63). /* ? */
caracter_unico(33). /* ! */
caracter_unico(46). /* . */

/* Caracteres integrantes de una palabra */

en_palabra(C,C) :- C>96, C<123.              
/* minusculas */
en_palabra(C,L) :- C>64, C<91, L is C+32.    
/* mayusculas y transformacion a minusculas */
en_palabra(C,C) :- C>47, C<58.               
/* digitos */
en_palabra(39,39) :- !.                      
/* ' */
en_palabra(45,45) :- !.                      
/* - */

/* Caracteres terminadores de frase */


ultimapalabra('.').
ultimapalabra('!').
ultimapalabra('?').