vers l accueil 

revoir le sujet

visualiser le programme en texte brut ou le télécharger

 

/* V1.8.0pl */

/* Pour cet exercice, nous avons choisi de compiler tous les éléments dans un seul et même fichier.
Ainsi, on a:

- Les prédicats d'appel des phrases.
- Les règles de réécriture.
- Le lexique.
- Le module drawtree.

D'ordinaire, il aurait été préférable de garder le caractère modulaire des éléments, mais pour des
raisons pratiques, de rapidité d'accès aux fonctions (dés l'ouverture de notre programme, toutes
les fonctions sont disponibles), on a préféré tout rassembler. Cette opération a été effectuée
dans la dernière version du programme, une fois toutes les erreurs évacuées.*/

 

/*Règles permettant la reconnaissance des phrases et
donnant des informations sur leur représentation*/
%_______________________________________________
/* règle donnant à la suite toutes les prhrases que peut générer notre grammaire*/
/* COMMANDE: 'mesPhrases.'*/


mesPhrases:-
s(_Tree, Sentence, []),
write(Sentence),
nl,
fail.
%_______________________________________________
/*règle donnant toutes les structures des phrases sous forme de liste que peut générer notre grammaire */
/* COMMANDE: 'mesRepresentations.'*/


mesRepresentations:-
s(Tree, _Sentence, []),
write(Tree),
nl,
fail.
%_______________________________________________
/*règle donnant toutes les structures des phrases sous forme d'arbre que peut générer notre grammaire */
/* COMMANDE: 'mesArbres.'*/


mesArbres:-
s(Tree, _Sentence, []),
drawtree(Tree),
nl,nl,
fail.

 

 

/* règles de reecriture */

 

/* s: phrase */

/* np: noun phrase */

/* vp: verb phrase */

 

/* La phrase doit se composer d'un Np et d'un Vp dont les accords en genre et en nombre doivent

être identiques */

s([s,Np,Vp])-->

np(Np,acc(Genre,Nombre)),

vp(Vp,acc(Genre,Nombre),soucat(_,_,_)).

 

/* CONSTRUCTION DU NP */

/* On peut composer 3 types de Np */

 

 

/* det: determinant */

/* n:nom */

/* adj: adjectif */

/* propern: nom propre */

 

 

/* traits et valeurs du SN: */

/* - [concat des élement] */

/* - acc({masc, fem},{sing,plur}) */

 

 

/* 1er solution: Le Np est composé d'un déterminant et d'un nom, l'accord est porté par le nom, celui

du determinant devant être identique : Np type 1: le chat */

np([np,Det,N],acc(Genre,Nombre))-->

det(Det,acc(Genre,Nombre)),

n(N,acc(Genre,Nombre)).

 

/* définition du determinant par rapport au lexique et sur les emplacements

des valeurs nécessaires:det type: le */

 

det([det,Det],acc(Genre,Nombre))-->

[Det],

{lex(Det,cat:det,acc(Genre,Nombre))}.

 

/* définition du nom par rapport au lexique et sur les emplacements

des valeurs nécessaires: n type: chat */

 

n([n,N],acc(Genre,Nombre))-->

[N],

{lex(N,cat:n,acc(Genre,Nombre))}.

 

/* 2eme solution: Le Np est composé d'un déterminant d'un nom et d'un adjectif postposé au nom

, l'accord est porté par le nom, celui du determinant et de l'adjectif devant être identique

: Np type 2: le beau chat */

 

np([np,Det,Adj,N],acc(Genre,Nombre))-->

det(Det,acc(Genre,Nombre)),

adj(Adj,acc(Genre,Nombre)),

n(N,acc(Genre,Nombre)).

 

/* définition de l' adj par rapport au lexique et sur les emplacements

des valeurs nécessaires: adj type: beau */

 

adj([adj,Adj],acc(Genre,Nombre))-->

[Adj],

{lex(Adj,cat:adj,acc(Genre,Nombre))}.

 

/* 3eme solution: Le Np est composé d'un nom propre,propern type 3: fido */

 

np([np,Propern],acc(Genre,Nombre))-->

propern(Propern,acc(Genre,Nombre)).

 

