:-dynamic(flag/1).
:-dynamic(coco_declare/1).
:-dynamic(inconnu/1).
:-dynamic(double/1).
:-dynamic(stack/1).

:-if(false).
:-dynamic(affirme/5).
:-dynamic(affirme/4). 
:-dynamic(nom_propre_declaré/2).
:-dynamic(nom_declaré/3).
:-dynamic(nom_propre_declaré/4).
:-dynamic(prénom_declaré/2).
:-dynamic(prénom_declaré/3).
:-dynamic(ladjectif_declaré/5).
:-dynamic(verbe_declaré/3).
:-dynamic(ppassé_declaré/4).
:-dynamic(pprésent_declaré/2).
:-dynamic(nomde_declaré/3).
:-dynamic(dimension_declarée/2).
:-endif.

flag(réciproque).
flag(équivalent).
flag(askdico).
flag(controle).

:-initialization(coco).

init:-
	assertz(flag(init)),
	abolish(affirme/3),
	abolish(affirme/4),
	abolish(affirme/5),
	abolish(affirme/6),
	assertz(affirme(a,a,a)),
	assertz(affirme(a,a,a,a,a,a)),
	
	assertz((affirme(_x, être, _x, vrai) :- nom(_x,_,_,_x))),
	assertz((affirme(_x, être, _x, vrai) :- prénom(_x,_))),
	assertz((affirme(_x, être, _x, vrai) :- nom_propre_declaré(_x,_))),
	assertz((affirme(_x, être, _x, vrai) :- nom_propre_declaré(_,_,_,_x))),
	assertz((affirme(_x, être, _x, vrai) :- nom_composé(_,_,_,_x))),
	assertz((affirme(_x,avoir,_atr,_valu,faux) :- number(_valu),affirme(_x, avoir, _atr,_valu2,vrai),number(_valu2),_valu\=_valu2)),
	assertz((affirme(_x,avoir,_atr,non(_valu),faux) :- nonvar(_valu),affirme(_x, avoir, _atr,_valu,vrai))),
	assertz((affirme(_x,avoir,_atr,_valu,faux) :- nonvar(_valu),affirme(_x, avoir, _atr,non(_valu),vrai))),
	assertz((affirme(_x,avoir,_atr,_valu1,faux) :- nonvar(_valu1),contraire(_valu1,_valu2),affirme(_x, avoir, _atr,_valu2,vrai))),
	assertz((affirme(_x,avoir,_atr,_valu1,faux) :- nonvar(_valu1),contraire(_valu2,_valu1),affirme(_x, avoir, _atr,_valu2,vrai))),	
	assertz((affirme(_x,avoir,_atr,_valu1,faux) :- nonvar(_valu1),comparatif(_valu1,_valu2,_),affirme(_x, avoir, _atr,_valu2,vrai))),
	assertz((affirme(_x,avoir,_atr,_valu1,faux) :- nonvar(_valu1),comparatif(_valu2,_valu1,_),affirme(_x, avoir, _atr,_valu2,vrai))),
	assertz((affirme(_x,avoir,_atr,vrai) :- affirme(_x, avoir, _atr,_,vrai))),
	assertz((affirme(_x,avoir,_atr,_,faux) :- affirme(_x, avoir, _atr,faux))),
	
	assertz((affirme(_x,_verbe,_,faux) :- nonêtreavoir(_verbe),affirme(_x, _verbe,faux))) ,
	assertz((affirme(_x,_verbe,_atr,_,faux) :- nonêtreavoir(_verbe),affirme(_x, _verbe,_atr,faux))).

% vocabulaire supplémentaire
vocab:-
	assertz(flag(vocab)),
	abolish(nom_propre_declaré/2),
	abolish(nom_declaré/3),
	abolish(nom_propre_declaré/4),
	abolish(prénom_declaré/2),
	abolish(prénom_declaré/3),
	abolish(ladjectif_declaré/5),
	abolish(verbe_declaré/3),
	abolish(ppassé_declaré/4),
	abolish(pprésent_declaré/2),
	abolish(nomde_declaré/3),
	abolish(dimension_declarée/2),
	
	assertz(ladjectif_declaré(xx,xx,xx,xx,xx)),
	assertz(nom_declaré(xx,xx,xx)),
	assertz(nomde_declaré(xx,xx,xx)),
	assertz(dimension_declarée(xx,xx)),

	
	assertz((verbe_declaré(contient,singulier,contenir))),
	assertz((verbe_declaré(contiennent,pluriel,contenir))),
	assertz((verbe_declaré(allaite,singulier,allaiter))),
	assertz((verbe_declaré(allaitent,pluriel,allaiter))),
	assertz((verbe_declaré(respire,singulier,respirer))),
	assertz((verbe_declaré(respirent,pluriel,respirer))),
	assertz((verbe_declaré(pond,singulier,pondre))),
	assertz((verbe_declaré(pondent,pluriel,pondre))),
	assertz((verbe_declaré(ronge,singulier,ronger))),
	assertz((verbe_declaré(rongent,pluriel,ronger))),
	assertz((verbe_declaré(couve,singulier,couver))),
	assertz((verbe_declaré(couvent,pluriel,couver))),
	assertz((verbe_declaré(vit,singulier,vivre))),
	assertz((verbe_declaré(vivent,pluriel,vivre))),
	assertz((verbe_declaré(nage,singulier,nager))),
	assertz((verbe_declaré(nagent,pluriel,nager))),
	assertz((verbe_declaré(saute,singulier,sauter))),
	assertz((verbe_declaré(sautent,pluriel,sauter))),
	assertz((verbe_declaré(coure,singulier,courir))),
	assertz((verbe_declaré(courent,pluriel,courir))),
	assertz((verbe_declaré(rumine,singulier,ruminer))),
	assertz((verbe_declaré(ruminent,pluriel,ruminer))),
	assertz((verbe_declaré(rampe,singulier,ramper))),
	assertz((verbe_declaré(rampent,pluriel,ramper))),
	assertz((verbe_declaré(batit,singulier,batir))),
	assertz((verbe_declaré(batissent,pluriel,batir))),
	assertz((verbe_declaré(construit,singulier,batir))),
	assertz((verbe_declaré(construisent,pluriel,batir))),
	assertz((verbe_declaré(pèche,singulier,pêcher))),
	assertz((verbe_declaré(pèchent,pluriel,pêcher))),
	assertz((verbe_declaré(chasse,singulier,chasser))),
	assertz((verbe_declaré(chassent,pluriel,chasser))),
	assertz((verbe_declaré(métamorphose,singulier,métamorphoser))),
	assertz((verbe_declaré(métamorphosent,pluriel,métamorphoser))),
	assertz((verbe_declaré(fixe,singulier,fixer))),
	assertz((verbe_declaré(fixent,pluriel,fixer))),
	assertz((verbe_declaré(reproduit,singulier,reproduire))),
	assertz((verbe_declaré(reproduisent,pluriel,reproduire))),
	assertz((verbe_declaré(régénère,singulier,régénérer))),
	assertz((verbe_declaré(régénèrent,pluriel,régénérer))),
	assertz((verbe_declaré(hiberne,singulier,hiberner))),
	assertz((verbe_declaré(hibernent,pluriel,hiberner))),
	assertz((verbe_declaré(suspend,singulier,suspendre))),
	assertz((verbe_declaré(suspendent,singulier,suspendre))),
	assertz((verbe_declaré(suce,singulier,sucer))),
	assertz((verbe_declaré(sucent,pluriel,sucer))),
	assertz((verbe_declaré(broye,singulier,broyer))),
	assertz((verbe_declaré(broyent,pluriel,broyer))),
	assertz((verbe_declaré(chante,singulier,chanter))),
	assertz((verbe_declaré(chantent,pluriel,chanter))),
	assertz((verbe_declaré(marche,singulier,marcher))),
	assertz((verbe_declaré(marchent,pluriel,marcher))),
	assertz((verbe_declaré(crache,singulier,cracher))),
	assertz((verbe_declaré(crachent,pluriel,cracher))),
	assertz((verbe_declaré(dégage,singulier,dégager))),
	assertz((verbe_declaré(dégagent,pluriel,dégager))),
	assertz((verbe_declaré(migre,singulier,migrer))),
	assertz((verbe_declaré(migrent,pluriel,migrer))),
	assertz((ppassé_declaré(contenu,masculin,singulier,manger))),
	assertz((ppassé_declaré(contenue,féminin,singulier,manger))),
	assertz((ppassé_declaré(contenus,masculin,pluriel,manger))),
	assertz((ppassé_declaré(contenues,féminin,pluriel,manger))),
	assertz((pprésent_declaré(contenant,être))),
	
	assertz((nom_propre_declaré(france,féminin))),
	assertz((nom_propre_declaré(bretagne,féminin))),
	assertz((nom_propre_declaré(normandie,féminin))),
	assertz((nom_propre_declaré(picardie,féminin))),
	assertz((nom_propre_declaré(finistère,masculin))),
	assertz((nom_propre_declaré(morbihan,masculin))),
	assertz((nom_propre_declaré([ile,et,vilaine],féminin,singulier,ile_et_vilaine))),
	assertz((nom_propre_declaré([côtes,du,nord],féminin,pluriel,côtes_du_nord))),
	assertz((nom_propre_declaré([loire,atlantique],féminin,singulier,loire_atlantique))),
	assertz((nom_propre_declaré(centre,masculin))),
	assertz((nom_propre_declaré(indre,masculin))),
	assertz((nom_propre_declaré(loiret,masculin))),
	assertz((prénom_declaré(quimper,féminin))),
	assertz((prénom_declaré(vannes,féminin))),
	assertz((prénom_declaré(rennes,féminin))),
	assertz((prénom_declaré([saint,brieuc],féminin,saint_brieuc))),
	assertz((prénom_declaré(nantes,féminin))),
	assertz((prénom_declaré([henri,_],féminin,henri_IV))).
	
	
% init et vocab ont-ils été lancés une fois
test_init:-
	flag(init),!.
test_init:-
	init.
	
test_vocab:-
	flag(vocab),!.
test_vocab:-
	vocab.
	
% mesure du temps passé
get_time(T,R) :-
	statistics(runtime, [_, T]),
	statistics(real_time, [_, R]).

% lecture d'une phrase
read_phrase([punct(full_stop) | Phrase_in], Phrase_out) :- reverse(['.' |Phrase_in], Phrase_out), !.
read_phrase(['?' | Phrase_in], Phrase_out) :- reverse(['.' |Phrase_in], Phrase_out), !.
read_phrase(Phrase_in, Phrase_out) :-
	read_token(Atom),
	change_add(Atom , Phrase_in , Phrase_out1),
	read_phrase(Phrase_out1,Phrase_out).

