%--------------------------------------------------------------------- % jjlex -analise l'exico-morfol'ogica % % interface dispon'ivel % lex(Palavra,Categoria,Semantica,Lingua) (definida em jjdict) % lex(Palavra,Categoria,Semantica) % % %--------------------------------------------------------------------- :- multifile ==> /2. :- multifile ==> /3. :- multifile lex_rep /3. :- multifile lex_error /3. :- multifile lex_rep /4. stem(Pal,Cat,Sem, Pals,Cats,Sems,Ling):- nonvar(Pal), nameappend(Rad,Suf,Pal), rule_st(Suf,Cat,Sem, Sufs,Cats,Sems,Ling), nameappend(Rad,Sufs,Pals), lex(Pals,Cats,Sems,Ling). stem(Pal,Cat,Sem, Pals,Cats,Sems,Ling):- nonvar(Pals), lex(Pals,Cats,Sems,Ling), nameappend(Rad,Sufs,Pals), rule_st(Suf,Cat,Sem, Sufs,Cats,Sems,Ling), nameappend(Rad,Suf,Pal). %--------------------------------------------------------------------- % por defeito, Lingua = portugues... % :- consult(jjdict). lex(P,Cat,Sem) :- lex(P,Cat,Sem,port). lex_rep(H,T,S) :- lex_rep(H,T,S,port). %--------------------------------------------------------------------- % Regras morfol'ogicas %--------------------------------------------------------------------- % na lingua Ling, % se existe uma Pal1=Rad ^ Sufi tem categoria Cati e Semantica Semi % entao Pal2=Rad ^ Sufo tem categoria Cato e Semantica Semo: % % rule_st(Sufo,Cato,Semo, Sufi,Cati,Semi, Ling). rulep ! v(_,[]) ==> [] . rulep ! v(Tem,[P/N-T=S|Ta]) ==> [Head|Tail] :- rewrite(v(Tem,P,N)-T=S, Head ,rulep) , rewrite(v(Tem,Ta), Tail,rulep). rulep ! v(Tem,N,G)-Term=Suf ==> rule_st(Suf,v(X,(Tem,N,G)),S,Term,v(X,inf),S,port). rulep ! Ca+Pa+Se -> Ca1+Pa1+Se1 ==> rule_st(Pa,Ca,Se,Pa1,Ca1,Se1,port). rulep ! (Ca+Pa+Se -> Ca1+Pa1+Se1 :-C) ==> (rule_st(Pa,Ca,Se,Pa1,Ca1,Se1,port) :-C). :- begin(rulep). v(imp,[1/s-r=va, 2/s-r=vas, 3/s-r=va, 1/p-r=vamos,3/p-r=vam]). v(pre,1,s)-ar=o. v(pre,1,s)-er=o. v(pre,2,s)-ar=as. v(pre,2,s)-er=es. v(pre,3,s)-ar=a. v(pre,3,s)-er=e. v(pre,1,p)-r=mos. v(pre,2,p)-r=is. v(pre,3,p)-ar=am. v(pre,3,p)-er=em. v(ppi,3,s)-ar=ou. v(ppi,3,s)-er=eu. adj(v(X),m,s)+ido+S -> v(X,inf)+er+S. adj(v(X),m,s)+ado+S -> v(X,inf)+ar+S. adj(X,f,s)+a+S -> adj(X,m,s)+o+S. adj(X,f,p)+as+S -> adj(X,m,s)+o+S. adj(X,m,p)+os+S -> adj(X,m,s)+o+S. adj(X,_,p)+es+S -> adj(X,_,s)+e+S. adv(m(adj(X)))+mente+S -> adj(X,f,s)+''+S. :- end(rulep). %--------------------------------------------------------------------- % utilidades: append A,B,C =^ A ^ B = C % nameappend = append de nomes(=atomos prolog) nameappend(A,B,C):- nonvar(A),nonvar(B), name(A,Al), name(B,Bl), append(Al,Bl,Cl), name(C,Cl). nameappend(A,B,C):- nonvar(C), name(C,Cl), append(Al,Bl,Cl), name(A,Al), name(B,Bl).