/* ANALIZADOR DE LENGUAJE NATURAL - Analizador basado en una gramatica libre de contenidos ö Inteligencia Artificial Gonzalo Villarreal Farah Para Turbo Prolog 2.0 de Borland */ DOMAINS oracion = string lista = symbol* numero = integer db_selector = data palabra = palabra(symbol) PREDICATES bus_palabra(symbol,symbol) proxima_palabra(oracion,oracion,symbol) encuentra_delimitador(oracion,numero,numero) analiza(oracion) elimina_espacio(oracion,oracion) f_sustantiva(oracion,oracion,lista) f_verbal(oracion,oracion,lista) termino(oracion) agrega(symbol,lista,lista) concatena(lista,lista,lista) partida rep GOAL makewindow(1,7,7,"",5,10,15,60), db_open(data,"PALABRAS.SEO",in_file), rep,nl,nl, partida, write("Desea continuar ? (s/n) : "), readchar(L),L><'s', db_close(data). CLAUSES rep. rep:-rep. partida:-write("Ingrese una oraci¢n : "),nl, readln(S), analiza(S), write("Es una oraci¢n, OK! ."),nl,nl,!. partida:-beep,write("\nHay un error en la oraci¢n."),!. /* AHORA ANALICE LA ORACION "S" */ analiza(S):- f_sustantiva(S,S2,FS), write("\nLa frase sustantiva es : ",FS),nl,readchar(_), f_verbal(S2,S3,FV), write("\nLa frase verbal es : ",FV),nl, termino(S3). /* BUSQUE CADA UNA DE LAS PARTES */ bus_palabra(A,B):-write("\n",B," ...es ",A," ?. "), chain_terms(data,A,palabra,palabra(B),_), write(" ,SI"),readchar(_),!; write(" ,NO"),readchar(_),!,fail. f_sustantiva(S,S2,FS):- /* SIN ADJETIVO */ proxima_palabra(S,S1,P), bus_palabra(art¡culo,P), agrega(P,[],L), proxima_palabra(S1,S2,P2), bus_palabra(sustantivo,P2), concatena(L,[P2],FS). f_sustantiva(S,S3,FS):- /* CON ADJETIVO */ proxima_palabra(S,S1,P), bus_palabra(art¡culo,P), agrega(P,[],L), proxima_palabra(S1,S2,P2), bus_palabra(sustantivo,P2), concatena(L,[P2],L2), proxima_palabra(S2,S3,P3), bus_palabra(adjetivo,P3), concatena(L2,[P3],FS). f_sustantiva(S,S2,FS):- /* CON PREPOSICION */ proxima_palabra(S,S1,P), bus_palabra(preposici¢n,P), f_sustantiva(S1,S2,L), concatena([P],L,FS). /* AHORA LA FRASE VERBAL */ f_verbal(S,S2,FV):- /* V + FS */ proxima_palabra(S,S1,P), bus_palabra(verbo,P), f_sustantiva(S1,S2,L), concatena([P],L,FV). f_verbal(S,S3,FV):- /* V + ADVERBIO + FS */ proxima_palabra(S,S1,P), bus_palabra(verbo,P), proxima_palabra(S1,S2,P1), bus_palabra(adverbio,P1), f_sustantiva(S2,S3,L), concatena([P],[P1],L1), concatena(L1,L,FV). f_verbal(S,S2,FV):- /* V + ADVERBIO */ proxima_palabra(S,S1,P), bus_palabra(verbo,P), proxima_palabra(S1,S2,P1), bus_palabra(adverbio,P1), concatena([P],[P1],FV). f_verbal(S,S4,FV):- /* V + ADJETIVO */ proxima_palabra(S,S1,P1), bus_palabra(verbo,P1), proxima_palabra(S1,S4,P2), bus_palabra(adjetivo,P2), concatena([P1],[P2],FV). f_verbal(S,S1,FV):- /* SOLO VERBO */ proxima_palabra(S,S1,P), bus_palabra(verbo,P), agrega(P,[],FV). /* AHORA LAS HERRAMIENTAS BASICAS : termino, proxima palabra, busca delimitador, elimina espacios, agrega y concatena. */ termino(S):- frontchar(S,C,_), C = '.'. /* pare si punto */ termino(""):-!. termino(S):-encuentra_delimitador(S,N,1), frontstr(N,S,D,S2),D=" ", termino(S2),!. proxima_palabra(F,F1,P):- encuentra_delimitador(F,N,0),!, N > 0, frontstr(N,F,P,F2), elimina_espacio(F2,F1). /* Busque un espacio o un punto. */ encuentra_delimitador(F,N,C):- frontchar(F,Caracter,F1), Caracter <> ' ',Caracter <> '.', C1 = C + 1, encuentra_delimitador(F1,N,C1). encuentra_delimitador(_,N,N). /* Elimine los espacios delante la proxima palabra. */ elimina_espacio(F,F1):- frontchar(F,Caracter,F1), Caracter = ' '. elimina_espacio(F,F). /* Agrega y Concatena */ agrega(X,L,[X|L]). concatena([],L,L). concatena([X|C],L1,[X|L2]):- concatena(C,L1,L2).