/* définition du propern par rapport au lexique et sur les emplacements

des valeurs nécessaires: propern type: fido */

 

propern([propern,Propern],acc(Genre,Nombre))-->

[Propern],

{lex(Propern,cat:propern,acc(Genre,Nombre))}.

 

 

 

 

/* CONSTRUCTION DU VP */

/* aux: auxiliaire */

/* vt:verbe transitif */

/* vi:verbe intransitif */

/* pp: groupe prépositionnel */

/* prep: préposition */

 

 

/* traits et valeurs du VP: */

/* - [concat des élement] */

/* - acc({masc, fem},{sing,plur}): définie l'accord du verbe */

/* - soucat({sur,à,0},{avoir,être],{finie,participe}: */

/* => la préposition acceptée par le verbe */

/* => son auxiliaire à la forme composée */

/* => sa forme verbale */

/*______________*/

 

 

/* 1er solution: Le Vp est composé d'un verbe intransitif, vp type 1: dort */

vp([vp,Vi],acc(Genre,Nombre),soucat(0,Aux,finie))-->

vi(Vi,acc(Genre,Nombre),soucat(0,Aux,finie)).

 

/* définition du vi par rapport au lexique et sur les emplacements

des valeurs nécessaires: propern type: dort */

vi([vi,Vi],acc(Genre,Nombre),soucat(0,Aux,Forme))-->

[Vi],

{lex(Vi,cat:v,vi,acc(Genre,Nombre),soucat(0,Aux,Forme))}.

 

/* 2eme solution: Le Vp est composé d'un verbe transitif et d'un groupe nominal,les

deux n'ayant aucun rapport d'accord, vp type 2: mange une pomme */

vp([vp,Vt,Np],acc(Genre,Nombre),soucat(0,Aux,finie))-->

vt(Vt,acc(Genre,Nombre),soucat(0,Aux,finie)),

np(Np,acc(_,_)).

 

/* définition du vt par rapport au lexique et sur les emplacements

des valeurs nécessaires: propern type: dort */

vt([vt,Vt],acc(Genre,Nombre),soucat(Prepo,Aux,Forme))-->

[Vt],

{lex(Vt,cat:v,vt,acc(Genre,Nombre),soucat(Prepo,Aux,Forme))}.

 

 

/* 3eme solution: Le Vp est composé d'un verbe transitif, d'un groupe nominal et d'un

groupe prépositionnel, vp type 3: donne une pomme à */

vp([vp,Vt,Np,Pp],acc(Genre,Nombre),soucat(Preposition,Aux,finie))-->

vt(Vt,acc(Genre,Nombre),soucat(Preposition,Aux,finie)),

np(Np,acc(_,_)),

pp(Pp,soucat(Preposition)).

 

/* définition du pp, composé d'une préposition et d'un np, pp type: à fido */

/*Ici, on permet en une seule règle prep + tous les SN possibles */

pp([pp,Prep,Np],soucat(Preposition))-->

prep(Prep,soucat(Preposition)),

np(Np,acc(_,_)).

 

/* définition de la prep par rapport au lexique et sur les emplacements

des valeurs néccessaires: prep type: à */

prep([prep,Prep],soucat(Preposition))-->

[Prep],

{lex(Prep,cat:prep,soucat(Preposition))}.

 

 

/* 4eme solution: Le Vp est composé d'un verbe auxiliaire selectionné par le vt grâce

au trait soucat(Prep,_,_) et d'un groupe nominal, vp type 4: a mangé une pomme */

 vp([vp,Aux,Vt,Np],acc(Genre,Nombre),soucat(Preposition,Auxiliaire,finie))-->

aux(Aux,acc(Genre,Nombre),soucat(Auxiliaire,finie)),

vt(Vt,acc(Genre,Nombre),soucat(Preposition,Auxiliaire,participe)),

np(Np,acc(_,_)).

 

 

/* 5eme solution: Le Vp est composé d'un verbe auxiliaire selectionné par le vi grâce

au trait soucat(Prep,_,_), vp type 5: a dormi */

vp([vp,Aux,Vi],acc(Genre,Nombre),soucat(0,Auxiliaire,finie))-->

aux(Aux,acc(Genre,Nombre),soucat(Auxiliaire,finie)),