% suppression des caractères spéciaux
change_add(',',Phrase_in,Phrase_in):- !.
change_add('-',Phrase_in,Phrase_in):- !.
change_add('''',Phrase_in,Phrase_in):- !.
change_add(Atom,Phrase_in,[Atom |Phrase_in]).

% lancement et arret du programme

fini([fin,'.']):-write(fini),nl.

write_double(_phrase):-
	flag(double),!,
	write(user_output,_phrase),nl(user_output).
write_double(_phrase).
	
coco :-
	test_init, test_vocab,
	repeat,
		write('phrase>'),
		read_phrase([],_phrase),
		write_double(_phrase),
		writen('lu:',_phrase),nl,
		phrase(_phrase),
		fini(_phrase), !.
		
cocogn :-
	test_init,test_vocab,
	repeat,
		nl,write('gn>'),
		read_phrase([],_phrase),
		groupe_nominal_complément(_,_phrase,['.'],_x,_resu),
		write(_resu),nl,
		fini(_phrase), !.
		
cocoall :-
	test_init,test_vocab,
	repeat,
		nl,write('type phrase (vb, rel, q, qrel, gns, gnc, gnv)>'),nl,
		read_phrase([],[_type |_phrase]),
		essaye(_type,_phrase),		
		fini([_type |_phrase]), !.
		
essaye(vb,_phrase):-
	forme_verbale_active(_phrase,['.'],_resu),
	write(_resu),nl.
essaye(rel,_phrase):-
	relative(_phrase, ['.'], _x,_racine_nom, _rel),
	write(_rel),nl.
essaye(q,_phrase):-
	quantité(_phrase, ['.'], _at,_x,_valu),
	write(_valu),nl.
essaye(qrel,_phrase):-
	quantité_relative(_phrase,['.'],_atr,_x,_rel),
	write(_rel),nl.
essaye(gns,_phrase):-
	groupe_nominal_sujet(_phrase,['.'],_x,_resu),
	write(_resu),nl.
essaye(gnc,_phrase):-
	groupe_nominal_complément(_,_phrase,['.'],_x,_resu),
	write(_resu),nl.
essaye(gnv,_phrase):-
	groupe_nominal_valeur(_phrase, ['.'],  _atr, _resu, _calcule),
	write(_calcule),nl.
essaye(fin,_phrase).
		
% lire un fichier de phrases terminé par close.
fichier(_animal):-
	atom_chars(_animal,_l),
	append(_l,['.',t,x,t],_lfichier),
	append(_l,['.',l,o,g],_efichier),
	atom_chars(_rfichier,_lfichier),
	atom_chars(_wfichier,_efichier),
	open(_rfichier,read,Lire),
	add_stream_alias(Lire,lire),
	retractall(flag(askdico)),
	retractall(flag(outputfichier)),
	retractall(inconnu(_)),
	assertz(flag(outputfichier)),
	open(_wfichier,write,Ecrire),
	add_stream_alias(Ecrire,ecrire),
	get_time(_a,_b),
	set_input(Lire),
	set_output(Ecrire).

ctrl_participe_est(_genre,_nombre,être,_genre2,_nombre) :- !.
ctrl_participe_est(_,_,_verbe,_,_):-nonêtre(_verbe).

phrase(_phrase) :- 
	retractall(flag(noncompris)),
	assertz(flag(noncompris)),
	controle_dico(_phrase).
phrase([réciproque,non,'.']):-!,
	retractall(flag(réciproque)).
phrase([réciproque,oui,'.']):-!,
	retractall(flag(réciproque)),
	assertz(flag(réciproque)).
phrase([controle,non,'.']):-!,
	retractall(flag(controle)).
phrase([controle,oui,'.']):-!,
	retractall(flag(controle)),
	assertz(flag(controle)).
phrase([équivalent,non,'.']):-!,
	retractall(flag(équivalent)).
phrase([équivalent,oui,'.']):-!,
	retractall(flag(équivalent)),
	assertz(flag(équivalent)).
phrase([fichier,_nom,'.']) :-!,
	fichier(_nom).
phrase([listing,'.']) :-!,
	listing(affirme).
phrase([help,'.']) :-!,
	help.
phrase([help,_mot,'.']) :-!,
	help(_mot).
phrase([_,rien |_]):-!.
phrase([askdico,oui,'.']) :-!,
	retractall(flag(askdico)),
	assertz(flag(askdico)).	
phrase([askdico,non,'.']) :-!,
	retractall(flag(askdico)).	
phrase([close,output,'.']):-!,
	retractall(flag(outputfichier)),
	close(ecrire).
phrase([double,oui,'.']):-!,
	retractall(flag(double)),
	assertz(flag(double)).
phrase([double,non,'.']):-!,
	retractall(flag(double)).
phrase([close,'.']):-!,
	retractall(flag(outputfichier)),
	retractall(flag(askdico)),
	assertz(flag(askdico)),
	close(lire),
	close(ecrire),
	get_time(_a,_b),writen('cpu :',_a,'real :',_b),nl.
phrase([init,'.']) :-!,
	init.
	
phrase([affiche,_nom,'.']) :-!,
	clause(affirme(_x,être,_nom,_vrai),_cond),
	affiche(affirme(_x,être,_nom,_vrai),_cond).
phrase([expert,_nom,'.']) :-!,
	retractall(coco_declare(_)),
	retractall(stack(_)),
	assertz(coco_declare(affirme(coco,être,_nom,vrai))),
	writen('pense à un ',_nom,'je vais te poser des questions sur ses caractéristiques pour le deviner'),nl,
	writen('rappel : '),nl,
	writen('   - une baleine vit dans l''eau mais respire dans l''air'),nl,
	writen('   - un requin à une colonne cartilagineuse alors que la plupart des poissons l''ont osseuse'),nl,
	writen('   - certains insectes ont des élytres, c''est à dire 2 ailes durcies en carapaces, protégeant 2 autres ailes'),nl,
	writen('   - certains insectes ont des cerques, c''est à dire des pinces au bout de l''abdomen'),nl,
	writen('   - certains insectes ont des larves totalement différentes de l''animal métamorphosé complètement'),nl,
	writen('     d''autres ont des larves  où il ne manque que les ailes par rapport à l''animal métamorphosé incomplètement'),nl,
	write('frapper . return '),read_token(_),
	_x=coco,
	retirer_noncompris([expert]),
	expert(affirme(_x,être,_nom,vrai)).

phrase([tous | _reste]) :-
	phrase(_reste).
phrase([_aucun| _reste]) :-
	aucun(_aucun,_genre),
	groupe_nominal_sujet(_reste,[_ne|_rest], _x, gn( _racnom1, _genre, singulier)),
	ne(_ne),
	forme_verbale_active(_rest, _res, verbe( _racverbe,  vrai, singulier)),
	complément_active(_rest,['.'],_x,_racnom,_nombre,_racverbe,faux,_resu),
	retirer_noncompris([_aucun |_reste]),
	traiter(_resu).

phrase([_seul | _phrase]) :-
	flag(noncompris),
	groupe_nominal_sujet(_phrase , _reste,  _x, gn( _racnom, _genre, _nombre)),
	forme_verbale_active(_reste, _rest, verbe( _racverbe,  _vrai, _nombre)),
	complément_active(_rest,['.'],_x,_racnom,_nombre,_racverbe,_vrai,_resu),
	retirer_noncompris([_seul |_phrase]),
	traiter(_resu),
	flag(réciproque),
	réciproque(_resu,_retourné),
	traiter(_retourné).
	
phrase([_ce,qui | _reste]) :-
	ce(_ce,_nombre),!,
	forme_verbale_active(_reste, _rest, verbe( _racverbea,  _vraia, _nombrea)),
	complément_active(_rest,_in2,_x,true,_nombrea,_racverbea,_vraia,_resua),
	simplifie_variable(_resua,_resu2a,_a,_b,_c,_d),
	forme_verbale_active(_in2, _in2a, verbe( _racverbeb,  _vraib, _nombreb)),
	complément_active(_in2a,['.'],_x,true,_nombreb,_racverbeb,_vraib,_resub),
	simplifie_variable(_resub,_resu2b,_a,_b,_c,_d),
	retirer_noncompris([_ce,qui |_phrase]),
	enregistrer(_resu2b,_resu2a).
	
phrase([si | _phrase]) :-
	et_elems([deb | _phrase],_rest, _liste,_a,_b,_c,_d),
	groupe_nominal_sujet(_rest , _res,  _x, gn( _racnom, _genre, _nombre)),
	forme_verbale_active(_res, _re, verbe( _racverbe,  _vrai, _nombre)),
	complément_active(_re,['.'],_x,_racnom,_nombre,_racverbe,_vrai,_resu),
	simplifie_variable(_resu,_resu2,_a,_b,_c,_d),
	retirer_noncompris([si |_phrase]),
	enregistrer(_resu2,_liste).
	
phrase([si | _phrase]) :-
	groupe_nominal_sujet(_phrase , _reste,  _x, gn( _racnoma, _genrea, _nombrea)),
	forme_verbale_active(_reste, _rest, verbe( _racverbea,  _vraia, _nombrea)),
	complément_active(_rest,[ou,si |_in2],_x,_racnoma,_nombrea,_racverbea,_vraia,_resua),
	simplifie_variable(_resua,_resu2a,_a,_b,_c,_d),
	groupe_nominal_sujet(_in2 , _in2a,  _y, gn( _racnomb, _genreb, _nombreb)),
	forme_verbale_active(_in2a, _in2b, verbe( _racverbeb,  _vraib, _nombreb)),
	complément_active(_in2b,[alors |_in3],_y,_racnomb,_nombreb,_racverbeb,_vraib,_resub),
	simplifie_variable(_resub,_resu2b,_a,_b,_c,_d),
	groupe_nominal_sujet(_in3 , _in3a,  _z, gn( _racnom, _genre, _nombre)),
	forme_verbale_active(_in3a, _in3b, verbe( _racverbe,  _vrai, _nombre)),
	complément_active(_in3b,['.'],_z,_racnom,_nombre,_racverbe,_vrai,_resu),
	simplifie_variable(_resu,_resu2,_a,_b,_c,_d),
	retirer_noncompris([si |_phrase]),
	enregistrer(_resu2,ou(_resu2a,_resu2b)).

phrase([est,ce,que | _phrase]) :-
	groupe_nominal_sujet(_phrase, _reste,  _x, gn( _racnom, _genre, _nombre)),
	forme_verbale_active(_reste, _rest, verbe( _racverbe,  _vrai, _nombre)),
	complément_active(_rest,['.'],_x,_racnom,_nombre,_racverbe,_vrai,phrase(_si,_alorsv,_alors)),
	writen(_si,_alorsv,_alors),nl,
	retirer_noncompris([est,ce,que |_phrase]),
	transforme(et(_si,_alors),_t,_),
	controle(_alorsv,_t,oui,non),
	write('Coco ne sait pas'),nl.
% fff
phrase([qui | _phrase]) :-
	forme_verbale_active(_phrase, _rest, verbe( _racverbe,  _vrai, _nombre)),
	groupe_nominal_complément(_racverbe,_rest, ['.'], _y,gn( _racnom1, _genre1, _nombre1)),
	retirer_noncompris([qui |_phrase]),
	sialors(_x,_racverbe,_vrai,_racnom1,_x,_y,_si,_alorsv,_alors),
	répondre(_x,et(_alors,_alorsv)).
phrase([qui | _phrase]) :-	
	forme_verbale_passive(_phrase, _rest, verbe( _racverbe,  _vrai, _genre, _nombre)),
	groupe_nominal_sujet(_rest, ['.'], _y, gn( _racnom2, _genre2, _nombre2)),
	retirer_noncompris([qui |_phrase]),
	sialors(_racnom2,_verbe,_vrai,_x,_y,_x,_si,_alorsv,_alors),
	répondre(_x,et(_alors,_alorsv)).
phrase([_que | _reste]) :-
	que(_que),
	forme_verbale_active(_reste, _rest, verbe( _racverbe,  _vrai, _nombre2)),
	nonvar(_racverbe),
	groupe_nominal_sujet(_rest, ['.'], _x,gn( _racnom2, _genre2, _nombre2)),
	retirer_noncompris([_que |_reste]),
%	cherche(affirme(_x,_racverbe,_qe,_vrai),_racnom2),
	répondre(_qe,et(_racnom2,affirme(_x,_racverbe,_qe,_vrai))).
phrase([_que | _reste]) :-
	que(_que),
	forme_verbale_active(_reste, _rest, verbe( _racverbe,  _vrai, _nombre2)),
	var(_racverbe),
	groupe_nominal_sujet(_rest, ['.'], _x,gn( _racnom2, _genre2, _nombre2)),
	retirer_noncompris([_que |_reste]),
%	cherche(affirme(_x,_racverbe,_qe,_vrai),_racnom2),
	répondre2([_racverbe,_qe],et(_racnom2,affirme(_x,_racverbe,_qe,_vrai))).
phrase([_quel,_être | _rest]):-
	quel(_quel,_genre,_nombre),!,
	verbe(_être,_nombre,être),
	phrase_quel(_rest,_genre,_nombre).
phrase([il,y,a,combien,de |_reste]):-
	groupe_nominal_sujet([joker|_reste], ['.'], _x, gn( _racnom, _genre, _nombre)),
	retirer_noncompris([il,y,a,combien,de |_reste]),
	findall(_x,_racnom,_l),
	sort(_l,_resu),
	length(_resu,_cnt),
	write(_cnt),nl.

phrase(_phrase) :-
	flag(noncompris),
	groupe_nominal_sujet(_phrase , _reste,  _x, gn( _racnom, _genre, _nombre)),
	forme_verbale_active(_reste, _rest, verbe( _racverbe,  _vrai, _nombre)),
	complément_active(_rest,['.'],_x,_racnom,_nombre,_racverbe,_vrai,_resu),
	retirer_noncompris(_phrase),
	traiter(_resu).
phrase(_phrase) :-
	flag(noncompris),
	groupe_nominal_sujet(_phrase , _reste,  _x, gn( _racnom, _genre, _nombre)),
	forme_verbale_passive(_reste, _rest, verbe( _racverbe,  _vrai, _genre, _nombre)),
	groupe_nominal_sujet(_rest, ['.'], _y, gn( _racnom2, _genre2, _nombre2)),
	retirer_noncompris(_phrase),
	sialors(_racnom2,_verbe,_vrai,_racnom,_y,_x,_si,_alorsv,_alors),
	traiter( phrase(_si,_alorsv,_alors)).
phrase([_le,_attribut,_de |_rest]):-
	article(_le,_genre,_nombre),
	nom(_attribut,_genre,_nombre,_atr),nomde(_atr,_,_),
	de(_de),
	groupe_nominal_sujet_joker(_rest ,_res,_x,gn(_racnom,_g,_n)),
	forme_verbale_active(_res,_re,verbe(être,_vrai,_nombre)),
	quantité_relative(_re,['.'],_atr,_x,_rel),
	retirer_noncompris(_phrase),
	writen(_racnom,_rel),
	traiter(phrase(_racnom,_rel,true)).
phrase([_le,_attribut,_de |_rest]):-
	article(_le,_genre,_nombre),
	nom(_attribut,_genre,_nombre,_atr),nomde(_atr,_,_),
	de(_de),
	groupe_nominal_sujet_joker(_rest ,_res,_x,gn(_racnom,_g,_n)),
	forme_verbale_active(_res,_re,verbe(être,_vrai,_nombre)),
	phrase_est(_re,_racadj),
	retirer_noncompris(_phrase),
	traiter(phrase(_racnom,affirme(_x,avoir,_atr,_racadj,_vrai),true)).
phrase(_phrase):-
	flag(noncompris),
	error_log('coco n''a rien compris à ',_phrase).

phrase_est([_adj,'.'],_racadj):-
	adjectif(_adj,_,_nombre,_racadj,_),!.
phrase_est(_re,_prénom):-
	prénom(_re,['.'],_prénom,_,_),!.
phrase_est(_re,_nom2):-	
	prepnomde(_re,['.'],_nom2).
	
help:-
	write('réciproque oui/non : asserter la réciproque (seul ....)'),nl,
	write('controle oui/non : vérifier la cohérence'),nl,
	write('équivalent oui/non : asserter l''équivalent négatif'),nl,
	write('askdico oui/non : demander à définir les mots inconnus'),nl,
	write('double oui/non : sortie double, vers le fichier et vers l''écran'),nl,
	write('init : oublier toutes les clauses affirme'),nl,
	write('listing : afficher les clauses affirme'),nl,
	write('help : afficher la liste des commandes'),nl,
	write('fichier nom-de-fichier : lire les phrases sur le fichier (animal, département ou famille)'),nl,
	write('close output : fin de la sortie dans un fichier et retour à l''écran standard'),nl,
	write('close : fin de lecture du fichier et retour à la lecture clavier standard'),nl,
	write('affiche nom'),nl,
	write('expert nom : déclencher l''expertise en nom (ex: fichier animal. puis expert animal.'),nl,
	write('une phrase du genre : groupe-nominal-sujet verbe groupe-nominal-complément'),nl,
	write('faire help phrase/gns/verbe/gnc/relative/valeurfin'),nl,
	write('choix>'),read_token(_mot),
	help(_mot).
	
help(phrase):-	!,
	write('des affirmations du type :'),nl,
	write('  groupe-nominal-sujet verbe ex: un poisson nage'),nl,
	write('  groupe-nominal-sujet verbe groupe-nominal-complement ex : un félidé a des griffes rétractiles'),nl,
	write('  groupe-nominal-sujet est verbé par groupe-nominal-sujet ex : la souris est mangée par le chat'),nl,
	write('  le attribut de groupe-nominal-sujet est quantité-relative'),nl,
	write('  seul groupe-nominal-sujet verbe groupe-nominal-complément ex: seul un vertébré a une colonne vertébrale'),nl,
	write('  une règle ex : si x est le père de y et si y est de sexe masculin alors y est le fils de x'),nl,
	write('  celui qui verbe groupe-nominal-complément verbe groupe-nominal-complément'),nl,
	write('on distingue '),nl,
	write('  nom-d-entité, servant à nommer les entités à étudier : chat, poisson,merlan,porc épic'),nl,
	write('  nom-d-attribut, servant à décrire les entités : température, taille, poids, couleur'),nl,
	write('    les parties des entités et tout ce qui sert à les décrire sont également des attributs, que les entités ont, ou pas, et de telle et telle façon :'),nl,
	write('    patte, antenne, queue, nid'),nl,
	write('des questions :'),nl,
	write('  quel est le attribut des groupe-nominal-sujet ex : quel est la couleur du cheval blanc d henri'),nl,
	write('  quel sont les attributs respectifs des groupe-nominal-sujet'),nl,
	write('  est ce que phrase'),nl,
	write('  qui verbe groupe-nominal-complément'),nl,
	write('  que verbe groupe-nominal-sujet'),nl,
	write('  quels sont les groupe-nominal-sujet'),nl,
	write('  quels sont les attributs respectifs des groupe-nominal-sujet'),nl,
	write('  quels sont classés par attribut des groupe-nominal-sujet'),nl,
	write('  il y a combien de groupe-nominal-sujet'),nl,
	write('faire help gns/verbe/gnc/fin'),nl,
	write('choix>'),read_token(_mot),
	help(_mot).
help(gns):-!,
	write('groupe-nominal-sujet (gns) :'),nl,
	write('  (adjectif) nom-d-entité (non) (adjectif) (adjectif) (relatives) ex : un petit animal noir qui mange une souris et qui a des griffes non rétractiles'),nl,
	write('  article plus/moins adjectif des groupe-nominal-sujet ex : le plus lourd des chats qui ont la couleur noire'),nl,
	write('  prénom ex: hector/médor/titine'),nl,
	write('  article nom-propre ex : la loire atlantique'),nl,
	write('  x/y/z, servant à definir des règles ex : si x est le père de y alors y est l enfant de x'),nl,
	write('help relative/fin'),nl,
	write('choix>'),read_token(_mot),
	help(_mot).
help(verbe):-!,
	write('verbe (être, avoir ou autre) :'),nl,
	write('  verbe'),nl,
	write('  ne verbe pas'),nl,
	write('  est verbé par'),nl,
	write('  n est pas verbé par'),nl,
	write('help gns/gnc/relative/valeur/fin'),nl,
	write('choix>'),read_token(_mot),
	help(_mot).
help(gnc):-!,
	write('  groupe-nominal-sujet ex: un petit animal insectivore qui a des plumes et dont le bec est long'),nl,
	write('  adverbe (si verbe non être/avoir) ex : nage vite'),nl,
	write('  (préposition) article (adjectif) nom-d-entité (adjectif) (si verbe non être/avoir) ex: vit sur la terre'),nl,
	write('  article nom-d-attribut préposition non-d-attribut (si verbe non être) ex : des ongles en corne'),nl,
	write('  compléments spécifiques au verbe être'),nl,
	write('    (non) adjectif ex : est petit'),nl,
	write('    de attribut quantité-relative ex : est de poids supérieur/égal à 2 kg'),nl,
	write('    de adjectif attribut ex : de taille petite'),nl,
	write('    le attribut de groupe-nominal-sujet ex : le file d hecror'),nl,
	write('  compléments spécifiques au verbe avoir :'),nl,
	write('    (adjectif) nom-d-attribut (adjectif) (adjectif)  ex : a un long bec crochu'),nl,
	write('    nombre nom-d-attribut ex: a 4 pattes'),nl,
	write('    de article nom-d-attribut ex : a de la fourrure'),nl,
	write('    de adjectif nom-d-attribut ex : a de longues pattes'),nl,
	write('    pour attribut gns ex : a pour fils hector'),nl,
	write('    gns pour attribut ex : a quimper pour capitale'),nl,
	write('    quantité : ex a 2 kg'),nl,
	write('    article attribut supérieur/inférieur/égale à quantité-relative ex : a un poids supérieur à 2 kg'),nl,
	write('    plus/moins/autant de attribut que gns ex : a plus de poids que médor'),nl,
	write('help gns/valeur/fin'),nl,
	write('choix>'),read_token(_mot),
	help(_mot).
help(relative):-!,
	write('relative :'),nl,
	write('  dont article attribut est/n est pas adjectif ex: dont la taille est petite'),nl,
	write('  dont article attribut est/n est pas quantité-relative ex: dont la taille est supérieur à celle du chien'),nl,
	write('  dont article attribut est groupe-nominal-sujet ex dont le fils est hector'),nl,
	write('  dont groupe-nominal-sujet est/n est pas article attribut ex : dont quimper est la capitale'),nl,
	write('  qui verbe groupe-nominal-complément ex : qui mange de l herbe'),nl,
	write('  participe-présent groupe-nominal-complément ex : mangeant la souris'),nl,
	write('  à poils'),nl,
	write('  à nombre attribut ex : à 4 pattes'),nl,
	write('  de adjectif attribut ex : de petite taille'),nl,
	write('  de groupe-nominal-sujet ex :  le chat de hector'),nl,
	write('  de quantité ex : de 2 kg'),nl,
	write('  de attribut quantité-relative ex de poids supérieur à celui du chien'),nl,
	write('  que verbe groupe-nominal-sujet'),nl,
	write('help valeur/gnc/fin'),nl,
	write('choix>'),read_token(_mot),
	help(_mot).
help(valeur):-!,
	write('gn-valeur :'),nl,
	write('  article moyenne/somme/minimum/maximum des attibuts de groupe-nominal-sujet ex : la somme du poids des chats'),nl,
	write('  article attribut moyenne/somme/minimum/maximum des groupe-nominal-sujet ex : le poids moyen des chats'),nl,
	write('  article attribut du plus/moins adjectif des groupe-nominal-sujet ex : le poids du plus lourd des chats'),nl,
	write('  le nombre de groupes-nominal-sujet ex : le nombre de chats rouges qui volent et qui nagent'),nl,
	write('valeur :'),nl,
	write('  nombre unités (de attribut)  ex : 2 m (de haut'),nl,
	write('quantité :'),nl,
	write('  valeur'),nl,
	write('  comparatif (de) valeur ex : plus de 3 kg'),nl,
	write('  comparatif de gn-valeur ex : égal à la somme des surfaces des départements de bretagne'),nl,
	write('quantité-relative :'),nl,
	write('  quantité'),nl,
	write('  comparatif à celle de groupe-nominal-sujet ex : supérieur à celui du chat'),nl,
	write('help phrase/gns/verbe/gnc/relative/fin'),nl,
	write('choix>'),read_token(_mot),
	help(_mot).
help(fin):-!.
help(_):-
	help(phrase).
	
phrase_quel(_rest,_genre,_nombre):-
	groupe_nominal_sujet(_rest, ['.'], _x, gn( _racnom, _genre, _nombre)),!,
	retirer_noncompris([quel,est |_rest]),
	répondre(_x,_racnom).
phrase_quel(_rest,_genre,_nombre):-
	groupe_nominal_valeur(_rest, ['.'], _atr, _resu, _calcule),!,
	retirer_noncompris([quel,est |_rest]),write(aaa2),
	répondre(_resu,_calcule).
phrase_quel([_article,_attribut,_respectifs | _rest],_genre,_nombre):-
	article(_article, _genre, _nombre),
	nom(_attribut,_genre,_nombre,_atr),	
	respectif(_respectifs),
	groupe_nominal_sujet(_rest, ['.'], _x, gn( _racnom, _genr, _nombr)),!,
	retirer_noncompris([quel,est,_article,_attribut,_respectifs |_rest]),
	findall(_x,_racnom,_l),
	sort(_l,_lr),
	member(_e,_lr),
	quoi(_e,_atr,_valu),
	writen(_e,_valu),nl.
phrase_quel([_le,_attribut, _de | _rest],_genre,_nombre):-
	de(_de),
	article(_le,_genre,_nombre),
	nom(_attribut,_genre,_nombre,_atr),
	groupe_nominal_sujet_joker(_rest, ['.'], _x, gn( _racnom, _genr, _nombr)),!,
	retirer_noncompris([quel,est,_le,_attribut,_de |_rest]),
	writen(_racnom,affirme(_x,avoir,_atr,_y,vrai)),nl,
%	cherche(affirme(_x,avoir,_atr,_y,vrai),_racnom),
	findall(_y,(_racnom,affirme(_x,avoir,_atr,_y,vrai)),_l),
	sort(_l,_lr),
	writen(_lr),nl.
phrase_quel([_classé, par,_attribut | _rest],_genre,_nombre):-
	classé(_classé),write(bbb),
	nom(_attribut,_,_,_atr),write(ccc),
	groupe_nominal_sujet(_rest, ['.'], _x, gn( _racnom, _genr, _nombr)),write(ddd),
	retirer_noncompris([quel,est,_classé,par,_attribut |_rest]),writen(aaa,_racnom),
	findall(_y,(_racnom,affirme(_x,avoir,_atr,_y,vrai)),_l),
	sort(_l,_lr),
	member(_e,_lr),
	findall(_x,(_racnom,affirme(_x,avoir,_atr,_e,vrai)),_l2),
	writen(_e,_l2),nl.
phrase_quel([_article,_caracteristique, _de | _rest],_genre,_nombre):-
	article(_article, _genre, _nombre),
	de(_de),
	caracteristique(_caracteristique),
	groupe_nominal_sujet_joker(_rest, ['.'], _x, gn( _racnom, _genr, _nombr)),write(_racnom),
	retirer_noncompris([quel,est,_article,_caracteristique, _de |_rest]),
	findall(_x,_racnom,_l),
	sort(_l,_lr),
	findall(_y,(_racnom,affirme(_x,avoir,_y,_,_)),_lat),
	sort(_lat,_latr),
	member(_e,_lr),
	affichecar(_e,_latr).

% complément du verbe actif
complément_active(['.'],['.'],_x,_racnom,_,_racverbe,_vrai,phrase(_racnom,affirme(_x,_racverbe,_vrai),true)):-!.
complément_active([_adv|_reste],_reste,_x,_racnom,_,_racverbe,_vrai,phrase(_racnom,affirme(_x,_racverbe,_adv,_vrai),true)):-
	adverbe(_adv),!.
complément_active(_in,_reste,_x,_racnom,_,_racverbe,_vrai,phrase(_racnom,affirme(_x,_racverbe,_nom2,_adj2,_vrai),true)):-
	nonêtreavoir(_racverbe),
	prepnomde(_in,_reste,_nom2,_adj2),!.
complément_active(_in,_reste,_x,_racnom,_,_racverbe,_vrai,phrase(_racnom,affirme(_x,_racverbe,_nom2,_vrai),true)):-
	nonêtreavoir(_racverbe),
	prepnomde(_in,_reste,_nom2),!.
complément_active(_in,_reste,_x,_racnom,_nombre,_racverbe,_vrai,phrase(_si,_alorsv,_alors)):-
	groupe_nominal_complément(_racverbe,_in, _reste, _y, gn( _racnom2, _genre2, _nombre2)),!,
	ctrl_participe_est(_genre,_nombre,_racverbe,_genre2,_nombre2),
%	writen(_racnom,_racverbe,_racnom2),nl,
	sialors(_racnom,_racverbe,_vrai,_racnom2,_x,_y,_si,_alorsv,_alors).
complément_active(_in,_in,_x,_racnom,_,_racverbe,_vrai,phrase(_racnom,affirme(_x,_racverbe,_vrai),true)):-!.

affichecar(_e,_latr):-
	affirme(_e,être,_y,vrai),
	writen(_e,être,_y,vrai),nl,fail.
affichecar(_e,_latr):-
	affirme(_e,avoir,_y,_vrai),affirme(_e,avoir,_y,_,vrai),fail,
	writen(_e,avoir,_y,_vrai),nl,fail.
affichecar(_e,_latr):-
	writen(_e,' avoir '),
	member(_a,_latr),
	quoi(_e,_a,_valu),
	writen(_a,_valu,' '),fail.
affichecar(_e,_latr):-nl.
	
quoi(_e,_atr,_valu):-
	affirme(_e,avoir,_atr,_valu,vrai),!.
quoi(_e,_atr,non(_valu)):-
	affirme(_e,avoir,_atr,_valu,faux),!.
quoi(_e,_atr,inconnu).

% predicats de calculs globaux
calcule(_pred,_x,_racnom,_attribut,_resu):-
	findall(_x,_racnom,_l1),
	sort(_l1,_l2),
	member(_z,_l2),affirme(_z,avoir,_attribut,(_zz,_v),vrai),!,
	findall(_tv,
		(member(_y,_l2),affirme(_y,avoir,_attribut,(_tu,_u),vrai),conver(_tu,_u,_tv,_v)),
		_l),
		=..(_fon,[_pred,_l,_resu]),
		call(_fon),!.
calcule(_pred,_x,_racnom,_attribut,0).

conver(_tu,_u,_tu,_u):-!.
conver(_tu,_u,_tv,_v) :-
	conversion(_u,_n,_v),!
	is(_tv,_n*_tu).
conver(_tu,_u,_tv,_v) :-
	conversion(_v,_n,_u),!
	is(_tv,_tu/_n).

% certains ne sont pas prévus directement dans prolog :
% calcule de la moyenne
avr_list([],0):-!.
avr_list(_l,_resu):-
	sum_list(_l,_sum),
	length(_l,_nb),
	is(_resu,_sum/_nb),!.
avr_list(_l,0).

% calcule du nombre d'éléments
compte(_x,_racnom,_resu):-
	findall(_x,_racnom,_l1),
	sort(_l1,_l),
	length(_l,_resu),!.
compte(_x,_racnom,0).

et_calc(_a,_b):-
	call(_a),
	call(_b).
et_cond(_a,_b):-
	call(_a),
	call(_b).
et(_a,_b):-
	call(_a),
	call(_b).
ou(_a,_b):-
	call(_a),!.
ou(_a,_b):-
	call(_b).

être(_cmp,(_a,_u),(_b,_u)):-!,
	être(_cmp,_a,_b).
être(_cmp,(_a,_u),(_b,_v)):-
	conversion(_u,_n,_v),!,
	is(_va,n*_a),
	être(_cmp,_va,_b).
être(_cmp,(_a,_u),(_b,_v)):-
	conversion(_v,_n,_u),!,
	is(_vb,n*_b),
	être(_cmp,_a,_vb).

% on peut aussi comparer des valeurs imprécises : une taille haute est plus haute qu’une taille basse
être(_cmp,_a,_b):-
	atom(_a),
	atom(_b),!,
	conv(_a,_numa),
	conv(_b,_numb),
	être(_cmp,_numa,_numb).

être(égal,_a,_a):-!.
être(différent,_a,_a):- !,fail.
être(différent,_a,_b).

être(_cmp,_a,_b):-var(_a),fail,!.	
être(_cmp,_a,_b):-var(_b),fail,!.	
être(inférieur,_a,_b):-number(_a),number(_b),_a<_b.
être(supérieur,_a,_b):-number(_a),number(_b),_a>_b.
être(inférieurégal,_a,_b):-number(_a),number(_b),_a=<_b.
être(supérieurégal,_a,_b):-number(_a),number(_b),_a>=_b.

conv(minuscule,0) :-!.
conv(_adj,1):-comparatif(_,_adj,_),!.
conv(moyen,2).
conv(standard,2).
conv(_adj,3):-comparatif(_adj,_,_),!.
conv(énorme,4).

cherche(_rep,_quest):-
	chercher(_rep,_quest),!.
cherche(_rep,_quest).

chercher(_quest,_quest):-!,
	writen('la réponse est dans la question :',_quest),nl.
chercher(_quest,et(_a,_b)):-
	chercher(_quest,_a),!.
chercher(_quest,et(_a,_b)):-
	chercher(_quest,_b),!.
chercher(_quest,et_cond(_a,_b)):-
	chercher(_quest,_a),!.
chercher(_quest,et_cond(_a,_b)):-
	chercher(_quest,_b),!.

répondre(_x,_racnom):-
	writen(répondre,_x,_racnom),nl,
	findall(_x,_racnom,_l),
	sort(_l,_resu),
	write(_resu),nl.
répondre2([_racverbe,_x],_racnom):-
	writen(répondre,_racverbe,_x,_racnom),nl,
	findall([_racverbe,_x],_racnom,_l),
	sort(_l,_resu),
	write(_resu),nl.

simplifie_xyz(affirme(_w,être,x,faux),_w\=_a,_a,_b,_c,_d):-!.
simplifie_xyz(affirme(_w,être,y,faux),_w\=_b,_a,_b,_c,_d):-!.
simplifie_xyz(affirme(_w,être,z,faux),_w\=_c,_a,_b,_c,_d):-!.
simplifie_xyz(affirme(_w,être,t,faux),_w\=_d,_a,_b,_c,_d):-!.
simplifie_xyz(affirme(_a,être,x,vrai),true,_a,_b,_c,_d):-!.
simplifie_xyz(affirme(_b,être,y,vrai),true,_a,_b,_c,_d):-!.
simplifie_xyz(affirme(_c,être,z,vrai),true,_a,_b,_c,_d):-!.
simplifie_xyz(affirme(_d,être,t,vrai),true,_a,_b,_c,_d):-!.
simplifie_xyz(et_cond(_x,_y),_y,_a,_b,_c,_d):-
	simplifie_xyz(_x,true,_a,_b,_c,_d),!.
simplifie_xyz(et_calc(_x,_y),_y,_a,_b,_c,_d):-
	simplifie_xyz(_x,true,_a,_b,_c,_d),!.
simplifie_xyz(et(_x,_y),_sxy,_a,_b,_c,_d):-!,
	simplifie_xyz(_x,_sx,_a,_b,_c,_d),
	simplifie_xyz(_y,_sy,_a,_b,_c,_d),
	simplifie_true(et(_sx,_sy),_sxy).
simplifie_xyz(_si,_si,_a,_b,_c,_d).

simplifie_true(et(true,true),true):-!.
simplifie_true(et(_a,true),_a):-!.
simplifie_true(et(true,_a),_a):-!.
simplifie_true(_a,_a):-!.

simplifie_variable(phrase(_si,_alorsv,true),_salorsv,_a,_b,_c,_d):-
	simplifie_xyz(_si,true,_a,_b,_c,_d),!,
	simplifie_xyz(_alorsv,_salorsv,_a,_b,_c,_d).
simplifie_variable(phrase(_si,_alorsv,true),_sialors,_a,_b,_c,_d):-!,
	simplifie_xyz(_si,_ssi,_a,_b,_c,_d),
	simplifie_xyz(_alorsv,_salorsv,_a,_b,_c,_d),
	simplifie_true(et(_ssi,_salorsv),_sialors).
simplifie_variable(phrase(_si,_alorsv,_alors),_ssisalors,_a,_b,_c,_d):-
	simplifie_xyz(_si,_ssi,_a,_b,_c,_d),
	simplifie_xyz(_alors,_salors,_a,_b,_c,_d),
	simplifie_xyz(_alorsv,_salorsv,_a,_b,_c,_d),
	simplifie_true(et(_ssi,_salors),_sialors),
	simplifie_true(et(_sialors,_salorsv),_ssisalors).

et_elems([alors | _rest],_rest, _listein,_listein,_a,_b,_c,_d) :- !.	
et_elems([et,si | _phrase], _re, _listein, _listeout,_a,_b,_c,_d) :-!,
	et_elems([et | _phrase], _re, _listein, _listeout,_a,_b,_c,_d).
et_elems([et | _phrase], _re, _listein, _listeout,_a,_b,_c,_d) :-
	groupe_nominal_sujet(_phrase , _reste,  _x, gn( _racnom, _genre, _nombre)),
	forme_verbale_active(_reste, _rest, verbe( _racverbe,  _vrai, _nombre)),
	complément_active(_rest,_res,_x,_racnom,_nombre,_racverbe,_vrai,_resu),
	simplifie_variable(_resu,_resu2,_a,_b,_c,_d),
	et_elems(_res,_re,et(_listein,_resu2),_listeout,_a,_b,_c,_d).
et_elems([deb | _phrase], _re, _listeout,_a,_b,_c,_d) :-
	groupe_nominal_sujet(_phrase , _reste,  _x, gn( _racnom, _genre, _nombre)),
	forme_verbale_active(_reste, _rest, verbe( _racverbe,  _vrai, _nombre)),
	complément_active(_rest,_res,_x,_racnom,_nombre,_racverbe,_vrai,_resu),
	simplifie_variable(_resu,_resu2,_a,_b,_c,_d),
	et_elems(_res,_re,_resu2,_listeout,_a,_b,_c,_d).
	
maximum([_le,_plus,_grand,des,_atrs|_reste],_reste,_le,_plus,_grand,_atrs).
maximum([_le,_plus,_grand,_atrs|_reste],_reste,_le,_plus,_grand,_atrs).
maximum([_le,_atrs,_le, _plus, _grand |_reste],_reste,_le,_plus,_grand,_atrs).
maximum([_le,_atrs, du, _plus, _grand |_reste],_reste,_le,_plus,_grand,_atrs).
maximum([_le,_atrs, du, _plus, _grand |_reste],[joker |_reste],_le,_plus,_grand,_atrs).
maximum([_le,_atrs, de, _la, _plus, _grand |_reste],_reste,_le,_plus,_grand,_atrs).
maximum([_le,_atrs, de, _la, _plus, _grand |_reste],[joker |_reste],_le,_plus,_grand,_atrs).
	
plus_adj(plus,_adj,max_list) :- comparatif(_adj,_,_),!.
plus_adj(plus,_adj,min_list) :- comparatif(_,_adj,_),!.
plus_adj(moins,_adj,min_list) :- comparatif(_adj,_,_),!.
plus_adj(moins,_adj,max_list) :- comparatif(_,_adj,_),!.

moyen(moyenne,féminin,avr_list).
moyen(moyen,féminin,avr_list).
moyen(maximum,_,max_list).
moyen(minimum,_,min_list).
moyen(somme,féminin,sum_list).
moyen(cumul,masculin,sum_list).
moyen(addition,féminin,sum_list).

% la moyenne des poids des chats
groupe_nominal_valeur([_la, _moyenne, _des, _atrs | _rest], _reste,  _atr, _resu, calcule(_minmax_list,_x,_racnom,_atr,_resu)) :-
	article(_la,_genre,singulier),
	moyen(_moyenne,_genre,_minmax_list),
	de(_des),
	dim(_atrs,_atr),
	groupe_nominal_sujet(_rest , _reste,  _x, gn( _racnom, _genre2, _nombre2)).
groupe_nominal_valeur([_la, _moyenne, _de, _la2, _atrs | _rest], _reste,  _atr,_resu, calcule(_minmax_list,_x,_racnom,_atr,_resu)) :-
	article(_la,_genre,singulier),
	moyen(_moyenne,_genre,_minmax_list),
	de(_de),
	article(_la2,_,_),
	dim(_atrs,_atr),
	groupe_nominal_sujet(_rest , _reste,  _x, gn( _racnom, _genre2, _nombre2)).
groupe_nominal_valeur([_la, _atrs, _moyenne | _rest], _reste,  _atr,_resu, calcule(_minmax_list,_x,_racnom,_atr,_resu)) :-
	article(_la,_genre,singulier),
	dim(_atrs,_atr),
	moyen(_moyenne,_genre,_minmax_list),!,
	groupe_nominal_sujet(_rest , _reste,  _x, gn( _racnom, _genre2, _nombre2)).
groupe_nominal_valeur(_phrase, _reste, _atr,_resu, calcule(_minmax_list,_x,_racnom,_atr,_resu)) :-
	maximum(_phrase, _rest, _le,_plus, _adj,_atrs),
	article(_le,_,_),
	adjectif(_adj,_,_,_racadj,_),
	plus_adj(_plus,_racadj,_minmax_list),
	dim(_atrs,_atr),
	groupe_nominal_sujet(_rest , _reste,  _x, gn( _racnom, _genre2, _nombre2)).
groupe_nominal_valeur([le, nombre, _de | _rest], _reste,  _ ,_resu, compte(_x,_racnom,_resu)) :-
	de(_de),
	groupe_nominal_sujet([joker | _rest] , _reste,  _x, gn( _racnom, _genre2, _nombre2)).
	
groupe_nominal_valeur_joker([_le|_in], _reste,  _atr,_y, _gn ):-article(_le,_,_),!,groupe_nominal_valeur([_le|_in], _reste, _atr, _y, _gn ).
groupe_nominal_valeur_joker(_in, _reste,  _atr,_y, _gn ):-groupe_nominal_valeur([joker|_in], _reste, _atr, _y, _gn ).

add(_rel,true,_rel):-!.
add(_rel1,_rel2,et(_rel1,_rel2)).

adjectif([_adj|_reste],_reste,_genre,_nombre,_x,affirme(_x,avoir,_atr,_racadj,vrai)):-
	adjectif(_adj,_genre,_nombre,_racadj,_atr),!.
adjectif([non,_adj|_reste],_reste,_genre,_nombre,_x,affirme(_x,avoir,_atr,non(_racadj),vrai)):-
	adjectif(_adj,_genre,_nombre,_racadj,_atr),!.
adjectif(_in,_in,_,_,_x,true).

nom(_in,_reste,_genre,_nombre,_racine_nom):-	
	nom_composé(_in,_reste,_genre,_nombre,_racine_nom),!.
nom([_nom |_reste],_reste,_genre,_nombre,_racine_nom):-
	nom(_nom, _genre, _nombre, _racine_nom),nonnomde(_racine_nom).

% analyse d'un groupe nominal sujet : article nom ! article nom adjectif ! article adjectif nom adjectif ! prénom ! article nom propre *!
% le chien fff
groupe_nominal_sujet([fin ,'.'], ['.'],_,_) :-!.
groupe_nominal_sujet([_article |_res],_reste,_x,gn(_rel,_genre,_nombre)):-
		article(_article, _genre, _nombre),
		adjectif(_res,_rest,_genre,_nombre,_x,_reladj1),
		nom(_rest,_resta,_genre,_nombre,_racine_nom),
		add(affirme(_x,être,_racine_nom,vrai),_reladj1,_rel1),
		adjectif(_resta,_restb,_genre,_nombre,_x,_reladj2),
		add(_rel1,_reladj2,_rel2),
		adjectif(_restb,_restc,_genre,_nombre,_x,_reladj3),
		add(_rel2,_reladj3,_rel3),
		nrelative(_restc, _reste, _x,_racine_nom, _rel4),
		add(_rel3,_rel4,_rel),!.
groupe_nominal_sujet([_article |_res],_reste,_x,gn(_rel,_genre,_nombre)):-
		article(_article, _genre, _nombre),
		nom(_res,_resta,_genre,_nombre,_racine_nom),
		add(affirme(_x,être,_racine_nom,vrai),_x,_rel1),
		adjectif(_resta,_restb,_genre,_nombre,_x,_reladj2),
		add(_rel1,_reladj2,_rel2),
		adjectif(_restb,_restc,_genre,_nombre,_x,_reladj3),
		add(_rel2,_reladj3,_rel3),
		nrelative(_restc, _reste, _x,_racine_nom, _rel4),
		add(_rel3,_rel4,_rel).
% le plus lourd des chiens
groupe_nominal_sujet([_article, _plus,_adj | _rest], _reste, _x, gn(et(calcule(_minmax,_x,_rel,_atr,_z),et(_rel,affirme(_x,avoir,_atr,_z,vrai))), _genre, _nombre)) :-
	article(_article, _genre, _nombre),
	adjectif(_adj, _genre, _nombre, _racine_adj,_atr),
	plus_adj(_plus,_racine_adj,_minmax),
	groupe_nominal_sujet_joker(_rest,_reste,_x,gn(_rel,_,_)).
% hector
groupe_nominal_sujet(_in, _reste,  _x, gn(affirme(_x,être,_prénom,vrai), _genre,  _nombre)) :-
	prénom(_in,_reste,_prénom, _genre, _nombre).
groupe_nominal_sujet([_le |_in], _reste,  _x, gn(affirme(_x,être,_nom,vrai), _genre,  _nombre)) :-
	article(_le,_genre,_nombre),
	nom_propre(_in,_reste,_nom, _genre,_nombre).
% x y ou z
groupe_nominal_sujet([_variable | _reste], _reste,  _y, gn( affirme(_y,être,_variable,vrai), _genre,  singulier) ):-
	variable(_variable, _variable).
	
% chiens ou des chiens fff
groupe_nominal_sujet_joker(_in, _reste,  _y, _gn ):-groupe_nominal_sujet(_in, _reste,  _y, _gn ).
groupe_nominal_sujet_joker(_in, _reste,  _y, _gn ):-groupe_nominal_sujet([joker|_in], _reste,  _y, _gn ).

groupe_nominal_complément(avoir,_phrase,_reste,_x,_gn) :- !,
	groupe_nominal_complément_avoir(_phrase,_reste,_x,_gn).
groupe_nominal_complément(être,_phrase,_reste,_x,_gn) :- !,
	groupe_nominal_complément_être(_phrase,_reste,_x,_gn).
groupe_nominal_complément(_racverbe,_phrase,_reste,_x,_gn) :-
	groupe_nominal_sujet(_phrase,_reste,_x,_gn),!.
groupe_nominal_complément(_racverbe,_reste, _reste,  _x, gn( true, _genre, _nombre)).

addc(_nom,true,true,true,_x,affirme(_x,avoir,_nom,vrai)).
addc(_nom,affirme(_x,avoir,_,_adj1,vrai),true,true,_x,affirme(_x,avoir,_nom,_adj1,vrai)).
addc(_nom,true,affirme(_x,avoir,_,_adj2,vrai),true,_x,affirme(_x,avoir,_nom,_adj2,vrai)).
addc(_nom,affirme(_x,avoir,_,_adj1,vrai),affirme(_x,avoir,_,_adj2,vrai),true,_x,et(affirme(_x,avoir,_nom,_adj1,vrai),affirme(_x,avoir,_nom,_adj2,vrai))).
addc(_nom,true,affirme(_x,avoir,_,_adj1,vrai),affirme(_x,avoir,_,_adj2,vrai),_x,et(affirme(_x,avoir,_nom,_adj1,vrai),affirme(_x,avoir,_nom,_adj2,vrai))).

article_de(_article, _genre, _nombre):-
	article(_article, _genre, _nombre),!.
article_de(_article, _genre, _nombre):-
	deonly(_article).
	
groupe_nominal_complément_avoir([_article |_res],_reste,_x,gn(_rel,_genre,_nombre)):-
		article_de(_article, _genre, _nombre),
		adjectif(_res,[_nom|_resta],_genre,_nombre,_x,_reladj1),
		nom(_nom,_genre,_nombre,_racnom),nomde(_racnom,_,_),
		adjectif(_resta,_restb,_genre,_nombre,_x,_reladj2),
		adjectif(_restb,_reste,_genre,_nombre,_x,_reladj3),
		addc(_racnom,_reladj1,_reladj2,_reladj3,_x,_rel).
% les ongles en corne
groupe_nominal_complément_avoir([_article, _nom | _reste], _rest,  _x, gn(affirme(_x,avoir,_racine_nom,_rnom2,vrai), _genre, _nombre)) :-
	article(_article, _genre, _nombre),
	nom(_nom, _genre, _nombre, _racine_nom),nomde(_racine_nom,_,_),
	prepnomde(_reste,_rest,_rnom2),!.
% qui a de la fourrure
groupe_nominal_complément_avoir([_de, _le,_attribut | _reste], _reste, _x,gn(affirme(_x,avoir,_atr,vrai),_,_)) :-
	deonly(_de),
	article(_le,_genre,_nombre),
	nom(_attribut, _genre,_nombre,_atr),nomde(_atr,_,_).

% a pour fils hector
groupe_nominal_complément_avoir([_pour, _attribut | _rest], _reste, _x,gn(et_cond(_rel,affirme(_x,avoir,_atr,_y,vrai)),_,_)) :-
	pour(_pour),
	nom(_attribut, _genre,_nombre,_atr),nomde(_atr,_,_),
	groupe_nominal_sujet(_rest,_reste,_y,gn(_rel,_,_)).
% a hector pour fils
groupe_nominal_complément_avoir(_in, _reste,_x,gn(et_cond(_rel,affirme(_x,avoir,_atr,_y,vrai)),_,_)) :-
	groupe_nominal_sujet(_in,[_pour,_attribut|_reste],_y,gn(_rel,_,_)),
	pour(_pour),
	nom(_attribut, _genre,_nombre,_atr),nomde(_atr,_,_).
% a 2 kg
groupe_nominal_complément_avoir(_in, _reste, _x, gn(_rel,_,_)) :-
	quantité(_in,_reste,_,_x,_rel),!.
% a la taille	de 2m, supérieure à
groupe_nominal_complément_avoir([_le, _atrs|_rest], _reste, _x, gn(_rel,_,_)) :-
	article(_le, _genre,_nombre),
	nom(_atrs, _genre,_nombre,_atr),
	dimension(_atr,_), 
	quantité_relative(_rest,_reste,_atr,_x,_rel),!.
% a plus de poids que
groupe_nominal_complément_avoir([_comp, _de, _atrs,que |_rest], _reste, _x, gn(et_cond(_rel,et(affirme(_x,avoir,_atr,_valu,vrai),et_calc(affirme(_y,avoir,_atr,_z,vrai),être(_cmp,_valu,_z)))),_,_)) :-
	compare([_comp,_de],_cmp),
	nom(_atrs, _genre,_nombre,_atr),
	dimension(_atr,_), 
	groupe_nominal_sujet(_rest,_reste,_y,gn(_rel,_,_)),!.

groupe_nominal_complément_être( [_le,_nom,_de | _rest], _reste,  _x, gn(et_cond( _rel,affirme(_y,avoir,_atr,_x,vrai)), _, _)) :-	
	article(_le,_genre,_nombre),
	de(_de),
	nom(_nom, _genre,_nombre,_atr), nomde(_atr,_,_),
	groupe_nominal_sujet_joker(_rest,_reste,_y,gn(_rel,_,_)),!.
% pour (est) petit
groupe_nominal_complément_être([_adj | _reste], _reste,  _x, gn( affirme(_x, avoir,_atr,_racine_adj,vrai), _genre, _nombre)) :-
	adjectif(_adj, _genre, _nombre, _racine_adj,_atr).
groupe_nominal_complément_être([non, _adj | _reste], _reste, _x, gn( affirme(_x, avoir,_atr, non(_racine_adj),vrai), _genre, _nombre)) :-
	adjectif(_adj, _genre, _nombre, _racine_adj,_atr).
groupe_nominal_complément_être( [de,_attribut | _rest], _reste,  _x, gn( _rel, _, _)) :-	
	nom(_attribut, _genre,_nombre,_atr), nomde(_atr,_,_),
	quantité_relative(_rest,_reste,_atr,_x,_rel),!.
groupe_nominal_complément_être([de,_attribut,_adj | _reste], _reste,  _x, gn( affirme(_x, avoir,_atr,_racadj,vrai), _, _)) :-	
	nom(_attribut, _genre,_nombre,_atr), nomde(_atr,_,_),
	adjectif(_adj,_genre,_nombre,_racadj,_).
groupe_nominal_complément_être([de,_adj,_attribut | _reste], _reste,  _x, gn( affirme(_x, avoir,_atr,_racadj,vrai), _, _)) :-	
	adjectif(_adj,_genre,_nombre,_racadj,_),
	nom(_attribut, _genre,_nombre,_atr), nomde(_atr,_,_).
	
prénom([_nom |_reste],_reste, _nom,_,singulier):-
	prénom(_nom,_genre).
prénom([_a,_b|_reste],_reste, _nom,_,singulier):-
	prénom_declaré([_a,_b],_genre,_nom).
prénom([_a,_b,_c|_reste],_reste_nom,_,singulier):-
	prénom_declaré([_a,_b,_c],_genre,_nom).

nom_propre([_nom |_reste],_reste, _nom,_genre,singulier):-
	nom_propre_declaré(_nom,_genre).
nom_propre([_a,_b|_reste],_reste, _nom,_genre,_nombre):-
	nom_propre_declaré([_a,_b],_genre,_nombre,_nom).
nom_propre([_a,_b,_c|_reste],_reste,_nom,_genre,_nombre):-
	nom_propre_declaré([_a,_b,_c],_genre,_nombre,_nom).
	
nom_composé([_a,_b|_reste],_reste, _genre,singulier,_nom):-
	nom_composé([_a,_b],_,_genre,_nom).
nom_composé([_a,_b,_c|_reste],_reste,_genre,singulier,_nom):-
	nom_composé([_a,_b,_c],_,_genre,_nom).
nom_composé([_a,_b|_reste],_reste,_genre,pluriel, _nom):-
	nom_composé(_,[_a,_b],_genre,_nom).
nom_composé([_a,_b,_c|_reste],_reste,_genre,pluriel,_nom):-
	nom_composé(_,[_a,_b,_c],_genre,_nom).

nrelative(_rest, _reste, _x,_racine_nom, _rel) :-
	relative(_rest, _res, _x,_racine_nom, _rel1),
	suite_relative(_res,_reste,_x,_racine_nom,_rel1,_rel).
nrelative(_reste, _reste, _x,_racine_nom, true).

suite_relative([et |_rest], _reste, _x,_racine_nom, _rel1,_rel) :-
	relative(_rest, _res, _x,_racine_nom, _rel2),
	suite_relative(_res,_reste,_x,_racine_nom,et(_rel1,_rel2),_rel),!.
suite_relative(_reste, _reste, _x,_racine_nom, _rel,_rel).

relative([dont |_in], _reste, _x,_racnom, _rel) :-
	relative_dont(_in, _reste, _x,_racnom, _rel),!.
relative([_de | _rest], _reste, _x,_atr, _rel) :-	
	de_à(_de),
	relative_de(_rest, _reste, _x, _atr,_rel),!.
% (le fils) du chien noir
relative([_dedu|_rest], _reste, _y,_nomrel,et_cond(_racnom, affirme(_x,avoir,_nomrel,_y,vrai))) :-
	de(_dedu),nonvar(_nomrel),
	groupe_nominal_sujet_joker(_rest , _reste,  _x, gn( _racnom, _genre, _nombre)).
% qui est, a, mange
relative([qui | _rest], _reste, _x,_, _rel) :-
	forme_verbale_active(_rest, _res, verbe( _racverbe,  _vrai, _nombre)),
	relative_qui( _res, _reste, _racverbe, _vrai, _nombre, _x, _rel).
relative([_pprésent | _rest], _reste, _x,_, _rel) :-
	pprésent(_pprésent, _verbe),
	relative_qui( _rest,_reste,_verbe, vrai, _nombre, _x, _rel).
relative([_ne, _pprésent, pas | _rest], _reste, _x,_, _rel) :-
	ne(_ne),
	pprésent(_pprésent, _verbe),
	relative_qui( _rest,_reste, _verbe, faux, _nombre,_x,_rel).

% dont la taille est supérieure à 
relative_dont([ _article, _attribut, _est| _rest], _reste, _x,_, _rel) :-
	article(_article,_genre,_nombre),
	nom(_attribut, _genre,_nombre,_atr), nomde(_atr,_,_),
	verbe(_est,_nombre,être),
	quantité_relative(_rest,_reste,_atr,_x,_rel),!.
% dont la taille est petite
relative_dont([ _article, _attribut, _est, _adj | _reste], _reste, _x,_, affirme(_x, avoir,_atr,_racadj,vrai)) :-
	article(_article,_genre,_nombre),
	nom(_attribut, _genre,_nombre,_atr), nomde(_atr,_,_),
	verbe(_est,_nombre,être),
	adjectif(_adj,_genre,_nombre,_racadj,_).
% dont la taille n est pas petite
relative_dont([ _article, _attribut, _ne, _est, pas, _adj | _reste], _reste, _x,_, affirme(_x,avoir,_atr,_racadj,faux)) :-
	ne(_ne),
	article(_article,_genre,_nombre),
	nom(_attribut, _genre,_nombre,_atr), nomde(_atr,_,_),
	verbe(_est,_nombre,être),
	adjectif(_adj,_genre,_nombre,_racadj,_).
% dont le fils est hector
relative_dont([ _article, _attribut, _est | _rest], _reste, _x,_, et(_rel,affirme(_x, avoir,_atr,_y,vrai))) :-
	article(_article,_genre,_nombre),
	nom(_attribut, _genre,_nombre,_atr), nomde(_atr,_,_),
	verbe(_est,_nombre,être),
	groupe_nominal_sujet(_rest,_reste,_y,gn(_rel,_,_)).
% dont hector est le fils
relative_dont( _rest, _reste, _x,_, et(_rel,affirme(_x, avoir,_atr,_y,vrai))) :-
	groupe_nominal_sujet(_rest,[_est,_article, _attribut|_reste],_y,gn(_rel,_,_)),
	verbe(_est,_nombre,être),
	article(_article,_genre,_nombre),
	nom(_attribut, _genre,_nombre,_atr), nomde(_atr,_,_).
% dont hector n est pas le fils
relative_dont( _rest, _reste, _x,_, et(_rel,affirme(_x, avoir,_atr,_y,faux))) :-
	groupe_nominal_sujet(_rest,[_ne, _est,pas,_article, _attribut|_reste],_y,gn(_rel,_,_)),
	ne(_ne),
	verbe(_est,_nombre,être),
	article(_article,_genre,_nombre),
	nom(_attribut, _genre,_nombre,_atr), nomde(_atr,_,_).
% dont le fils n'est pas hector
relative_dont([ _article, _attribut, _ne, _est, pas | _rest], _reste, _x,_, et(_rel,affirme(_x,avoir,_atr,_y,faux))) :-
	ne(_ne),
	verbe(_est,_nombre,être),
	article(_article,_genre,_nombre),
	nom(_attribut, _genre,_nombre,_atr), nomde(_atr,_,_),
	groupe_nominal_sujet(_rest,_reste,_y,gn(_rel,_,_)).

relative_qui(_in, _reste, être, vrai, _nombre, _x,_rel) :-!,
		groupe_nominal_complément(être,_in,_reste,_x,gn(_rel,_,_)).
relative_qui(_in, _reste, être, faux, _nombre, _x,_rela) :-!,
		groupe_nominal_complément(être,_in,_reste,_x,gn(_rel,_,_)),neg(_rel,_rela).		
relative_qui(_in, _reste, avoir, vrai, _nombre, _x,_rel) :-!,
		groupe_nominal_complément(avoir,_in,_reste,_x,gn(_rel,_,_)).
relative_qui(_in, _reste, avoir, faux, _nombre, _x,_rela) :-!,
		groupe_nominal_complément(avoir,_in,_reste,_x,gn(_rel,_,_)),neg(_rel,_rela).

% qui mange vite
relative_qui( [_adv |_reste], _reste, _verbe, _vrai,_nomb, _x, affirme(_x,_verbe,_adv,_vrai)):-
	nonêtreavoir(_verbe),
	adverbe(_adv),!.
relative_qui( _phrase, _reste, _verbe, _vrai,_nomb, _x, affirme(_x,_verbe,_nom2,_adj2,_vrai)):-
	nonêtreavoir(_verbe),
	prepnomde(_phrase,_reste,_nom2,_adj2),!.
relative_qui( _phrase, _reste, _verbe, _vrai,_nomb, _x, affirme(_x,_verbe,_nom2,_vrai)):-
	nonêtreavoir(_verbe),
	prepnomde(_phrase,_reste,_nom2),!.
relative_qui( _phrase, _reste, _verbe, _vrai,_nomb, _x, et_cond(_rel,affirme(_x,_verbe,_y,_vrai))):-
	nonêtreavoir(_verbe),
	groupe_nominal_complément(_verbe,_phrase,_reste,_y,gn(_rel,_,_)),_rel\=true,!.
relative_qui(_in, _in, _verbe, _vrai, _nombre, _x,affirme(_x,_verbe,_vrai)).

% (qui est) à griffes rétractiles, de taille petite
relative_de([_attribut, _adj | _reste], _reste, _x,_, affirme(_x, avoir,_atr,_racadj,vrai)) :-
	nom(_attribut, _genre,_nombre,_atr),nomde(_atr,_,_), 
	adjectif(_adj,_genre,_nombre,_racadj,_).
% à griffes non rétractiles
relative_de([_attribut, non, _adj | _reste], _reste, _x,_, affirme(_x,avoir,_atr,non(_racadj),vrai)) :-
	nom(_attribut, _genre,_nombre,_atr), nomde(_atr,_,_),
	adjectif(_adj,_genre,_nombre,_racadj,_).
% à petites canines, de petite taille
relative_de([_adj, _attribut | _reste], _reste, _x,_, affirme(_x,avoir,_atr,_racadj,vrai)) :-
	adjectif(_adj,_genre,_nombre,_racadj,_),
	nom(_attribut, _genre,_nombre,_atr),nomde(_atr,_,_).
% à 3 pattes
relative_de([ _adj, _attribut | _reste], _reste, _x,_, affirme(_x,avoir,_atr,_valu,vrai)) :-
	nombre(_adj,_valu),
	nom(_attribut, _genre,_nombre,_atr). 
% de 2 kg
relative_de(_in, _reste, _x,_atr,_rel) :-
	quantité(_in,_reste,_atr,_x,_rel).
% de longueur supérieure à 2 kg
relative_de([_attribut | _rest], _reste, _x,_, _rel) :-
	nom(_attribut, _genre,_nombre,_atr),nomde(_atr,_,_),
	quantité_relative(_rest,_reste,_atr,_x,_rel).	

% 3 m de hauteur
valquantité([_nomb, _unité, de, _adj | _reste], _reste,_adj,(_valu,_abréviation)):-
	nombre(_nomb,_valu),
	unité(_unité,_abréviation),
	nomde(_adj,_,_),!.
% 3 m de haut
valquantité([_nomb, _unité, de, _adj | _reste], _reste,_atr,(_valu,_abréviation)):-
	nombre(_nomb,_valu),
	unité(_unité,_abréviation),
	ladjectif(_adj,_,_,_,_atr),!.
% 3 m
valquantité([_nomb, _unité | _reste], _reste,_atr,(_valu,_abréviation)):-
	nombre(_nomb,_valu),
	unité(_unité,_abréviation),
	dimension(_atr,_abréviation),!.
%3 doigts en corne
valquantité([_nomb, _nom,_prep,_nom2 | _reste], _reste,(_atr,_atr2),_valu):-
	nombre(_nomb,_valu),
	nom(_nom,_,_,_atr),
	prep(_prep),
	nom(_nom2,_,_,_atr2),!.	
% 2 ailes colorées
valquantité([_nomb, _nom,_adj | _reste], _reste,(_atr,_atr1),_valu):-
	nombre(_nomb,_valu),
	nom(_nom,_genre,_nombre,_atr),
	adjectif(_adj,_genre,_nombre,_atr1,_),!.	
% 1 petite nageoire dorsale
valquantité([_nomb, _adj,_nom,_adj2 | _reste], _reste,(_atr,_atr1,_atr2),_valu):-
	nombre(_nomb,_valu),
	adjectif(_adj,_genre,_nombre,_atr1,_),
	nom(_nom,_genre,_nombre,_atr),
	adjectif(_adj2,_genre,_nombre,_atr2,_),!.	
% 2 pattes
valquantité([_nomb, _nom | _reste], _reste,_atr,_valu):-
	nombre(_nomb,_valu),
	nom(_nom,_,_,_atr),!.
	
compare([supérieur_égal,_à],supérieurégal):-à(_à).
compare([inférieur_égal,_à],inférieurégal):-à(_à).
compare([supérieur,_à],supérieur):-à(_à).
compare([inférieur,_à],inférieur):-à(_à).
compare([supérieure,_à],supérieur):-à(_à).
compare([inférieure,_à],inférieur):-à(_à).
compare([supérieurs,_à],supérieur):-à(_à).
compare([inférieurs,_à],inférieur):-à(_à).
compare([supérieures,_à],supérieur):-à(_à).
compare([inférieures,_à],inférieur):-à(_à).
compare([identique,_à],égal):-à(_à).
compare([identiques,_à],égal):-à(_à).
compare([égal,_à],égal):-à(_à).
compare([égale,_à],égal):-à(_à).
compare([égaux,_à],égal):-à(_à).
compare([égales,_à],égal):-à(_à).
compare([différent,_de],différent):-de(_de).

compare([_le,même],égal):-article(_le,_,_).
compare([autant,de],égal).
compare([plus,de],supérieur).
compare([au,maximum],inférieurégal).
compare([au,plus],inférieurégal).
compare([moins,de],inférieur).
compare([au,moins],supérieurégal).
compare([au,minimum],supérieurégal).

quantité(_in, _reste, _at,_x,affirme(_x,avoir,_atri,_valu,vrai)):-
	valquantité(_in,_reste,_atr,_valu),complete(_at,_atr,_atri).
	% au plus 2 kg
quantité([_au,_plus|_rest],_reste,_at,_x,et_calc(affirme(_x,avoir,_atri,_val,vrai),être(_comp,_val,_valu))):-
	compare([_au,_plus],_comp),
	valquantité(_rest,_reste,_atr,_valu),complete(_at,_atr,_atri).
% au plus de 2 kg
quantité([_au,_plus,de |_rest],_reste,_at,_x,et_calc(affirme(_x,avoir,_atri,_val,vrai),être(_comp,_val,_valu))):-
	compare([_au,_plus],_comp),
	valquantité(_rest,_reste,_atr,_valu),complete(_at,_atr,_atri).
% au plus la moyenne du poids des chats	
quantité([_au,_plus|_rest],_reste,_at,_x,et_calc(affirme(_x,avoir,_atri,_val,vrai),et(_calcule,être(_comp,_val,_valu)))):-
	compare([_au,_plus],_comp),
	groupe_nominal_valeur_joker(_rest,_reste,_atr,_valu,_calcule),complete(_at,_atr,_atri).
quantité([de|_in],_reste,_at,_x,_rel):- quantité(_in,_reste,_at,_x,_rel).
quantité([d|_in],_reste,_at,_x,_rel):- quantité(_in,_reste,_at,_x,_rel).

complete(_at,_atr,_atr):-var(_at),!.
complete(_at,_atr,_at):-nonvar(_at).
	
quantité_relative(_in,_reste,_atr,_x,_rel):-
	quantité(_in,_reste,_atr,_x,_rel),!.
quantité_relative([_comp,_à |_in],_reste,_atr,_x,et(affirme(_x,avoir,_atr,_valu,vrai),et(_rel,et_calc(affirme(_y,avoir,_atr,_z,vrai),être(_cmp,_valu,_z))))):-
	compare([_comp,_à],_cmp),
	qr(_in,_rest),
	groupe_nominal_sujet_joker(_rest,_reste,_y,gn(_rel,_,_)).
quantité_relative(_in,_reste,_atr,_x,et(affirme(_x,avoir,_atr,_valu,vrai),et(_rel,et_calc(affirme(_y,avoir,_atr,_z,vrai),être(égal,_valu,_z))))):-
	qr(_in,_rest),
	groupe_nominal_sujet_joker(_rest,_reste,_y,gn(_rel,_,_)).
quantité_relative([_le,même,_atrs,_que|_rest],_reste,_atr,_x,et(affirme(_x,avoir,_atr,_valu,vrai),et(_rel,et_calc(affirme(_y,avoir,_atr,_z,vrai),être(égal,_valu,_z))))):-
	article(_le,_genre,_nombre),que(_que),
	nom(_atrs,_genre,_nombre,_atr),nomde(_atr,_,_),
	groupe_nominal_sujet(_rest,_reste,_y,gn(_rel,_,_)).

qr([_pronom,_de|_rest],_rest):- ce(_pronom,_), de(_de).
qr([_le,même,que,_pronom,_de|_rest],_rest):- article(_le,_,_),	ce(_pronom,_),	de(_de).

% analyse d'un verbe à la forme active, affirmative ou négative *!

forme_verbale_active([_se, _verb | _reste],  _reste,  verbe( _racverbe,  vrai, _nombre)) :-
	se(_se),verbe(_verb,  _nombre,  _racverbe).
forme_verbale_active([_verb | _reste],  _reste,  verbe( _racverbe,  vrai, _nombre)) :-
	verbe(_verb,  _nombre,  _racverbe).
forme_verbale_active([_ne,  _verb, pas,_de | _reste], [joker |_reste], verbe( _racverbe,  faux, _nombre)) :-
	ne(_ne),
	de(_de),
	verbe(_verb, _nombre, _racverbe),!.
forme_verbale_active([_ne,  _verb, pas | _reste], _reste, verbe( _racverbe,  faux, _nombre)) :-
	ne(_ne),
	verbe(_verb, _nombre, _racverbe).
% pour répondre à : que fait toto, le verbe faire reste une variable
forme_verbale_active([fait | _reste],  _reste,  verbe( _faire,  vrai, singulier)).
forme_verbale_active([font | _reste],  _reste,  verbe( _faire,  vrai, pluriel)).

% analyse d'un verbe à la forme passive, affirmative ou négative *!

forme_verbale_passive([_est, _ppassé, par | _reste],  _reste,  verbe( _racverbe,  vrai, _genre, _nombre)) :-
	verbe(_est, _nombre, être),
	ppassé(_ppassé,  _genre, _nombre,  _racverbe).
forme_verbale_passive([_ne, _est, pas, _ppassé, par | _reste], _reste, verbe( _racverbe,  faux, _genre, _nombre)) :-
	ne(_ne),
	verbe(_est, _nombre, être),
	ppassé(_ppassé, _genre, _nombre, _racverbe).
	
%sialors(_racnom,_racverbe,_vrai,_cond,_,_,_,_,_):-
%	writen(ggg,_racnom,_racverbe,_vrai,_cond),nl,fail.
sialors(_racnom,être,vrai,et_cond(_v1,_v2),_x,_x,_racnom,_v2,_v1):-!.
sialors(_racnom,être,vrai,et_calc(_v1,_v2),_x,_x,_racnom,_v2,_v1):-!.
sialors(_racnom,être,vrai,_racnom2,_x,_x, _racnom,_racnom2, true):-!.
sialors(_racnom,être,faux,et_cond(_v1,_v2),_x,_x,_racnom,_nv2,_v1):-neg(_v2,_nv2),!.
sialors(_racnom,être,faux,et_calc(_v1,_v2),_x,_x,_racnom,_nv2,_v1):-neg(_v2,_nv2),!.
sialors(_racnom,être,faux,et(_v1,_v2),_x,_x,_racnom,_nega,true):-neg(et(_v1,_v2),_nega),!.
sialors(_racnom,être,faux,affirme(_x,être,_y,vrai),_x,_x,_racnom,affirme(_x,être,_y,faux),true):-!.
sialors(_racnom,être,faux,affirme(_x,avoir,_y,_z,vrai),_x,_x,_racnom,affirme(_x,avoir,_y,_z,faux),true):-!.
sialors(_racnom,avoir,_vrai,affirme(_z,avoir,_p,_vrai1),_x,_y,_racnom,affirme(_x,avoir,_p,_vrai),true):-!.
sialors(_racnom,avoir,_vrai,affirme(_z,avoir,_p,_v,_vrai1),_x,_y,_racnom,affirme(_x,avoir,_p,_v,_vrai),true):-!.

sialors(_racnom,avoir,vrai,et(_r,_q),_x,_x,_racnom,et(_r,_q),_true):-!.
sialors(_racnom,avoir,faux,et(_r,_q),_x,_x,_racnom,ou(_nr,_nq),_true):-!,neg(r,nr),neg(_q,nq).
sialors(_racnom,avoir,vrai,et_cond(_v1,_v2),_x,_x,_racnom,_v2,_v1):-!.
sialors(_racnom,avoir,vrai,et_calc(_v1,_v2),_x,_x,_racnom,_v2,_v1):-!.
sialors(_racnom,avoir,faux,et_cond(_v1,_v2),_x,_x,_racnom,_nv2,_v1):-neg(_v2,_nv2),!.
sialors(_racnom,avoir,faux,et_calc(_v1,_v2),_x,_x,_racnom,_nv2,_v1):-neg(_v2,_nv2),!.

%sialors(_racnom,_racverbe,_vrai,et_cond(_s,affirme(_a,avoir,_b,_c,_v)),_x,_x,_racnom,affirme(_a,avoir,_b,_c,_v),_s):-!.
sialors(_racnom,_racverbe,_vrai,true,_x,_y,_racnom,affirme(_x,_racverbe,_vrai),true):-!.
sialors(_racnom,_racverbe,_vrai,_racnom2,_x,_y,_racnom,affirme(_x,_racverbe,_y,_vrai),_racnom2).

mettre_inconnu(affirme(_x,_verbe,_vrai) , affirme(_x,_verbe,inconnu)).
mettre_inconnu(affirme(_x,_verbe,_y,_vrai) , affirme(_x,_verbe,_y,inconnu)).
mettre_inconnu(affirme(_x,_verbe,_y,_z,_vrai) , affirme(_x,_verbe,_y,_z,inconnu)).

vrai(affirme(_x,_verbe,vrai)).
vrai(affirme(_x,_verbe,_y,vrai)).
vrai(affirme(_x,_verbe,_y,_z,vrai)).

neg(affirme(_x,_verbe,vrai) , affirme(_x,_verbe,faux)).
neg(affirme(_x,_verbe,faux) , affirme(_x,_verbe,vrai)).
neg(affirme(_x,_verbe,_y,vrai) , affirme(_x,_verbe,_y,faux)).
neg(affirme(_x,_verbe,_y,faux) , affirme(_x,_verbe,_y,vrai)).
neg(affirme(_x,_verbe,_y,_z,vrai) , affirme(_x,_verbe,_y,_z,faux)).
neg(affirme(_x,_verbe,_y,_z,faux) , affirme(_x,_verbe,_y,_z,vrai)).

neg(et(_a,_b),ou(_nega,_negb)):-
	neg(_a,_nega),neg(_b,_negb).
neg(ou(_a,_b),et(_nega,_negb)):-
	neg(_a,_nega),neg(_b,_negb).
neg(true,false).
neg(false,true).
neg(et_cond(_rel,_aff), et_cond(_rel,_naff)) :- neg(_aff,_naff).
neg(et_calc(_aff,_rel), et_calc(_aff,_nrel)) :- neg(_rel,_nrel).

neg(être(_cmp,_a,_b), être(_ncmp,_a,_b)) :- nega(_cmp,_ncmp).

nega(inférieur,supérieurégal).
nega(supérieur,inférieurégal).
nega(supérieurégal,inférieur).
nega(inférieurégal,supérieur).
nega(égal,différent).
nega(différent,égal).

réciproque(phrase(_si,_alorsv,true),phrase(_alorsv,_si,true)):-!.
réciproque(phrase(_si,_alorsv,_alors),phrase(et(_alors,_alorsv),_si,true)).

% on controle la phrase (ou son équivalent), selon que l'on trouve ou non un affirme(_x,être,xxx,vrai) simplifiable en _x=xxx dans la condition (ou la conclusion)
traiter( phrase(_si,_alorsv,true)):-
	writen(traiter,_alorsv,si,_si),nl,
	transforme(_si,_tsi,true),!,
%	writen(transformex,_alorsv,_tsi),nl,
	controle(_alorsv,_tsi,'je savais déjà que','c''est incohérent avec ce que tu m''as déjà dit'),
	enregistrer(_alorsv,_si),
	flag(équivalent),
	neg(_si,_negsi),
	neg(_alorsv,_negalorsv),
	enregistrer(_negsi,_negalorsv).
traiter( phrase(_si,_alorsv,true)):-
	neg(_si,_negsi),
	neg(_alorsv,_negalorsv),
	transforme(_negalorsv,_tnegalorsv,true),!,
%	writen(transformex,_negsi,_tnegalorsv),nl,
	controle(_negsi,_tnegalorsv,'je savais déjà que','c''est incohérent avec ce que tu m''as déjà dit'),
	enregistrer(_negsi,_negalorsv),
	flag(équivalent),
	enregistrer(_alorsv,_si).
traiter( phrase(_si,_alorsv,true)):-
	enregistrer(_alorsv,_si).
	
traiter( phrase(_si,_alorsv,_alors)) :-_alors \= true,
writen(si,_si),nl,
writen(alors,_alors),nl,
writen(alorsv,_alorsv),nl,
	writen(traiter,_alorsv,si,_si,_alors),nl,
	transforme(et(_si,_alors),_tsi,true),!,
	writen(transformex,_alorsv,_tsi),nl,
	controle(_alorsv,_tsi,'je savais déjà que','c''est incohérent avec ce que tu m''as déjà dit'),
	enregistrer(_alorsv,et(_si,_alors)),
	flag(équivalent),
	neg(_si,_negsi),
	neg(_alors,_negalors),
	neg(_alorsv,_negalorsv),
	enregistrer(_negsi,et(_alors,_negalorsv)),
	enregistrer(_negalors,et(_si,_negalorsv)).

traiter( phrase(_si,_alorsv,_alors)) :-_alors \= true,
	traiter(phrase(et(_si,_alors),_alorsv,true)).

nocontrole :-
	flag(controle),!,fail.
nocontrole.

controle(_alors,_si,_oui,_non):-
%	writen(kkk,_alors,_si),nl,
	nocontrole,!.
controle(_alors,_si,_oui,_non):-
	call(_si),
	call(_alors),
	error_log(_oui,(_alors,si,_si)),!,fail.
controle(_alors,_si,_oui,_non) :-
	neg(_alors,_negalors),
	call(_si),
	call(_negalors),
	error_log(_non,(_negalors,si,_si)),!,fail.
controle(_alors,_si,_oui,_non).

error_log(_a,_phrase):-
	flag(outputfichier),
	write(_a),nl,write(_phrase),nl,fail.
error_log(_a,_phrase):-
	writeo(_a),nl(user_output),writeno(_phrase),nl(user_output).
	
retirer_noncompris(_phrase):-
	flag(noncompris),!,
	retractall(flag(noncompris)).
retirer_noncompris(_phrase):-
	error_log('phrase ambigue :',_phrase).

transforme(et_cond(_a,_b),et_cond(_ta,_tb),_plus):-
	transforme(_a,_ta,_xa),
	transforme(_b,_tb,_xb),ajoute(_xa,_xb,_plus),!.
transforme(et(_a,_b),et(_ta,_tb),_plus):-
	transforme(_a,_ta,_xa),
	transforme(_b,_tb,_xb),ajoute(_xa,_xb,_plus),!.
transforme(ou(_a,_b),ou(_ta,_tb),_plus):-
	transforme(_a,_ta,xa),
	transforme(_b,_tb,xb),ajoute(_xa,_xb,_plus),!.
transforme(affirme(_x,être,_y,vrai),_x=_y,true):-!.
transforme(_a,_a,false).

ajoute(true,true,true).
ajoute(true,false,true).
ajoute(false,true,true).
ajoute(false,false,false).

enregistrer(_x,ou(_a,_b)):-
	enregistrer(_x,_a),
	enregistrer(_x,_b),!.
enregistrer(false,_cond):-!.
enregistrer(true,_cond):-!.
enregistrer(ou(_a,_b),_cond):-
	neg(_a,_nega),
	neg(_b,_negb),
	enregistrer(_a,et(_negb,_cond)),
	enregistrer(_b,et(_nega,_cond)),!.
enregistrer(et(_a,_b),_cond):-
	enregistrer(_a,_cond),
	enregistrer(_b,_cond),!.
enregistrer(et_cond(_a,_b),_cond):-
	enregistrer(_b,et(_a,_cond)),!.
enregistrer(et_calc(_a,_b),_cond):-
	enregistrer(_b,et(_a,_cond)),!.
enregistrer(_x,ou(_a,_b)):-
	enregistrer(_x,_a),
	enregistrer(_x,_b),!.
enregistrer(_a,_cond):-
	flat(_cond,[],_liste),
	reverse(_liste,_list),
	asserter(_a,_list).

flat(et_cond(_a,_b),_lin,_lout2):-!,
	flat(_a,_lin,_lout1),
	flat(_b,_lout1,_lout2).
flat(et(_a,_b),_lin,_lout2):-!,
	flat(_a,_lin,_lout1),
	flat(_b,_lout1,_lout2).
flat(true,_lin,_lin):-!.
flat(_a,_lin,[_a|_lin]).

asserter(_v,_l):-
		write('  enregistre : '),
		writen((_v:-_l)),nl,
		write_double((_v:-_l)),
		assert(_v,_l).
		
assert(_v,[_a]):-!,assertz((_v:-(_a))).
assert(_v,[_a,_b]):-!,assertz((_v:-(_a,_b))).
assert(_v,[_a,_b,_c]):-!,assertz((_v:-(_a,_b,_c))).
assert(_v,[_a,_b,_c,_d]):-!,assertz((_v:-(_a,_b,_c,_d))).
assert(_v,[_a,_b,_c,_d,_e]):-!,assertz((_v:-(_a,_b,_c,_d,_e))).
assert(_v,[_a,_b,_c,_d,_e,_f]):-!,assertz((_v:-(_a,_b,_c,_d,_e,_f))).
assert(_v,[_a,_b,_c,_d,_e,_f,_g]):-!,assertz((_v:-(_a,_b,_c,_d,_e,_f,_g))).
assert(_v,[_a,_b,_c,_d,_e,_f,_g,_h]):-!,assertz((_v:-(_a,_b,_c,_d,_e,_f,_g,_h))).
assert(_v,[_a,_b,_c,_d,_e,_f,_g,_h,_i]):-!,assertz((_v:-(_a,_b,_c,_d,_e,_f,_g,_h,_i))).
assert(_v,[_a,_b,_c,_d,_e,_f,_g,_h,_i,_j]):-!,assertz((_v:-(_a,_b,_c,_d,_e,_f,_g,_h,_i,_j))).

% une patte
prepnomde([_le,_nom2|_reste],_reste,_rnom2) :-
	article(_le,_genre,_nombre),
	nom(_nom2, _genre, _nombre, _rnom2),nomde(_rnom2,_,_).
% du miel
prepnomde([_prep,_nom2|_reste],_reste,_rnom2) :-
	prep(_prep),
	nom(_nom2, _, _, _rnom2),nomde(_rnom2,_,_).
% dans l eau
prepnomde([_prep,_le,_nom2|_reste],_reste,_rnom2) :-
	prep(_prep),
	article(_le,_genre,_nombre),
	nom(_nom2, _genre, _nombre, _rnom2),nomde(_rnom2,_,_).

%  une petite taille
prepnomde([_le,_adj2,_nom2|_reste],_reste,_rnom2,_radj2) :-
	article(_le,_genre,_nombre),
	nom(_nom2, _genre, _nombre, _rnom2),nomde(_rnom2,_,_),
	adjectif(_adj2,_genre,_nombre,_radj2,_).
% une taille petite
prepnomde([_le,_nom2,_adj2|_reste],_reste,_rnom2,_radj2) :-
	article(_le,_genre,_nombre),
	nom(_nom2, _genre, _nombre, _rnom2),nomde(_rnom2,_,_),
	adjectif(_adj2,_genre,_nombre,_radj2,_).
% dans les lieux humides
prepnomde([_prep,_le,_nom2,_adj2|_reste],_reste,_rnom2,_radj2) :-
	prep(_prep),
	article(_le,_genre,_nombre),
	nom(_nom2, _genre, _nombre, _rnom2),nomde(_rnom2,_,_),
	adjectif(_adj2,_genre,_nombre,_radj2,_).
% des terriers sous terre, des ongles en corne
prepnomde([_le,_nom2,_prep,_adj2|_reste],_reste,_rnom2,_radj2) :-
	article(_le,_genre,_nombre),
	nom(_nom2, _genre, _nombre, _rnom2),nomde(_rnom2,_,_),
	prep(_prep),
	nom(_adj2,_genre2,_nombre2,_radj2).
% des nids sur la terre
prepnomde([_le,_nom2,_prep,_la,_adj2|_reste],_reste,_rnom2,_radj2) :-
	article(_le,_genre,_nombre),
	nom(_nom2, _genre, _nombre, _rnom2),nomde(_rnom2,_,_),
	prep(_prep),
	article(_la,_genre2,_nombre2),
	nom(_adj2,_genre2,_nombre2,_radj2).

% le vocabulaire

verbe(est,singulier,être).
verbe(sont,pluriel,être).
verbe(a,singulier,avoir).
verbe(ont,pluriel,avoir).

verbe(mange,singulier,manger).
verbe(mangent,pluriel,manger).
verbe(vole,singulier,voler).
verbe(volent,pluriel,voler).
verbe(produit,singulier,produire).
verbe(produisent,pluriel,produire).
verbe(rase,singulier,raser).
verbe(rasent,pluriel,raser).

verbe(traverse,singulier,traverser).
verbe(traversent,pluriel,traverser).
verbe(touche,singulier,toucher).
verbe(touchent,pluriel,toucher).
verbe(sépare,singulier,séparer).
verbe(séparent,pluriel,séparer).
verbe(_forme,_nombre,_infinitif) :- verbe_declaré(_forme,_nombre,_infinitif).

ppassé(mangé,masculin,singulier,manger).
ppassé(mangée,féminin,singulier,manger).
ppassé(mangés,masculin,pluriel,manger).
ppassé(mangées,féminin,pluriel,manger).

ppassé(traversé,masculin,singulier,traverser).
ppassé(traversés,masculin,pluriel,traverser).
ppassé(traversées,féminin,pluriel,traverser).
ppassé(traversée,féminin,singulier,traverser).
ppassé(touché,masculin,singulier,toucher).
ppassé(touchée,féminin,singulier,toucher).
ppassé(touchés,masculin,pluriel,toucher).
ppassé(touchées,féminin,pluriel,toucher).
ppassé(séparé,masculin,singulier,séparer).
ppassé(séparée,féminin,singulier,séparer).
ppassé(séparées,fémininin,pluriel,séparer).
ppassé(séparés,masculin,pluriel,séparer).
ppassé(_masculin,_féminin,_mascplur,_femplur) :- ppassé_declaré(_masculin,_féminin,_mascplur,_femplur).

pprésent(étant,être).
pprésent(ayant,avoir).

pprésent(mangeant,manger).
pprésent(aboyant,aboyer).
pprésent(volant,voler).

pprésent(traversant,traverser).
pprésent(touchant,toucher).
pprésent(séparant,séparer).
pprésent(_présent,_infinitif) :- pprésent_declaré(_présent,_infinitif).

nom(animal,animaux,masculin).
nom(vertebré,vertebrés,masculin).
nom(mammifère,mammifères,masculin).
nom( tétrapode , tétrapodes , masculin ).

nom(primate,primates,masculin).
nom(homme,hommes,masculin).
nom(femme,femmes,féminin).
nom( singe , singes , masculin ).
nom( lémurien , lémuriens , masculin ).
nom(chimpanzé,chimpanzés,masculin).
nom(babouin,babouins,masculin).
nom(gorille,gorilles,masculin).
nom( paresseux , paresseux , masculin ).
nom(cétacé,cétacés,masculin).
nom( narval , narvals , masculin ).
nom(baleine,baleines,féminin).
nom( rorqual , rorquals , masculin ).
nom(baleineau,baleinaux,masculin).
nom( cachalot , cachalots , masculin ).
nom(dauphin,dauphins,masculin).
nom(marsouin,marsouins,masculin).

nom( phocidé , phocidés , masculin ).
nom( phoque , phoques , masculin ).
nom( morse , morses , masculin ).
nom( otarie , otaries , féminin ).
nom( sirénien , siréniens , masculin ).
nom( dugong , dugongs , masculin ).
nom( lamentin , lamentins , masculin ).
nom(canidé,canidés,masculin).
nom(chien,chiens,masculin).
nom(chienne,chienne,féminin).
nom(chiot,chiots,masculin).
nom( lévrier , lévriers , masculin ).
nom( chacal , chacals , masculin ).
nom(loup,loups,masculin).
nom(louve,louves,féminin).
nom(louveteau,louveteaux,masculin).

nom( ursidé , ursidés , masculin ).
nom( ours , ours , masculin ).
nom(ourson,oursons,masculin).
nom(panda,pandas,masculin).
nom(mustélidé,mustélidés,masculin).
nom( belette , belettes , féminin ).
nom( martre , martres , féminin ).
nom( blaireau , blaireaux , masculin ).
nom( loutre , loutres , féminin ).
nom(hermine,hermines,féminin).
nom( vison , visons , masculin ).
nom(furet,furets,masculin).
nom(fouine,fouines,féminin).
nom(putois,putois,masculin).

nom(mouton,moutons,masculin).
nom(agneau,agneaux,masculin).
nom(bélier,béliers,masculin).
nom(brebis,brebis,féminin).
nom(chèvre,chèvres,féminin).
nom(bouc,boucs,masculin).

nom(ongulé,ongulés,masculin).
nom( rhinocéros , rhinocéros , masculin ).
nom( tapir , tapirx , masculin ).

nom(ruminant,ruminants,masculin).
nom(bovidé,bovidés,masculin).
nom( buffle , buffles , masculin ).
nom( gnou , gnous , masculin ).
nom( zébu , zébus , masculin ).
nom( bison , bisons , masculin ).
nom( gazelle , gazelles , féminin ).
nom( capriné , caprinés , masculin ).
nom( bouquetin , bouquetins , masculin ).
nom( chamois , chamois , masculin ).
nom(mouflon,mouflons,masculin).

nom(cervidé,cervidés,masculin).
nom(cerf,cerfs,masculin).
nom(biche,biches,féminin).
nom(daim,daims,masculin).
nom(faon,faons,masculin).
nom(chevreuil,chevreuils,masculin).
nom( élan , élans , masculin ).
nom( renne , rennes , masculin ).

nom(équidé,équidés,masculin).
nom(cheval,chevaux,masculin).
nom( poney , poneys , masculin ).
nom(jument,juments,féminin).
nom(poulain,poulains,masculin).
nom(âne,ânes,masculin).
nom(ânesse,ânesses,féminin).
nom(zèbre,zèbres,masculin).

nom(chiroptère,chiroptères,masculin).
nom(rongeur,rongeurs,masculin).
nom(souris,souris,féminin).
nom( cobaye , cobayes , masculin ).
nom(castor,castors,masculin).
nom(écureuil,écureuils,masculin).
nom( marmotte , marmottes , féminin ).
nom( loir , loirs , masculin ).
nom( rat , rats , masculin ).
nom( hamster , hamsters , masculin ).
nom(chinchilla,chinchillas,masculin).
nom(mulot,mulots,masculin).
nom(ragondin,ragondins,masculin).

nom( girafidé , girafidés , masculin ).
nom(girafe,girafes,féminin).
nom(girafon,girafons,masculin).
nom( okapi , okapis , masculin ).

nom( éléphant , éléphants , masculin ).
nom(éléphanteau,éléphanteaux,masculin).
nom(antilope,antilopes,féminin).
nom(hippopotame,hippopotames,masculin).

nom(chamelidé,chamelidés,masculin).
nom(chameau,chameaux,masculin).
nom(chamelle,chamelles,féminin).
nom(dromadaire,dromadaires,masculin).
nom( lama , lamas , masculin ).

nom( eulypotypla , eulypotyplas , masculin ).
nom( musaraigne , musaraignes , féminin ).
nom( taupe , taupes , féminin ).
nom( hérisson , hérissons , masculin ).

nom( lagomorphe , lagomorphes , masculin ).
nom( lièvre , lièvres , masculin ).
nom(lapin,lapins,masculin).
nom(lapine,lapines,féminin).
nom(lapereau,lapereaux,masculin).

nom(suiné,suinés,masculin).
nom(cochon,cochons,masculin).
nom(truie,truies,féminin).
nom(verrat,verrats,masculin).
nom(porcelet,porcelets,masculin).
nom(porc,porcs,masculin).
nom(sanglier,sangliers,masculin).
nom( phacochère , phacochères , masculin ).
nom(pécari,pécaris,masculin).

nom(marsupial,marsupiaux,masculin).
nom( opossum , opossums , masculin ).
nom( kangourou , kangouroux , masculin ).
nom( koala , koalax , masculin ).
nom( wallabies , wallabies , masculin ).

nom(félidé,félidés,masculin).
nom(féliforme,féliformes,masculin).
nom(chat,chats,masculin).
nom(chatte,chattes,féminin).
nom(chaton,chatons,masculin).
nom(tigre,tigres,masculin).
nom(tigresse,tigresses,féminin).
nom(lion,lions,masculin).
nom(lionne,lionnes,féminin).
nom(lionceau,lionceaux,masculin).
nom(léopard,léopards,masculin).
nom(jaguar,jaguars,masculin).
nom( lynx , lynx , masculin ).
nom( panthère , panthères , féminin ).
nom( guépard , guépards , masculin ).
nom( hyène , hyènes , féminin ).
nom( mangouste , mangoustes , féminin ).


nom(vache,vaches,féminin).
nom(taureau,taureaux,masculin).
nom(taurillon,taurillons,masculin).
nom(boeuf,boeufs,masculin).
nom(veau,veaux,masculin).
nom(génisse,génisses,féminin).
nom(renard,renards,masculin).
nom(renarde,renardes,féminin).

nom(oiseau,oiseaux,masculin).

nom( ratite , ratites , masculin ).
nom( émeu , émeux , masculin ).
nom( casoar , casoars , masculin ).
nom(autruche,autruches,féminin).
nom( kiwi , kiwis , masculin ).
nom( neognathae , neognathaes , masculin ).
nom( albatros , albatros , masculin ).
nom( cormoran , cormorans , masculin ).
nom( pétrel , pétrels , masculin ).
nom( sphénisciforme , sphénisciformes , masculin ).
nom( manchot , manchots , masculin ).
nom( échassier , échassiers , masculin ).
nom( ardeidé , ardeidés , masculin ).
nom( héron , hérons , masculin ).
nom( aigrette , aigrettes , féminin ).
nom( butor , butors , masculin ).
nom( ibis , ibis , masculin ).
nom( ciconiidé , ciconiidés , masculin ).
nom( cigogne , cigognes ,féminin ).
nom( flamant , flamants , masculin ).
nom( anatidé , anatidés , masculin ).
nom( cygne , cygnes , masculin ).
nom( oie , oies , féminin ).
nom( jars , jars , masculin ).
nom( canard , canards , masculin ).
nom(cane, cannes, féminin).
nom(caneton,cannetons,masculin).
nom( sarcelle , sarcelles , féminin ).
nom( laridé , laridés , masculin ).
nom( goéland , goélands , masculin ).
nom(mouette,mouettes,féminin).
nom( rapace , rapaces , masculin ).
nom( falconidé , falconidés , masculin ).
nom(faucon,faucons,masculin).
nom( condor , condors , masculin ).
nom(vautour,vautours,masculin).
nom( accipitridé , accipitridés , masculin ).
nom(aigle,aigles,masculin).
nom( buse , buses , féminin ).
nom( épervier , éperviers , masculin ).
nom( milan , milans , masculin ).
nom( strigidé , strigidés , masculin ).
nom( chouette , chouettes , féminin ).
nom( hibou , hiboux , masculin ).
nom( effraie , effraies , masculin ).
nom( galliforme , galliformes , masculin ).
nom( poule , poules , féminin ).
nom(coq,coqs,masculin).
nom(poulet,poulets,masculin).
nom(poussin,poussins,masculin).
nom( gélinotte , gélinottes , féminin ).
nom( faisan , faisans , masculin ).
nom( perdrix , perdrix , féminin ).
nom( caille , cailles , féminin ).
nom( paon , paons , masculin ).
nom( pintade , pintades , féminin ).
nom( dindon , dindons , masculin ).
nom(dinde,dindes,féminin).
nom(dindonneau,dindonneaux,masculin).
nom( pélican , pélicans , masculin ).
nom( gruiforme , gruiformes , masculin ).
nom( grue , grues , féminin ).
nom( outarde , outardes , féminin ).
nom( bécasse , bécasses , féminin ).
nom( courlis , courlis , masculin ).
nom( alcidé , alcidés , masculin ).
nom( pingouin , pingouins , masculin ).
nom( macareux , macareux , masculin ).
nom( columbidé , columbidés , masculin ).
nom( colombe , colombes , féminin ).
nom( pigeon , pigeons , masculin ).
nom( tourterelle , tourterelles , féminin ).
nom( cuculiforme , cuculiformes , masculin ).
nom( coucou , coucoux , masculin ).
nom( psittaciforme , psittaciformes , masculin ).
nom(perroquet,perroquets,masculin).
nom( cacatoès , cacatoès , masculin ).
nom( aras , aras , masculin ).
nom( perruche , perruches , féminin ).
nom( micropidiforme , micropidiformes , masculin ).
nom( martinet , martinets , masculin ).
nom( colibri , colibris , masculin ).
nom( corvidé , corvidés , masculin ).
nom( corbeau , corbeaux , masculin ).
nom( corneille , corneilles , féminin ).
nom( choucas , choucas , masculin ).
nom( pie , pies , féminin ).
nom( geai , geais , masculin ).
nom( passereau , passereaux , masculin ).
nom( turdidé , turdidés , masculin ).
nom( merle , merles , masculin ).
nom( grive , grives , féminin ).
nom( rossignol , rossignols , masculin ).
nom( alouette , alouettes , fémininin ).
nom( canari , canaris , masculin ).
nom( tanagridé , tanagridés , masculin ).
nom( pinson , pinsons , masculin ).
nom( serein , serein , masculin ).
nom( chardonneret , chardonnerets , masculin ).
nom( bouvreuil , bouvreuils , masculin ).
nom( ortolan , ortolans , masculin ).
nom( mésange , mésanges , féminin ).
nom( fauvette , fauvettes , féminin ).
nom( roitelet , roitelets , masculin ).
nom( bergeronnette , bergeronnettes , féminin ).
nom( étourneau , étourneaux , masculin ).
nom( moineau , moineaux , masculin ).
nom( loriot , loriots , masculin ).
nom( hirondelle , hirondelles , féminin ).
nom( mainate , mainates , masculin ).

nom(invertebré,invertebrés,masculin).
nom(amphibien,amphibiens,masculin).
nom(tétard,tétards,masculin).
nom(reptile,reptiles,masculin).
nom( crocodilien , crocodiliens , masculin ).
nom( crocodile , crocodiles , masculin ).
nom( alligator , alligators , masculin ).
nom( caïman , caïmans , masculin ).
nom( lacertilien , lacertiliens , masculin ).
nom( lézard , lézards , masculin ).
nom( iguane , iguanes , masculin ).
nom( caméléon , caméléons , masculin ).
nom( varan , varans , masculin ).
nom( tortue , tortues , féminin ).
nom(serpent,serpents,masculin).
nom( vipère , vipères , féminin ).
nom( couleuvre , couleuvres , féminin ).
nom( boa , boas , masculin ).
nom( naja , najas , masculin ).
nom( cobra , cobras , masculin ).
nom( orvet , orvets , masculin ).
nom(grenouille,grenouilles,féminin).
nom(rainette,rainettes,féminin).
nom( apode , apodes , masculin ).
nom( anoure , anoures , masculin ).
nom( crapaud , crapauds , masculin ).
nom( urodèle , urodèles , masculin ).
nom( triton , tritons , masculin ).
nom( salamandre , salamandres , féminin ).

nom(insecte,insectes,masculin).
nom(hétérométabole,hétérométaboles,masculin).
nom(hétéroptère,hétéroptères,masculin).
nom(plécoptère,plécoptères,masculin).
nom(homoptère,homoptères,masculin).
nom(éphémèroptère,éphémèroptères,masculin).
nom(éphémère,éphémères,masculin).
nom(holométabole,holométaboles,masculin).
nom(siphonactère,siphonactères,masculin).
nom(odonate,odonates,masculin).
nom( libellule , libellules , féminin ).
nom(demoiselle,demoiselles,féminin).
nom( termite , termites , masculin ).
nom(dictoptère,dictoptères,masculin).
nom( cafard , cafards , masculin ).
nom(cancrelas,cancrelas,masculin).
nom( blatte , blattes , féminin ).
nom( mante , mantes , féminin ).
nom( fourmi , fourmis , féminin ).
nom( diptère , diptères , masculin ).
nom( mouche , mouches , féminin ).
nom( taon , taons , masculin ).
nom( moustique , moustiques , masculin ).
nom(lépidoptère,lépidoptères,masculin).
nom(mite,mites,féminin).
nom(teigne,teignes,féminin).
nom( papillon , papillons , masculin ).
nom( chenille , chenilles , féminin ).
nom(dermaptère,dermaptères,masculin).
nom(trichoptère,trichoptères,masculin).
nom( coléoptère , coléoptères , masculin ).
nom(scarabé,scarabés,masculin).
nom( hanneton , hannetons , masculin ).
nom( doryphore , doryphore , masculin ).
nom( coccinelle , coccinelles , féminin ).
nom( poux , poux , masculin ).
nom( parasite , parasites , masculin ).
nom( puce , puces , féminin ).
nom( morpion,morpions,masculin).
nom( cygale , cygales , féminin ).
nom(puceron,pucerons,masculin).
nom( punaise , punaises , féminin ).
nom( cochenille , cochenilles , féminin ).
nom( hyménoptère , hyménoptères , masculin ).
nom( orthoptère , orthoptères , masculin ).
nom( grillon , grillons , masculin ).
nom( criquet , criquets , masculin ).
nom( scolopendre , scolopendres , masculin ).
nom(araignée,araignées,féminin).
nom( tarentule , tarentules , féminin ).
nom(abeille,abeilles,féminin).
nom(bourdon,bourdons,masculin).
nom(guèpe,guèpes,féminin).
nom(frelon,frelons,masculin).
nom(sauterelle,sauterelles,féminin).

nom(crustacé,crustacés,masculin).
nom( crabe , crabes , masculin ).
nom( homard , homards , masculin ).
nom( langouste , langoustes , féminin ).
nom( écrevisse , écrevisses , féminin ).
nom( crevette , crevettes , féminin ).
nom(myriapode,myriapodes,masculin).
nom(ver,vers,masculin).
nom( lombric , lombrics , masculin ).
nom( sangsue , sangsues , féminin ).
nom( ténia , ténias , masculin ).

nom(gastéropode,gastéropodes,masculin).
nom( escargot , escargots , masculin ).
nom( limace , limaces , féminin ).
nom( bigorneau , bigorneaux , masculin ).
nom( scaphopode , scaphopodes , masculin ).
nom(bivalve,bivalves,masculin).
nom( huitre , huitres , féminin ).
nom( moule , moules , féminin ).
nom( palourde , palourdes , féminin ).
nom(céphalopode,céphalopodes,masculin).
nom( calmar , calmars , masculin ).
nom(encornet,encornets,masculin).
nom( pieuvre , pieuvres , féminin ).
nom(poulpe,poulpes,masculin).
nom(seiche,seiches,féminin).
nom(cnidaire,cnidaires,masculin).
nom( corail , coraux , masculin ).
nom( hydre , hydres , féminin ).
nom( méduse , méduses , féminin ).
nom( oursin , oursins , masculin ).
nom(échinoderme,échinodermes,masculin).
nom(arachnide,arachnides,masculin).
nom(arthropode,arthropodes,masculin).
nom( scorpion , scorpions , masculin ).
nom( acarien , acariens , masculin ).
nom( tique , tiques , masculin ).
nom(mollusque,mollusques,masculin).
nom(annelidé,annelidés,masculin).
nom( spongiaire , spongiaires , masculin ).
nom( éponge , éponges , féminin ).
nom(palmipède,palmipèdes,masculin).

nom(poisson,poissons,masculin).
nom( pinranha , pinranhas , masculin ).
nom( grondin , grondins , masculin ).
nom( perche , perches , féminin ).
nom( rouget , rougets , masculin ).
nom( mulet , mulets , masculin ).
nom( capitaine , capitaines , masculin ).
nom( gobie , gobies , féminin ).
nom(vive,vives,féminin).
nom( thon , thons , masculin ).
nom( maquereau , maquereaux , masculin ).
nom( turbot , turbots , masculin ).
nom( flétan , flétans , masculin ).
nom( limande , limandes , féminin ).
nom( sole , soles , féminin ).
nom(agnathe,agnathes,masculin).
nom(lamproie,lamproies,féminin).
nom(chondrichtye,chondrichtyes,masculin).
nom(raie,raies,féminin).
nom(roussette,roussettes,féminin).
nom(anguille,anguilles,féminin).
nom(requin,requins,masculin).
nom( espadon , espadons , masculin ).
nom(ostéichien,ostéichiens,masculin).
nom( gardon , gardons , masculin ).
nom(esturgeon,esturgeons,masculin).
nom(morue,morues,féminin).
nom(lotte,lottes,féminin).
nom(merlan,merlans,masculin).
nom(haddock,haddocks,masculin).
nom( hippocampe , hippocampes , masculin ).
nom(élopomorphe,élopomorphes,masculin).
nom(congre,congres,masculin).
nom(murène,murènes,féminin).
nom(salmoniforme,salmoniformes,masculin).
nom(saumon,saumons,masculin).
nom( truite , truites , féminin ).
nom(éperlan,éperlans,masculin).
nom(brochet,brochets,masculin).
nom(ostariophysaire,ostariophysaires,masculin).
nom(carpe,carpes,féminin).
nom(piranha,piranhas,masculin).
nom(percomorphe,percomorphes,masculin).
nom(dorade,dorades,féminin).
nom(rascasse,rascasses,féminin).

nom(_attribut,_genre,_,_attribut) :- nom(_attribut,_attribut,_genre),!.
nom(_attribut,_genre,singulier,_attribut) :- nom(_attribut,_,_genre).
nom(_attribut,_genre,pluriel,_attr) :- nom(_attr,_attribut,_genre).
nom(_attribut,_genre,_singulier,_attribut) :- nomde(_attribut,_attribut,_genre),!.
nom(_attribut,_genre,singulier,_attribut) :- nomde(_attribut,_,_genre).
nom(_attribut,_genre,pluriel,_attr) :- nomde(_attr,_attribut,_genre).
nom(_singulier,_genre,singulier,_singulier) :- nom_declaré(_singulier,_,_genre).
nom(_pluriel,_genre,pluriel,_singulier) :- nom_declaré(_singulier,_pluriel,_genre).


nom_composé( [porc,épic] , [porcs,épics] , masculin ,porc_épic).
nom_composé( [perce,oreille] , [perces,oreille] , masculin ,perce_oreille).
nom_composé( [orang,outan] , [orangs,outans] , masculin,orang_outan ).
nom_composé( [bernard,l,érmite] , [bernard,l,érmite] , masculin,bernard_l_érmite ).
nom_composé( [coquille,saint,jacques] , [coquilles,saint,jacques] , féminin,coquille_saint_jacques ).
nom_composé( [étoile,de,mer] , [étoiles,de,mer] , féminin,étoile_de_mer ).
nom_composé( [anémone,de,mer] , [anémones,de,mer] , féminin,anémone_de_mer ).
nom_composé([coq,de,bruyère],[coqs,de,bruyère],masculin,coq_de_bruyère ).
nom_composé([poisson,volant],[poissons,volant],masculin,poisson_volant).
nom_composé([martin,pécheur],[martins,pécheurs],masculin,martin_pécheur).
nom_composé([rouge,gorge],[rouges,gorges],masculin,rouge_gorge).
nom_composé([chauve,souris],[chauves,souris],féminin,chauve_souris).
nom_composé([cochon,d,inde],[cochons,d,inde],masculin,cochon_d_inde).
nom_composé([raton,laveur],[ratons,laveurs],masculin,raton_laveur).

adjectif(pourrie,féminin,singulier,pourri,fraicheur).
adjectif(fraiche,féminin,singulier,frais,fraicheur).
adjectif(dominante,féminin,singulier,dominant,pouvoir).
adjectif(mâle,_genre,singulier,mâle,sexe).
adjectif(femelle,_genre,singulier,femelle,sexe).
adjectif(masculin,_genre,singulier,mâle,sexe).
adjectif(féminin,_genre,singulier,femelle,sexe).
adjectif(vieux,_,_,vieux,âge).

adjectif(_adjectif,_,singulier,_adjectif,_attribut) :- ladjectif(_adjectif,_adjectif,_mp,_mp,_attribut).
adjectif(_adjectif,_,pluriel,_m,_attribut) :- ladjectif(_m,_m,_adjectif,_adjectif,_attribut),!.
adjectif(_adjectif,masculin,singulier,_adjectif,_attribut) :- ladjectif(_adjectif,_f,_mp,_fp,_attribut),_adjectif\=_f.
adjectif(_adjectif,féminin,singulier,_m,_attribut) :- ladjectif(_m,_adjectif,_mp,_fp,_attribut),_adjectif\=_m.
adjectif(_adjectif,masculin,pluriel,_m,_attribut) :- ladjectif(_m,_f,_adjectif,_fp,_attribut),_f\=_m.
adjectif(_adjectif,féminin,pluriel,_m,_attribut) :- ladjectif(_m,_f,_mp,_adjectif,_attribut),_f\=_m.

ladjectif(petit,petite,petits,petites,taille).
ladjectif(grand,grande,grands,grandes,taille).
ladjectif(moyen,moyenne,moyens,moyennes,taille).
ladjectif(standard,standard,standards,standards,_).
ladjectif(énorme,énorme,énormes,énormes,taille).
ladjectif(minuscule,minuscule,minuscules,minuscules,taille).
ladjectif(noir,noire,noirs,noires,couleur).
ladjectif(brun,brune,bruns,brunes,couleur).
ladjectif(blanc,blanche,blancs,blanches,couleur).
ladjectif(gris,grise,gris,grises,couleur).
ladjectif(rouge,rouge,rouges,rouges,couleur).
ladjectif(bleu,bleue,bleus,bleues,couleur).
ladjectif(jaune,jaune,jaunes,jaunes,couleur).
ladjectif(vert,verte,verts,vertes,couleur).
ladjectif(coloré,colorée,colorés,colorées,couleur).
ladjectif(haut,haute,hauts,hautes,hauteur).
ladjectif(bas,basse,bas,basses,hauteur).
ladjectif(long,longue,longs,longues,longueur).
ladjectif(court,courte,courts,courtes,longueur).
ladjectif(large,large,larges,larges,largeur).
ladjectif(étroit,étroite,étroits,étroites,largeur).
ladjectif(profond,profonde,profonds,profondes,profondeur).
ladjectif(épais,épaisse,épais,épaisses,épaisseur).
ladjectif(mince,mince,minces,minces,épaisseur).
ladjectif(étendu,étendue,étendus,étendues,surface).
ladjectif(volumineux,volumineuse,volumineux,volumineuses,volume).
ladjectif(gros,grosse,gros,grosses,poids).
ladjectif(lourd,lourde,lourds,lourdes,poids).
ladjectif(léger,légère,légers,légères,poids).
ladjectif(lent,lente,lents,lentes,vitesse).
ladjectif(rapide,rapide,rapides,rapides,vitesse).
ladjectif(obtu,obtue,obtus,obtues,angle).
ladjectif(aigu,aigue,aigus,aigues,angle).
ladjectif(carré,carrée,carrés,carrées,forme).
ladjectif(rond,ronde,ronds,rondes,forme).
ladjectif(plat,plate,plats,plates,forme).
ladjectif(triangulaire,triangulaire,triangulaires,triangulaires,forme).
ladjectif(cubique,cubique,cubiques,cubiques,forme).
ladjectif(conique,conique,coniques,coniques,forme ).
ladjectif(ramifié,ramifiée,ramifiés,ramifiées,forme).
ladjectif(cylindrique,cylindrique,cylindriques,cylindriques,forme).
ladjectif(horizontal,horizontale,horizontaux,horizontales,direction).
ladjectif(vertical,verticale,verticaux,verticales,direction).
ladjectif(longitudinal,longitudinale,longitudinaux,longitudinales,direction).
ladjectif(jumellé,jumellée,jumellés,jumellées,apparence).
ladjectif(sec,sèche,secs,sèches,humidité).
ladjectif(humide,humide,humides,humides,humidité).
ladjectif(froid,froide,froids,froides,tempérarure).
ladjectif(chaud,chaude,chauds,chaudes,température).
ladjectif(mou,molle,mous,molles,consistance).
ladjectif(dur,dure,durs,dures,consistance).
ladjectif(nu,nue,nus,nues,apparence).
ladjectif(musqué,musquée,musqués,musquées,odeur).
ladjectif(transparent,transparente,transparents,transparentes,apparence).
ladjectif(beau,belle,beaux,belles,apparence).
ladjectif(vide,vide,vides,vides,qualité).
ladjectif(constant,constante,constants,constantes,qualité).
ladjectif(variable,variable,variables,variables,qualité).
ladjectif(réduit,réduite,réduits,réduites,qualité).
ladjectif(développé,développée,développés,développées,qualité).
ladjectif(nombreux,nombreuse,nombreux,nombreuses,nombre).
ladjectif(rare,rare,rares,rares,nombre).
ladjectif(cher,chere,chers,cheres,prix).
ladjectif(sauvage,sauvage,sauvages,sauvages,état).
ladjectif(domestique,domestique,domestiques,domestiques,état).
ladjectif(jeune,jeune,jeunes,jeunes,âge).
ladjectif(couvert,couverte,couverts,couvertes,apparence).

ladjectif(rétractil,rétractile,rétractils,rétractiles,griffe).
ladjectif(préhensible,préhensible,préhensibles,préhensibles,main).
ladjectif(fourchu,fourchue,fourchus,fourchues,forme).
ladjectif(palmé,palmée,palmés,palmées,forme ).
ladjectif(recourbé,recourbéé,recourbés,recourbées,forme).
ladjectif(crochu,crochue,crochus,crochues,forme).
ladjectif(droit,droite,droits,droites,forme).
ladjectif(lamellé,lamellée,lamellés,lamellées,forme).
ladjectif(vertébrale,vertébrale,xxx,xxx,colonne).
ladjectif(dorsal,dorsale,dorsaux,dorsales,emplacement).
ladjectif(ventral,ventrale,ventraux,ventrales,emplacement).
ladjectif(costal,costale,costaux,costales,emplacement).
ladjectif(interne,interne,internes,internes,emplacement).
ladjectif(externe,externe,externes,externes,emplacement).
ladjectif(nocturne,nocturne,nocturnes,nocturnes,temps).
ladjectif(diurne,diurne,diurnes,diurnes,temps).

ladjectif( cartilagineux , cartilagineuse , cartilagineux,cartilagineuses,matière ).
ladjectif( osseux,osseuse,osseux,osseuses ,matière).
ladjectif( natatoire,natatoire,natatoires,natatoires,vessie).

ladjectif(carnivore,carnivore,carnivores,carnivores,nourriture).
ladjectif(insectivore,insectivore,insectivores,insectivores,nourriture).
ladjectif(piscivore,piscivore,piscivores,piscivores,nourriture).
ladjectif(herbivore,herbivore,herbivores,herbivores,nourriture).
ladjectif(nécrophage,nécrophage,nécrophages,nécrophages,nourriture).
ladjectif(détritivore,détritivore,détritivores,détritivores,nourriture).
%suspensivore,
%brouteur
ladjectif(omnivore,omnivore,omnivores,omnivores,nourriture).
ladjectif(granivore,granivore,granivores,granivores,nourriture).
ladjectif(vivipare,vivipare,vivipares,vivipares,naissance).
ladjectif(ovipare,ovipare,ovipares,ovipares,naissance).
ladjectif(libre,libre,libres,libres,attache).
ladjectif(soudé,soudée,soudés,soudées,attache).
ladjectif(terrestre,terrestre,terrestres,terrestres,lieu).
ladjectif(marin,marine,marins,marines,lieu).
ladjectif(symétrique,symétrique,symétriques,symétriques,apparence).
ladjectif(urticant,urticante,urticants,urticantes,défense).
ladjectif(piquant,piquante,piquantes,piquantes,défense).
ladjectif(venimeux,venimeuse,venimeux,venimeuses,défense).

ladjectif(_masculin,_féminin,_mascpluriel,_fémpluriel,_qualité):-
	ladjectif_declaré(_masculin,_féminin,_mascpluriel,_fémpluriel,_qualité).

nomde(couleur,couleurs,féminin).
nomde(sexe,sexes,masculin).
nomde(forme,formes,féminin).
nomde(niveau,niveaux,masculin).
nomde(dimension,dimensions,féminin).
nomde( symétrie,symétries,féminin ).

nomde(taille,tailles,féminin).
nomde(poids,poids,masculin).
nomde(hauteur,hauteurs,féminin).
nomde(longueur,longueurs,féminin).
nomde(largeur,largeurs,féminin).
nomde(périmètre,périmètres,masculin).
nomde(circonférence,circonférences,féminin).
nomde(profondeur,profondeurs,féminin).
nomde(épaisseur,épaisseurs,féminin).
nomde(surface,surfaces,féminin).
nomde(superficie,superficies,féminin).
nomde(étendue,étendues,féminin).
nomde(volume,volumes,masculin).
nomde(durée,durées,féminin).
nomde(densité,densités,féminin).
nomde(vitesse,vitesses,féminin).
nomde(population,populations,féminin).
nomde(production,productions,féminin).
nomde(débit,débits,masculin).
nomde(température,températures,féminin).
nomde(pression,pressions,féminin).
nomde(gestation,gestation,féminin).
nomde(longévité,longévités,féminin).
nomde(incubation,incubations,féminin).
nomde(course,courses,féminin).
nomde(nage,nages,féminin).
nomde(vol,vols,masculin).
nomde(âge,âges,masculin).

nomde(région,régions,féminin).
nomde(département,départements,masculin).
nomde(capitale,capitales,féminin).
nomde(fleuve,fleuves,masculin).
nomde(ville,villes,féminin).
nomde(président,présidents,masculin).
nomde(sommet,sommets,masculin).

nomde(famille,familles,féminin).
nomde(parent,parents,masculin).
nomde(enfant,enfants,masculin).
nomde(père,pères,masculin).
nomde(mère,mères,féminin).
nomde(fils,fils,masculin).
nomde(fille,filles,féminin).
nomde(frère,frères,masculin).
nomde(soeur,soeurs,féminin).
nomde(grandparent,grandparent,_).
nomde(grandpère,grandpères,masculin).
nomde(grandmère,grandmères,féminin).
nomde(frère,frères,masculin).
nomde(soeur,soeurs,féminin).
nomde(frèresoeur,frèresoeur,_).
nomde(petitfils,petitfils,masculin).
nomde(petitefille,petitefille,féminin).
nomde(petitenfant,petitenfant,_).
nomde(oncle,oncles,masculin).
nomde(tante,tantes,féminin).
nomde(oncletante,oncletante,_).
nomde(beauparent,beauparent,_).
nomde(beaupère,beaupère,masculin).
nomde(bellemère,bellemère,féminin).
nomde(gendre,gendres,masculin).
nomde(brue,brues,féminin).
nomde(gendrebrue,gendrebrue,_).
nomde(beaufrèresoeur,beaufrèresoeur,masculin).
nomde(beaufrère,beaufrère,masculin).
nomde(bellesoeur,bellesoeur,féminin).
nomde(neveu,neveux,masculin).
nomde(nièce,nièces,féminin).
nomde(neveunièce,neveunièce,_).
nomde(cousin,cousins,masculin).
nomde(cousine,cousines,féminin).
nomde(cousincousine,cousincousine,_).
nomde(époux,époux,masculin).
nomde(épouse,épouses,féminin).
nomde(épouxépouse,épouxépouse,_).

nomde(peau,peaux,féminin).
nomde(plume,plumes,féminin).
nomde(poil,poils,masculin).
nomde(écail,écails,masculin).
nomde(épine,épines,féminin).

nomde(doigt,doigts,masculin).
nomde(ongle,ongles,masculin).
nomde(griffe,griffes,féminin).
nomde(sabot,sabots,masculin).
nomde(ventouse,ventouses,féminin).
nomde(palme,palmes,féminin).
nomde(pied,pieds,masculin).
nomde(main,mains,féminin).
nomde(serre,serres,féminin).
nomde(partie,parties,féminin).
nomde(patte,pattes,féminin).
nomde(antenne,antennes,féminin).
nomde(aile,ailes,féminin).
nomde(élytre,élytres,féminin).
nomde(nageoire,nageoires,féminin).
nomde(tentacule,tentacules,féminin).
nomde(membre,membres,masculin).

nomde(corps,corps,masculin).
nomde(colonne,colonnes,féminin).
nomde(mammelle,mammelles,féminin).
nomde(oeuf,oeufs,masculin).

nomde( carapace , carapaces , féminin ).
nomde(coquille,coquilles,féminin).
nomde(spirale,spirales,féminin).
nomde(anneau,anneaux,masculin).

nomde(sang,sangs,masculin).
nomde(salive,salives,féminin).
nomde(sève,sèves,féminin).
nomde(odeur,odeurs,féminin).
nomde(nourriture,nourritures,féminin).

nomde(venin,xxx,masculin).
nomde(encre,encre,féminin).
nomde(dard,dards,masculin).
nomde(langue,langues,féminin).
nomde(crochet,crochets,masculin).
nomde(morsure,morsures,féminin).
nomde(pince,pinces,féminin).

nomde(odorat,xxx,masculin).
nomde(ouie,xxx,féminin).
nomde(vue,xxx,féminin).
nomde(toucher,xxx,masculin).

nomde(tête,têtes,féminin).
nomde(abdomen,abdomens,masculin).
nomde(thorax,thorax,masculin).
nomde(ventre,ventres,masculin).
nomde(estomac,estomacs,masculin).
nomde( vessie , vessies , féminin ).
nomde(dos,dos,masculin).
nomde(queue,queues,féminin).
nomde(cou,cous,masculin).

nomde(museau,museaux,masculin).
nomde(truffe,truffes,féminin).
nomde(groin,groins,masculin).
nomde(bec,becs,masculin).
nomde( jabot , jabots , masculin ).
nomde(huppe,huppes,féminin).
nomde(trompe,trompes,féminin).
nomde(défense,défenses,féminin).
nomde(corne,cornes,féminin).
nomde(bois,bois,masculin).
nomde(oreille,oreilles,féminin).
nomde(nez,nez,masculin).
nomde(oeil,yeux,masculin).
nomde(facette,facettes,feminin).
nomde(amble,ambles,masculin).
nomde(toit,toits,masculin).


nomde( gueule , gueules , féminin ).
nomde( machoire , machoires , féminin ).
nomde( fanons , fanons , masculin ).
nomde( dent , dents , féminin ).
nomde(mandibule,mandibules,féminin).
nomde(molaire,molaires,féminin).
nomde(incisive,incisives,féminin).
nomde(canine,canines,féminin).
nomde(croc,crocs,masculin).

nomde(bosse,bosses,féminin).
nomde(cellule,cellules,féminin).

nomde(poumon,poumons,masculin).
nomde(branchie,branchies,féminin).
nomde(poche,poches,féminin).

nomde(os,os,masculin).
nomde(ivoire,ivoires,masculin).
nomde(calcaire,calcaires,masculin).
nomde(lait,laits,masculin).
nomde(laine,laines,féminin).
nomde(fourrure,fourrures,féminin).
nomde(miel,miels,masculin).
nomde(cire,cires,féminin).
nomde(fil,xxx,masculin).
nomde(toile,toiles,féminin).
nomde(cocon,cocon,masculin).
nomde(larve,larves,féminin).

nomde(lieu,lieux,masculin).
nomde(rocher,rochers,masculin).
nomde(eau,eaux,féminin).
nomde(mer,mers,féminin).
nomde(terre,terres,féminin).
nomde(montagne,montagnes,féminin).
nomde(air,airs,masculin).
nomde(rivière,rivière,féminin ).
nomde(banquise,banquises,féminin ).
nomde(hemisphère,hemisphères,masculin ).
nomde(pays,pays,masculin).
nomde(calotte,calottes,féminin).
nomde( sud , sud , masculin ).
nomde( nord , nord , masculin ).
nomde( ouest , ouest , masculin ).
nomde( est , est , masculin ).
nomde( sol , sols , masculin ).

nomde(herbe,herbes,féminin).
nomde(viande,viandes,féminin).
nomde(graine,graines,féminin).
nomde(détritus,détritus,masculin).
nomde(cadavre,cadavres,masculin).
nomde(charogne,charognes,féminin).
nomde(pollen,pollens,masculin).

nomde(groupe,groupes,masculin).

nomde(nid,nids,masculin).
nomde(termitière,termitières,féminin).
nomde(fourmillière,fourmillières,féminin).
nomde(essaim,essaims,masculin).
nomde(terrier,terriers,masculin).

nomde(arbre,arbres,masculin).
nomde(fleur,fleurs,féminin).
nomde(plante,plantes,féminin).

nomde(_singulier,_pluriel,_genre) :- nomde_declaré(_singulier,_pluriel,_genre).

xnomde(haut,masculin).
xnomde(bas,masculin).
xnomde(milieu,masculin).
xnomde(intérieur,masculin).
xnomde(extérieur,masculin).
xnomde(dessous,masculin).
xnomde(dessus,masculin).
xnomde(gauche,masculin).
xnomde(droite,masculin).
xnomde(avant,masculin).
xnomde(arrière,masculin).
xnomde(est,masculin).
xnomde(ouest,masculin).
xnomde(sud,masculin).
xnomde(nord,masculin).
xnomde(nord-est,masculin).
xnomde(sud-est,masculin).
xnomde(sud-ouest,masculin).
xnomde(nord-ouest,masculin).

comparatif(haut,bas,niveau).
comparatif(haut,bas,hauteur).
comparatif(long,court,longueur).
comparatif(large,étroit,largeur).
comparatif(profond,bas,profondeur).
comparatif(épais,mince,épaisseur).
comparatif(rapide,lent,vitesse).
comparatif(grand,petit,_).
comparatif(important,bas,_).
comparatif(étendu,petit,_any).
comparatif(volumineux,petit,volume).
comparatif(gros,petit,_any).
comparatif(lourd,léger,poids).
comparatif(long,court,durée).
comparatif(obtu,aigu,angle).
comparatif(chaud,froid,température).
comparatif(énorme,minuscule,_).
comparatif(vieux,jeune,âge).

unité(_x) :- conversion(_x,_,_),!.
unité(_x) :- conversion(_,_,_x),!.
unité(_x) :- dimension(_,_x),!.
unité(_x) :-  abréviation(_x,_,_),!.
unité(_x) :-  abréviation(_,_x,_).

unité(_x,_y) :-
	 abréviation(_x,_,_y),!.
unité(_x,_y) :-
	 abréviation(_,_x,_y),!.
unité(_x,_x) :- unité(_x).
	
dimension(taille,m).
dimension(poids,kg).
dimension(hauteur,m).
dimension(longueur,m).
dimension(largeur,m).
dimension(périmètre,m).
dimension(circonférence,m).
dimension(profondeur,m).
dimension(épaisseur,m).
dimension(surface,m2).
dimension(superficie,km2).
dimension(étendue,m2).
dimension(volume,m3).
dimension(vitesse,kmh).
dimension(durée,s).
dimension(densité,hm2).
dimension(population,hab).
dimension(niveau,m).
dimension(production,t).
dimension(débit,m3heure).
dimension(température,d).
dimension(pression,bar).
dimension(gestation,sem).
dimension(longévité,an).
dimension(incubation,j).
dimension(course,kmh).
dimension(nage,kmh).
dimension(vol,kmh).
dimension(_atr,_x) :- var(_atr),nonvar(_x),conversion(_x,_,_y),dimension(_atr,_y),!.
dimension(_atr,_x) :- var(_atr),nonvar(_x),conversion(_y,_,_x),dimension(_atr,_y),!.
dimension(_nom,_unité):- dimension_declarée(_nom,_unité).

abréviation(kilo,kilos,kg).
abréviation(tonne,tonnes,t).
abréviation(quintal,quintaux,q).
abréviation(gramme,grammes,g).
abréviation(heure,heures,h).
abréviation(minute,minutes,mn).
abréviation(seconde,secondes,s).
abréviation(jour,jours,j).
abréviation(semaine,semaines,sem).
abréviation(an,ans,an).
abréviation(mètre,mètres,m).
abréviation(kilomètre,kilomètres,km).
abréviation(centimètre,centimètres,cm).
abréviation(millimètre,millimètres,mm).

conversion(kg,1000,g).
conversion(t,1000,kg).
conversion(q,100,kg).
conversion(km,1000,m).
conversion(m,100,cm).
conversion(m,1000,mm).
conversion(km2,10^6,m2).
conversion(litre,1,l).
conversion(m3,10^4,l).
conversion(h,3600,s).
conversion(h,60,mn).
conversion(mn,60,s).
conversion(j,24,h).
conversion(sem,7,j).
conversion(an,12,mois).
conversion(an,365,j).
conversion(mois,30.5,j).

dim(_atrs,_atrs):-
	dimension(_atrs,_),
	nomde(_atrs,_,_),!.
dim(_atrs,_atr):-
	nomde(_atr,_atrs,_),
	dimension(_atr,_).

glob(somme).
glob(minimum).
glob(maximum).
glob(nombre).
glob(moyenne).
glob(respectives).
glob(respectifs).
glob(classé).
glob(classées).
glob(par).

glob(rien).
glob(jamais).
glob(oui).
glob(non).
glob(rien).
glob(double).
glob(output).
glob(close).
glob(init).
glob(listing).
glob(askdico).
glob(expert).
glob(affiche).
glob(fichier).
glob(réciproque).
glob(controle).
glob(équivalent).
glob(help).
glob(gnc).
glob(gns).
glob(verbe).
glob(relative).
glob(valeur).
glob(phrase).

pour(comme).
pour(pour).

classé(classés).
classé(classées).

respectif(respectifs).
respectif(respectif).
respectif(respectives).
respectif(respective).

caracteristique(caractéristique).
caracteristique(caractéristiques).

adadj(extrèmement).
adadj(très).
adadj(assez).
adadj(peu).

adverbe(vite).
adverbe(lentement).
adverbe(complètement).
adverbe(incomplètement).
adverbe(haut).
adverbe(bas).

contraire(mâle, femelle).
contraire(frais, pourri).
contraire(sauvage,domestique).
contraire(ovipare,vivipare).
contraire(sec,humide).
contraire(constant,variable).
contraire(dur,mou).
contraire(nocturne,diurne).
contraire(réduit,développé).
contraire(libre,soudé).
contraire(rare,nombreux).

prénom(hector,masculin).
prénom(médor,masculin).
prénom(grosminet,masculin).
prénom(titine,féminin).
prénom(alfred,masculin).
prénom(arthur,masculin).
prénom(fifine,féminin).
prénom(barbier,masculin).
prénom(pierre,masculin).
prénom(catherine,féminin).
prénom(antoine,masculin).
prénom(soizic,féminin).
prénom(bernard,masculin).
prénom(geneviève,féminin).
prénom(dominique,féminin).
prénom(philippe,masculin).
prénom(henri,masculin).
prénom(éric,masculin).
prénom(bénédicte,féminin).
prénom(_np,_genre) :- prénom_declaré(_np,_genre).

nombre(deux,2).
nombre(trois,3).
nombre(quatre,4).
nombre(cinq,5).
nombre(six,6).
nombre(sept,7).
nombre(huit,8).
nombre(neuf,9).
nombre(dix,10).
nombre(cent,100).
nombre(mille,1000).
nombre(_x,_x):-number(_x).

article(le,masculin,singulier).
article(la,féminin,singulier).
article(les,_genre,pluriel).
article(un,masculin,singulier).
article(une,féminin,singulier).
article(des,_genre,pluriel).
article(l,_any,singulier).
article(son,masculin,singulier).
article(sa,féminin,singulier).
article(ses,_,pluriel).
article(joker,_any1,_any2).

se(se).
se(s).

de_à(d).
de_à(de).
de_à(à).
de_à(au).
de_à(aux).

à(à).
à(au).
à(aux).

de(de).
de(d).
de(du).
de(des).

deonly(de).
deonly(d).
deonly(du).

prep(en).
prep(du).
prep(à).
prep(au).
prep(aux).
prep(de).
prep(des).
prep(d).
prep(sur).
prep(dans).
prep(sous).
prep(avec).
prep(par).

ne(ne).
ne(n).

que(que).
que(qu).

ce(ce,singulier).
ce(ceux,pluriel).
ce(celui,singulier).
ce(celle,singulier).
ce(celles,pluriel).

quel(quel,masculin,singulier).
quel(quelle,féminin,singulier).
quel(quels,masculin,pluriel).
quel(quelles,féminin,pluriel).
quel(comment,_,_).

aucun(aucun,masculin).
aucun(aucune,féminin).

seul(seul,masculin,singulier).
seul(seuls,masculin,pluriel).
seul(seules,féminin,pluriel).
seul(seule,féminin,singulier).

question(qui,_qui).
question(quoi,_quoi).

variable(x,x).
variable(y,y).
variable(z,z).
variable(t,t).

controle_dico([]) :- ! .
controle_dico([_mot | _reste]) :-
	check(_mot),
	controle_dico(_reste).
	
check(_mot) :- article(_mot,_g,_n),!.
check(_mot) :- nom(_mot,_g,_n,_r),!.
check(_mot) :- adjectif(_mot,_g,_n,_r,_a),!.
check(_mot) :- prénom(_mot,_g),!.
check(_mot) :- nom_propre_declaré(_mot,_),!.
check(_mot) :- verbe(_mot,_g,_n),!.
check(_mot) :- que(_mot),!.
check(_mot) :- ne(_mot),!.
check(_mot) :- ce(_mot,_g),!.
check(_mot) :- seul(_mot,_,_),!.
check(_mot) :- de_à(_mot),!.
check(_mot) :- se(_mot),!.
check(_mot) :- question(_mot,_x),!.
check(_mot) :- variable(_mot,_x),!.
check(_mot) :- quel(_mot,_g,_n),!.
check(_mot) :- pprésent(_mot,_x),!.
check(_mot) :- ppassé(_mot,_g,_n,_x),!.
check(_mot) :- glob(_mot),!.
check(_mot) :- moyen(_mot,_,_),!.
check(_mot) :- adverbe(_mot),!.
check(_mot) :- adadj(_mot),!.
check(_mot) :- nom_propre_declaré(_l,_,_,_),member(_mot,_l),!.
check(_mot) :- nom_composé(_l,_,_,_),member(_mot,_l),!.
check(_mot) :- nom_composé(_,_l,_,_),member(_mot,_l),!.
check(_mot) :- prénom_declaré(_l,_,_),member(_mot,_l),!.
check(du) :- !.
check(fait) :- !.
check(font) :- !.
check(fin) :- !.
check(non) :-!.
check(pas) :- !.
check(dont) :- !.
check(si) :- !.
check(et) :- !.
check(ou) :- !.
check(alors) :- !.
check('.') :- !.
check('?') :- !.
check(_mot):-prep(_mot),!.
check(_mot):-caracteristique(_mot),!.
check(_mot):-compare([_mot,_],_),!.
check(_mot):-respectif(_mot),!.
check(_mot):-pour(_mot),!.
check(_mot):- nombre(_mot,_),!.
check(_mot):- unité(_mot),!.

check(_mot) :- 
	ajoute_inconnu(_mot).
check(_mot).

ajoute_inconnu(_mot) :-
	inconnu(_mot),!.
ajoute_inconnu(_mot):-
	assertz(inconnu(_mot)),
	ctrl_double(_mot),
	writeno('nom(',_mot,',',_mot,',',in,').'),nl(user_output),
%	writeno(_mot,' n''est pas dans le dictionnaire'),nl(user_output),
	flag(askdico),
	writeno('c''est un np un nom un adjectif un verbe ou un adverbe rien ou jamais'),nl(user_output),
	read_token(user_input,_x),
	déclare(_x, _mot).
	
ctrl_double(_mot):-
	flag(outputfichier),!,
	writen(_mot,' n''est pas dans le dictionnaire'),nl.
ctrl_double(_).

déclare(jamais,_):-
	retractall(flag(askdico)).
déclare(np,_np) :-
	constitue([genre],[],[_genre]),
	writeno(_np,'est un nom propre donc jamais utilisé avec un article'),
	read_token(user_input,oui),
	assertz(nom_propre_declaré(_np,_genre)).
déclare(nom,_nom):-
	writeno(_nom, 'n''est q''une qualité et on parle toujours de',_nom,'de qqchose, et cette qualité',_nom,'est décrite par un adjectf ou un nombre'),
	read_token(user_input,non),
	constitue([singulier,pluriel,genre],[],_l),
	reverse(_l,[_singulier,_pluriel,_genre]),
	assertz(nom_declaré(_singulier,_pluriel,_genre)),!.
déclare(nom,_nom):-
	constitue([singulier,pluriel,genre],[],_l),
	reverse(_l,[_singulier,_pluriel,_genre]),
	assertz(nomde_declaré(_singulier,_pluriel,_genre)),
	article(_le,_genre,_singulier),
	writeno(_le,_singulier,'se mesure par une valeur chiffrée'),
	read_token(user_input,oui),
	writeno('par quelle unité'),
	read_token(user_input,_unité),
	assertz(dimension_declarée(_singulier,unité)).
déclare(adjectif,_adj) :-
	constitue([masculin,féminin,mascpluriel,fémpluriel,qualité],[],_l),
	reverse(_l,[_masculin,_féminin,_mascpluriel,_fémpluriel,_qualité]),
	assertz(ladjectif_declaré(_masculin,_féminin,_mascpluriel,_fémpluriel,_qualité)).
déclare(verbe,_verbe):-
	constitue([infinitif,pprésent,singulier,pluriel,ppassémasc, ppasséfem, ppassémascplur,ppasséfemplur ],[],_l),
	reverse(_l,	[_infinitif,_pprésent,_singulier,_pluriel,_ppassémasc, _ppasséfem, _ppassémascplur,_ppasséfemplur]),
	assertz(verbe_declaré(_singulier,singulier,_infinitif)),
	assertz(verbe_declaré(_pluriel,pluriel,_infinitif)),
	assertz(ppassé_declaré(_ppassémasc,masculin,singulier,_infinitif)),
	assertz(ppassé_declaré(_ppasséfem,féminin,singulier,_infinitif)),
	assertz(ppassé_declaré(_ppassémascplur,masculin,pluriel,_infinitif)),
	assertz(ppassé_declaré(_ppasséfemplur,féminin,singulier,_infinitif)),
	assertz(pprésent_declaré(_pprésent,infinitif)).

constitue([],_resu,_resu):-!.
constitue([_x|_liste],_in,_out):-
		writeno(_x,':'),
		read_token(user_input,_elem),
		constitue(_liste,[_elem|_in],_out).

writen(_a):-write(_a).
writen(_a,_b):- write(_a),write(' '),write(_b).
writen(_a,_b,_c):- write(_a),write(' '),write(_b),write(' '),write(_c).
writen(_a,_b,_c,_d):- write(_a),write(' '),write(_b),write(' '),write(_c),write(' '),write(_d).
writen(_a,_b,_c,_d,_e):- write(_a),write(' '),write(_b),write(' '),write(_c),write(' '),write(_d),write(' '),write(_e).
writen(_a,_b,_c,_d,_e,_f):- write(_a),write(' '),write(_b),write(' '),write(_c),write(' '),write(_d),write(' '),write(_e),write(' '),write(_f).

writeno(_a):-writeo(_a).
writeno(_a,_b):- writeo(_a),writeo(' '),writeo(_b).
writeno(_a,_b,_c):- writeo(_a),writeo(' '),writeo(_b),writeo(' '),writeo(_c).
writeno(_a,_b,_c,_d):- writeo(_a),writeo(' '),writeo(_b),writeo(' '),writeo(_c),writeo(' '),writeo(_d).
writeno(_a,_b,_c,_d,_e):- writeo(_a),writeo(' '),writeo(_b),writeo(' '),writeo(_c),writeo(' '),writeo(_d),writeo(' '),writeo(_e).
writeno(_a,_b,_c,_d,_e,_f):- writeo(_a),writeo(' '),writeo(_b),writeo(' '),writeo(_c),writeo(' '),writeo(_d),writeo(' '),writeo(_e),writeo(' '),writeo(_f).
writeno(_a,_b,_c,_d,_e,_f,_g):- writeo(_a),writeo(' '),writeo(_b),writeo(' '),writeo(_c),writeo(' '),writeo(_d),writeo(' '),writeo(_e),writeo(' '),writeo(_f),writeo(' '),writeo(_g).

writeo(_a):-write(user_output,_a).

% rechercher les noms, adjectifs déclarés deux fois
doublon:-
	doublonnom.
doublon:-
	doublonadj.
doublon:-
	doublonnomde.
	
doublonadj :-
	retractall(double(_)),
	ladjectif(_x,_,_,_,_),
	chercheone(_x).
	
doublonnom :-
	retractall(double(_)),
	nom(_x,_,_),
	chercheone(_x).

doublonnomde :-
	retractall(double(_)),
	nomde(_x,_,_),
	chercheone(_x).

chercheone(_x):-
	double(_x),!,
	writen(_x,'est double'),nl.
chercheone(_x):-
	assertz(double(_x)),fail.

nonnomde(_atr) :-
	nomde(_atr,_,_), !, fail.
nonnomde(_atr).

nonêtreavoir(avoir) :- !, fail.
nonêtreavoir(être) :- !, fail.
nonêtreavoir(_x).

nonêtre(être) :- !, fail.
nonêtre(_x).

expert(_x):-
	expert(_x,[]).
expert(_):-
	coco_declare(_x),
	writen(_x),nl,fail.

% afficher une clause
affiche(_,nom(_,_,_,_)):-!.
affiche(_,prénom(_,_)):-!.
affiche(_,nom_propre_declaré(_,_)):-!.
affiche(_,nom_propre_declaré(_,_,_,_)):-!.
affiche(_,nom_composé(_,_,_,_)):-!.
affiche(_alors,_si):-writen(_alors,si,_si),nl.

% verifier qu'une condition n'est pas deja niée.
niée(_x,_why,_):-
	neg(_x,_negx),
	coco_declare(_negx),writen(_x,' est niée par declaration'),nl,!.
niée(_x,_why,_long):-
	neg(_x,_negx),
	clause(_negx,_cond),
writen('verifier si niée',_long,_x,_cond),nl,
	démontre(_cond,[_negx|_why],_long),writen('                              ',_x,'est niée par demontre'),assertz(coco_declare(_negx)),nl,!.

non_niée(_x,_why):-
	niée(_x,_why,court),!,
	fail.
non_niée(_x,_why).

% chercher à vérifier toutes les clauses non déja niée d'un but x est y ( la première devrait être la définition, réciproque)
expert(_clause,_in):-
	clause(_clause,_cond),
writen(expert,_clause,_cond),nl,
	non_niée(_clause,_in),
	writen('à démontrer :',_clause,si,_cond),nl,
	démontre(_cond,[_clause|_in],long),
	verifié(_clause).

% démontre une liste de conditions de clause	
démontre(_,_,_):-coco_declare(stop),!,fail.
démontre((_a,_b),_why,_long):-!,
	vérifie(_a,_why,_long),démontre(_b,_why,_long).
démontre((_a),_why,_long):-!,
	vérifie(_a,_why,_long).

% enregistre une déduction
verifié(_vrai):-
	retractall(stack(_vrai)),
	coco_declare(_vrai),!.
verifié(_vrai):-
	writen('                  donc',_vrai),nl,
	neg(_vrai,_neg),
	mettre_inconnu(_vrai,_inc),
	retractall(coco_declare(_neg)),
	retractall(coco_declare(_inc)),
	assertz(coco_declare(_vrai)).

% vérifie une condition élémentaire
vérifie(_,_,_):-coco_declare(stop),!,fail.
vérifie(nom(_x,_,_,_x),_,_):-!.
vérifie(prénom(_x,_),_,_):-!.
vérifie(nom_propre_declaré(_x,_),_,_):-!.
vérifie(nom_propre_declaré(_,_,_,_x),_,_):-!.
vérifie(nonêtreavoir(_v),_,_):-!,nonêtreavoir(_v).
vérifie(nonvar(_x),_,_):-!,nonvar(_x).
vérifie(contraire(_a,_b),_,_):-!,contraire(_a,_b).
vérifie(comparatif(_a,_b,_),_,_):-!,comparatif(_a,_b,_).

vérifie(_x,_,_):-
	coco_declare(_x),!.
vérifie(_x,_,_):-
	neg(_x,_negx),
	coco_declare(_negx),!,fail.
vérifie(_x,_,_):-
	mettre_inconnu(_x,_y),
	coco_declare(_y),!.	
vérifie(_x,_,_):-
	stack(_x),!,writen(_x ,'est déja en expertise'),nl,fail.
vérifie(_x,_why,long):-
	not_to_ask(_x),
	one_clause(_x),
	assertz(stack(_x)),!,
	expertise(_x,_why).
%vérifie(_x,_why,long):-
%	niée(_x,_why,ask),!,fail.
vérifie(_x,_why,long):-
write(demandea),nl,
	demande(_x,_oui,_why),
	_oui=oui.
vérifie(_x,_why,ask):-
	to_ask(_x),
	write(demandeb),nl,
	demande(_x,_oui,_why),
	_oui=oui.
	
expertise(_x,_why):-
	expert(_x,_why),
	writen('expert a verifié',_x),nl.
expertise(_x,_why):-
	retractall(stack(_x)),fail.
expertise(_x,_why):-
	coco_declare(stop),!,fail.
expertise(_x,_):-
	coco_declare(_x),!.
expertise(_x,_):-
	neg(_x,_negx),
	coco_declare(_negx),!,fail.
expertise(_x,_why):-
	niée(_x,_why,ask),!,fail.
expertise(_x,_):-
	coco_declare(_x),!.
expertise(_x,_):-
	neg(_x,_negx),
	coco_declare(_negx),!,fail.
expertise(_x,_):-
	mettre_inconnu(_x,_y),
	coco_declare(_y),!.
expertise(_x,_):-
	stack(_x),!,writen(_x ,'est encore en expertise'),nl,fail.
expertise(_x,_why):-
writen(demandeexpertise),nl,
	demande(_x,_oui,_why),
	_oui=oui.

% il y a au moins une règle
one_clause(_x):-
	clause(_x,_),!.
	
% c'est une propriété non demandable : x est y
not_to_ask(affirme(_,être,_,_)).

to_ask(_x):-
	not_to_ask(_x),!,fail.
to_ask(_x).
	
demande(_x,_oui,_why):-
	vrai(_x),!,
	writen('est ce qu il est vrai que ',_x,' :'),
	réponse(_oui,_why),
	stock(_x,_oui).
demande(_x,_ouinon,_why):-
	neg(_x,_negx),
	writen('est ce que ',_negx,' :'),
	réponse(_oui,_why),
	retourne(_oui,_ouinon),
	stock(_negx,_oui).

retourne(oui,non).
retourne(non,oui).

réponse(_oui,_why):-
	read_token(_rep),
	controle_rep(_rep,_oui,_why),!.
réponse(_oui,_why):-
	writen('il faut frapper : oui, non, inconnu, pourquoi, trouvé ou stop :'),
	réponse(_oui,_why).
	
controle_rep(oui,oui,_):-!.
controle_rep(vrai,oui,_):-!.
controle_rep(non,non,_):-!.
controle_rep(faux,non,_):-!.
%controle_rep(inconnu,inconnu,_):-!.
%controle_rep(x,inconnu,_):-!.
controle_rep(stop,stop,_):-assertz(coco_declare(stop)),!.
controle_rep(trouvé,stop,_):-assertz(coco_declare(stop)),!.
controle_rep(pourquoi,_oui,_why):-!,
	writen('pour démontrer',_why),nl,
	réponse(_oui,_why).
	
stock(_x,inconnu):-
	mettre_inconnu(_x,_y),
	writen(stock,_y),nl,
	assertz(coco_declare(_y)),nl,!.
stock(_x,oui):-writen(stock,_x),nl,
	assertz(coco_declare(_x)),nl,!.
stock(_x,non):-
	neg(_x,_negx),writen(stock,_negx),nl,
	assertz(coco_declare(_negx)),nl,fail,!.
