/* 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('?').