vi(Vi,acc(Genre,Nombre),soucat(0,Auxiliaire,participe)).

 

/* définition de l aux par rapport au lexique et sur les emplacements

des valeurs nécessaires, aux type: a */

 

aux([aux,Aux],acc(Genre,Nombre),soucat(Auxiliaire,Forme))-->

[Aux],

{lex(Aux,cat:v,aux,acc(Genre,Nombre),soucat(Auxiliaire,Forme))}.

 

 

/* 6eme solution: Le Vp est composé d'un verbe auxiliaire selectionné par le vt grâce

au trait soucat(Prep,_,_), vp type 5: a donné la pomme à fido */

vp([vp,Aux,Vt,Np,Pp],acc(Genre,Nombre),soucat(Preposition,Auxiliaire,finie))-->

aux(Aux,acc(Genre,Nombre),soucat(Auxiliaire,finie)),

vt(Vt,acc(Genre,Nombre),soucat(Preposition,Auxiliaire,participe)),

np(Np,acc(_,_)),

pp(Pp,soucat(Preposition)).

 

 

 

/* lexique */

 

/* Composition du lexique:
-----------------------------
Pour des raisons d'homogénéité, on donne pour chaque mot imposé les formes dérivées.
Les dérivés de chacun de ces mots sont mis en commentaire pour limiter le temps de défilement,qui sans cette limitation dure au moins 4h (contre moins d'une heure pour cette version).
Le lexique disponible sera donc limité strictement à celui nécessaire aux tests proposés.

______________________________________________________________________
det: le, un, une, la, les.
_________
Nom: pomme, Chat, facteur, livre, linguiste, table, fille, pommes, (chats), (facteurs),
(livres), (linguistes), (tables).
_________
Nom propre: fido.
On omet volontairement la majuscule pour éviter la confusion avec une variable.
_________
Adjectif: (jolie), (jolies), joli, (jolis), belle, (belles), beau, (beaux).
_________
Préposition: à, sur.
_________
Verbes: mange, (mangent), donne, (donnent), met, (mettent), lit, (lisent), dort, dorment,
mangé, (donné), (mis), (lu), (dormi), parti, (partie), (partis), (parties), est, (sont), a, (ont) */

/********************************/

/* categorie: verbe */

/********************************/

/*______________________________*/

/* Table des conjugaisons */

/*______________________________*/

%_____________

/* present*/

/* verbe transitif */

 

lex(mange,cat:v,vt,acc(_,sing),soucat(0,avoir,finie)).

%lex(mangent,cat:v,vt,acc(_,plur),soucat(0,avoir,finie)).

lex(donne,cat:v,vt,acc(_,sing),soucat(à,avoir,finie)).

%lex(donnent,cat:v,vt,acc(_,plur),soucat(à,avoir,finie)).

lex(met,cat:v,vt,acc(_,sing),soucat(sur,avoir,finie)).

%lex(mettent,cat:v,vt,acc(_,plur),soucat(sur,avoir,finie)).

lex(lit,cat:v,vt,acc(_,sing),soucat(0,avoir,finie)).

%lex(lisent,cat:v,vt,acc(_,plur),soucat(0,avoir,finie)).

 

 

/* verbe intransitif */

 

lex(dort,cat:v,vi,acc(_,sing),soucat(0,avoir,finie)).

lex(dorment,cat:v,vi,acc(_,plur),soucat(0,avoir,finie)).

%_____________________

/* participe passé */

/* verbe transitif */

 

lex(mangé,cat:v,vt,acc(_,_),soucat(0,avoir,participe)).

%lex(donné,cat:v,vt,acc(_,_),soucat(à,avoir,participe)).

%lex(mis,cat:v,vt,acc(_,_),soucat(sur,avoir,participe)).

%lex(lu,cat:v,vt,acc(_,_),soucat(0,avoir,participe)).

%lex(dormi,cat:v,vi,acc(_,_),soucat(0,avoir,participe)).

 

 

/* verbe intransitif */

 

lex(parti,cat:v,vi,acc(masc,sing),soucat(0,être,participe)).

%lex(partie,cat:v,vi,acc(fem,sing),soucat(0,être,participe)).

%lex(partis,cat:v,vi,acc(masc,plur),soucat(0,être,participe)).

