prolog - KelT Informatique
Transcription
prolog - KelT Informatique
PROLOG ESGI 2011-2012 Enseignant : Nicolas Vidal Début de cours : ◦ Brève interrogation sur le cours de la dernière séance. Cours : ◦ Apprentissage par l’exemple. ◦ Chaque notion est manipulée sur machine. Travail personnel : ◦ Exercices pour la fois suivante. Déroulement des scéances Email : [email protected] Début de cours : ◦ Brève interrogation sur le cours de la dernière séance. Déroulement des scéances Email : [email protected] Travail personnel : ◦ Exercices pour la fois suivante. Correction des exercices … Unification Moteur de D’inférence de Prolog ◦ (algorithme de résolution) Déroulement de la séance Définition d’usage : ◦ Deux termes sont unifiables si ils sont identiques ou s’ils contiennent des variables qui peuvent être uniformément instanciées de telle manière que les termes résultant soient égaux. Symbole de l’unification : ◦= Unification Quelques exemples : ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦ toto = toto. toto = X. toto = Toto. X = Y. pere(X) = pere(arthur). pere(X) = pere(homme(barbu)). toto(X,b) = toto(a,Y). toto(X) = toto(titi(Y)). Unification Ecrivons ensemble une définition plus précise: 1- Si T1 et T2 sont des nombres ou des atomes, ils sont unifiables si ils sont identiques. 2- Si T1 est une variable, T1 et T2 sont unifiables si T1 est instantiable à T2 ◦ Ou Si T2 est une variable, T2 et T1 sont unifiables si T2 est instantiable à T1 3- Si T1 et T2 sont des termes complexes, ils sont unifiables si : ◦ Leurs functors sont identiques ◦ Ils possèdent le même nombre d’arguments ◦ Leurs arguments sont unifiables 2 à 2. Unification Exemples … Retour sur les listes et les requêtes … Algorithme de résolution de Prolog ◦ Retour sur les bases de connaissances du premier cours … ◦ Intuition de l’algorithme ◦ Connaissez-vous l’Iliade ? Ecrivons la base de connaissance responsable de la guerre de Troie ! Proof Search La guerre de Troie … jaloux(X,Y). Proof Search La guerre de Troie … jaloux(X,Y). X = A, Y=B Proof Search La guerre de Troie … jaloux(X,Y). X = A, Y=B aime(A,C), aime(B,C). Proof Search La guerre de Troie … jaloux(X,Y). X = A, Y=B aime(A,C), aime(B,C). A = menelas, C = helene Proof Search La guerre de Troie … jaloux(X,Y). X = A, Y=B aime(A,C), aime(B,C). A = menelas, C = helene aime(B,helene) Proof Search La guerre de Troie … jaloux(X,Y). X = A, Y=B aime(A,C), aime(B,C). A = menelas, C = helene aime(B,helene) B = menelas Proof Search La guerre de Troie … ◦ => menelas est jaloux de menelas !!! jaloux(X,Y). X = A, Y=B aime(A,C), aime(B,C). A = menelas, C = helene aime(B,helene) B = menelas Proof Search La guerre de Troie … jaloux(X,Y). X = A, Y=B aime(A,C), aime(B,C). A = menelas, C = helene aime(B,helene) B = menelas Proof Search B = paris La guerre de Troie … jaloux(X,Y). X = A, Y=B aime(A,C), aime(B,C). A = menelas, C = helene aime(B,helene) B = menelas Proof Search B = paris La guerre de Troie … jaloux(X,Y). X = A, Y=B aime(A,C), aime(B,C). A = menelas, C = helene aime(B,helene) B = menelas Proof Search B = paris La guerre de Troie … jaloux(X,Y). X = A, Y=B aime(A,C), aime(B,C). A = menelas, C = helene aime(B,helene) B = menelas Proof Search B = paris La guerre de Troie … jaloux(X,Y). X = A, Y=B aime(A,C), aime(B,C). A = menelas, C = helene A = paris, C = helene aime(B,helene) aime(B,helene). B = menelas Proof Search B = paris La guerre de Troie … jaloux(X,Y). X = A, Y=B aime(A,C), aime(B,C). A = menelas, C = helene A = paris, C = helene aime(B,helene) aime(B,helene). B = menelas Proof Search B = paris La guerre de Troie … jaloux(X,Y). X = A, Y=B aime(A,C), aime(B,C). A = menelas, C = helene aime(B,helene) B = menelas Proof Search B = paris A = paris, C = helene aime(B,helene). B = menelas La guerre de Troie … jaloux(X,Y). X = A, Y=B aime(A,C), aime(B,C). A = menelas, C = helene aime(B,helene) B = menelas B = paris Proof Search A = paris, C = helene aime(B,helene). B = menelas B = paris Exercices : ◦ Terminer les exercices de la planche 1 non corrigés en cours (ex 3, 4, 5). ◦ Guerre de Troie ◦ Sub-Sudoku Exercices Fin des exercices de la planche 1 : ◦ Une fois chaque base de connaissances écrite pour chaque exercice, dérouler l’algorithme de résolution de Prolog (sous forme d’arbre de résolution) sur un exemple de requête. Exercices Guerre de Troie ◦ Appliquer la modification suivante à la base de connaissance vue en cours : Quelqu’un ne peut pas être jaloux de lui-même. ◦ Dérouler l’algorithme de résolution de Prolog (sous forme d’arbre) sur les requêtes suivantes: jaloux(menelas, helene). jaloux(X, X). jaloux(X, Y), X = paris. Exercices Sub-Sudoku ◦ Le but à terme de ce « projexercice » est de réaliser un générateur/solveur de sudoku en Prolog. ◦ Il s’agit ici de la première étape. ◦ Pour ceux qui ne connaissent pas : http://fr.wikipedia.org/wiki/Sudoku ◦ Pour l’instant nous allons nous intéresser à générer des grilles valides. ◦ Une grille de sudoku est composée de 9 carrés chacun se composant lui-même de 9 cases contenant un chiffre entre 1 et 9. Exercices Sub-Sudoku ◦ Première étape : générer un de ces carrés. ◦ Travail : Ecrire un prédicat sub_sudoku/3 tel que : ◦ Chaque argument est une liste de trois éléments. ◦ Chaque élément de ces listes est un chiffre entre 1 et 9. ◦ Un chiffre ne peut être présent qu’une seule fois dans le carré. ◦ Forcer le backtrack (appui sur ‘n’ lors d’une proposition de solution) doit pouvoir permettre d’énumérer successivement tous les carrés possibles. Exercices Sub-Sudoku ◦ Exemple d’utilisation : ?- sub_sudoku(L1,L2,L3). L1 = [1,2,3], L2 = [4,5,6], L3 = [7,8,9] Appui sur ‘n’ L1 = [1,2,3], L2 = [4,5,6], L3 = [7,9,8] … Exercices