Séance 12 : Grammaire sur Prolog Flashcards
Quel est le problème ici?
article(le). article(la). nom(chat). nom(voiture). npropre(jean).
sn(X,Y) :- article(X),nom(Y).
sn(X) :- npropre(X).
Quelle est la solution (générale) ?
Il existe deux prédicats pour traiter le sn (sn/1 et sn/2) On ne peut pas interroger sur le sn en une seule question.
Il faut forcer le Sn à avoir un seul argument (regrouper les éléments en une variable). Ne travailler qu’avec sn/1.
Quelle est la première solution apportée au problème?
Placer les mots dans des listes [X,Y] qui forment qu’un seul argument
article(le). article(la). nom(chat). nom(souris). npropre(jean). verbe(mange).
sn([X,Y]) :- article(X),nom(Y).
sn([X]) :- npropre(X).
sv([X,Y,Z]) :- verbe(X), sn([Y,Z]).
p([A,B,C,D,E]) :- sn([A,B]), sv([C,D,E]).
seulement sn/1
Quel est le problème à la solution des listes?
On doit prévoir exactement le nombre de mots qu’il y aura dans une phrase et ça ne règle pas le problème du nom propre (car 1 mot et tous les sn ont 2 lettres. (mais principes de base utiles)
Quelle est la solution au problème des listes?
On place tout dans des listes et on «colle» les listes lorsque nécessaire avec «append/3»
1.Mettre les atomes entre []
det([le]). det([la]). nom([chat]). nom([souris]). npropre([jean]). verbe([mange]).
sn(C) :- det(A),nom(B),append(A,B,C). Va chercher un det dans une liste et le met dans A et un nom dans une liste et avec append les combine pour en faire une seule qui va aller dans C. sn(C) :- npropre(C). sv(C) :- verbe(A),sn(B),append(A,B,C). p(C) :- sn(A),sv(B),append(A,B,C).
=> comme ça peu importe le nombre de mots du Sn, c’est sn(A).
Que fait append(A,B,C)? C’estune structure….
Joint les listes A et B dans une liste C. Structure binaire, unit toujours 2 listes, pas plus.
Dans sn(C) :- det(A),nom(B),append(A,B,C) ; que contient A?
Une liste contenant ‘le’ ou une liste contenant ‘la’
Ajoute l’accord en genre.
det([le]). det([la]). nom([chat]). nom([souris]). npropre([jean]). verbe([mange]).
p(C) :- sn(A),sv(B),append(A,B,C).
sn(C) :- det(A),nom(B),append(A,B,C).
sn(C) :- npropre(C).
sv(C) :- verbe(A),sn(B),append(A,B,C).
det([le],m). det([la],f). nom([chat],m). nom([souris],f). npropre([jean]). verbe([mange]). p(C) :- sn(A),sv(B),append(A,B,C). sn(C) :- det(A,G),nom(B,G),append(A,B,C). sn(C) :- npropre(C). sv(C) :- verbe(A),sn(B),append(A,B,C).
Pourquoi on écrit det([le],m) ?
Car append agit seulement sur des listes et on veut qu’il prenne ‘le’, alors on le met dans une liste. on ne veut pas qu’il prennent m alors on ne le met pas)
Quels genres d’erreurs sont :
Jean mange la table
Le chat mange le chat
erreur sémantique
erreur pragmatique
Quel est le problème avec la solution avec append?
Ne fonctionne que si on a que 2 listes à joindre (ne fonctionne plus si sn est formé de dét, nom, adj par exemple)
Ne permet de traiter le genre et le nombre du verbe (peut pas avoir 2 arguments dans sn (C, N)
Transformer en formalisme de la grammaire à clauses définies et ajouter le nombre:
det([le],m). det([la],f). nom([chat],m). nom([souris],f). npropre([jean]). verbe([mange]). p(C) :- sn(A),sv(B),append(A,B,C). sn(C) :- det(A,G),nom(B,G),append(A,B,C). sn(C) :- npropre(C). sv(C) :- verbe(A),sn(B),append(A,B,C).
det(m,s) --> [le]. det(f,s) --> [la]. det(_,p) --> [les]. nom(m,s) --> [chat]. nom(m,p) --> [chats]. nom(f,_) --> [souris]. npropre(m,s) -->[jean]. verbe(s) --> [mange]. verbe(p) --> [mangent].
p –> sn(N), sv(N).
sn(N) –> det(G,N), nom(G,N).
sn(N) –> npropre(,N).
sv(N) –> verbe(N), sn().
Modifier la grammaire afin qu’elle permette de reconnaître les phrases
Le chat de ma soeur mange la souris blanche.
Le chat de ma sœur mange la belle souris.
Pourquoi c’est assez complexe?
det(m,s) --> [le]. det(f,s) --> [la]. det(_,p) --> [les]. det(f,s) --> [ma]. nom(m,s) --> [chat]. nom(m,p) --> [chats]. nom(f,_) --> [souris]. nom(f,s) --> [soeur]. adj(f,s) --> [blanche]. adj(f,s) --> [belle]. npropre(m,s) -->[jean]. verbe(s) --> [mange]. verbe(p) --> [mangent]. prep --> [de].
p --> sn(N), sv(N). sn(N) --> det(G,N), nom(G,N). sn(N) --> det(G,N), nom(G,N), adj(G,N). sn(N) --> det(G,N), adj(G,N), nom(G,N). sn(N) --> det(G,N), nom(G,N), sprep. sn(N) --> npropre(_,N). sv(N) --> verbe(N), sn(_). sprep --> prep, sn(_).
Assez complexe car il faut faire une règle par type de sn
Quelle est le problème avec la forme
det(m,s) –> [le].
N’est pas universelle. Elle est dans le format de la grammaire à clauses définies
On préfère la forme initiale:
det(le,m,s).
det(la,f,s).
det(les,_,p).
Comment utiliser la forme initiale
det(le,m,s).
det(la,f,s).
det(les,_,p).
dans la grammaire à clauses définies.
Avec des règles de conversions (1 par classe grammaticale) :
nom(chat,m,s).
nom(maisons,f,p).
adjectif(beaux,m,p).
nom(G,N) –> [X], {nom(X,G,N)}.
adj(G,N) –> [X], {adj(X,G,N)}.
Le mot est mis dans X et son genre dans G et son nombre dans N.
Transformer en grammaire à clauses définies le dictionnaire suivant
det(le,m,s). det(la,f,s). nom(chat,m,s). nom(chien,m,s). nom(souris,f,_). npropre(jean). verbe(mange).
det(G,N) –> [X], {det(X,G,N)}.
nom(G,N) –> [X], {nom(X,G,N)}.
npropre –> [X], {npropre(X)}.
verbe –> [X], {verbe(X)}.
p –> sn (N), sv (N),
sn (N) –> det(G,N), nom(G,N).
sn –> npropre.
sv (N) –> verbe(N), sn(_).