Transcript
Page 1: CSI2520 % extraire une phrase et retourner le reste phrase(X,Z):- groupeDuNom(X,Y), groupeDuVerbe(Y,Z). groupeDuNom(X,Z):- determinant(X,Y), nom(Y,Z)

Analyser une phrase

CSI2520

% extraire une phrase et retourner le restephrase(X,Z):- groupeDuNom(X,Y), groupeDuVerbe(Y,Z).groupeDuNom(X,Z):- determinant(X,Y), nom(Y,Z).groupeDuVerbe(X,Z):- verbe(X,Y), groupeDuNom(Y,Z).

Page 2: CSI2520 % extraire une phrase et retourner le reste phrase(X,Z):- groupeDuNom(X,Y), groupeDuVerbe(Y,Z). groupeDuNom(X,Z):- determinant(X,Y), nom(Y,Z)

Vocabulaire

CSI2520

determinant([le|Z],Z).determinant([la|Z],Z).determinant([un|Z],Z).determinant([une|Z],Z).determinant([les|Z],Z).determinant([des|Z],Z).nom([chat|Z],Z).nom([chien|Z],Z).nom([garcon|Z],Z).nom([fille|Z],Z).

verbe([aime|Z],Z).verbe([regarde|Z],Z).verbe([attaque|Z],Z).

Page 3: CSI2520 % extraire une phrase et retourner le reste phrase(X,Z):- groupeDuNom(X,Y), groupeDuVerbe(Y,Z). groupeDuNom(X,Z):- determinant(X,Y), nom(Y,Z)

Exemple

CSI2520

?- phrase([la,fille,aime,le,chien],[]).yes

Page 4: CSI2520 % extraire une phrase et retourner le reste phrase(X,Z):- groupeDuNom(X,Y), groupeDuVerbe(Y,Z). groupeDuNom(X,Z):- determinant(X,Y), nom(Y,Z)

Notation DCG(definite clause grammar)

CSI2520

phrase --> groupeDuNom, groupeDuVerbe.groupeDuNom --> determinant, nom.groupeDuVerbe--> verbe, groupeDuNom.determinant --> [le].determinant --> [la].determinant --> [un];[une];[des];[les].nom --> [fille];[garcon];[chat];[chien].verbe --> [regarde];[attaque];[aime].

Page 5: CSI2520 % extraire une phrase et retourner le reste phrase(X,Z):- groupeDuNom(X,Y), groupeDuVerbe(Y,Z). groupeDuNom(X,Z):- determinant(X,Y), nom(Y,Z)

Singulier vs pluriel

CSI2520

phrase --> groupeDuNom(N), groupeDuVerbe(N).groupeDuNom(N) --> determinant(N), nom(N).groupeDuVerbe(N) --> verbe(N), groupeDuNom( _ ).determinant(singulier) --> [le];[la];[un];[une].determinant(pluriel) --> [les];[des].nom(singulier) --> [fille];[garcon];[chat];[chien].nom(pluriel) --> [filles];[garcons];[chats];[chiens].verbe(singulier) --> [regarde];[attaque];[aime].verbe(pluriel) --> [regardent];[attaquent];[aiment].

Page 6: CSI2520 % extraire une phrase et retourner le reste phrase(X,Z):- groupeDuNom(X,Y), groupeDuVerbe(Y,Z). groupeDuNom(X,Z):- determinant(X,Y), nom(Y,Z)

Construire un arbre

CSI2520

phrase(N,ph(GN,GV)) --> groupeDuNom(N,GN), groupeDuVerbe(N,GV).groupeDuNom(N,gNom(Det,Nom)) --> determinant(N,Det), nom(N,Nom).groupeDuVerbe(N,gVerbe(Verbe,GN)) --> verbe(N,Verbe), groupeDuNom(N,GN).determinant(singulier,det(le)) --> [le].nom(singulier,nom(chat)) --> [chat].verbe(singulier,verbe(aime)) --> [aime].. . .

