|

/* 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. |
|