/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Coniugatore.pl * * Copyright (C) 2001 Glad Deschrijver, Wed Apr 04 2001. * * No parts of this program may be used for commercial, political, * * military or obscene purposes. This program may only be copied or * * modified if you include this message entirely. NO responsibility * * is given or implied for any unwanted effects due to the usage of * * this program or any of its derivatives. This program is freeware, * * so should all derivatives be! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ :- write('Welcome to Coniugatore (Prolog Version).'),nl, write('Type e.g. "coniuga(parlare)" to conjugate "parlare".'). coniuga(Verbo):- get_partpres(Verbo,Partpres), get_partpas(Verbo,Partpas), get_gerundio(Verbo,Gerundio), get_ipres(Verbo,Ipres), get_iimp(Verbo,Iimp), get_ipas(Verbo,Ipas), get_ifut(Verbo,Ifut), get_ipaspros(Ipaspros,Partpas), get_itrappros(Itrappros,Partpas), get_itraprem(Itraprem,Partpas), get_ifutant(Ifutant,Partpas), get_copres(Verbo,Copres), get_copas(Copas,Partpas), get_cpres(Verbo,Cpres), get_cimp(Ipas,Cimp), get_cpaspros(Cpaspros,Partpas), get_ctraprem(Ctraprem,Partpas), write_out(Verbo,Ipres,Iimp,Ipas,Ifut, Ipaspros,Itrappros,Itraprem,Ifutant, Copres,Copas, Cpres,Cimp,Cpaspros,Ctraprem, Partpres,Partpas,Gerundio). coniuga(_):- write('Syntax error...'). as_finire(Verbo):- member(Verbo,[abolire, agire, aulire, bellire, buire, canire, capire, cudire, finire, fluire, fondire, gredire, leggerire, libire, mattire, mufire, mutolire, nerire, passire, ricchire, rossire, rostire, rugginire, serire, vilire, volire]). /*** Indicativo Presente ***/ get_radix(Verbo,Type,Radix,Radix2):- atom_chars(Verbo,Verbochars), get_radix2(Verbochars,Radixchars,Type), atom_chars(Radix,Radixchars), ((Type == a, get_radix_care_gare_ciare_giare(Radixchars, Radix2chars), atom_chars(Radix2,Radix2chars)); (Type == i, as_finire(Verbo), add_suffix(Radix,'isc',Radix2)); Radix2 = Radix). get_radix2([H1,H2,_,_],[H1],H2). get_radix2([H|V],[H|R],Type):-get_radix2(V,R,Type). get_radix_care_gare_ciare_giare([H1,H2],R):- (member(H1,[c,g]), H2 == i, R = [H1]); (member(H2,[c,g]), R = [H1,H2,h]). get_radix_care_gare_ciare_giare([H|V],[H|R]):- get_radix_care_gare_ciare_giare(V,R). get_ipres_suffix(Type,[S1,S2,S3,S4,S5,S6]):- S1 = o, S2 = i, ((Type == a, S3 = a); S3 = e), S4 = iamo, ((Type == a, S5 = ate); (Type == e, S5 = ete); S5 = ite), ((Type == a, S6 = ano); S6 = ono). get_ipres(Verbo,Ipres):- (Verbo == andare, Ipres = ['vado o vo',vai,va,andiamo,andate,vanno]); (Verbo == avere, Ipres = [ho,hai,ha,abbiamo,avete,hanno]); (Verbo == essere, Ipres = [sono,sei,è,siamo,siete,sono]). get_ipres(Verbo,Ipres):- get_radix(Verbo,Type,Radix1,Radix2), get_ipres_suffix(Type,[S1,S2,S3,S4,S5,S6]), ((Type == i, Radixtmp1 = Radix2, Radixtmp2 = Radix1); (Radixtmp1 = Radix1, Radixtmp2 = Radix2)), add_suffix(Radixtmp1,S1,P1), add_suffix(Radix2,S2,P2), add_suffix(Radixtmp1,S3,P3), add_suffix(Radixtmp2,S4,P4), add_suffix(Radix1,S5,P5), add_suffix(Radixtmp1,S6,P6), Ipres = [P1,P2,P3,P4,P5,P6]. /*** Indicativo Imperfetto ***/ iimp(_,[_,_],L1,L2,L3,L4,L5,L6):- L1 = [v,o], L2 = [v,i], L3 = [v,a], L4 = [v,a,m,o], L5 = [v,a,t,e], L6 = [v,a,n,o]. iimp(Verbo,[H|TV],[H|T1],[H|T2],[H|T3],[H|T4],[H|T5],[H|T6]):- iimp(Verbo,TV,T1,T2,T3,T4,T5,T6). get_iimp(Verbo,Iimp):- (Verbo == essere, Iimp = [ero,eri,era,eravamo,eravate,erano]). get_iimp(Verbo,Iimp):- atom_chars(Verbo,Verbochars), iimp(Verbo,Verbochars,Tmp1,Tmp2,Tmp3,Tmp4,Tmp5,Tmp6), form_the_tense(Iimp,Tmp1,Tmp2,Tmp3,Tmp4,Tmp5,Tmp6). /*** Indicativo Passato Remoto ***/ ipas(_,[H,_,_],L1,L2,L3,L4,L5,L6):- L1 = [H,i], L2 = [H,s,t,i], ((H == a, L3 = [ò]); (H == e, L3 = [é]); L3 = [ì]), L4 = [H,m,m,o], L5 = [H,s,t,e], L6 = [H,r,o,n,o]. ipas(Verbo,[H|TV],[H|T1],[H|T2],[H|T3],[H|T4],[H|T5],[H|T6]):- ipas(Verbo,TV,T1,T2,T3,T4,T5,T6). get_ipas(Verbo,Ipas):- (Verbo == avere, Ipas = [ebbi,avesti,ebbe,avemmo,aveste,ebbero]); (Verbo == essere, Ipas = [fui,fosti,fu,fummo,foste,furono]). get_ipas(Verbo,Ipas):- atom_chars(Verbo,Verbochars), ipas(Verbo,Verbochars,Tmp1,Tmp2,Tmp3,Tmp4,Tmp5,Tmp6), form_the_tense(Ipas,Tmp1,Tmp2,Tmp3,Tmp4,Tmp5,Tmp6). /*** Indicativo Futuro ***/ get_ifut(Verbo,Ifut):- get_ifutradix(Verbo,Ifutradix), add_suffix(Ifutradix,'ò',F1), add_suffix(Ifutradix,'ai',F2), add_suffix(Ifutradix,'à',F3), add_suffix(Ifutradix,'emo',F4), add_suffix(Ifutradix,'ete',F5), add_suffix(Ifutradix,'anno',F6), Ifut = [F1,F2,F3,F4,F5,F6]. add_suffix(Prefix,Suffix,Output):- atom_chars(Prefix,Pchars), atom_chars(Suffix,Schars), add_suffix2(Pchars,Schars,Ochars), atom_chars(Output,Ochars). add_suffix2([],S,S). add_suffix2([H|P],S,[H|PS]):-add_suffix2(P,S,PS). get_ifutradix_care_gare_ciare_giare(H1,H2,H3,H4,TR):- (member(H1,[c,g]), H2 == i, TR = [H1,H3,H4]); (member(H2,[c,g]), TR = [H1,H2,h,H3,H4]). get_ifutradix2([H1,H2,H3,H4,_],TR):- (H3 == a, (get_ifutradix_care_gare_ciare_giare(H1,H2,H3,H4,TR); TR = [H1,H2,e,H4])); TR = [H1,H2,H3,H4]. get_ifutradix2([H|TV],[H|TR]):- get_ifutradix2(TV,TR). get_ifutradix(Verbo,Ifutradix):- (Verbo == andare, Ifutradix = andr); (Verbo == avere, Ifutradix = avr); (Verbo == essere, Ifutradix = sar). get_ifutradix(Verbo,Ifutradix):- atom_chars(Verbo,Verbochars), get_ifutradix2(Verbochars,Radixchars), atom_chars(Ifutradix,Radixchars). /*** Indicativo Passato Prossimo ***/ get_ipaspros(Ipaspros,Partpas):- get_ipres(avere,Aipres), add_partpas(Aipres,Partpas,Ipaspros). /*** Indicativo Trapassato Prossimo ***/ get_itrappros(Itrappros,Partpas):- get_iimp(avere,Aiimp), add_partpas(Aiimp,Partpas,Itrappros). /*** Indicativo Trapassato Remoto ***/ get_itraprem(Itraprem,Partpas):- get_ipas(avere,Aipas), add_partpas(Aipas,Partpas,Itraprem). /*** Indicativo Futuro Anteriore ***/ get_ifutant(Ifutant,Partpas):- get_ifut(avere,Aifut), add_partpas(Aifut,Partpas,Ifutant). /*** Condizionale Presente ***/ get_copres(Verbo,Copres):- get_ifutradix(Verbo,Ifutradix), add_suffix(Ifutradix,'ei',F1), add_suffix(Ifutradix,'esti',F2), add_suffix(Ifutradix,'ebbe',F3), add_suffix(Ifutradix,'emmo',F4), add_suffix(Ifutradix,'este',F5), add_suffix(Ifutradix,'ebbero',F6), Copres = [F1,F2,F3,F4,F5,F6]. /*** Condizionale Passato ***/ get_copas(Copas,Partpas):- get_copres(avere,Acopres), add_partpas(Acopres,Partpas,Copas). /*** Congiuntivo Presente ***/ get_cpres_suffix(Type,[S1,S2,S3,S4,S5,S6]):- ((Type == a, S1 = i, S2 = i, S3 = i); S1 = a, S2 = a, S3 = a), S4 = iamo, S5 = iate, ((Type == a, S6 = ino); S6 = ano). get_cpres(Verbo,Cpres):- (Verbo == andare, Cpres = [vada,vada,vada,andiamo,andiate,vadano]); (Verbo == avere, Cpres = [abbia,abbia,abbia,abbiamo,abbiate,abbiano]); (Verbo == essere, Cpres = [sia,sia,sia,siamo,siate,siano]). get_cpres(Verbo,Cpres):- get_radix(Verbo,Type,Radix1,Radix2), get_cpres_suffix(Type,[S1,S2,S3,S4,S5,S6]), ((Type == i, Radixtmp = Radix1); (Radixtmp = Radix2)), add_suffix(Radix2,S1,P1), add_suffix(Radix2,S2,P2), add_suffix(Radix2,S3,P3), add_suffix(Radixtmp,S4,P4), add_suffix(Radixtmp,S5,P5), add_suffix(Radix2,S6,P6), Cpres = [P1,P2,P3,P4,P5,P6]. /*** Congiuntivo Imperfetto ***/ cimp([_,_],L1,L2,L3,L4,L5,L6):- L1 = [s,i], L2 = [s,i], L3 = [s,e], L4 = [s,i,m,o], L5 = [t,e], L6 = [s,e,r,o]. cimp([H|TV],[H|T1],[H|T2],[H|T3],[H|T4],[H|T5],[H|T6]):- cimp(TV,T1,T2,T3,T4,T5,T6). get_cimp(Ipas,Cimp):- [_,_,_,_,Ipas5,_] = Ipas, atom_chars(Ipas5,Ipas5chars), cimp(Ipas5chars,Tmp1,Tmp2,Tmp3,Tmp4,Tmp5,Tmp6), form_the_tense(Cimp,Tmp1,Tmp2,Tmp3,Tmp4,Tmp5,Tmp6). /*** Indicativo Trapassato Remoto ***/ get_cpaspros(Cpaspros,Partpas):- get_cpres(avere,Acpres), add_partpas(Acpres,Partpas,Cpaspros). /*** Congiuntivo Trapassato Remoto ***/ get_ctraprem(Ctraprem,Partpas):- get_cimp([_,_,_,_,aveste,_],Acimp), add_partpas(Acimp,Partpas,Ctraprem). /*** Participio Presente ***/ partpres([H,_,_],TP):- (H == a, TP = [H,n,t,e]); TP = [e,n,t,e]. partpres([H|TV],[H|TP]):-partpres(TV,TP). get_partpres(Verbo,Partpres):- atom_chars(Verbo,Verbochars), partpres(Verbochars,Tmp), atom_chars(Partpres,Tmp). /*** Participio Passato ***/ partpas([H,_,_],TP):- (H == e, TP = [u,t,o]); TP = [H,t,o]. partpas([H|TV],[H|TP]):-partpas(TV,TP). get_partpas(Verbo,Partpas):- (Verbo == essere, Partpas = stato). get_partpas(Verbo,Partpas):- atom_chars(Verbo,Verbochars), partpas(Verbochars,Tmp), atom_chars(Partpas,Tmp). /*** Gerundio ***/ gerundio([H,_,_],TP):- (H == a, TP = [H,n,d,o]); TP = [e,n,d,o]. gerundio([H|TV],[H|TP]):-gerundio(TV,TP). get_gerundio(Verbo,Gerundio):- atom_chars(Verbo,Verbochars), gerundio(Verbochars,Tmp), atom_chars(Gerundio,Tmp). /*** Auxiliary functions ***/ form_the_tense(Tense,T1,T2,T3,T4,T5,T6):- atom_chars(T1b, T1), atom_chars(T2b, T2), atom_chars(T3b, T3), atom_chars(T4b, T4), atom_chars(T5b, T5), atom_chars(T6b, T6), Tense = [T1b, T2b, T3b, T4b, T5b, T6b]. add_partpas([A1,A2,A3,A4,A5,A6],P,[B1,B2,B3,B4,B5,B6]):- add_partpas2(A1,P,B1), add_partpas2(A2,P,B2), add_partpas2(A3,P,B3), add_partpas2(A4,P,B4), add_partpas2(A5,P,B5), add_partpas2(A6,P,B6). add_partpas2(A,P,B):- atom_chars(A,Achars), atom_chars(P,Pchars), add_partpas3(Achars,Pchars,Bchars), atom_chars(B,Bchars). add_partpas3([], Pchars, [H|Pchars]):- H = ' '. add_partpas3([H|Achars],Pchars,[H|Bchars]):- add_partpas3(Achars,Pchars,Bchars). write_out(Verbo,Ipres,Iimp,Ipas,Ifut, Ipaspros,Itrappros,Itraprem,Ifutant, Copres,Copas, Cpres,Cimp,Cpaspros,Ctraprem, Partpres,Partpas,Gerundio):- write('Coniugazione di '), write(Verbo),nl, write(' Indicativo'),nl, write(Ipres),nl, write(Iimp),nl, write(Ipas),nl, write(Ifut),nl, write(Ipaspros),nl, write(Itrappros),nl, write(Itraprem),nl, write(Ifutant),nl, write(' Condizionale'),nl, write(Copres),nl, write(Copas),nl, write(' Congiuntivo'),nl, write(Cpres),nl, write(Cimp),nl, write(Cpaspros),nl, write(Ctraprem),nl, write(' Participio Presente'),nl, write('['),write(Partpres),write(']'),nl, write(' Participio Passato'),nl, write('['),write(Partpas),write(']'),nl, write(' Gerundio'),nl, write('['),write(Gerundio),write(']'),nl.