Page 7: CSI2520 % extraire une phrase et retourner le reste phrase(X,Z):- groupeDuNom(X,Y), groupeDuVerbe(Y,Z). groupeDuNom(X,Z):- determinant(X,Y), nom(Y,Z)

Exemple

CSI2520

?- phrase(N,Arbre,[le,chien,attaque,le,garcon]).N=singulierArbre= ph(gN(det(le),nom(chien)),gVerbe(verbe(attaque), gNom(det(le),nom(garcon)))).

Page 8: CSI2520 % extraire une phrase et retourner le reste phrase(X,Z):- groupeDuNom(X,Y), groupeDuVerbe(Y,Z). groupeDuNom(X,Z):- determinant(X,Y), nom(Y,Z)

Avec un dictionnaire

CSI2520

determinant(N,det(Det)) --> [Det], estDeterminant(Det,N).nom(N,nom(Nom)) --> [Nom], estNom(Nom,N).verbe(N,verbe(Verbe)) --> [Verbe],estVerbe(Verbe,N)..

% dictionnaireestDeterminant(le,singulier).estDeterminant(les,pluriel).estNom(chat,singulier).estVerbe(aiment,pluriel).

Page 9: CSI2520 % extraire une phrase et retourner le reste phrase(X,Z):- groupeDuNom(X,Y), groupeDuVerbe(Y,Z). groupeDuNom(X,Z):- determinant(X,Y), nom(Y,Z)

Un ascenceur

CSI2520

deplacement --> mouvement.deplacement --> mouvement,deplacement.mouvement --> [haut].mouvement --> [bas].

?- deplacement([haut,haut,bas,haut],X).X = [haut, bas, haut] ;X = [bas, haut] ;X = [haut] ;X = [] ;false.

Page 10: CSI2520 % extraire une phrase et retourner le reste phrase(X,Z):- groupeDuNom(X,Y), groupeDuVerbe(Y,Z). groupeDuNom(X,Z):- determinant(X,Y), nom(Y,Z)

Décompte des étages

CSI2520

deplacement(E) --> mouvement(E).deplacement(E) --> mouvement(E1), deplacement(E2), {E is E1+E2}.mouvement(1) --> [haut].mouvement(-1) --> [bas].

1 ?- deplacement(E,[haut,haut,bas,haut],X).E = 1,X = [haut, bas, haut] ;E = 2,X = [bas, haut] ;E = 1,X = [haut] ;E = 2,X = [] ;false.

Page 11: CSI2520 % extraire une phrase et retourner le reste phrase(X,Z):- groupeDuNom(X,Y), groupeDuVerbe(Y,Z). groupeDuNom(X,Z):- determinant(X,Y), nom(Y,Z)

CSI2520

Méta-Interpréteur Prolog

Un méta-Interpréteur Prolog est un programme ecrit en Prolog pour interpréter les commandes Prolog: Prolog dans Prolog!

Une réalisation d’un langage L dans L est souvent considerée comme une preuve de l’aspect général du langage L.

On peut avoir Java dans Java, C dans C, etc...La question est de savoir a quel point il est facile d’exprimer un langage par ce meme langage.

Page 12: CSI2520 % extraire une phrase et retourner le reste phrase(X,Z):- groupeDuNom(X,Y), groupeDuVerbe(Y,Z). groupeDuNom(X,Z):- determinant(X,Y), nom(Y,Z)

CSI2520

Méta-Interpréteur Prolog

% pour resoudre un but vraisolve0(true) :- !.

% pour resoudre une liste de butssolve0 ((G, Gs)) :- !,

solve0(G), solve0(Gs).

% pour resoudre un but, trouver sa clause et resoudre ses conditions

solve0(G) :- !, clause(G, Body), solve0(Body).

Page 13: CSI2520 % extraire une phrase et retourner le reste phrase(X,Z):- groupeDuNom(X,Y), groupeDuVerbe(Y,Z). groupeDuNom(X,Z):- determinant(X,Y), nom(Y,Z)

CSI2520

Méta-Interpréteur Prolog

?- solve0(member(X, [a, c])).X = a ;X = c ;No

