Arbre de recherche
description
Transcript of Arbre de recherche
On parle d’arbre de recherche d’une question* Racine de l’arbre : question * Nœuds : points de choix (formule à démontrer)* Passage d’un nœud vers son fils en considérant
l’une des règles et en effectuant une unification et une étape (pas) de démonstration
CSI2520
Arbre de recherche
* Nœuds de gauche à droite dans l’ordre de déclaration des règles
* Nœuds d'échec : aucune règle ne permet de démontrer la première formule du nœud
* Nœuds de succès : ne contient plus aucune formule, tout a été démontré et les éléments de solution sont trouvés en remontant vers la racine de l’arbre
CSI2520
Arbre de recherche
Pour résoudre une question, Prolog construit l’arbre de recherche de la question
Parcours en profondeur d’abord* nœud de succès : c’est une solution, Prolog
l’affiche et cherche d’autres solutions* nœud d'échec : remontée dans l’arbre jusqu'à un
point de choix possédant des branches non explorées
CSI2520
Stratégie de Prolog
On parle de backtracking. Si un tel nœud de choix n’existe pas, la démonstration est terminée, il n’y a pas d’autres solutions.
Possibilité de branche infinie et donc de recherche sans terminaison…
Attention à :* ordre des littéraux dans la queue de clause* ordre des clauses
CSI2520
Stratégie de Prolog
CSI2520
Un premier exemple
f(a).f(b).g(a).g(b).h(b).k(X):- f(X), g(X), h(X).
?- k(Y).
CSI2520
Exemple: arbre de recherche
CSI2520
Exemple: arbre de recherche
CSI2520
Un autre exemple (en 3 versions)
pere(charles,jean).noble(henri).noble(louis).noble(charles).noble(X):- pere(Y,X), noble(Y).
pere(charles,jean).noble(X):- pere(Y,X), noble(Y).noble(henri).noble(louis).noble(charles).pere(charles,jean).
noble(henri).noble(louis).noble(charles).noble(X):- noble(Y), pere(Y,X). ?- noble(jean).
CSI2520
Un dernier exemple
aime(vincent,mimi).aime(marcel,mimi).jaloux(X,Y) :- aime(X,Z),aime(Y,Z).
?- jaloux(X,Y).
Combien de solutions? … 4
CSI2520
Les opérateurs Ils permettent d’utiliser une syntaxe infixée,
préfixée ou suffixée pour écrire des prédicats.
Ils ont des priorités différentes.
CSI2520
Arité des opérateurs
Trois types :* Opérateur binaire infixé : il figure entre ses 2
arguments et désigne un arbre binaireX + Y
* Opérateur unaire préfixé : il figure avant son argument et désigne un arbre unaire
-X* Opérateur unaire suffixé : il figure après son
argument et désigne un arbre unaire (Ex : X^2)
CSI2520
Associativité des opérateurs Associativité :
* A gauche : * X op Y op Z est lu comme (X op Y) op Z
* A droite :* X op Y op Z est lu comme X op (Y op Z)
* Non associatif : les parenthèses sont obligatoires* la syntaxe X op Y op Z est interdite
CSI2520
Déclaration des opérateurs Déclaration des opérateurs :
* possibilité de modifier la syntaxe Prolog en définissant de nouveaux opérateurs
* définition : par l’enregistrement de faits de la forme suivante op(Priorite, Specif, Nom)* Nom : nom de l’opérateur* Priorite :compris entre 0 (le plus prioritaire) et 1200* Specif :type de l'opérateur (infixé, associatif…)
CSI2520
Specif
Infix: xfx non-associative xfy right to left yfx left to right
Prefix fx non-associative fy left to right
Postfix: xf non-associative yf right to left
CSI2520
Exemple
is_in(apple, room(kitchen)).:-op(35,xfx,is_in).
?- apple is_in X. X = room(kitchen)
?- X is_in room(kitchen). X = apple
?- is_in(banana, room(kitchen)) = banana is_in room(kitchen). yes
CSI2520
Exemple
:-op(33,fx,room).?- room kitchen = room(kitchen). yes
?- apple is_in X. X = room kitchen
pear is_in room kitchen. ?- is_in(pear, room(kitchen)) = pear is_in room kitchen. yes
CSI2520
Exemple
:-op(35,xfy,is_in).?- key is_in desk is_in office = is_in(key, is_in(desk, office)).yes :-op(35,yfx,is_in)?- key is_in desk is_in office = is_in(is_in(key, desk), office).yes
Un autre exemple
CSI2520
:-op(100, xfx, a_des).:-op(100, xfx, est_un).
Animal a_des ailes :- Animal est_un oiseau.