%lex(parties,cat:v,vi,acc(fem,plur),soucat(0,être,participe)).

%________________

/* auxiliaire*/

lex(est,cat:v,aux,acc(_,sing),soucat(être,finie)).

lex(sont,cat:v,aux,acc(_,plur),soucat(être,finie)).

 

%lex(a,cat:v,aux,acc(_,sing),soucat(avoir,finie)).

%lex(ont,cat:v,aux,acc(_,plur),soucat(avoir,finie)).

 

/********************************/

/* categorie: nom */

/********************************/

/*lex(Mot,cat:Categorie,accord(Genre,Nombre))*/

/* noms communs */

lex(pomme,cat:n,acc(fem,sing)).

lex(chat,cat:n,acc(masc,sing)).

lex(facteur,cat:n,acc(masc,sing)).

lex(livre,cat:n,acc(masc,sing)).

lex(linguiste,cat:n,acc(_,sing)).

lex(table,cat:n,acc(fem,sing)).

lex(fille,cat:n,acc(fem,sing)).

lex(pommes,cat:n,acc(fem,plur)).

%lex(chats,cat:n,acc(masc,plur)).

%lex(facteurs,cat:n,acc(masc,plur)).

%lex(livres,cat:n,acc(masc,plur)).

%lex(linguistes,cat:n,acc(_,plur)).

lex(tables,cat:n,acc(fem,plur)).

/* noms propres */

lex(fido,cat:propern,acc(masc,sing)).

 

/********************************/

/* categorie: determinant */

/********************************/

/*lex(Mot,Categorie,accord(Genre,Nombre))*/

lex(le,cat:det,acc(masc,sing)).

lex(un,cat:det,acc(masc,sing)).

%lex(une,cat:det,acc(fem,sing)).

lex(la,cat:det,acc(fem,sing)).

lex(les,cat:det,acc(_,plur)).

/********************************/

/* categorie: adjectif */

/********************************/

/* lex(Mot,Categorie,accord(Genre,Nombre)) */

/* adjectif postpose */

%lex(jolie,cat:adj,acc(fem,sing)).

%lex(jolies,cat:adj,acc(fem,plur)).

lex(joli,cat:adj,acc(masc,sing)).

%lex(jolis,cat:adj,acc(masc,plur)).

lex(belle,cat:adj,acc(fem,sing)).

%lex(belles,cat:adj,acc(fem,plur)).

lex(beau,cat:adj,acc(masc,sing)).

%lex(beaux,cat:adj,acc(masc,plur)).

 

 

/********************************/

/* categorie: preposition */

/********************************/

lex(à,cat:prep,soucat(à)).

lex(sur,cat:prep,soucat(sur)).

 

 

 

/*===========================================================================*/

/* Pour des raisons de rapidité, nous avons ajouté à la suite de notre programme, le programme

'drawtree.pl', de façon à n'ouvrir qu'un seul fichier lors de la démonstration. */

%----------------------------

%A simple drawing program

%----------------------------

%The top level predicate that parses a given sentence and draws

%the corresponding tree

parse(Sentence):-

s(Tree, Sentence, []),

nl, drawtree(Tree), nl.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%We write out the label of the mother node, and calculate

%the indent that will be required for each daughter of this node

%other than the first. We then print out the daughters

drawtree(Tree):-

d_tree(Tree, 0).

d_tree([Mother|Daughters], Indent):-

write('('), %open paren..

write(Mother), %..write mother node

tab(1), %..leave space..

calcindent(Indent,Mother,NewIndent), %calculate indent

d_daughters(Daughters, NewIndent), %handle daughters

write(')'). %close paren

d_daughters([Atom], _Indent):-

atom(Atom),

write(Atom).

d_daughters([First|Rest], Indent):-

d_first(First, Indent),

d_rest(Rest, Indent).

d_first(Daughter, Indent):-

d_tree(Daughter, Indent).

d_rest([], _Indent).

d_rest([H|T], Indent):-

nl, tab(Indent),

d_first(H, Indent),

d_rest(T, Indent).

calcindent(N,Atom,N1):-

name(Atom,List),

length(List,L),

N1 is N + L + 2.

Emeline et Emilie.