Friday, December 02, 2011

Silabeador erróneo en Prolog


Jugando con la idea del corrector ortográfico, me puse a pensar cómo podría escribirse la parte de las reglas de división silábica en Prolog. La realidad no parece muy complicado, considerando que las reglas son muy claras. Sin embargo, antes de embarcarme en esta idea, se me ocurrió algo que en un inicio me pareció brillante: ¿Qué tal utilizar el archivo con todas las sílabas del español para hacer la tarea sin necesidad de reglas. Así, entonces, el problema se reduciría a encontrar las sílabas correspondientes a cada palabra. Como este proceso se hace sobre cada palabra, de izquierda a derecha, la cosa parecía fácil. Era un problema básicamente de recursión y de agotar todas las posibilidades, lo cual en Prolog es el pan de cada día. Pensando en esto, hice el siguiente programa:

predicates
  sil(string)
  pinta
  repeat
  silabea(string)
  corre
 
clauses

corre :- write(" Dame palabra "),
         readln(Pal),
         silabea(Pal).

repeat.
repeat :- repeat.

pinta :-
           sil(X),
           write(X),nl,
           fail. 
pinta.


silabea("final").
silabea(Pal) :-
          
           sil(Silaba),
           str_len(Silaba,X2),
           frontstr(X2,Pal,Pal1,Pal2),
           Silaba = Pal1,
           write(Pal1), write("-"),
           silabea(Pal2).


sil("a").
sil("ab").
sil("abs").
sil("ac").
sil("ad").
sil("ads").
sil("af").
sil("ag").
sil("ah").
sil("ahi").
sil("ahu").
sil("ai").
sil("ain").
sil("ais").
sil("aiz").
sil("al").
sil("am").
sil("an").
sil("angs").
sil("ans").
sil("ap").
sil("ar").
sil("as").
sil("at").
sil("au").
sil("aur").
sil("aug").
sil("aun").
sil("aus").
sil("ax").
sil("ay").
sil("azba").
sil("bab").
sil("bac").
sil("bad").
sil("bahu").
sil("bai").
sil("bais").
sil("baj").
sil("bal").
sil("bam").
sil("ban").
sil("bap").
sil("bar").
sil("bas").
sil("bau ").
sil("bax").
sil("bay").
sil("be").
sil("beb").
sil("bec").
sil("bei").
sil("beis").
sil("bel").
sil("bem").
sil("ben").
sil("ber").
sil("berg").
sil("bergs").
sil("bes").
sil("beu").

[...] /* el listado de las sílabas es muy largo */

sil("final").

El software toma una palabra (que le da el usuario vía el teclado), y la divide silábicamente. La idea es así:

  • Léase la palabra a dividir silábicamente
  • Tómese la primera sílaba del listado
  • Tómense las primeras N letras de la palabra, en donde N es la longitud de la sílaba que se tomó
  • Compárese si la sílaba con la fracción de la palabra es la misma.
  • Si es así, escríbase esa sílaba añadiendo un guión 
  • Procédase con el resto de la palabra.
Se me ocurrió usar mi programa con la palabra "barbara" (sin acentos por el momento, ése es otro problema). Y el sistema me regresó:

bar-bar-a

¡Agghhh! entonces caí en la cuenta que todo el enfoque está mal. Se necesita por fuerza usar las reglas ortográficas.

Moraleja: hay cosas que parecen fáciles, pero no lo son finalmente. La lección es que no me puedo deshacer de las reglas ortográficas.

1 comment:

Atonau said...

A problemas simples, respuestas simples.... a problemas complejos respuestas complejas.... el dilema.... las respuestas complejas requieren paciencia y método.... las respuestas simples requieren sabiduria....