?- solve0((member(X, [a , c, f]),| member(X, [b, c, d, f, g]))).X = c ;X = f ;No

Page 14: CSI2520 % extraire une phrase et retourner le reste phrase(X,Z):- groupeDuNom(X,Y), groupeDuVerbe(Y,Z). groupeDuNom(X,Z):- determinant(X,Y), nom(Y,Z)

CSI2520

Méta-Interpréteur Prolog

Cet interpréteur ne marchera pas pour les opérations pré-définies (built-in). Ces opérations n’ont pas de clauses. Elles sont directement interprétées par le systeme Prolog.

Une amérioration du précédent interpréteur concerne la distinction des opérations pré-définies. Aussi, nous distinguerons les faits des regles.

Le prédicat builtIn permet de reconnaitre les prédicats pré-définis:

builtIn(G) :- predicate_property(G, built_in).builtIn(G) :- predicate_property(G, interpreted).

Page 15: CSI2520 % extraire une phrase et retourner le reste phrase(X,Z):- groupeDuNom(X,Y), groupeDuVerbe(Y,Z). groupeDuNom(X,Z):- determinant(X,Y), nom(Y,Z)

CSI2520

Méta-Interpréteur Prolog

solve((Head :- Body)):- !, assertz((Head :- Body)).

solve(true):- !.

solve((G, Gs)):- !,solve(G), solve(Gs).

solve(G):- builtIn(G),!, call(G).

solve(G):- clause(G, Body), solve(Body).

Page 16: CSI2520 % extraire une phrase et retourner le reste phrase(X,Z):- groupeDuNom(X,Y), groupeDuVerbe(Y,Z). groupeDuNom(X,Z):- determinant(X,Y), nom(Y,Z)

CSI2520

Méta-Interpréteur Prolog

On peut également utiliser notre propre boucle d’interprétation:do :- nl,

write('query: '), read(Q),

Q =\= stop, do1(Q).do. %arret lorsque Q == stop

Page 17: CSI2520 % extraire une phrase et retourner le reste phrase(X,Z):- groupeDuNom(X,Y), groupeDuVerbe(Y,Z). groupeDuNom(X,Z):- determinant(X,Y), nom(Y,Z)

CSI2520

Méta-Interpréteur Prolog

do1(Q) :- solve(Q), write('yes: '), writeln(Q), write('OK? (CR or anything else) '), get0(Ans), Ans == 10,

% if Ans is not CR, fail back to solve(Q) !, do.

do1(_) :- writeln(no), do.

Page 18: CSI2520 % extraire une phrase et retourner le reste phrase(X,Z):- groupeDuNom(X,Y), groupeDuVerbe(Y,Z). groupeDuNom(X,Z):- determinant(X,Y), nom(Y,Z)

CSI2520

Méta-Interpréteur Prolog

?- do.query: writeln(okay).yes: writeln(okay)OK? (CR or anything else)query: member(X, [a, b]).yes: member(a, [a, b])OK? (CR or anything else) nyes: member(b, [a, b])OK? (CR or anything else)query: member(X, [a, b, c]), member(X, [b, c, d, e]).yes: member(b, [a, b, c]), member(b, [b, c, d, e])OK? (CR or anything else) nyes: member(c, [a, b, c]), member(c, [b, c, d, e])OK? (CR or anything else)query: assert(added(one, fact)).yes: assert(added(one, fact))OK? (CR or anything else)

Page 19: CSI2520 % extraire une phrase et retourner le reste phrase(X,Z):- groupeDuNom(X,Y), groupeDuVerbe(Y,Z). groupeDuNom(X,Z):- determinant(X,Y), nom(Y,Z)

CSI2520

Méta-Interpréteur Prolog

query: added(X, Y).yes: added(one, fact)OK? (CR or anything else) nnoquery: a(1) :- true.yes: a(1):-trueOK? (CR or anything else)query: a(2) :- a(1).yes: a(2):-a(1)OK? (CR or anything else)query: a(X).yes: a(1)OK? (CR or anything else) nyes: a(2)OK? (CR or anything else)query: stop.Yes


Recommended