% portugues s(s(N,V),p) --> np(N,p), vp(V,p). np(np(D,N),p) --> d(D,p), n(N,p). np(np(P),p) --> pn(P,p). np(np(D,N,R),p) --> d(D,p), n(N,p), rel(R,p). vp(vp(V),p) --> vi(V,p). vp(vp(V,N),p) --> vt(V,p), np(N,p). vp(vp(V,N1,N2),p) --> v3(V,p), np(N1,p), [a], np(N2,p). vp(vpm(V,S),p) --> vm(V,p) , [que], s(S,p). rel(rel(V),p) --> [que], vp(V,p). rel(rel(N,V),p) --> [que], np(N,p), vt(V,p). n(n(cao),p) --> [cao]. n(n(gato),p) --> [gato]. n(n(maca),p) --> [maca]. pn(pn(toze),p) --> [toze]. pn(pn(joao),p) --> [joao]. d(d(o),p) --> [o]. d(d(um),p) --> [um]. d(d(uma),p) --> [uma]. vt(vt(e),p) --> [e]. v3(v3(deu),p) --> [deu]. vi(vi(chora),p) --> [chora]. vm(vm(pensa),p) --> [pensa]. % ingles s(s(N,V),i) --> np(N,i), vp(V,i). np(np(D,N),i) --> d(D,i), n(N,i). np(np(P),i) --> pn(P,i). np(np(D,N,R),i) --> d(D,i), n(N,i), rel(R,i). vp(vp(V),i) --> vi(V,i). vp(vp(V,N),i) --> vt(V,i), np(N,i). vp(vp(V,N1,N2),i) --> v3(V,i), np(N2,i), np(N1,i). vp(vp(V,N1,N2),i) --> v3(V,i), np(N1,i), [to],np(N2,i). vp(vpm(V,S),i) --> vm(V,i), [that], s(S,i). vp(vpm(V,S),i) --> vm(V,i), s(S,i). rel(rel(V),i) --> [that], vp(V,i). rel(rel(N,V),i) --> [that], np(N,i), vt(V,i). n(n(cao),i) --> [dog]. n(n(gato),i) --> [cat]. n(n(maca),i) --> [apple]. n(n(toze),i) --> [toze]. pn(pn(joao),i) --> [john]. d(d(o),i) --> [the]. d(d(um),i) --> [a]. d(d(uma),i) --> [a]. vt(vt(e),i) --> [is]. v3(v3(deu),i) --> [gave]. vi(vi(chora),i) --> [cries]. vm(vm(pensa),i) --> [thinks]. %--------------------------------------------------------------------- % tradutor P --> I I --> P p2i(P,I) :- nonvar(P), !, s(S,p,P,[]), s(S,i,I,[]). p2i(P,I) :- nonvar(I), !, s(S,i,I,[]), s(S,p,P,[]). %--------------------------------------------------------------------- % traducao recursivo (apenas P(ortugues) --> I(ngles)) % traduz ate' `a palavra "end." trad :- read(X),trad(X). trad(end) :- halt. trad(P) :- (p2i(P,I)->write(I);write('?')),nl,trad. %--------------------------------------------------------------------- % executa ?- prompt(_,''),trad.