prolog.pdf



Comments



Description

— Cours d’Informatique S9 —Le langage Prolog ´s Travaux Dirige Jacques TISSEAU ´nieurs de Brest Ecole Nationale d’Inge Technopˆole Brest-Iroise CS 73862 – 29238 Brest cedex 3 – France [email protected] Avec la participation de Pierre De Loor, Pierre-Alexandre Favier et Ahmed Naim. Ce document regroupe l’ensemble des exercices du cours de programmation en logique du 9e`me semestre (S9) de l’Ecole Nationale d’Ing´enieurs de Brest (ENIB : www.enib.fr). Il accompagne les notes de cours « Le langage Prolog ». Informatique S9 Le langage Prolog — programmation en logique — Jacques TISSEAU ´nieurs de Brest Ecole Nationale d’Inge Technopˆ ole Brest-Iroise CS 73862 - 29238 Brest cedex 3 - France c enib 1990-2010 [email protected] Prolog c enib 1990-2010 1/83 , Tisseau J.,Le langage prolog, ENIB, cours d’Informatique S9, Brest, 1990-2010. version du 15 mai 2010 2 Sommaire Avant-propos 5 I 7 Enonc´ es 1 De la logique ` a Prolog 9 2 Termes 15 3 Listes 19 4 Contrˆ ole de la r´ esolution 33 5 Bases de donn´ ees 41 6 Recherche dans les graphes 45 II 53 Corrig´ es 1 De la logique ` a Prolog 55 2 Termes 63 3 Listes 69 4 Contrˆ ole de la r´ esolution 81 5 Bases de donn´ ees 93 6 Recherche dans les graphes 103 III 109 Annexes Liste des exercices 111 Liste des listings 114 R´ ef´ erences 115 3 4 SOMMAIRE . help(Topic). il suffit d’appeler le pr´edicat halt/0.org) issu des travaux de l’Universit´e d’Amsterdam. ?Pour sortir de l’interpr´eteur SWI-Prolog. D’autres impl´ementations. SWI-Prolog comes with ABSOLUTELY NO WARRANTY.dcc. sont disponibles et compatibles avec la norme ISO-Prolog (ISO/IEC 13211-1. $ 5 .up.apropos(Word).64) Copyright (c) 1990-2008 University of Amsterdam.org YAP Prolog : www. 32 bits. La version actuelle sera prochainement compl´et´ee par 2 nouveaux chapitres : jeux et interpr´eteurs.pt/~vsc/Yap (Universit´e de Madrid) (INRIA) (Universit´e de Porto) Pour d´emarrer SWI-Prolog sous Linux avec un interpr´eteur de commandes (un shell). il suffit de lancer la commande pl pour voir le prompt ( ?-) de l’interpr´eteur s’afficher.org for details. This is free software.upm.Avant-propos Ce document regroupe les exercices (dans la partie I) propos´es dans le cadre du cours de « Programmation en Logique » de l’ENIB ainsi que les corrig´es associ´es (dans la partie II).6.clip. Les solutions Prolog correspondant aux exercices de ce document ont ´et´e test´ees avec l’interpr´eteur du « domaine public » SWI-Prolog (www. ?. Please visit http://www. ´egalement « open source ». or ?. use ?.gprolog.fc.fi.dia.es/Software/Ciao GNU Prolog : www. [6]) : Ciao Prolog : www.halt.swi-prolog. Version 5.swi-prolog. $ pl Welcome to SWI-Prolog (Multi-threaded. For help. and you are welcome to redistribute it under certain conditions. a]).3. N et L connus. false.X. X = c. false.c. N et L connus.a]).6 SOMMAIRE A partir des ´enonc´es du TD 3.occurences(a.+L) peut ˆetre appel´e de 2 (= 21 ) mani`eres diff´erentes : X et L connus ou X inconnu et L connu. Y = 1 .a]).3. false.+L) o` u X n’apparaˆıt qu’une seule fois dans la liste L.c.a]). les arguments des pr´edicats Prolog `a d´efinir sont syst´ematiquement pr´ec´ed´es de leur mode d’instantiation. ?. false.[a. » Ainsi le pr´edicat occurences(?X. N inconnu et L connu. ?. true .occurences(X.a]). Y = 2 .[a.unique(X. mode .c. ?. X = b . true .b.b.+L) peut ˆetre appel´e de 4 (= 22 ) mani`eres diff´erentes : X. false. X connu. Exemples : – « D´efinir le pr´edicat unique(?X.c.unique(b. ?. ?.Y.b.occurences(a. X et N inconnus et L connus.a. .[a. `a savoir : mode + : l’argument doit ˆetre instanti´e `a l’appel (mode input). X inconnu. X = b. ?. X = c .b. la liste des listings (page 114) ainsi qu’une liste de r´ef´erences bibliographiques (page 115).+L) o` u X apparaˆıt N fois dans la liste L. On trouvera en annexe (partie III) la liste de tous les exercices (page 111). X = a .b.b. X = a.b.b.occurences(X. – « D´efinir le pr´edicat occurences(?X.[a.c. » Ainsi le pr´edicat unique(?X. X = 3 .a. false.?N.[a.a.c.a]).b.: l’argument doit ˆetre libre `a l’appel (mode output) et mode ? : l’argument peut ˆetre libre ou instanti´e `a l’appel (mode input-output). Y = 3 .[a.?N.a.b. Premi` ere partie Enonc´ es 7 . . – L’anglais habite la maison blanche.S). Ces trois maisons sont situ´ees dans la mˆeme rue . et la troisi`eme au bout de la rue. une autre au milieu. y (P (x) ⇒ ((Q(x. espagnole et fran¸caise) et pratiquant des sports diff´erents (football. y) ⇒ ¬(∃u P (f (u)))) ∨ (Q(x. D´eterminer les caract´eristiques de chacune des 3 maisons.C. 5 55 9 . natation et tennis). On dispose des 5 indices suivants : – Dans la maison verte on pratique la natation. y) ⇒ (∃u P (f (u))))) ∧ (∀y (Q(x. une des maisons est situ´ee au d´ebut de la rue.2 : Formes clausales Pour chacune des expressions logiques suivantes : – ∀x P (x) – ∀x (P (x) ⇒ Q(x)) – ∀x (∃y (P (x) ⇒ Q(x. habitent dans trois maisons de couleurs distinctes (blanc.1 : Puzzle logique Trois personnes. – Le tennisman habite au d´ebut de la rue.TD 1 De la logique ` a Prolog TD 1. o` u E est l’emplacement de la maison dans la rue. N et S la nationalit´e et le sport pratiqu´e par son occupant. – La maison verte est situ´ee avant la maison de l’espagnol.N. Chacune des 3 maisons est donc caract´eris´ee par un quadruplet (E. 5 55 TD 1. de nationalit´es diff´erentes (anglaise. C la couleur de la maison. bleu. y) ⇒ P (x))) ) ) 1. Mettre l’expression logique sous forme clausale en respectant les 6 ´etapes suivantes : (a) ´elimination des ⇒ (b) d´eplacement des ¬ vers l’int´erieur (c) ´elimination des ∃ (“ skol´emisation ”) (d) d´eplacement des ∀ vers l’ext´erieur (e) distribution de ∧ sur ∨ (f) mise en clauses 2. vert). Ecrire la forme clausale obtenue sous forme de clauses Prolog. f (y)))) – ∀x. y) ⇒ ¬R(y)))) – ∀x ( P (x) ⇒ ( (¬∀y (Q(x. – La maison blanche est situ´ee avant la maison o` u on pratique le football. 3. a a s b s b . Thomson est une entreprise dynamique. nand/3 (a · b). s la sortie. 5 57 `bre de Boole TD 1. 7. s la sortie. 6. On consid`ere les conventions graphiques traditionnelles pour les op´erateurs logiques : a a·b a+b a⊕b a·b·c a+b+c a·b·c D´efinir les pr´edicats correspondant aux circuits logiques suivants. ` a partir des op´erateur de base et/3 (a· b). ou/3 (a + b) et non/2 (a). (a) a et b sont les entr´ees. Traduire par des faits Prolog les tables de v´erit´e des op´erateurs logiques de base : la conjonction (et/3 : a· b). 4. nor/3 (a + b). 2. Mozart est l’auteur de « La flˆ ute enchant´ee ». D´efinir les op´erateur xor/3 (a ⊕ b).` PROLOG TD 1. Le facteur sonne toujours deux fois. V´erifier les principales propri´et´es des op´erateurs logiques : (a) Commutativit´ e : X · Y = Y · X et X + Y = Y + X (b) Associativit´ e : X · (Y · Z) = (X · Y ) · Z et X + (Y + Z) = (X + Y ) + Z (c) Distributivit´ e : X · (Y + Z) = (X · Y ) + (X · Z) et X + (Y · Z) = (X + Y ) · (X + Z) (d) Idempotence : X + X = X et X · X = X (e) Compl´ ementarit´ e : X + X = 1 et X · X = 0 (f) Th´ eor` emes de De Morgan : X · Y = X + Y et X + Y = X · Y 4. Moli`ere est l’auteur de « L’avare ». Le voisin aime les chiens. DE LA LOGIQUE A 10 ´dicats TD 1.3 : Des relations aux pre Traduire en faits Prolog les affirmations suivantes : 1. 8. la disjonction (ou/3 : a + b) et la n´egation (non/2 : a). Le champ magn´etique est ` a flux conservatif. (a) a et b sont les entr´ees. 5. imply/3 (a ⇒ b) et equiv/3 (a ⇔ b). 2.4 : Alge 1. La voisine aime les chats. 3. L’ENIB est une ´ecole d’ing´enieurs. b et c sont les entr´ees. s la sortie. s et t les sorties. b et c sont les entr´ees. b et c sont les entr´ees. heure d’arrivee.5 : Une base de donne On consid`ere une base de faits d´ecrivant des vols de la compagnie Air-Enib : vol(numero du vol. s t s (c) a. heure de depart. a b c s7 s6 s5 s4 s3 s2 s1 s0 5 57 ´es Air-Enib TD 1. s0 . ville de depart. . a s s u t b t (b) a. s a b c a b c (a) a. s et t les sorties. s et t les sorties. ville d’arrivee.s7 les sorties. b et c sont les entr´ees. . nombre de passagers) .11 (a) a et b sont les entr´ees. (a) a. b et c sont les entr´ees et s la sortie.s1 . a b c a b c (b) a. 2. 5 59 TD 1.6) de telle mani`ere que deux r´egions adjacentes ne soient pas de la mˆeme couleur. % une route relie la ville s a la ville a 1. 3 6 4 2 5 1 Ecrire un programme Prolog qui permet d’associer une couleur (rouge. Quels types de questions peut-on poser lors de la consultation de cette base de faits ? 3.X). vert. 2. 2.7 : Coloriage d’une carte On dispose de 4 couleurs (rouge.e). bleu) ` a une r´egion (1.3. 5 60 .4. route(a. route(s. jaune. Repr´esenter le r´eseau ainsi d´efini.e). route(a.6 : Un petit re On consid`ere un r´eseau routier d´ecrit par la base de faits suivante : route(s.voisines(d.jaune. D´efinir le pr´edicat voisines(X. route(b.c).vert.bleu) pour colorier la carte repr´esent´ee ci-dessous.d).d). Tracer l’arbre de r´esolution pour la question ?. Quelles questions Prolog doit–on poser pour d´eterminer la liste des vols (identifi´es par leur num´ero) (a) (b) (c) (d) (e) (f) (g) au d´epart d’une ville donn´ee ? qui arrivent dans une ville donn´ee ? au d´epart d’une ville donn´ee et qui partent avant midi ? arrivant dans une ville donn´ee `a partir de 14 h ? qui ont plus de 100 passagers et qui arrivent dans une ville donn´ee avant 17 h ? qui partent ` a la mˆeme heure de deux villes diff´erentes ? qui durent plus de deux heures ? 5 59 ´seau routier TD 1.b). D´ecrire plusieurs vols selon le format pr´ec´edent. route(d.5. DE LA LOGIQUE A 12 1.a). route(b.Y) % Il existe une route directe entre X et Y 4.` PROLOG TD 1. mere(marie.marc). pere(bruno. homme(emile). 2. 1. homme(marc). femme(marie). femme(eve).Y) % X est l’ancetre de Y 5 60 . homme(franck).eve). D´efinir les pr´edicats suivants : (a) parent(X. % pere/2 pere(emile. pere(franck.Y) % X est le beau-frere de Y (o) belleSoeur(X. femme(julie).8 : Arbre ge On consid`ere un arbre g´en´ealogique d´ecrit par la base de faits suivante : % homme/1 homme(jean).Y) (b) fils(X. mere(evelyne. mere(julie. pere(franck. pere(bruno. homme(jerome).Y) % X est la soeur de Y (n) beauFrere(X.Y) % X est le mari de Y (f) gdPere(X. mere(evelyne. % mere/2 mere(louise.Y) % X est la femme de Y (e) mari(X.aurelie). mere(anne. pere(jean.franck). pere(fabien.aurelie).evelyne).fabien).Y) % X est la belle-soeur de Y (p) ancetre(X. mere(sophie.13 ´ ne ´alogique TD 1. % femme/1 femme(evelyne).sophie).Y) % X est un des grand-parents de Y (i) aGdPere(X.Y) % X est le frere ou la soeur de Y (l) frere(X.evelyne).eve). homme(bruno).Y) % X est la grand-mere de Y (h) gdParent(X.Y) % X est l’arriere grand-mere de Y (k) frereSoeur(X.fabien). Repr´esenter l’arbre g´en´ealogique ainsi d´ecrit. femme(aurelie). mere(anne. % ´ evelyne est une femme femme(louise).jerome).Y) % X est la fille de Y (d) femme(X.sophie).jean). % jean est un homme homme(fabien). femme(sophie). % ´ emile est le p` ere de jean pere(jean.jean).Y) % X est le frere de Y (m) soeur(X. % louise est la m` ere de jean mere(julie.Y) % X est l’arriere grand-pere de Y (j) aGdMere(X.Y) % X est un des parents de Y % X est le fils de Y (c) fille(X.franck).jerome). femme(anne).Y) % X est le grand-pere de Y (g) gdMere(X. DE LA LOGIQUE A .14 ` PROLOG TD 1. s(x) ∈ N 2. Traduire par des buts Prolog les questions suivantes : (a) Quels sont les individus (nom. – une fonction unaire s(X) qui traduit la notion de successeur d’un entier X ..pr´enom. y ∈ N. Le vocabulaire initial de la th´eorie des entiers non n´egatifs comprend : – une constante z qui repr´esente l’entier 0 (z´ero) . 15 .pr´enom) de nationalit´e fran¸caise ? (b) Quels sont les individus (nom.pr´enom. x + z = x et ∀x. – un pr´edicat unaire entier(X) (X est un entier). x · s(y) = x · y + x 4. G´ en´ eration : z ∈ N et ∀x ∈ N..1 : Etat-civil 1. Exponentiation : ∀x ∈ N. On suppose que la base de faits contient un certain nombre de fiches d’´etat-civil. xs(y) = xy · x 1 voir par exemple : Manna Z. x + s(y) = s(x + y) 3.2 : Entiers naturels Traduire en Prolog les axiomes1 d´efinissant les nombres entiers non n´egatifs (N) et les principales op´erations les concernant. (1985) The logical basis for computer programming. 1. Addition : ∀x ∈ N. y ∈ N. AddisonWeslay. x · z = z et ∀x. Traduire par un fait Prolog une ´etat–civil nom pr´enom date de naissance nationalit´e sexe adresse rue ville d´epartement fiche d’´etat-civil du type : NGAOUNDERE Richard 15/02/1960 camerounaise masculin 4 rue Leclerc Brest Finist`ere (29) 2. Multiplication : ∀x ∈ N.TD 2 Termes TD 2. Waldinger R. xz = s(z) et ∀x.nationalit´e) de nationalit´e ´etrang`ere habitant Brest dans le Finist`ere ? (d) Y a-t-il des individus habitant la mˆeme adresse ? 5 63 TD 2. y ∈ N.nationalit´e) de nationalit´e ´etrang`ere ? (c) Quels sont les individus (nom. ∀y ∈ N∗ .Y) (b) min(X. Pr´ ed´ ecesseur : ∀x ∈ N. s(x) − s(y) = x − y 7. x ≤ y ⇔ x = y ou x ≤ p(y) 8. y)) 12. x < y ⇔ x ≤ y et x 6= y 9.Imaginaire).Arg) % Arg = arg(Z) (b) modC(Z.polynome(3*cos(x)^2 + 1. y) = rest(x.Y. x ÷ y ⇔ ∃q ∈ N∗ tel que x · q = y 11.Ppcm) % P pcm = ppcm(X. y)) ∀x ∈ N. Quotient et reste : ∀x ∈ N. D´efinir les pr´edicats Prolog correspondant aux suites r´ecurentes suivantes : (a) Suite factorielle : u0 = 1 et un = n · un−1 ∀n ∈ N∗ (b) Suite de Fibonacci : u0 = 1 . x < y ⇒ rest(x. true. p(s(x)) = x 6. Factorielle : z! = s(z) et ∀x ∈ N. Y ) (c) pgcd(X.Y.Y. ∀y ∈ N∗ .cos(x)). Un nombre complexe sera repr´esent´e ici par un terme binaire c(Reel. Strictement inf´ erieur : ∀x. pgcd(x. x < y ⇒ quot(x. z) = x et ∀x ∈ N.+Variable) vrai si et seulement si l’Expression est un polynˆome par rapport ` a la Variable (variable prise au sens math´ematique du terme). y ∈ N. Division : ∀x ∈ N. y ∈ N. true. y) = x et rest(x + y.polynome(3*cos(x)^2 + 1.Mod) % M od =| Z | .Z) % Z = min(X.Y) % Y = ch(X) 2. 5 64 ´tique TD 2. false. y) 10.x).Pgcd) % P gcd = pgcd(X.y). ∀y ∈ N∗ . n > 1 3. ∀y ∈ N∗ .polynome(3*x^2 + 2*x. s(x)! = s(x) · x! 5 63 ˆ mes TD 2. ?. y) = s(quot(x. Y ) (d) ppcm(X. ?. TERMES 5. Plus grand commun diviseur : ∀x ∈ N.3 : Polyno D´efinir le pr´edicat polynome(+Expression. Soustraction : ∀x ∈ N. pgcd(x. Exemples : ?. Y ) (e) ch(X.polynome(3*x^2 + 2*x. y) = pgcd(y. D´efinir sous forme de pr´edicats Prolog les fonctions math´ematiques suivantes : % Y =| X | (a) abs(X.x).4 : Arithme 1. D´efinir les op´erations suivantes sur les nombres complexes : (a) argC(Z. Inf´ erieur ou ´ egal : ∀x ∈ N. ?. false. x − z = x et ∀x. y ∈ N. x ≤ z ⇔ x = z et ∀x.16 TD 2. rest(x. y) = 0 et quot(x + y. u1 = 1 et un = un−1 + un−2 ∀n ∈ N. []). Arbres binaires : structure soit vide.5 : Arbres et dictionnaires binaires 1.Z) % Z = Z1 + Z2 (d) mulC(Z1. M ax ∈ N. Un arbre binaire vide sera repr´esent´e ici par le terme atomique [].Val.[])) D´efinir les pr´edicats suivants concernant les arbres binaires : (a) arbreBinaire(T) % T est un arbre binaire (b) dansArbre(X.D1. Dictionnaires binaires : arbre binaire bt(Gauche. soit compos´ee de trois ´el´ements : – une racine Val. – un sous–arbre binaire Droite. . soit un terme compos´e dont tous les arguments sont des termes de base. un arbre non vide par le terme compos´e bt(Gauche.5. – Gauche et Droite sont eux-mˆemes des dictionnaires binaires. D´efinir les pr´edicats suivants concernant les dictionnaires binaires : (a) dicoBinaire(T) % T est un dictionnaire binaire (b) inserer(X.Droite) (bt comme binary tree).6 : Termes de base 1.bt([].3.9.D1.Val.A) % X est un ´el´ement de l’arbre binaire A (c) profondeur(A.Z2.Max) vrai si et seulement si : ∀I. D´efinir le pr´edicat base( ?Terme) vrai si et seulement si Terme est un terme de base . – tous les nœuds de Droite ont une valeur strictement sup´erieure `a Val . M in ≤ I ≤ M ax 5 64 TD 2.Z1) % Z1 = Z 4.D2) Exemple : 5 58 64 % X est supprim´e du dictionnaire D1 pour donner D2 33 • Q 33 18 18 50 •  @ @• 10 • 5 Q 30 • A • A• → insertion de 58 → Q  QQ60 30 • • @ @ 75 10 52 @• • @• • 33 A  A A• • • A• QQ60 • @ 75 @• • 52  • 64 30 •  → suppression de 50 → 10 • A • A• 5 18 QQ60 • @ 75 @• • 52  • 64 5 66 TD 2.D2) Exemple : % X est ins´er´e dans le dictionnaire D1 pour donner D2 50 • 50 • Q  QQ60 30 • • @ @ 75 10 @• • @• • 33 52 A  • A• • 5 18 64 (c) supprimer(X.bt([].Z) % Z = Z1 · Z2 (e) conj(Z. c’est–`a–dire soit un terme atomique.[])).Z2. M in.17 (c) addC(Z1.N) % N est la profondeur de l’arbre binaire A 2.7. Exemple : bt(bt(bt([].12.Droite) ordonn´e tel que : – tous les nœuds de Gauche ont une valeur strictement inf´erieure `a Val . – un sous–arbre binaire Gauche.Min. D´efinir le pr´edicat dans(I. D´efinir les op´erateurs Prolog n´ecessaires pour que l’´ecriture de r`egles puissent se faire de la mani`ere suivante : regle r1 avant regle r2 arriere si a et b ou c si f ou g alors d et e. 5 67 .+Terme. alors h. ?Nouveau. pierre est le maire de brest.7 : Ope 1. Repr´esenter sous forme d’arbres les expressions suivantes : (a) 2 * a + b * c (b) 2 * (a + b) * c (c) 2 * (a + b * c) (d) ((2 * a) + b) * c (e) 2 + a + b + c 2. 3. jean est le gardien de but des verts.18 TD 2. TERMES 2. 5 66 ´rateurs TD 2. D´efinir les op´erateurs Prolog n´ecessaires pour que les phrases suivantes soient des termes Prolog autoris´es : diane est la secretaire de la mairie de brest.+Terme) vrai si et seulement si SousTerme est un sous-terme de Terme. ?NouveauTerme) vrai si et seulement si NouveauTerme correspond au Terme dans lequel toutes les occurences du sous–terme Ancien ont ´et´e remplac´ees par le sous-terme Nouveau. D´efinir le pr´edicat sousTerme( ?SousTerme. 3. D´efinir le pr´edicat substituer( ?Ancien. dernier(c.dernier(X. ?. L = [X] . _G509. premier(?X. .X.premier(a. L = [_G506.premier(X.premier(a. L = [X|_G522]. ?. X = c . L = [_G504. false. false.b. L = [_G504] . true . X = a.b. ?. Ecrire de toutes les mani`eres possibles la liste [a. N = 2. 4.liste([a. X = a .c])..2 : Informations sur les listes D´efinir les pr´edicats suivants : 1.nieme(2.. X = b .liste([a.L).[a. ?.?L) : X est le dernier ´el´ement de la liste L. true.[a. false. ?..c].c]).[a.b.L).dernier(X.b..b. false. N = 1.L). ?.nieme(N. 19 .. X = c . ?.b. ?.b.c]). 2.b|c]).b|[c]]). ?. ?.nieme(N. . ?. _G524.[a.1 : Repre 1. ?.premier(X. L = [_G506. _G507. c] . false. X] . dernier(?X. ?. L = [_G521.. true .c]. false. true. false.c]). c] .X.c]). 3.[a.?X.+L) : X est le Ne`me ´el´ement de la liste L. .b. true. L = [_G521.b.?L) : X est le premier ´el´ement de la liste L.dernier(c.c]). _G510] .[a. L = [_G504.c]).b. L = [] .L). X] .b.b.liste(L). ?. _G507] . liste(?L) : L est une liste.liste([a. 2. ?. nieme(?N.[a.nieme(2.TD 3 Listes ´sentations de listes TD 3. N = 2 . 5 69 TD 3.c]). L = [a|_G507]. X = b .[a. L = [c] . N = 3. ?.c]).b. Repr´esenter par un arbre la liste Prolog [a. X.hors(b. ?. X|_G293] .L). Y|_G310] . b|_G278] . L = [_G274.suivants(X. LISTES 5. b|_G283] .b. dans(?X. .unique(b.b. X = b . X = a.[a.L).. false. false.occurences(a.c]). ?.a]). 8. ?. L = [a.suivants(a. Y = c . L = [X.b.a.c]). false. Y = 1 . false.hors(d.b. ?.. false.3.[a.unique(X. X = a . true .. L = [_G306. ?.longueur(N.X. ?. ?. ?. X = a .Y.[a.L).suivants(a. false.b.L).+L) : X n’apparaˆıt qu’une seule fois dans la liste L. unique(?X..c.c]).a]).c. true . b|_G298] .+L) : N est le nombre d’´el´ements de la liste L. N = 3 .b.[a. ?.L).b. ?.Y. ?. ?. true .Y.[a. L = [X|_G290] .a]).c]).a]).[a.suivants(a. X = b.[a. occurences(?X.occurences(X.b.a. X|_G295] .b. b|_G281] .b.occurences(X. b|_G295] .b.a. _G277. ?..b.?L) : X et Y se suivent imm´ediatement dans la liste L. ?. suivants(?X. X|_G301] . . X = a . X = b .. ?. X = c .a]).suivants(X.dans(b.[a.[a..occurences(a. hors(+X. _G292.dans(X. L = [_G289.b...b.suivants(X.c]). L = [X. b|_G280] . false.3.c]). ?.?N. X = c.c.b. L = [_G291. true . false.[a. ?. X|_G296] . a.c. ?. X|_G298] . L = [_G291.b.[a.a.b. 6. Y|_G313] .c]). L = [_G276.b.[a. X = b. Y = b .?Y. . 7.c]). a.c. .L).suivants(X. _G294.X.b.c]). a. ?.[a. true . false. false. false. Y = 3 .[a.+L) : X n’appartient pas `a la liste L. X = a. false. . X = b .. false. ?.dans(b. ?. ?.[a.?L) : X appartient ` a la liste L.b. L = [_G289.. 9. L = [_G274. false. false.longueur(3.b. X = 3 . X.dans(X. L = [_G291.c]). true .c.suivants(a. false.+L) : X apparaˆıt N fois dans la liste L.b.20 TD 3..a]). L = [a. . L = [b|_G275] .b.X. 10.[a. Y = 2 . . longueur(?N. X = c .b. L). ?.?L) : SL est une sous–liste de la liste L. 12. false. . L = [a. L = [_G289. L = [_G289|_G293] .sousListe([b]. c] . P = [a.[a.b].[a.L). false. c] . SL = [] . S = [b.prefixe([a. _G298|_G302] . c] . _G286.c]).. ?. SL = [b] . b|_G290] . _G295|_G299] . P = [_G289. SL = [a. c] . . ?. P = [a. L = [_G289|S] . false. b. ?. SL = [_G289]. L = [_G292. b.. S = [c] . P = [] .21 11.c].L).b. ?.c]). b.b.[a. c] . S = [a. L = [_G286. true .suffixe([b. . false. b.c]).L). P = [_G289]. true . b|_G290]. suffixe(?S.L). L = [_G280.. ?.sousListe([b].L). _G295].?L) : P est un pr´efixe de la liste L..b]. L = [b|_G284] . SL = [] .. P = [a] . 5 69 TD 3. SL = [_G289. prefixe(?P.. _G289|_G302] . SL = [c] ..?L2. ?. SL = [b. _G289. L = [_G289. S = [] . S = L . ?. L = [b. P = [] .b.prefixe([a. L = [_G289. . _G298].c]). . ?.suffixe(S.sousListe(SL. ?. c] .3 : Manipulation de listes D´efinir les pr´edicats suivants : 1. b|_G296] . true. 13. SL = [a] .b.c]. . L = [_G286. b] . c] ..[a.b.prefixe(P.suffixe([b.c]). false. b] . ?. c] .. b.suffixe(S.c]).b. conc(?L1. SL = [a. L = [_G280.[a. sousListe(?SL.?L3) : concat´enation de listes (L1 + L2 = L3).sousListe(SL. L = [_G289|_G296] .[a.?L) : S est un suffixe de la liste L. SL = [_G289].prefixe(P.. _G292|S] . ?. 22 TD 3. LISTES ?- conc([a],[b,c],[a,b,c]). true. ?- conc([a],[b,c],L3). L3 = [a, b, c]. ?- conc([a],L2,[a,b,c]). L2 = [b, c]. ?- conc([a],L2,L3). L3 = [a|L2]. ?- conc(L1,[b,c],[a,b,c]). L1 = [a] ; false. ?- conc(L1,[b,c],L3). L1 = [], L3 = [b, c] ; L1 = [_G303], L3 = [_G303, b, c] ; L1 = [_G303, _G309], L3 = [_G303, _G309, b, c] ; ... ?- conc(L1,L2,[a,b,c]). L1 = [], L2 = [a, b, c] ; L1 = [a], L2 = [b, c] ; L1 = [a, b], L2 = [c] ; L1 = [a, b, c], L2 = [] ; false. ?- conc(L1,L2,L3). L1 = [], L2 = L3 ; L1 = [_G306], L3 = [_G306|L2] ; L1 = [_G306, _G312], L3 = [_G306, _G312|L2] ; ... 2. inserer(?X,?L1,?L2) : X est ins´er´e en tˆete de L1 pour donner L2. ?- inserer(a,[b,c],[a,b,c]). true. ?- inserer(a,[b,c],L2). L2 = [a, b, c]. ?- inserer(a,L1,[a,b,c]). L1 = [b, c]. ?- inserer(a,L1,L2). L2 = [a|L1]. ?- inserer(X,[b,c],[a,b,c]). X = a. ?- inserer(X,[b,c],L). L = [X, b, c]. ?- inserer(X,L1,[a,b,c]). X = a, L1 = [b, c]. ?- inserer(X,L1,L2). L2 = [X|L1]. 3. ajouter(?X,?L1,?L2) : X est ajout´e en fin de L1 pour donner L2. ?- ajouter(c,[a,b],[a,b,c]). true ; false. ?- ajouter(c,[a,b],L). L = [a, b, c] ; false. ?- ajouter(c,L1,[a,b,c]). L1 = [a, b] ; false. ?- ajouter(c,L1,L2). L1 = [], L2 = [c] ; L1 = [_G291], L2 = [_G291, c] ; L1 = [_G291, _G297], L2 = [_G291, _G297, c] ; ... ?- ajouter(X,[a,b],[a,b,c]). X = c ; false. ?- ajouter(X,[a,b],L2). L2 = [a, b, X] ; false. ?- ajouter(X,L1,[a,b,c]). X = c, L1 = [a, b] ; false. ?- ajouter(X,L1,L2). L1 = [], L2 = [X] ; L1 = [_G306], L2 = [_G306, X] ; L1 = [_G306, _G312], L2 = [_G306, _G312, X] ; ... 4. selection(?X,?L1,?L2) : X est extrait de L1 pour donner L2. 23 ?- selection(b,[a,b,c],[a,c]). true ; false. ?- selection(b,[a,b,c],L2). L2 = [a, c] ; false. ?- selection(b,L1,[a,c]). L1 = [b, a, c] ; L1 = [a, b, c] ; L1 = [a, c, b] ; false. ?- selection(b,L1,L2). L1 = [b|L2] ; L1 = [_G291, b|_G295], L2 = [_G291|_G295] ; L1 = [_G291, _G297, b|_G301], L2 = [_G291, _G297|_G301] ; ... ?- selection(X,[a,b,c],[a,c]). X = b ; false. ?- selection(X,[a,b,c],L2). X = a, L2 = [b, c] ; X = b, L2 = [a, c] ; X = c, L2 = [a, b] ; false. ?- selection(X,L1,[a,c]). L1 = [X, a, c] ; L1 = [a, X, c] ; L1 = [a, c, X] ; false. ?- selection(X,L1,L2). L1 = [X|L2] ; L1 = [_G306, X|_G310], L2 = [_G306|_G310] ; L1 = [_G306, _G312, X|_G316], L2 = [_G306, _G312|_G316] ; ... 5. supprimer(?X,+L1,?L2) : toutes les occurences de X sont supprim´ees de L1 pour donner L2. ?- supprimer(a,[a,b,a,c],[b,c]). true ; false. ?- supprimer(a,[a,b,a,c],L2). L2 = [b, c] ; false. ?- supprimer(X,[a,b,a,c],[b,c]). X = a ; false. ?- supprimer(X,[a,b,a,c],L2). X = a, L2 = [b, c] ; X = b, L2 = [a, a, c] ; X = c, L2 = [a, b, a] ; false. 6. inverser(+L1,?L2) : inverser L1 donne L2. ?- inverser([a,b,c],[c,b,a]). true. ?- inverser([a,b,c],L2). L2 = [c, b, a]. 7. substituer(?X,?Y,+L1,?L2) : substituer toutes les occurences de X par Y dans L1 donne L2. ?- substituer(a,e,[a,b,a,c], [e,b,e,c]). true ; false. ?- substituer(a,e,[a,b,a,c],L2). L2 = [e, b, e, c] ; false. ?- substituer(a,Y,[a,b,a,c], [e,b,e,c]). Y = e ; false. ?- substituer(a,Y,[a,b,a,c],L2). L2 = [Y, b, Y, c] ; false. ?- substituer(X,e,[a,b,a,c], [e,b,e,c]). X = a ; false. ?- substituer(X,e,[a,b,a,c],L2). X = a, L2 = [e, b, e, c] ; X = b, L2 = [a, e, a, c] ; X = c, L2 = [a, b, a, e] ; false. ?- substituer(X,Y,[a,b,a,c],[e,b,e,c]). X = a, Y = e ; false. ?- substituer(X,Y,[a,b,a,c],L2). X = a, L2 = [Y, b, Y, c] ; X = b, L2 = [a, Y, a, c] ; X = c, L2 = [a, b, a, Y] ; false. 24 TD 3. LISTES 8. decaler(+L,?LD) : LD est la liste L o` u les ´el´ements ont ´et´e d´ecal´es circulairement vers la droite. ?- decaler([a,b,c],[c,a,b]). true ; false. ?- decaler([a,b,c],L). L = [c, a, b] ; false. 9. permutation(+L,?LP) : LP est une permutation de la liste L (si n est le nombre d’´el´ements de la liste, il y a n! permutations possibles). ?- permutation([a,b,c],[b,c,a]). true ; false. ?- permutation([a,b,c],LP). LP = [a, b, c] ; LP = [a, c, b] ; LP = [b, a, c] ; LP = [b, c, a] ; LP = [c, a, b] ; LP = [c, b, a] ; false. 10. convertir(?L,?LC) : LC est la liste L ( = [t1,t2,...,tn] ) ´ecrite sous la forme t1 et t2 et ... et tn et fin. ?- convertir([a,b,c], a et b et c et fin). (2) true. ?- convertir([a,b,c],LC). LC = a et b et c et fin. ?- convertir(L,a et b et c et fin). L = [a, b, c] ; false. ?- convertir(L,LC). L = [], LC = fin ; L = [_G289], LC = _G289 et fin ; L = [_G289, _G295], LC = _G289 et _G295 et fin ; ... 11. aplatir(+L,?LA) : LA est la liste L qui ne contient plus qu’un seul niveau de crochets ( [...] ). ?- aplatir([a,[b,[[]]],[c]], [a,b,c]). true ; false. ?- aplatir([a,[b,[[]]],[c]],LA). LA = [a, b, c] ; false. 12. transposer(+L,?LT) : LT est la matrice transpos´ee de la matrice L. ?- transposer([[1,2,3],[4,5,6]],L). L = [[1, 4], [2, 5], [3, 6]] ; false. ?- transposer([[1,4],[2,5],[3,6]],L). L = [[1, 2, 3], [4, 5, 6]] ; false. 13. creerListe(?X,+N,-L) : L est la liste cr´e´ee `a partir de N occurences du terme X. ?- creerListe(0,3,L). L = [0, 0, 0]. ?- creerListe(X,3,L). L = [X, X, X]. 14. univ(?F,?L) : L est la liste dont la tˆete est le nom du terme F et la queue est compos´ee des arguments de F. Chacun des arguments peut ˆetre libre, mais pas les deux simultan´ement. ?- univ(f(a,f(b)),[f,a,f(b)]). true ; false. ?- univ(f(a,f(b)),L). L = [f, a, f(b)] ; false. ?- univ(F,[f,a,f(b)]). F = f(a, f(b)) ; false. b.b].c]).triFusion([c.c]).25 5 70 TD 3.triSelection([c.a. ?. false. ?. b.triRapide([c. b.b. ?.b. triRapide(+L.triDicho([c. 4. triDicho(+L.a]. ?. ?. ?.triRapide([c. LT = [a.[a. true .?LT) : LT est la liste L tri´ee selon la m´ethode de tri par fusion.c]). ?. false. true .b.[a. ?. true .c]).[a. LT = [a. 6.b.?LT) : LT est la liste L tri´ee selon la m´ethode de tri par insertion dichotomique. LT = [a. triBulles(+L. ?.LT). false.a]. c] .LT).triSelection([c.?LT) : LT est la liste L tri´ee selon la m´ethode na¨ıve des permutations (m´ethode « g´en´erer et tester »). c] . false. b.c]).a]. 5 72 TD 3. triPermutation(+L. LT = [a. . false.?LT) : LT est la liste L tri´ee selon la m´ethode du tri `a bulles.LT). 5. b. LT = [a.[a. c] .[a.LT). false.LT).triPermutation([c.LT).a].triPermutation([c.a. triFusion(+L.a].b. true .b. ?. false.b]. false. LT = [a.5 : Piles et files Les piles et les files sont repr´esent´ees ici par des listes Prolog. 3. c] .triFusion([c.b. b.b.b. true .4 : Tris de listes D´efinir les pr´edicats suivants : 1.triBulles([c.triDicho([c.a.b]. 2.?LT) : LT est le liste L tri´ee selon la m´ethode de tri rapide.a]. c] . triSelection(+L. c] . ?. false. false. true .b.b.b].[a.b.?LT) : LT est la liste L tri´ee selon la m´ethode du tri par s´election.a.a]. b.b. ?.triBulles([c.a]. false. false.c]). L1 = [c.L2). true.L1.L2). ?.. X].[c.L2).?L1. X] . .a].[b.?L2)) : empiler (enfiler) X dans la pile (file) L1 donne L2.[c.. a]. ?.empiler(X. ?.empiler(X. b. b.empiler(a. empiler(?X.. L1 = [b. c]. ?. ?. L2 = [_G291] .defiler(a. LISTES empiler .empiler(a. true .[c. ?. ?.defiler(X.c]. ?.?P1.a]. X = a.defiler(a.L1.c]).L2).empiler(X. 4.pileVide(L).c]. ?.[c. true.empiler(X.tete(X.[c.L1.b. L = []. _G274. ?. L1 = [X]. L = [X] .c]). 2.[b. L1 = [_G306. pileVide(?L) (fileVide(?L)) : tester si la pile (file) L est vide.. L2 = [] .empiler(a. L = [_G271. false.d´ epiler t^ ete ? sommet - 3 ? 2 enfiler - 3 2 1 . b] . _G289.L).b.L).?P2) (defiler(?X.. ?. true..b. ?.[c. ?. L2 = [c.[b.b]). . false. c].L2).?L)) : X est le sommet (la tˆete) de la pile (file) L.[a.L1.b. X = a . L1 = [a]. X].26 TD 3. false.b.?L) (tete(?X.[a.b]). ?.b. . b] . false. L = [_G286.?L1. L = [_G286. L2 = [] . sommet(?X.b.tete(a.L2). depiler(?X.L1.c]).L1. L2 = [a.defiler(a. X = a.[a. L = [a] . ?.b]).a]). L1 = [c.[c.tete(X.d´ efiler 1 Pile File D´efinir les principales op´erations sur ces structures : 1.pileVide([]). L2 = [c.b. . ?.L1.c]).c]. ?.[c. a] .defiler(X.L2). ?. X = a.?F1. L1 = [_G291. L2 = [X.L2). . ?.[c.b.b.a]. ?.?F2)) : d´epiler (d´efiler) X de la pile (file) L1 donne L2. ?. b.defiler(X. L2 = [_G306] . c].[b. X = a. L2 = [X|L1].defiler(a. b.[c. L2 = [a|L1]..c]. a]. a] . L = [_G271. 3.a]). X] .empiler(a.L1. L1 = [b.tete(a. ?.a].b]).?L2) (enfiler(?X.defiler(X.. c].[a. 3.intersection([a. true .N.c. b. ?. o` u C est la couleur de la maison. 5. false.7 : Puzzle logique On reprend ici le puzzle du TD 1.a]. false.1 page 9 pour le r´esoudre automatiquement en Prolog.d.a.c]). E3 = [a.S).b.[b.c]. d] . b] . ?. true .d. false.b.a].?E3) : union de 2 ensembles (E3 = E1 ∪ E2). false.c]).a].b. [a. E3 = [a.?E) : la liste L est transform´ee en un ensemble E. union(+E1. false.E). [a. ?.c]. ?.c].[a.d.b. Il y a a priori 216 combinaisons possibles.b.6 : Ensembles Un ensemble est repr´esent´e ici par une liste Prolog dont les ´el´ements sont tous diff´erents les uns des autres. une autre au milieu. ?. false.intersection([a.a.[b. false.union([a. c] . de nationalit´es diff´erentes (anglaise. .c.c]).b]).b. sousEnsemble(+E1.+E2. ?.[a. E = [a.c]).a. 5 75 TD 3.d]).a].ensemble([a. ?. et la troisi`eme au bout de la rue.b. false. 1.[b. Ces trois maisons sont situ´ees dans la mˆeme rue . Chacune des 3 maisons est caract´eris´ee par un triplet m(C.union([a. ?.E3). true .c. natation et tennis). true .a. true . ?. false. [a. c. b. une des maisons est situ´ee au d´ebut de la rue.ensemble([a.b.b.a].c.b.b]. D´efinir les pr´edicats suivants : 1. Trois personnes.+E2) : E1 est un sous-ensemble de E2 (E1 ⊂ E2). habitent dans trois maisons de couleurs distinctes (blanc.a. N et S la nationalit´e et le sport pratiqu´e par son occupant.sousEnsemble([b]. true . 4.listeEnsemble([a.27 5 74 TD 3.E3).d.[b.b.a]. listeEnsemble(+L.?E3) : intersection de 2 ensembles (E3 = E1 ∩ E2).d]).c].+E2. ?. espagnole et fran¸caise) et pratiquant des sports diff´erents (football. 2. ensemble(+L) : la liste L rep´esente un ensemble. false. bleu. intersection(+E1.sousEnsemble([d.listeEnsemble([a. vert). D´efinir le pr´edicat tableau(?Rue) o` u Rue est la liste des maisons qui satisfont `a la description pr´ec´edente.b. L’ordre des ´el´ements dans la liste correspond `a l’ordre des maisons dans la rue. maximum(+L. m(bleu.2.?Max) : Max est le maximum des nombres qui composent la liste L.somme([1.3].+B. R = [m(blanc.?L) : L est la liste des entiers compris entre Min et Max inclus (Min <= Max).Z]).8 : Listes et arithme On consid`ere ici des listes de nombres. ?. produitScalaire(+A. R = [m(bleu. . L = [1. m(vert. entiers(+Min. 3] .+Max.5. somme(+L.8. false. true..tableau(R). espagnol. natation).8).. ?. false.1. LISTES ?. francais.. true . francais. ?. m(bleu.28 TD 3.?N) : N est la somme des ´el´ements de la liste L. 2. espagnol.?P) : P est le produit scalaire de deux vecteurs A et B. false.3.3].6). – La maison verte est situ´ee avant la maison de l’espagnol.. – La maison blanche est situ´ee avant la maison o` u on pratique le football. false.entiers(1.maximum([7. – L’anglais habite la maison blanche.3]).3]. ?.2.5. R = [m(vert. natation). m(blanc. m(bleu. M = 8 . m(blanc. football)] .puzzle(R). espagnol.8. m(vert. R = [m(blanc.Y. Un vecteur est repr´esent´e ici par une liste de composantes ([X. natation). football).2.3. – Le tennisman habite au d´ebut de la rue.2. 5 76 ´tique TD 3. ?. D´efinir le pr´edicat puzzle(?Rue) o` u Rue est la liste des maisons qui v´erifient les indices pr´ec´edents. francais. D´efinir les pr´edicats suivants : 1. .2. . 3. francais. football). Chaque indice doit trouver sa traduction Prolog dans la d´efinition du pr´edicat puzzle/1. tennis). ?. false. anglais.somme([1.L). football)] .1. false.N). ?. 2. L’ordre des ´el´ements dans la liste correspond `a l’ordre des maisons dans la rue. On retrouve bien sˆ ur ici la solution obtenue page 55. natation). anglais. 4.entiers(1. espagnol. tennis)] . On donne maintenant les indices suivants : – Dans la maison verte on pratique la natation. anglais.M). anglais.maximum([7. tennis)] . tennis). true . m(vert. 2. N = 6.3].[1. i ?. Exemples : x = 2. 13] .4]. operation(+X. 5.5). y = 2. ?. 5. z = 4. 13]).2.operation(2.1). E = (2+4)*6+5 . 7. true . 3.(4.1). z et t pour obtenir un cinqui`eme nombre r donn´e.((2+4)*6)+5).6. y = 5.+Y. .(1.(0. positif sinon. P = 15.6)]. false. true .(1.Op.6). (0.(4.?L) : L est la liste des N premiers nombres premiers (on pourra utiliser la m´ethode du crible d’Eratosth`ene).premiers(14.6. [-1. ?.2. t = 1. .5. ?. false. premiers(+N..4. ?. 11. false.0).+. z = 4. false.2. t = 5. true . false.1).. z et t peuvent apparaˆıtre dans n’importe quel ordre mais ne doivent intervenir qu’une seule fois dans la combinaison. ?.(1.surface([(0. Seuls les op´erateurs arithm´etiques +.surface([(4.3.2. − et ∗.P). true .calcul(2.2).calcul(2. . z = 3. .0).3.1). 11.+Y. r = 1 x + t − yz = r D´efinir les pr´edicats suivants : 1.?Expr) : (((X Op1 Y) Op2 Z) Op3 T) = R ou ((X Op4 Y) Op5 (Z Op6 T)) = R.]). ?. Op2. (0. Op = + .+T. 2.?Op.4].2).5. [1. − et ∗ seront utilis´ees.5).1. 2.?S) : S est la surface du polygone P repr´esent´e ici par une liste de points ([(X1. (0. ?. -/2 et */2. 3.L). Les nombres x. calcul(+X.8). ?.6)]. false.S). Op6 repr´esentent chacun l’un des 3 op´erateurs arithm´etiques +.0 . false. t = 6. [-1.E).41. 2.0)]. false. y = 5. 5.produitScalaire([1. surface(+P.+Z) : X Op Y = Z o` u Op repr´esente l’un des 3 op´erateurs arithm´etiques +/2.-8).3]. (0.S).operation(2.8). r = 41 xyz + t = r x = 2.premiers(14.Y2). ?.(X2.15).0).29 ~·B ~ = A X Ai · Bi . Z 1 S= xdy − ydx. false. Le signe de S est n´egatif si l’orientation du polygone est dans le sens 2 des aiguilles d’une montre.41.9 : Le compte est bon Le jeu du « compte est bon x consiste ici `a d´eterminer une combinaison arithm´etique entre 4 nombres connus x. 6.+Z.(4.0).4. ?.(1. 5 76 TD 3. L = [1. r = 41 t(x + z) + y = r x = 2. Expr la combinaison trouv´ee.0).+R. S = -8 . y.3].Y1). o` u Op1. true. true .produitScalaire([1.(0. false. y.(4. S = 1.6). ?.surface([(0.surface([(4. 7.0)]. +Z.A.O.N1.D].R. 5 77 ˆte cryptarithme ´tique TD 3.Z. LISTES 3.N3). casseTete(6. 2.A. N3 = [1.[E.A.C. 3. 7.I. Y. 9. E = (2+4)*6+5 . . 9}) et o` u deux lettres diff´erentes repr´esentent deux chiffres diff´erents (10 lettres diff´erentes au maximum). les n reines se trouvent n´ecessairement `a des abscisses diff´erences puisqu’elles ne peuvent pas ˆetre situ´ees sur une mˆeme verticale.N2.compte(2.E). ni sur les mˆemes diagonales.M. .D]. casseTete(2. 5. N1 = [5.Y]).L. L2 le deuxi`eme nombre du casse-tˆete (exemple : [E. ?. 7.[Z.R. compte(+X.N. casseTete(3.N2. 2 .N.R. 0] . Z et T ´egale au nombre R. 6] ..4. 5 78 `me des n reines TD 3.C. N1 = [4.[M. 5]. 6.O.E.N.E]). 4. 2.30 TD 3.4.y2).[A.O].D]. 3. Si le probl`eme des n reines a une solution.[M.[L.O.N2.B. N2 = [2.C. 8.[A.N..O.L.6.O.A.6.N. 7. 9].[S.M.yn)]).N1. N3 = [7.E].+L2.L. N2 = [1.U.+R.11 : Proble On cherche ` a placer n reines sur un ´echiquier (n × n) sans qu’aucune des reines ne puisse en attaquer une autre. .10 : Casse-te Dans cet exercice.[M.O.casseTete(7. casseTete(4. N1 = [8.5.D]).[M. 2. 2. ?. casseTete(8.N3).E]. Les casse-tˆetes seront cod´es par les faits Prolog suivants : % casseTete/4 casseTete(1.E. 7].S.N. somme(N1. casseTete(7. N3 = [1.compte(2.41. 5].[B. Ainsi deux reines ne peuvent pas se situer sur la mˆeme horizontale. false.?Expr) : Expr est une expression arithm´etique des nombres X.T.N].T]). 2] .E. 7.A]).D]. 8.N3). on cherche ` a r´esoudre des casse-tˆetes cryptarithm´etiques du type : z e r o m a p p e g r a n d + z e r o + m o n d e + e c r a n = r i e n = a t l a s = c i n e m a o` u chaque lettre repr´esente un chiffre (∈ {0.[R.[D. leur position dans la liste codant pour sa part implicitement leurs abscissees respectives ([y1.R.R. 1.[R. 2. 1.O.E.[D.R.A.R. 0. 5. N2 = [9.E].A.casseTete(2.A]).E].. 0.E]. 9..E.N. ?. 4.[S.+T.E.A.((4+2)*6)+5).+L3) o` u L1 repr´esente le premier nombre d’un casse-tˆete (exemple : [G.yn] → [(1. true . 7]. On repr´esentera alors la solution par la liste de leurs ordonn´ees respectives. 4. false..A. 5].N.[C.E]).N]) et L1 la somme du casse-tˆete (exemple : [C.I. ?.A.S.. ni sur la mˆeme verticale.A.P.O.E. 7. E = (4+2)*6+5 . false.D].[G.[M.I. . 8.L.I.A.[C. casseTete(5.41.P].+Y. false. 9. 6.N.N]).S].(2.E].P.N]). 6.R.N. 6.U.[G.E.A.R.N3).E.O. D´efinir le pr´edicat somme(+L1.R. 7. 6.(n.[D.N.O].D.S]).O.y1).N2.[M.E. 1.5.[Z.y2.N. somme(N1. e.o. 4. Mutant = caribours . 1. 3.t. 3) ne s’attaquent pas mutuellement.e.Mutant). 2. 3.t. 2] .i. Pour stocker ces mots.?L) o` u L repr´esente la liste des ordonn´ees de N reines plac´ees sur un ´echiquier (N×N) de telle mani`ere qu’elles ne s’attaquent pas mutuellement.t]. Dans cette figure les quatre reines R1 (1. 1.s. L = [5.3)]). L = [2.o. Mutant = koalapin .lemming. 1.mutant(poule. 4). . 5. 2. L = [3.mutant(koala. on dispose d’un dictionnaire repr´esent´e en Prolog par un ensemble de faits dico/1 tels que : % dico/1 dico([c. L = [2.+Mot2.2. false. L = [1. false. 1.e]). .r. ?. liste → [l. 5 79 ´s TD 3. 1. dico([l. L = [2.13 : Mots croise Un mot sera repr´esent´e ici par la liste des caract`eres qui le composent. .t]). ?.nreines(4.3. L = [3.Mutant). 2.L). R2 (2.mutant(vache. Mutant = alligatortue . 5. . . . 2.Mutant). caracteres → [c. R3 (3.c. 3.e.t. 3. L = [4. ?.a.r. ?. 5. false. false. dico([m. ?. 2). .tortue. `a partir de deux mots Mot1 et Mot2. 1) et R4 (4.e. .nreines(5.mutant(alligator.r.(2. 4. false.2). 3. ?.4]).a.mutant(caribou. Exemples : mot → [m.Mutant). on v´erifie ainsi qu’elle n’attaque pas les trois autres reines.Mutant). A titre d’exemple. L = [3. cr´ee un troisi`eme mot Mot3 en faisant co¨ıncider la fin du premier (Mot1) avec le d´ebut du deuxi`eme (Mot2). false. 4. false. 3 D´efinir le pr´edicat nreines(+N.L).mangouste. .t. 4] 3] 5] 4] 5] 1] 2] 1] 3] 2] .r.[1. 5. L = [1. ] .a. 4.s]).Mutant). 4..(3. .31 1 La figure ci-contre illustre le probl`eme des n reines pour n = 4.i.?Mot3) qui. Mutant = poulemming . false. 5 79 TD 3. L = [4.1. false. 5.a.4.e].lapin. 4. les positions marqu´ees d’un point rouge (•) sont attaquables par la reine R3 .12 : Les mutants D´efinir le pr´edicat mutant(+Mot1.ours.. leur position dans la liste codant implicitement leurs abscisses respectives (sousentendu : [(1. 3] . 2 4 • R2 4 3 3 6 @ I • @ • R4 • • @ 2 R1 @ • @  @ 1 • • R3 @ •- @ ? R [ 2 .c.1). 2. 4 . 4.nreines(4. 1 . 5.s]. Mutant = vacheval . 1. 1.s.cheval.4).mutant(caiman. L = [5. ?. 1.3]). 4. Mutant = caimangouste . ?.(4. La solution pr´esent´ee est donc cod´ee par la liste des ordonn´ees des 4 reines ([2. 2. ?. 3. ?M3. ?. false.M6. false.x.o.3).t]. M3.3). ?.nbCars([m.?NbCars) : NbCars est le nombre de caract`eres qui composent le Mot.o). [t.rang([m. false.+NbCars) : Mot est un mot de NbCars caract`eres dans le dictionnaire.N2).?Car) : Car est le caract`ere de rang N dans le mot Mot.M5. ?.e.?M6.N. i.32 TD 3.N1. u].t]. ?. t] .t].x.rang([m.3).C). M6 = [h.o. N1 = 2. C = t .e.5). M5.t].2. N2 = 1 .e. h.e.t].2. n].N1.5).o).M3.t]. M4 = [d. false. false. [t.rang([m. interCar(+Mot1. M4.M4.2. N = 2 .interCar([m.interCar([m.interCar([m. M2. [t. false.o. rang(+Mot. N1 = 3.o].o.o. N2 = 5 .t.M2. false.C). C = m .rang([m.?M7) : les mots M1. u.selectMot([m. N = 3. ?. a.o. o. false. N = 3 .t]. N1 = 3.?M4.o].t. a]. motsCroises(?M1.t].o. N2 = 5 . M5 = [c. 4. ?. 5. N2 = 4 .nbCars([m. C = o .o.?N.N2). LISTES D´efinir les pr´edicats suivants : 1.o. 2. Mot = [m. e]. N = 2.?M2. false. ?. selectMot(?Mot. true . N1 = 2 .o. ?. ?. c] .N).+Mot2.interCar([m. true . false. nbCars(+Mot. M1 = [c.t].t].o]. true . M6 et M7 du dictionnaire permettent de compl´eter la grille ci-dessous compos´ee de 7 mots num´erot´es de 1 `a 7.t]. true .t.?N1. ?. l. false. t].?M5. [t. false.motsCroises(M1.M7).N.2. false. C = o .o. N = 1. 1 - 5 6 7 ? ? ? 2 -4 3 - ?. a].selectMot(Mot. M7 = [t. 5 79 . r.o].x.x.?N2) : le caract`ere de rang N1 dans le mot Mot1 est identique au caract`ere de rang N2 dans le mot Mot2.t. ?. M3 = [n. 3. ?. M2 = [l. d(sin(cos(x)).[9.D).x.x. a..2 : Traitements ge D´efinir le pr´edicat map(+F. 33 . D´efinir les 3 pr´edicats suivants : (a) codes(?Codes. 97.L).?DFV) o` u DFV est la d´eriv´ee de l’expression FV par rapport `a la variable V (variable au sens math´ematique du terme).codes(L. 4].cos(x). ?.d(cos(x)^2.97. false. false..D). L = [’A’. false. D = 2*x^(2-1)*exp(x^2).d(exp(x^2). 9]] .5]].x. L = [65. ?.b]). ?.?Lettres) : Codes est la liste des codes ASCII correspondant ` a la liste des lettres Lettres ?.3 : Du mot aux syllabes 1. ?. 66. ?.L).66.98]. ?. On rappelle ci-dessous les principaux r´esultats concernant les d´eriv´ees de fonctions : d(xn ) = nxn−1 dx d(sin(x)) = cos(x) dx d(cos(x)) = − sin(x) dx d(exp(x)) = exp(x) dx d(log(x)) 1 = dx x . [5. ’B’. dC = 0 si C = Cte/x dx d(u + v) du dv = + dx dx dx d(u · v) du dv =v· +u· dx dx dx d(f (u)) du d(f (u)) = · dx dx du 5 81 ´ ne ´riques TD 4.TD 4 Contrˆ ole de la r´ esolution ´rivation symbolique TD 4. L = [1.[’A’. ?.D).2.codes([65.a.-3].map(abs. 5 81 TD 4. ?L2) o` u L2 est la liste L1 o` u chaque ´el´ement a ´et´e trait´e `a l’aide du pr´edicat de symbole fonctionnel F. 2.[[4.+V. b]. 98] . D = 1/x*cos(ln(x))+2*x^(2-1).[-1. D = -1*sin(x)*cos(cos(x)). 3] .3].map(triRapide.’B’.+L1. L = [[3.L).D).1 : De D´efinir le pr´edicat d(+FV. D = 2*cos(x)^(2-1).d(sin(ln(x))+x^2. M = ’al+go+rith+me’ . gn et th sont ins´eparables : or-tho-gra-phe so-phis-ti-qu´ ee – Quand il y a trois consonnes cons´ecutives `a l’int´erieur d’un mot.t]). forment avec cette consonne qui les pr´ec`ede un groupe ins´eparable (bl.b]).M).-. ?. false. M = mot .?Lettres) : Lettres est la liste des lettres qui composent le terme atomique Mot ?. la seconde ` a la syllabe suivante : syl-la-bes en ar-gent mas-sif Exceptions : les consonnes l ou r pr´ec´ed´ees d’une consonne autre que l ou r. – consonne(?C) : C est une consonne. cr.-. ch.decomposer(’ABab’. gr. ph. M = ’ABab’ . a.+. sont ins´eparables. tr. prises dans cet ordre.o. t]. gr. ?. cl. 5 81 TD 4.cesures(inseparable. M = ’syl+la+be’ . false. ?. false. dr. fr. les deux premi`eres terminent une syllabe. la premi`ere appartient `a la syllabe pr´ec´edente.?S) o` u S est le mot M dans lequel les syllabes sont s´epar´ees par le caract`ere s´eparateur Sep. vr). ph.M). br. CONTROLE DE LA RESOLUTION 34 (b) decomposer(+Mot. vr.ˆ ´ TD 4.decomposer(mot.cesures(syllabe.M). gl.L). qui commence une syllabe : o-gre li-bre Les groupes ch. cr.+Lettres) : Mot est le terme atomique dont la liste des lettres est Lettres ?. (c) recomposer(?Mot./. br. L = [’A’.cesures(algorithme. ?. pl. fl. ?.+. l’autre commence une nouvelle syllabe : rith-me obs-ti-n´ e Exceptions : les groupes ins´eparables (bl. false.4 : Gestion d’un compteur On veut pouvoir g´erer un compteur comme une variable globale d’un langage imp´eratif (comme C ou Pascal).?C2]) : les consonnes C1 et C2. gl.L). pr. cl.a. false. On admet maintenant les r`egles de c´esure suivantes : – Une consonne situ´ee entre deux voyelles introduit une nouvelle syllabe : tra-vaux di-ri-g´ es pro-log – Si deux consonnes sont situ´ees entre deux voyelles. M = ’an/ti/cons/ti/tu/tion/nel/le/ment’ . ’B’. o.[’A’. L = [m. pr. pl. th) sont assimil´es `a une seule consonne : af-flux ins-truit On suppose par ailleurs que les pr´edicats suivants sont d´efinis : – voyelle(?V) : V est une voyelle.recomposer(M. ?. M = ’in-se-pa-ra-ble’ .M). fl. dr.M).recomposer(M. – inseparables([?C1. false.+Sep.cesures(orthographe. ?. fr. b]. D´efinir les pr´edicats suivants : . gn.[m. false. 2.cesures(anticonstitutionnellement.’B’. D´efinir le pr´edicat cesures(+M. M = ’or-tho-gra-phe’ . tr. cptFin(+Cpt) : le compteur Cpt est d´etruit. ?. M = 5.xfx.35 1. a b c d e f g h i j k l m n o p q r s t u v w x y z true. cptVal(d.alphabet. ?. op(900. Y = 5.?Val) : la valeur du compteur Cpt est Val.cptInc(d. M = 3. true.X2 :Q2. V = 6.alors).. 5 82 ˆ le TD 4..xfx.xfx. ?..3).xfx.:=).. op(750. ?.cptVal(d. ?.xfx.4).xfx. 4.xfx. cptVal(c.V). op(900.cptInit(c.V).dans). op(900.+Val) : le compteur Cpt est initialis´e `a Val. op(800.cptVal(c. op(850. cptInit(+Cpt. 2. ?. op(750. V = 7.sinon).to).V). op(850.fx .cptVal(c. op(800. 1. D´efinir les pr´edicats correspondants aux 4 structures de base : (a) si/1 ?. op(850. true..V).Xn :Qn] – selon X dans [X1 :Q1.V).autrement). true.X2 :Q2.X = 3.fx .. op(850.-5). ?.cptFin(c). X = 3.si). .xfx.+Inc) : le compteur Cpt est incr´ement´e de Inc. Repr´esenter par des arbres les 7 types de structures compte-tenu de la d´efinition des op´erateurs.X = 3. 2.cptVal(c. true.cptInit(d. ?. V = 3. V = 1.repeter).xfx. op(850.jusqua).Xn :Qn autrement R] – repeter Q jusqua P – pour Cpt := Min to Max faire Q – pour Cpt := Max downto Min faire Q On d´efinit pour cela les op´erateurs suivants : :::::- op(900. ?. 5..downto). X = 3. Y = 2.5 : Structures de contro On veut d´efinir en PROLOG les diff´erentes structures de contrˆole d’un langage imp´eratif (comme C ou Pascal) : – si P alors Q – si P alors Q sinon R – selon X dans [X1 :Q1. si X > Y alors M = X sinon M = Y. ?. op(800.faire).. V = 3.3).fx . Y = 2. ?. cptInc(+Cpt.:). si X > Y alors M = X sinon M = Y.xfx. ?.0). alphabet : affiche les lettres de l’alphabet en utilisant un compteur et une boucle repeat/0.pour).fx . Y = 5. cptVal(+Cpt.cptFin(d).cptInc(c.selon). true. 3. ˆ ´ TD 4. CONTROLE DE LA RESOLUTION 36 (b) selon/1 ?- X = 3, selon X dans [1: Y = -1, 2: Y = 0, 3: Y = 1 autrement Y = 5]. X = 3, Y = 1. ?- X = 0, selon X dans [1: Y = -1, 2: Y = 0, 3: Y = 1 autrement Y = 5]. X = 0, Y = 5. (c) repeter/1 ?- cptInit(i,0), repeter ( cptVal(i,V), write(V), write(’ ’), cptInc(i,1) ) jusqua V =:= 3. 0 1 2 3 V = 3. (d) pour/1 ?- pour i := 0 to 3 faire (cptVal(i,V), write(V), write(’ ’)). 0 1 2 3 V = 3. 3. D´efinir un pr´edicat menu/0 qui permet d’afficher un menu, d’entrer une s´election et d’effectuer l’action associ´ee ` a la s´election. ?- menu(test). EXEMPLE DE MENU 1. un 2. deux 3. trois 4. quitter test > votre choix : 2. deux EXEMPLE DE MENU 1. un 2. deux 3. trois 4. quitter test > votre choix : 4. ... fin de l’exemple true. Les diff´erentes actions devront illustrer le fonctionnement des structures de contrˆole d´efinies dans la question pr´ec´edente. 5 83 TD 4.6 : Unification 1. D´efinir le pr´edicat unifier( ?Terme1, ?Terme2) vrai si et seulement si Terme1 et Terme2 sont unifiables : – deux termes inconnus sont unifiables ; 37 – un terme inconnu est unifiable `a un terme instanci´e ; – deux termes atomiques sont unifiables s’ils sont identiques ; – deux termes compos´es sont unifiables s’ils ont mˆeme foncteur (atome/arit´e) et si leurs arguments sont unifiables. ?- unifier(X,Y). X = Y ; false. ?- unifier(X,a). X = a ; false. ?- unifier(b,a). false. ?- unifier(f(a),g(a)). false. ?- unifier(f(a,f(b)),f(a,g(b))). false. ?- unifier(f(X,a,g(Y,c)),f(b,Y,Z)). X = b, Y = a, Z = g(a, c) ; false. 2. A la question X = f(X), certains interpr´eteurs Prolog donnent pour r´eponse : X = f(f(f(f(f(f( ...D´ ebordement de pile. D´efinir le pr´edicat nonOccur(-Terme1, ?Terme2) o` u le terme inconnu Terme1 n’apparaˆıt pas dans Terme2 (test d’occurence). ?- nonOccur(X,f(f(f(Y,X)))). false. ?- nonOccur(X,f(f(f(Z,Y)))). true ; false. 3. Red´efinir le pr´edicat unifier( ?Terme1, ?Terme2) de la premi`ere question en effectuant le test d’occurence de la question pr´ec´edente. ?- unifier(X,f(X)). X = f(**) ; false. ?- unifier2(X,f(X)). false. 4. D´efinir le pr´edicat varLiees(-Terme1,-Terme2) o` u Terme1 et Terme2 sont li´es. ?- varLiees(X,Y). false. ?- varLiees(X,X). true. ?- X = Y, varLiees(X,Y). X = Y. ?- X = Y, Y = Z, varLiees(X,Z). X = Z, Y = Z. 5. D´efinir le pr´edicat nbVars(+Terme,+N1, ?N2) o` u les arguments inconnus de Terme sont successivement instanci´es au terme v(N), o` u N varie de N1 `a (N2 - 1). ?- nbVars(f(X,Y),1,N). X = v(1), Y = v(2), N = 4 ; false. ?- nbVars(f(g(X,Y),h(g(X),Z)),1,N). X = v(1), Y = v(2), Z = v(3), N = 4 ; false. 5 88 TD 4.7 : Ensemble de solutions 1. On consid`ere les faits suivants : s(1). s(2). s(3). s(4). s(5). (a) D´efinir le pr´edicat s1( ?Terme) o` u Terme est la premi`ere solution de s(Terme). ?- s1(1). true. ?- s1(X). X = 1. (b) D´efinir le pr´edicat s2( ?Terme) o` u Terme est la deuxi`eme solution de s(Terme). ?- s2(1). false. ?- s2(X). X = 2 ; false. ˆ ´ TD 4. CONTROLE DE LA RESOLUTION 38 (c) D´efinir le pr´edicat sd( ?Terme) o` u Terme est la derni`ere solution de s(Terme). ?- sd(1). false. ?- sd(X). X = 5 ; false. (d) D´efinir le pr´edicat sn( ?Terme,+N) o` u Terme est la Ne`me solution de s(Terme). ?- sn(1,1). true ; false. ?- sn(X,4). X = 4 ; false. ?- sn(3,N). N = 3 ; false. ?- sn(X,N). X = 1, N = 1 X = 2, N = 2 X = 3, N = 3 X = 4, N = 4 X = 5, N = 5 false. ; ; ; ; ; (e) D´efinir le pr´edicat sall(-Liste) o` u Liste contient toutes les solutions de s(Terme). ?- sall(L). L = [1, 2, 3, 4, 5]. 2. D´efinir le pr´edicat toutes( ?Terme,+But, ?Liste) o` u Liste contient toutes les valeurs du Terme qui v´erifient le But. ?- toutes(X,s(X),L). L = [1, 2, 3, 4, 5]. ?- toutes(X,(s(X),X =\= 4),L). L = [1, 2, 3, 5]. ?- toutes(X,(s(X),X > 5),L). L = []. 5 89 TD 4.8 : Chaˆınage avant Ecrire un interpr´eteur de r`egles en chaˆınage avant (deduire/0), qui permet d’effectuer des d´eductions `a partir de r`egles et de faits. Les r`egles seront de la forme : regle(Conclusion,Conditions), et les faits : regle(Fait,vrai). ?- listing(regle/2). :- dynamic regle/2. regle(pere(e,j),vrai). regle(pere(j,f),vrai). regle(gdPere(A,C), (pere(A,B),pere(B,C))). regle(ancetre(A,B),pere(A,B)). regle(ancetre(A,C), (pere(A,B),ancetre(B,C))). true. ?- deduire. gdPere(e, f) affirm´ e ancetre(e, j) affirm´ e ancetre(j, f) affirm´ e ancetre(e, f) affirm´ e true. 5 90 TD 4.9 : Mise sous forme clausale Une forme clausale est une formule logique ne contenant que des disjonctions de litt´eraux positifs (forme pr´edicative P (t1 , t2 , . . . , tn )) ou n´egatifs (n´egation d’une forme pr´edicative ¬P (t1 , . . . , tn )). Pour obtenir une forme clausale ` a partir d’une formule logique quelconque, on applique l’algorithme suivant (voir TD 1.2 page 9) : 1. ´elimination des ⇒ 2. d´eplacement des ¬ vers l’int´erieur a ⇒ b → ¬a ∨ b ¬(a ∨ b) → ¬a ∧ ¬b ¬(a ∧ b) → ¬a ∨ ¬b -L) o` u L est la liste des formes clausales correspondant ` a la formule logique F. p(f(u))))et tout(y. op(200.p(X). tout(y. y)imp existe(u.p(X). formule(1. distribution de ∧ sur ∨ a ∨ (b ∧ c) → (a ∨ b) ∧ (a ∨ c) On introduira les termes tout/2 et existe/2 ainsi que les op´erateurs logiques op(100. p(x)imp q(x)). y)imp non existe(u. op(150.imp) et op(300.listing(formule/2). F = tout(x. tout(x. D´efinir le pr´edicat toClause(+F. p(x)imp (q(x. f (g(x))) → q(X. F = tout(x. existe(y. Les exemples ci-dessous illustrent alors la traduction Prolog de formules logiques : ∀x P (x) → tout(x. r(y)])] . y)imp existe(u. y)imp p(x)))). p(x))). q(x. p(x)imp q(x. [p(x)]).imp(p(x). true. p(x)imp q(x. [p(x)])] . tout(y.fx.xfy. q(x. y)imp non r(y))))). formule(4.existe(y.q(x))) ∀x (∃y (P (x) ⇒ Q(x. p(f(u))))ou (q(x. formule(2. f(y)))). f(’$f2’(x)))]. 5 90 . p(x)imp (q(x. ∃yP (y) → P (f (x)) 4.ou). ∀x (P (x) ⇒ Q(x)) → ¬P (x) ∨ Q(x) → q(X) :.C). p(f(u))))et tout(y.et). toClause(F. N = 3. p(x)). ∀x (∃y (P (x) ⇒ Q(x. [p(x). ’$f3’(x))]. p(f(u))])] .non).f(y))))) Pour les exemples ci-dessus. N = 1. ?.xfy. false.xfy. p(x)imp non tout(y. f(y))))). p(x)imp non tout(y. op(250. C = [c([].2 page 55) : ∀x P (x) → P (x) → p(X). tout(x. q(x. tout(x. C = [c([p(x)]. y)imp non r(y)))). C = [c([q(x)].xfy.formule(N. d´eplacement des ∀ vers l’ext´erieur ∀x. tout(x.eq). y)imp non existe(u. C = [c([q(x. p(f(u))))ou (q(x. f (y)))) → tout(x. existe(y. F = tout(x.p(x)) ∀x (P (x) ⇒ Q(x)) → tout(x. formule(5. P (x) ∨ ∀y.imp(p(x).F). F = tout(x. N = 5. C = [c([q(x. p(f(u)). [p(x)])] .39 3. f (y)))) → ¬P (x) ∨ Q(x. Q(y) → ∀x∀y(P (x) ∨ Q(y)) 5. ?. y)imp p(x))).q(x. c([]. [p(x). N = 4. N = 2. tout(x. la mise sous forme clausale conduit aux clauses suivantes (voir le corrig´e du TD 1. [])] .f(g(X))) :. ´elimination des ∃ (“ skol´emisation ”) ∀x. q(x. p(x)imp q(x))). F = tout(x. formule(3. 40 ˆ ´ TD 4. CONTROLE DE LA RESOLUTION . R´ ef´ erence pj1 pj2 pj3 pj4 pj5 pj6 pj7 Nature disque scanner lecteur console capteur terminal bande Site paris grenoble brest brest rennes bordeaux rennes – La table des livraisons contient le num´ero d’identification d’un fournisseur. le nom. InterEditions .TD 5 Bases de donn´ ees On consid`ere une base de donn´ees relationnelle1 « fournisseurs–pi`eces–projets ». 41 . la couleur. la quantit´e livr´ee ainsi que la r´ef´erence du projet auquel cette pi`ece est 1 Cet exemple est adapt´e de l’ouvrage de C. Identification f1 f2 f3 f4 f5 Nom martin albin dupont morin leach Priorit´ e 20 10 30 20 30 Ville rennes paris paris rennes brest – La table des pi`eces d´etach´ees pr´ecise la r´ef´erence. la r´ef´erence de la pi`ece ` a livrer. Date (1989) Introduction au standard SQL. R´ ef´ erence p1 p2 p3 p4 p5 p6 Nom ecrou boulon vis vis came engrenage Couleur rouge vert bleu rouge bleu rouge Poids 12 17 17 14 12 19 Entrepˆ ot rennes paris grenoble rennes paris rennes – La table des projets indique la r´ef´erence. Elle est compos´ee de 4 tables : – La table des fournisseurs affecte ` a chaque fournisseur un num´ero d’identification. le poids et le lieu de stockage de chaque pi`ece. un nom. une priorit´e et une ville. la nature et le lieu d’assemblage de chaque projet. ´finition des donne ´es TD 5. ISO 1986. (c) Cr´eer une vue pjF1P1(Projet.+But) vrai si et seulement si la Vue (table temporaire) satisfaisant au But. . on pourra comparer les requˆetes Prolog aux requˆetes SQL2 correspondantes. 2. Cr´eer les 4 tables pr´ec´edentes sous forme de faits Prolog.Ville) faisant apparaˆıtre tous les projets aliment´es par le fournisseur f1 ou utilisant la pi`ece p1. On veillera ` a ce qu’il n’y ait pas de doublons dans la vue. Fournisseur f1 f1 f2 f2 f2 f2 f2 f2 f2 f2 f3 f3 f4 f4 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 Pi` ece p1 p1 p3 p3 p3 p3 p3 p3 p3 p5 p3 p4 p6 p6 p2 p2 p5 p5 p6 p1 p3 p4 p5 p6 Projet pj1 pj4 pj1 pj2 pj3 pj4 pj5 pj6 pj7 pj2 pj1 pj2 pj3 pj7 pj2 pj4 pj5 pj7 pj2 pj4 pj4 pj4 pj4 pj4 Quantit´ e 200 700 400 200 200 500 600 400 800 100 200 500 300 300 200 100 500 100 200 100 200 800 400 500 Pour chacune des questions suivantes.Piece) faisant apparaˆıtre les num´eros d’identification des fournisseurs et des pi`eces pour tous les fournisseurs et toutes les pi`eces non situ´es dans la mˆeme ville. Database language SQL. (a) Cr´er une vue pjBrest(Reference.1 : De 1.Nature) donnant les informations concernant les projets en cours ` a brest. 5 93 2 La d´efinition de la norme SQL ISO/IEC 9075 est donn´ee dans le document de l’International Standards Organization (1986). a pu ˆetre cr´e´ee `a partir des tables existantes (tables permanentes ou autres vues). BASES DE DONNEES 42 affect´ee. (b) Cr´eer une vue fpDistincts(Fournisseur. D´efinir le pr´edicat creerVue(+Vue.´ TD 5. Quelles sont les livraisons dont la quantit´e est comprise entre 300 et 750 ? 5. Trouver tous les d´etails des projets rennais. 5.4 : Unions 1. Trouver les num´eros des projets dont au moins un des fournisseurs ne se trouve pas dans la mˆeme ville que celle o` u se d´eroule le projet.100.ibm. Trouver les r´ef´erences des pi`eces provenant d’un fournisseur rennais. 5 98 ` jour TD 5. une pi`ece ou un projet. Trouver la liste de toutes les villes dans lesquelles sont localis´es au moins un fournisseur. Trouver la liste de toutes les couleurs de pi`eces. Augmenter de 10% toutes les livraisons effectu´ees par les fournisseurs de pi`eces d´etach´ees oranges. 4.projet) tels qu’un des ´el´ements ne soit pas situ´e dans la mˆeme ville que les deux autres. 4. Introduire un nouveau fournisseur : (f10. Trouver les r´ef´erences des fournisseurs du projet pj1 .piece.projet) tels que les trois ´el´ements soient situ´es dans des villes diff´erentes. la pi`ece et le projet soient situ´es dans la mˆeme ville. 2.piece. 3. 5 99 . 2.projet) tels que le fournisseur. 2. Trouver tous les triplets (fournisseur. Trouver tous les d´etails de chacun des projets. Trouver tous les triplets (fournisseur. Changer la couleur de toutes les pi`eces rouges en orange.2 : Reque 1.5 : Mises a 1.43 ˆtes simples TD 5. Ajouter 10 ` a la priorit´e de tous les fournisseurs dont la priorit´e est actuellement inf´erieure `a celle du fournisseur f4 . Trouver tous les triplets (fournisseur. 3. 4. Trouver les r´ef´erences des pi`eces provenant d’un fournisseur rennais. 5. et destin´ees `a un projet rennais. Supprimer tous les projets se d´eroulant `a Grenoble et toutes les livraisons correspondantes.piece. 6. 3. Quels sont les projets qui se d´eroulent dans une ville dont la quatri`eme lettre est un n (ascii(n) = 110) ! ? 5 95 TD 5. 2.lyon). 5 96 TD 5.3 : Jointures 1. BASES DE DONNEES .44 ´ TD 5. 4).d.g.4). 6.X. estim(e.g. route(b.10.successeur(s.-K) o` u C est la liste des villes par lesquelles il faut passer pour aller de la ville de d´epart D `a la ville d’arriv´ee A.-C.c. route(b.e. ?.0).0. 8. route(?Ville1.3.TD 6 Recherche dans les graphes ´seau routier TD 6.?Ville2.5).?N) o` u Ville1 et Ville2 sont reli´ees par une route directe de N km. N = 3 .4). et K le nombre de kilom`etres parcourus en passant par ce chemin. false.5). route(s.?Ville2.g. Dessiner l’arbre de recherche associ´e `a ce r´eseau lorsqu’on veut aller de s `a g.?N) : il existe une route directe de N km entre Ville1 et Ville2. N = 3 .g. D´efinir le pr´edicat chemin(+D.4). route(f.5). X = a. 3. N = 4.3).4).N).g. estim(g. estim(s.7). D´efinir le pr´edicat successeur(?Ville1.a.+A.3). route(e. estim(?Ville1.9). c’est pourquoi nous ne donnons ici que les distances ` a vol d’oiseau entre une ville quelconque du r´eseau et la ville g. Nous chercherons par la suite un chemin pour aller de s en g . estim(b.a. route(d.6. 45 . a • c • b • 4 4 3 s• 5 •g 5 @ @4 @ 3 @ @• d 2 • e 4 • f r´ eseau routier estim(a.4.9).g. route(f.d.?Ville2.12. ?.N).successeur(s. 2. X = d.a. estim(d.g.e.1 : Re On consid`ere le graphe du r´eseau routier suivant : route(s. estim(f.0).a.?N) : la distance `a vol d’oiseau entre Ville1 et Ville2 est de N km. 1.2).0).g.g. route(b. estim(c. s]. f. (a) D´efinir les pr´edicats remplir(+E1. 0). C = [ (4. e. (0. e. 0). 2). (6.(W1. 4). 5). 5). false. 2). 5). (7. W2 = 0. 0).46 TD 6. (5. d. V2 ) caract´erisant la quantit´e d’eau contenue dans chacun des r´ecipents. (7. W1 = 1.. Pour fixer les id´ees. 5). f. (8. C = [g. W1 = 1. 5). 1). W1 = 0. (3.W2)).-N) pour ce probl`eme des vases. (0. (8. W2 = 4 . e.0). a. ?. (0. false.(4. W2 = 3. 3). (0. (0. s]. (0. (0.C. 0).N). L’´etat du syst`eme sera repr´esent´e par la paire (V1 . ?. 0). 0)]. (2.3).vider((1. 5). (b) Montrer que le pr´edicat chemin/4 permet de d´eterminer la suite des op´erations ´el´ementaires pour faire passer le syst`eme de l’´etat E1 = (0. (0. 5). K = 13 . W2 = 3 . 0). 5). C = [g. 2). (6. 5). 4). ?.g. 3). vider(+E1. (8. 5). K = 14 . 0). 1).-E2) et transvaser(+E1. (0. 0). (7.-E2) qui font passer le syst`eme de l’´etat E1 `a l’´etat E2 en effectuant l’une des op´erations ´el´ementaires. – transvaser un r´ecipient dans l’autre sans perdre une seule goutte. 2). (8. 0)].3). N = 1 . 0). (8. (8. ?. Soit un syst`eme compos´e de deux r´ecipients non gradu´es R1 et R2 . W2 = 0 .K). 5). (3. . e. (8. W2 = 0. 0)]. (0. s]. (7. (0. (5. N = 1 . W2 = 3. N = 1 . 2). 0). W1 = 0. (0.W2)).K). (3. 0).3). 5).-E2).chemin(s.transvaser((1. on prendra C1 = 8l et C2 = 5l. (5. 5). – vider compl`etement un r´ecipient. V2i ) ` a l’´etat final (V1f . W2 = 5. 2). 0). (2. 5). 0). (8. 5).-E2. W1 = 8. 0). 0)]. (1. (7. 4). (1. (2. (6. 4. 5). (2. K = 17 . 2).W2)). d. 0). (4. (2. (2. W2 = 4. b. 5).W2). 5). . On veut faire passer le syst`eme de l’´etat initial (V1i . 0).remplir((1. (7. (8.chemin((0. f.(W1. N = 1 . C = [ (4. W2 = 0. on consid`ere dans cette question le probl`eme suivant. K = 19 . (4. (5.successeur((1. ?. K = 25 . W1 = 0.. W1 = 0. N = 1 . (5. a. 0). (1. . (8. 5).. En d´eduire la d´efinition du pr´edicat successeur(+E1. 0). f. 4). respectivement de capacit´e C1 et C2 . K = 25 . W1 = 1. K = 12 . 1). (8. (0. 3).. W1 = 4. (6. 0) `a l’´etat E2 = (4. d.. b. false. W1 = 8. C = [ (4. RECHERCHE DANS LES GRAPHES ?. C = [ (4. 1). (0. 5). W2 = 5. 0).. false. 0). .(W1. W2 = 3 .0). W1 = 1. 5). (1.C. (8. a. 5). W1 = 4. (3. 4). 0).(W1. 4). 0). (0. 3). C = [g. (5. (0. K = 17 . (8. (8. V2f ) sachant que les seules op´erations ´el´ementaires autoris´ees sont : – remplir compl`etement un r´ecipient. (8.3). 5). N = 1 . (8. 0). 5). C = [g. Afin de tester la g´en´ericit´e du pr´edicat chemin/4 de la question pr´ec´edente. s]. (0. (5. (5. (0. 0). selon la Methode consid´er´ee et pour la ville d’arriv´ee A. s]. C = [g. C’est une liste dont les ´el´ements sont de la forme E-K-Villes o` u Villes est la liste des villes par lesquelles on est d´ej` a pass´e (exemple : Villes = [b. s]. ?. K = 19 . f. On prendra E = K pour les m´ethodes autres qu’heuristique. ?.s] et [a. initialiser(_.C. a.Chemin. C = [g. e.s]). d. C = [g. e. s]. 4-4-[d. f. ?. b. s]. K = 17 . S est la liste des villes directement accessibles `a partir de la ville V et par lesquelles on n’est pas d´ej`a pass´e (ie. b. false.+E-K-[V|Q]. (b) D´efinir le pr´edicat rechercher(+Methode.9-4-[d. s].K = 19 .d. 12.!.a. g. ?. s]. a.C. C = [g.K). K est le nombre de kilom`etres effectifs qu’il a fallu parcourir pour suivre le chemin des Villes (exemple : K = 7 pour Villes = [b. s]. s].-S) o` u. e. a. a. e. s]. f. f. C = [g.5-0-[s]] et pour les autres m´ethodes il prendra la valeur [0-0-[s]]. S = [3-3-[a. Ainsi. f. e.47 5. s].E). K = 25 . (a) D´efinir le pr´edicat successeurs(+Methode. E n’est utile que pour la m´ethode heuristique : elle repr´esente la somme (K + Estim) de la distance d´ej`a parcourue (K) pour arriver l`a o` u on en est dans l’arbre (exemple : en b pour Villes = [b.K). plus g´en´eralement en T pour Villes = [T|Q]) et d’une estimation (Estim) du chemin qui reste `a parcourir entre la ville o` u on se trouve et la ville d’arriv´ee (A).[0-0-[s]]. L’´etat [12.+A. a. g. b. C = [g. f. d.F.K). f. s].[0-0-[s]]. s].+A.4-3-[a. e. C = [g.d.s]. recherche en largeur. K = 13 .rechercher(largeur. f. C = [g.PilFil.a. e. d. a.s]).9. 13. a. rechercher(Methode. f. f.s]] signifie qu’on a d´ej`a explor´e 3 chemins [e. C = [g. C = [g. . s]].I. d. l’´etat initial sera [12. qui ne sont pas dans [V|Q]).Cout) :initialiser(Methode. a.successeurs(profondeur. pour une recherche heuristique d’un chemin entre s et g. b.PilFil).5-0-[s]. 19.s] . f.[0-0-[s]]. e. s]. K = 17 . recherche du meilleur premier ou recherche heuristique). b. d. e.Cout). C = [g. f.F. C est le chemin qui m`ene `a la ville d’arriv´ee A en K km pour un arbre de recherche dans l’´etat E. S = [13.C. K = 25 . C = [g. K = 13 . d. a.[E-0-[I]]) :.F. s]. d. K = 13 . e. f.s]. s]]. % initialiser/4 initialiser(heuristique. g. d.9-6-[e.g. a. b. e.K = 17 .I. [a.d. e. K = 13 . f.C. d.a. e. K = 17 .s]. s]. d.-K) o` u. K = 19 . s]. C = [g.rechercher(meilleur. false. s].s] qui correspondent respectivement `a des distances effectivement parcourues de 6. d.rechercher(heuristique. 12. 3 et 9 km et `a des estimations de 12. Il existe en fait plusieurs m´ethodes de parcours de l’arbre de recherche pour aller d’une ville `a une autre du r´eseau. K = 19 . ?.successeurs(heuristique. C = [g. a.F.4-3-[a. estim(I. Le pr´edicat ci-dessous propose de g´en´eraliser le pr´edicat chemin de la question pr´ec´edente en pr´ecisant la m´ethode de parcours de l’arbre de recherche (par exemple : recherche en profondeur. K = 25 .-C. a.Chemin.d. g. 13.g.+E. K = 25 .S). s]. b. false. e. C = [g. La variable PilFil est une repr´esentation de l’´etat d’avancement du parcours du graphe.4 et 19.rechercher(profondeur. 0-0-[s].4-9-[a.K). f. b.S).[0-0-[s]]. % chemin/5 chemin(Methode. e.4 km.I. d.I. selon la Methode consid´er´ee. ?. C = [g. f.F.[0-[I]]). false. e._. K). e. d. 25 . e.C. soit une transition ` a une place (voir figure ci-dessous). . d. ?.48 TD 6. e. . K = 13 . s]. K = 13 . a. Post.chemin(meilleur. s]. Les places et les transitions sont reli´ees par des arcs orient´es qui lient soit une place `a une transition.g. d. . e. e. . 3. . f. Elle traduit l’existence (1) ou non (0) d’un arc orient´e d’une place vers une transition. s]. C = [g. false. e. e.C. C = [g.K).C. . 25 . f. C = [g. T = {t1 . tj ) est une application qui `a chaque couple (pi . a.K). M est une application qui ` a chaque place pi associe un nombre entier mi (le marquage de la place) positif ou nul (mi ≥ 0) (M : P → N ). f. f. f.D.K). ?. false. 1} (Pre : P × T → {0. Une marque est repr´esent´ee par un • dans la place consid´er´ee. s]. f. Pre(pi . a. a. s]. f. a. Les ensembles P et T sont disjoints : P ∩ T = {}. tj ) du produit cart´esien P × T associe un ´el´ement de l’ensemble {0. tm } est un ensemble fini et non vide de m transitions (m > 0).s. ?. d. b. d.g. s]. s]. e. b. a. d. Post(pi . s]. s]. 6. e. K = 13 . f.chemin(heuristique. K = 19 C = [g. a. e. p2 . K = 17 . K = 13 . C = [g. b. 5 103 ´seaux de petri TD 6. e. f. . f. e.K). 1} (Post : P × T → {0. e. K = 25 . 4. t2 .s. s]. b. C = [g. . T. K = 17 C = [g. C = [g. false. tj ) du produit cart´esien P × T associe un ´el´ement de l’ensemble {0. t2 t1 p3 p2 p1 t4 t3 p4 t5 D’un point de vue formel. s]. Elle traduit l’existence (1) ou non (0) d’un arc orient´e d’une transition vers une place.chemin(profondeur.2 : Re Un r´eseau de Petri se repr´esente par un graphe biparti orient´e qui comporte deux types de nœuds : les places (repr´esent´ees par des cercles) et les transitions (repr´esent´ees par des traits). C = [g. d. . d. f. . K = false. 2. ?. b. b.C.g. K = 19 C = [g. d. un r´eseau de Petri ordinaire est un quintuplet < P. M > tel que : 1. K = 25 . 1}). . a. . a. f.C. s].g. C = [g. f. d. d. . K = 17 . f. s]. e. K = 17 C = [g. s]. K = C = [g. d. e. C = [g. Pre.A. a. K = 19 . RECHERCHE DANS LES GRAPHES (c) En d´eduire la d´efinition du pr´edicat chemin(Methode. a. s]. b. P = {p1 .s. C = [g. K = 19 . b. 5. e. C = [g. tj ) est une application qui `a chaque couple (pi . 1}). a.s. f. f. s]. pn } est un ensemble fini et non vide de n places (n > 0).chemin(largeur. t2 t2 t1 t1 p3 p2 t3 p3 p1 t4 p2 t 4 −→ t3 p1 t4 p4 p4 t5 t5 Dans la suite. on consid`ere ici le probl`eme dit du dˆıner des philosophes chinois.49 Une transition tj d’un r´eseau de Petri < P. Un r´eseau de Petri qui illustre cette situation peut ˆetre d´efini par les faits suivants. on peut alors la franchir et. tj ) Ce qui revient `a dire que chacune des places amont de la transition tj contient au moins une marque. chaque place sera d´efinie par un fait place/2 o` u le premier argument est le nom de la place et le deuxi`eme la description de l’´etat du syst`eme qu’elle repr´esente (place(nom. Pour fixer les id´ees. lorsque plusieurs transitions sont valides au mˆeme instant.marquage)).amont. Le probl`eme consiste ` a trouver un ordonnancement des philosophes tel qu’ils puissent tous manger et penser. La r`egle de franchissement d’une transition valide consiste `a retirer une marque dans chacune de ses places amont et ` a ajouter une marque dans chacune de ses places aval. Lorsqu’une transition est valide. Quand il ne mange pas. le philosophe pense. mi ≥ Pre(pi . Le choix de la transition `a franchir est a priori al´eatoire : on parle de non-d´eterminisme des r´eseaux de Petri. description)). Post. une seule de ces transitions sera franchie. comme dans le cas du franchissement de la transition t4 de la figure ci-dessous. le deuxi`eme la liste de ses places amont et le troisi`eme la liste de ses places aval (transition(nom. chacun a devant lui un plat de nouilles et `a sa droite une baguette. M > est valide si elle v´erifie la condition tj ∈ T. Pour pouvoir manger. Une transition sera d´efinie par un fait transition/3 o` u le premier argument est le nom de la transition. ∀pi ∈ P. Pre. T. Quatre philosophes chinois se retrouvent autour d’une table circulaire . . Le marquage d’une place est stock´e dans un fait marquage/2 o` u le premier argument est le nom de la place consid´er´ee et le deuxi`eme le marquage associ´e (marquage(place.aval)). chaque philosophe ne peut le faire que si les baguettes `a sa gauche et ` a sa droite sont disponibles. marquage(p11. ?.tir(t11).1).1). (c) tir(+T) : franchir la transition T. marquage(p12.putState.valids(Ts). ?. % transition/3 transition(t11. Dans l’´etat initial. .’baguette 1 libre’). t41]. transition(t42. marquage(b1. ?. place(b1.[p42]). place(p22.b4. marquage(p31. marquage(p32. t21.0).1). philosophe 1 pense philosophe 2 pense philosophe 3 pense philosophe 4 pense baguette 1 libre baguette 2 libre baguette 3 libre baguette 4 libre true.b3].50 TD 6.1). transition(t22.[p32]).b2]. les baguettes sont libres et les 4 philosophes pensent.b2. place(p31.[p22]). ?. t31. marquage(b4.’baguette 2 libre’).[p21. % marquage/2 :. place(b2. Ts = [t11. philosophe 2 pense philosophe 3 pense philosophe 4 pense baguette 3 libre baguette 4 libre philosophe 1 mange true.’baguette 3 libre’). D´efinir les pr´edicats suivants : (a) putState : affiche l’´etat du syst`eme. 1.b4]. marquage(b2.[p12]). true. t41]. RECHERCHE DANS LES GRAPHES % place/2 place(p11.[p21.’philosophe 4 mange’).b3.[p41.’philosophe 1 mange’).b1.[p31.[p41.[p31. t21. (b) valids(-Ts) : Ts est la liste des transitions valides dans un ´etat donn´e.1). transition(t32. place(p32.b1]). 2. transition(t41.b4]). place(p41.b4. philosophe 1 pense philosophe 2 pense philosophe 3 pense philosophe 4 pense baguette 1 libre baguette 2 libre baguette 3 libre baguette 4 libre true. ?.[p11.b2.’philosophe 4 pense’).b2]). place(p21.putState. Repr´esenter graphiquement le r´eseau de Petri ainsi d´efini.[p32].b3]).[p12].’baguette 4 libre’). transition(t21.[p42].valids(Ts). Ts = [t11.b1]. ?.’philosophe 2 pense’).’philosophe 2 mange’).0). marquage(p21.0).[p22].dynamic marquage/2.’philosophe 3 mange’). place(b4.1). place(p12. transition(t12.putState.1). marquage(p42. place(p42.b1.’philosophe 3 pense’).’philosophe 1 pense’). place(b3. marquage(p41. marquage(b3.[p11. marquage(p22. t31.b3.0). transition(t31.1). philosophe 1 pense philosophe 2 pense philosophe 3 pense philosophe 4 pense baguette 1 libre baguette 2 libre baguette 3 libre baguette 4 libre true.t41] Transition choisie : t31 Etat du systeme : philosophe 1 pense philosophe 2 pense philosophe 4 pense baguette 1 libre baguette 2 libre philosophe 3 mange Transitions valides : [t11. ?.t31. ?.51 3.putState.t32] Transition choisie : t12 Etat du systeme : philosophe 2 pense philosophe 4 pense philosophe 3 mange philosophe 1 pense baguette 1 libre baguette 2 libre Continue (y/n) ? n. true. Transitions valides : [t11. A chaque pas de simulation. 5 105 .simulRdp(continue).t21. on demande ` a l’utilisateur s’il veut continuer (C = continue) ou non (C = stop). D´efinir le pr´edicat simulRdp(+C) qui simule pas `a pas un r´eseau de Petri. Continue (y/n) ? y.t32] Transition choisie : t11 Etat du systeme : philosophe 2 pense philosophe 4 pense philosophe 3 mange philosophe 1 mange Continue (y/n) ? y. Transitions valides : [t12. RECHERCHE DANS LES GRAPHES .52 TD 6. Deuxi` eme partie Corrig´ es 53 . . ∀x P (x) (a) ∀x P (x) (b) ∀x P (x) (c) ∀x P (x) (d) P (x) (e) P (x) (f) 1 clause : P (x) (g) Prolog : p(X). s2 ) avec n1 < n2 – L’anglais habite la maison blanche : (n3 . vert. c5 . bleu. c4 . fran¸cais}) et S le sport pratiqu´e (S ∈ {football. C la couleur (C ∈ {blanc. blanc. c2 . tennis). espagnol. tennis). anglais. on peut maintenant affirmer que n4 = 3 et donc que s2 = s4 = football . 2. p1 6= espagnol or p1 6= anglais. bleu. vert}). p4 . (3. natation). espagnol. natation). espagnol.2 : Formes clausales 49 1. tennis). c2 . tennis). tennis}). (3. (3. s2 ) De l’indice 4. on d´eduit : n1 6= 1. De l’indice 2. (2. fran¸cais. c2 . S) o` u N repr´esente le num´ero dans la rue (N ∈ {1. natation). (2. p5 . c5 . s3 ) – La maison blanche est situ´ee avant la maison o` u on pratique le football : (n4 . P le pays d’origine (P ∈ {anglais. espagnol. p1 . p5 . p1 . natation. football) Enfin de l’indice 2. (3. on en d´eduit la solution : (1. football) avec n3 < n4 – Le tennisman habite au d´ebut de la rue : (1. p1 . anglais. on d´eduit alors n1 = 2 et n2 = 3 . vert. 3}). c2 . football) De l’indice 3.1 : Puzzle logique 49 Chaque maison est repr´esent´ee ici par un quadruplet (N. p1 . (2. d’o` u: (1. vert. TD 1. on d´eduit que la seule possibilit´e qui reste pour l’anglais est la maison 1 : (1. vert. blanc. natation). tennis) Des indices 1 et 5. blanc. Ainsi.7 pour une r´esolution automatique de ce probl`eme.Corrig´ es TD 1 De la logique ` a Prolog TD 1. c5 . 55 . C. p5 . espagnol. anglais. football) → voir TD 3. (2. d’o` u: (1. espagnol. P. vert. natation) – La maison verte est situ´ee avant la maison de l’espagnol : (n2 . les 5 indices peuvent s’´ecrire : – Dans la maison verte on pratique la natation : (n1 . 3. q(X. r(Y). y) ∨ ¬(∃u P (f (u)))) ∨ (¬Q(x. y) ∨ P (x))) ) ) (b) ∀x ( ¬P (x) ∨ ( (∃y (Q(x. y (¬P (x) ∨ ((¬Q(x. y) ∨ ¬R(y) (e) ¬P (x) ∨ ¬Q(x.´ TD 1. p(f(U)). y) ∨ ¬R(y)))) (b) ∀x. g(x)) ∧ (∀u ¬P (f (u))))) ∧ (∀y (¬Q(x. y) ∨ P (x)) ) (e) (¬P (x) ∨ Q(x. y) ⇒ ¬R(y)))) (a) ∀x. y) ∨ ¬P (f (u)) ∨ ¬Q(x. f (g(x))) (e) ¬P (x) ∨ Q(x.g(X)) :.Y).Y). y) ∨ (∀u ¬P (f (u)))) ∨ (¬Q(x. y) ∨ ¬P (f (u)) ∨ ¬Q(x. f (g(x))) (g) Prolog : q(X. y) ∨ ¬R(y)))) (d) ¬P (x) ∨ ¬Q(x. g(x)). y) ∨ (∃u P (f (u))))) ∧ (∀y (¬Q(x. y) ∨ (∀u ¬P (f (u)))) ∨ (¬Q(x. y) ∨ P (x))) ) ) (d) ¬P (x) ∨ ( (Q(x. 5. f (y)))) (a) ∀x (∃y (¬P (x) ∨ Q(x. y) = 1 (g) Prolog : q(X. p(f(U)).p(X). y) ∨ P (x) toujours vraie : ¬P (x) ∨ ¬Q(x. q(X. ∀x. :. ∀x (P (x) ⇒ Q(x)) (a) ∀x (¬P (x) ∨ Q(x)) (b) ∀x (¬P (x) ∨ Q(x)) (c) ∀x (¬P (x) ∨ Q(x)) (d) ¬P (x) ∨ Q(x) (e) ¬P (x) ∨ Q(x) (f) 1 clause : ¬P (x) ∨ Q(x) (g) Prolog : q(X) :. y) ∧ (∀u ¬P (f (u))))) ∧ (∀y (¬Q(x. y (P (x) ⇒ ((Q(x. ∀x ( P (x) ⇒ ( (¬∀y (Q(x.p(X). g(x)) ∧ ¬P (f (u))) ∧ (¬Q(x. y (¬P (x) ∨ ((¬Q(x. y) ∨ ¬R(y) (f) 1 clause : ¬P (x) ∨ ¬Q(x. y) ⇒ ¬(∃u P (f (u)))) ∨ (Q(x. f (y)))) (b) ∀x (∃y (¬P (x) ∨ Q(x. g(x))) ∧ (¬P (x) ∨ ¬P (f (u))) ∧ (¬P (x) ∨ ¬Q(x. f (g(x))) (f) 1 clause : ¬P (x) ∨ Q(x. y) ∨ P (x)) (f) 2 clauses : ¬P (x) ∨ Q(x. y (¬P (x) ∨ ((¬Q(x. y) = 1 ∨ ¬Q(x. . y) ⇒ (∃u P (f (u))))) ∧ (∀y (Q(x. f (g(x)))) (d) ¬P (x) ∨ Q(x. y) ∨ ¬P (f (u)) ∨ ¬Q(x. 4. f (y)))) (c) ∀x (¬P (x) ∨ Q(x. y) ∨ ¬R(y) (g) Prolog : :. y) ∨ ¬R(y)))) (c) ∀x.p(X). y) ∨ P (x) = (¬P (x) ∨ P (x)) ∨ ¬Q(x.p(X).p(X). DE LA LOGIQUE A ` PROLOG CORRIGES 56 2. ∀x (∃y (P (x) ⇒ Q(x. y) ⇒ P (x))) ) ) (a) ∀x ( ¬P (x) ∨ ( (¬∀y (¬Q(x.f(g(X))) :. ¬P (x) ∨ ¬P (f (u)) et ¬P (x) ∨ ¬Q(x. y) ∨ P (x))) ) ) (c) ∀x ( ¬P (x) ∨ ( ((Q(x. et (U . ou (0 . V ) . non (Y . champ .0 . Listing 1. Op´ erateurs d´ eriv´ es : pour d´efinir les op´erateurs d´eriv´es `a partir des 3 op´erateurs de base. ou (1 .0). 12 13 14 % equiv /3 equiv (X .Y .1). W ) .3 : Des relations aux pre 4 10 Classiquement. entreprise . ecole .Y .ou (X .1). non (1 . Op´ erateurs logiques : de simples faits suffisent pour d´efinir les 3 op´erateurs de base. ´ens TD 1.2). Z ) : . 3 4 5 % et /3 et (0 . ou (U . dans une phrase.0). T ) .Y .0 . est ( mozart .W . ’ La flute enchant´ e e ’ ).0).non (X . U ) . T ) . auteur . T ) . Z ).2 – op´erateurs logiques 1 2 % non /2 non (0 .Y .1 .Y . on utilise les relations suivantes : a⊕b = a·b+a·b. Z ) : .1 .1 – des relations aux pr´edicats 1 2 3 4 5 6 % est /3 est ( thomson . ce qui peut donner : Listing 1.0).et (X . et (0 . dynamique ). non (T . ou (T . .Y . 2.V . U ) .1).0 . ’L ’ ’ avare ’ ). 9 10 11 % imply /3 imply (X . 11 12 13 % sonne /2 sonne ( facteur . W ) . Z ). 7 8 9 10 % aime /2 aime ( voisine .Y . et (X .V . est ( enib . et (U .0 . est ( ’ champ magnetique ’ . non (T . 6 7 8 % ou /3 ou (0 .1). et (1 . et (X . Z ) : . Z ) : .1).4 : Calculs boole 4 10 1. 6 7 8 % nand /3 nand (X .57 ´dicats TD 1. ou (1 . ingenieurs ). on choisit le verbe comme pr´edicat.Y .W .1 . aime ( voisin . V ) . chat ). U ) . chat ). ou (T . 3 4 5 % nor /3 nor (X . Z ) : .Y . et (1 .non (X . T ) . auteur . Z ).1 .3 – op´erateurs d´eriv´es 1 2 % xor /3 xor (X . Z ).Y . le sujet et les attributs comme arguments du pr´edicat . non (Y . Z ).0).non (X . a ⇒ b = a+b et a ⇔ b = a·b+a·b. est ( moliere . Listing 1. ’ flux conservatif ’ ). V). U ) . T ) . ou (W . non(Z.Z . S1 . ou (X . V ) .C . et (A .X.U). V ) . ou (U . 6 7 8 % nonet3 / nonet (X .X.Y.1).Z. et(X.T).Z).T . T ).S .U). S7 ) : - . 3 4 5 % et3 /4 et3 (X . non(Y.Y.U .T).U).Z . et(Y. S ) 25 26 27 28 29 % circuit6 /5 circuit6 (A . et(U. T ) : et (B . U ) .xor (A . S5 . T ). ou(X.Y.V).V).Z).W.Y .B .T). 12 13 14 % circuit2 /3 circuit2 (A .W . T ) . et(X.B .W). et(X. xor (A .et3 (X . et(U.C .T .Z.T).B . et (B .Z .T.C . S ) : non (A . U ) . V ) .Y.Z . T ) : . commutativit´e associativit´e distributivit´e idempotence compl´ementarit´e De Morgan ????????????- et(X. S ) : . ou(X. et (U . W ) .X). et(X.Y . S ) : .B .U). ou(Y. nonet3 (U . U ) . ou(X. S2 .Z.C .T).non (A . W ) .B .T).Z .W . W ) . nonet3 (A . et3 (A .C . et(X.Z. Z ) .X. V ) .B . et (B . Propri´ et´ es des op´ erateurs logiques : de simples appels Prolog permettent de v´erifier les diff´erentes propri´et´es des op´erateurs bool´eens. non (B . non (U . T ) : .Y .Z . xor (B . 4. non(X.T).Y . et (A . DE LA LOGIQUE A ` PROLOG CORRIGES 58 3.ou (X . ou(X. S ).U .Z.B . S ) . W ) .V). T ) : . T ) . S3 . et(X.B . S ) : . W ) . non(X. 35 36 37 % circuit8 /11 circuit8 (A .V .U .T). ou(Y. X ) . ou(X.C . V ) .T).T). T ) : non (B . U ) . ou(U. S ).B . U ) .V). ou (U .Y.U).T). et(X. et(Y.Y . et(U.Y. Y ) . S ).Z. et (U . 15 16 17 % circuit3 /4 circuit3 (A .Z . Y ) . ou(X.Z . et(Y. S ).C .B .C . ou(U. non (B . non (B .S . U ) .0). 18 19 20 21 % circuit4 /5 circuit4 (A .4 – circuits logiques 1 2 % ou3 /4 ou3 (X . 9 10 11 % circuit1 /3 circuit1 (A . T ).´ TD 1. non(X.V .S . S6 .V.V. ou(Y.T).non (A . U ) .T). et (A . ou (U . 22 23 24 % circuit5 /4 circuit5 (A .Y. ou(X. X ) .V .Z.Y. 30 31 32 33 34 % circuit7 /4 circuit7 (A .B .U . et (A . non (C .T).Y .V. et (U . non (A . ou(X.Y .C .C . et (A . S0 .T).V . T ) .X. ou3 (T . U ) .X). ou(X.W . V ) .B .T).V. nonet3 (A .Z .T). T ). T ) : .V. non(Y. Circuits logiques Listing 1. non (C .V).U).Y .V .B .Y .V. U ) . S ) .et (A . non(X.T). T ).W.Z. et (U .C . et (W .W).T. non(Z.B .et (X . et(X. nonet3 (X . ou(U. S4 . B .C . S2 ) . . .1300 .brest. H < 1700. .B . R´ eseau routier s a d e b c 2. vol (2 . ).vol(N1. et3 (A .H.0800 .Z . ).Y). et3 (X .H. H =< 1200.0800 . X ) . . P > 100. et3 (X .Y . brest .1500 .Z . lyon .route(s.6 : Un petit re 4 12 1. paris . . . brest . vol(N2. et3 (X .Y . Y ) . brest .D. . Arbre de r´ esolution : ?.H.250). (d) ?. ´seau routier TD 1. et3 (A .Y .C . . .route (X . (b) ?. . ?. . S1 ) . . non (C .route(X.1400 . (e) ?.A. . ´es Air-Enib TD 1.vol(N.vol(N. .B .brest. ). X ).Y .6 – villes voisines 1 voisines (X . ). 4. . (f) ?.V1. H > 1400. 2. Vols Air-Enib Listing 1.1200 .H.e). route (Y .paris. (g) ?.paris. et3 (X .vol(N.Z . . S4 ) . paris .V2. S6 ) . vol (4 . . Villes voisines Listing 1.59 38 39 40 non (A . A-D > 0200.C . S0 ) .e).5 : Une base de donne 4 11 1. et3 (A .X). ?. vol (5 . S5 ) . 3. S7 ). Requˆ etes sur les vols Air-Enib (a) ?.route(s. Y ) . .5 – vols Air-Enib 1 2 3 4 5 vol (1 .B . (c) ?. non (B . vol (3 .vol(N. londres .100).paris.vol(N.Z . V1 \== V2. Y ) : . ). S3 ) . lyon .P).0600 . paris .75). Z ) .200).C .vol(N. lyon . ?.0630 .route(X.H.1400 . ). Questions simples : on joue sur l’instanciation des arguments pour obtenir les questions les plus simples. .250).1300 . ). et3 (A . X). C1 = rouge. couleur ( vert ). C6 ) : couleur ( C1 ) . couleur ( C2 ) . d) ? creep (7) voisines(d. C6 = vert . C2 \== C6 . C6 = bleu . Redo: Fail: Fail: false.8 : Arbre ge 4 13 1. C3 = bleu. DE LA LOGIQUE A ` PROLOG CORRIGES 60 ?− voisines(d.C3. C3 = jaune. _G336) ? creep TD 1. C6 = rouge .d). (7) voisines(d. couleur ( jaune ). d) ? creep (8) route(s.7 – coloriage d’une carte 1 2 % couleur /1 couleur ( rouge ). couleur ( C3 ) . C2 = jaune. Pr´ edicats de filiation : ` a ce niveau introductif. 3 4 5 6 7 8 9 % carte /6 carte ( C1 . On ne cherchera pas `a les ´eliminer. C4 = vert.C6).C4. C6 = vert . C5 = bleu. C3 \== C4 . e) ? creep (7) voisines(d. _G336) ? creep (8) route(d.C2. C5 .. C3 \== C6 . d) ? creep (8) route(a. a) ? creep (8) route(_G336. C1 \== C2 .X). X = e X = s X = a [trace] Call: Call: Exit: Exit: X = e . ?. C5 = vert.X).carte(C1. d) ? creep (7) voisines(d. C5 \== C6 . ´ ne ´alogique TD 1.´ TD 1. false. couleur ( bleu ). C2 \== C3 . . C2 = bleu. _G336) ? creep (8) route(d. Repr´ esentation graphique louise @ R @ bruno  @  R @  9  jean @ R @ evelyne  @  R @  9  marie fabien eve julie emile jerome franck anne  @  R @  9  sophie aurelie ? marc 2. C2 = jaune. couleur ( C5 ) . C2 \== C4 .voisines(d. et compte-tenu des donn´ees limit´ees du probl`eme. C1 \== C6 . couleur ( C6 ) .. C4 = rouge. couleur ( C4 ) . ?. Redo: Exit: Exit: X = a . C2 = jaune. C5 = jaune. C3 = vert. C2 \== C5 . C1 = rouge.7 : Coloriage d’une carte 4 12 Listing 1. C4 .C5. certaines questions conduiront logiquement `a des doublons. C3 . s) ? creep (8) route(_G336. C4 = vert. e) ? creep (8) route(_G336. C1 \== C5 . C1 = rouge. C1 = vert. d) ? creep (7) voisines(d. C2 . C4 = rouge. d) ? creep (8) route(_G336. C1 \== C3 . C3 = bleu. . Call: Exit: Exit: X = s . C5 = bleu. ?− route(d. ?− route(X. homme ( Y ).femme (Y . ancetre (X . 40 41 42 % soeur /2 soeur (X . Y )).parent (X . X ) . Z ) . Y ) : . X ) .mere (X . X \== Y .soeur (X . Y ). fils (Y . Y ). Z ) .parent (Y .femme (X . Y ) : . fille (Y . 28 29 30 % aGdMere /2 aGdMere (X . parent (Z . Y ) frereSoeur (X . Y ) . Y ) : . Y ). femme ( X ) .8 – g´en´ealogie 1 2 % parent /2 parent (X . Y ) ::::- fils (X . Y ) frereSoeur (X . ancetre (Z . Y ) . fille (X . fille (X . Y ) : . gdParent (Z . Z ) . X \== Y . femme ( X ) . homme ( Y ). 31 32 33 34 35 36 % frereSoeur /2 frereSoeur (X . Z ) .fille (Z . 19 20 21 % gdMere /2 gdMere (X . Z ) . . Z ) .parent (Y . Z ) .61 Listing 1. femme (X . Y ) : .pere (X . Y ) : . Z ) . gdParent (Z . homme ( X ). Y ). Y ) : .mere (X . 47 48 49 50 % belleSoeur /2 belleSoeur (X . Y ) : .fils (Z . femme (Z . 16 17 18 % gdPere /2 gdPere (X . 22 23 24 % gdParent /2 gdParent (X .parent (X .mari (X . 37 38 39 % frere /2 frere (X . Y ) . Y ) : . 43 44 45 46 % beauFrere /2 beauFrere (X . pere (X . fils (Z . Z ) . Z ). Y ) . Y ).frere (X . Z ) . fils (Y . frereSoeur (Z . Y ). parent (Z . fils (X . 6 7 8 % fille /2 fille (X . Y ) : . 51 52 53 54 % ancetre /2 ancetre (X . belleSoeur (X .parent (X . Y ) : . Y ) : . Y ) . femme ( X ). Z ). X ) . Z ) . ( mari (Z . frereSoeur (Z .frereSoeur (X . X ). Y ) . Z ) . beauFrere (X . Y ) : . fille (Z . 25 26 27 % aGdPere /2 aGdPere (X . fille (Y .frereSoeur (X . femme (Z . Y ) : .pere (X . 13 14 15 % mari /2 mari (X . 9 10 11 12 % femme /2 femme (X . Y )). Y ) : . homme ( X ). Y ) . Z ) .mere (X . Y ). Y ) : . ( mari (Z . Y ) frereSoeur (X . Z ) . Y ). Y ). Y ) : . parent (Z . X ) . femme ( X ). Y ). Y ) : . Z ) . Y ) : . 3 4 5 % fils /2 fils (X . Z ) . 62 ´ TD 1. DE LA LOGIQUE A ` PROLOG CORRIGES . . TD 2. ludovine . plus (Z . sexe ) % date : d ( jour .X . Z ) . ad ( ’4 rue leclerc ’ . entier ( s ( X )) : . ). (c) ?.P.civil : ec ( nom . d´ e partement ) individu ( ec ( ngaoundere .2 – entiers naturels 1 2 3 % entier /1 entier ( z ).individu(ec(N.z . N1 \== N2. pr´ e nom .1960) .plus (X . 4 5 6 7 % plus /3 plus (X . s ( Y ) .Nation.Nation. ann´ ee ) % adresse : ad ( rue . plus (X . fois (X .1945) . . cameroun . . ad ( ’ 21 rue de brest ’ . m ) .A). individu(ec(N2.1 : Etat-civil 4 15 1. date de naissance . ). individu ( ec ( martin . . ).2 : Entiers naturels 4 15 Listing 2. Res ). ). brest .ad( . Requˆ etes Prolog (a) ?. france . z ). richard . brest .france. ad ( ’4 rue leclerc ’ .Y . d (19 .29)).A).z .29). s ( Y ) .10 . individu ( ec ( ngaoundere . . d (16 . Nation \== france.fois (X .2 . (d) ?. (b) ?. f ) .P. .Y . cameroun .59)). Z ). . Res ) : . Nation \== france. X ).Corrig´ es TD 2 Termes TD 2.3 . d (15 . ). nationalit´ e . mois .individu(ec(N1.1953) .1 – fiches d’´etat-civil 1 2 3 4 5 6 7 8 9 10 % individu /2 % ´ e tat . m ) .29)). ). jean . ). lyon . Fait Prolog Listing 2.individu(ec(N. . .brest.entier ( X ). s ( Z )) : . 2.P. ville . 12 13 % expo /3 63 .individu(ec(N. 8 9 10 11 % fois /3 fois (_ . quotient (X .X >= 0. Q ).Y . N \== X . polynome (X . Res ). Z ).Y .atomic ( N ) . 27 28 29 % lt /2 lt (X . _ ). Y ) .X . s ( z )). 34 35 36 37 % reste /3 reste (X . lte (X . 30 31 32 33 % quotient /3 quotient (X . Y ) : . R ) . TERMES CORRIGES 64 14 15 expo (_ . X ) : . X ).Y . pgcd (X .Y . ´tique TD 2. Y ) : . plus (X . Res ) : . z ) : . 42 43 44 45 % fact /2 fact (z .Y .polynome (U . X \== Y . X ) : . X ) . Z ) . reste (X .X < 0 .Y \== z . s ( Y ) . plus (X . PY ). Z ) . polynome (U -V .4 – fonctions math´ematiques 1 2 3 % abs /2 abs (X . s ( Y ) .polynome (U . R ) : . R ). 23 24 25 26 % lte /2 lte (z . pred (Y . fois (Z .Y \== z . polynome ( X ^N .Y . Y ). X ).Y . X ).Y . X ). X ) . Y ) . X ) . F ).atomic ( C ) .pred (X .4 : Arithme 4 16 1. Y ) : .Y . ˆ mes TD 2. pgcd (Y . 19 20 21 22 % moins /3 moins (X . 16 17 18 % pred /2 pred ( s ( X ) . quotient (Z . 38 39 40 41 % pgcd /3 pgcd (X . moins ( s ( X ) . Z ) . X ).Y . expo (X . abs (X . polynome ( U *V . X ) : .´ TD 2. X ) : .polynome (U .3 : Polyno 4 16 Listing 2. X ) : . P ) : .Y . polynome (V . polynome ( U +V . X ). PX ) . X ). F ) : .Y . Z ) : . P ).Y \== z .moins (X . lt (X . PY ) .Y \== z .Y \== z . polynome (V . Y is -X . s ( z )).z .z . X ) : .Y . reste (X . lte ( PX . 4 5 % min /3 . Y ).lte (X . lt (X .fact (X .R . s ( Q )) : . C \== X .expo (X . Fonctions math´ ematiques Listing 2. fact ( s ( X ) . reste (Z . polynome (V .z . fois ( s ( X ) . X ) : .3 – polynˆomes 1 2 3 4 5 6 7 % polynome /2 polynome (C . A ) : . P ).Min = < Max .R3 is R1 + R2 . I ) . I3 )) : . argC ( c (0 . X ) : . F is N * F1 . I ) .I > 0 . fibonacci (N . dans (I . 5 6 7 % modC /2 modC ( c (R . c ( R3 . 15 16 17 % ch /2 ch (X . A ) : . 8 9 10 % addC /3 addC ( c ( R1 . 8 9 10 11 % pgcd /3 pgcd (X . F ) : N > 1 . 6 7 8 9 10 11 12 13 % fibonacci /2 fibonacci (0 . . I1 ) . F ) : N > 0 .14159/2. c (R .Y . 2.R3 is R1 * R2 . F is F1 + F2 . 3.I < 0 .Mod is sqrt ( R * R + I * I ). I3 is I1 + I2 . Max ). I3 is R1 * I2 + R2 * I1 . Min . Y ) : .Y . Nombres complexes Listing 2.6 – nombres complexes 1 2 3 4 % argC /2 argC ( c (R . I3 )) : .65 6 7 min (X .Y . I ) .Y =\= 0 . I ) . 4. Suites r´ ecurrentes Listing 2. c ( R3 . 12 13 14 % ppcm /3 ppcm (X .R . F1 ) . A ) : . D ) . Y ) : . R is X mod Y .Y is ( exp ( X ) + exp ( . N1 is N -1 . c ( R2 .X > Y . A is -3.IC is -I . fibonacci (1 . X ). c ( R2 .R =\= 0 .pgcd (X . IC )) : . fibonacci ( N2 . dans (I . factorielle ( N1 . Mod ) : .7 – intervalles 1 2 3 % dans /3 dans ( Min .1). A is 3. I1 ) . F2 ) .Min < Max . min (X . pgcd (Y . A is atan ( I / R ). F1 ) . Intervalles Listing 2. argC ( c (0 . factorielle (N . P ) : .1).I1 * I2 .X ))/2.X = < Y . fibonacci ( N1 . pgcd (X .5 – suites r´ecurrentes 1 2 3 4 5 % factorielle /2 factorielle (0 . 14 15 16 % conj /2 conj ( c (R . Max ) : . Min . I ) . Min1 is Min +1 . I2 ) . Min1 . N2 is N -2 . I2 ) .1).Y . Max ) : . P ) : . P is X * Y / D . N1 is N -1 .Y . 11 12 13 % mulC /3 mulC ( c ( R1 .14159/2.0 . X @ > Y . _ ) .X . bt (G . .Y . dicoBinaire ( G ) . arbreBinaire ( bt (G . dansArbre (X . inserer (X .X . bt ([] . D1 ).8 – arbres binaires 1 2 3 % arbreBinaire /1 arbreBinaire ([]). bt ( G1 . D )). RD ) .X . bt (G . G1 ). 9 10 11 12 13 14 % dicoBinaire /1 dicoBinaire ([]).transfert (G .X . D ) .Y .Y .X . plusGrand ( RD .D . profondeur ( bt (G . ’ racine vide ’) : . D )) : . inserer (X . supprimer (X . dicoBinaire ( D ).X @ < Y .X \== ’ racine vide ’. supprimer (X . N is M +1.Y . 4 5 6 7 8 % dansArbre /2 dansArbre (X .arbreBinaire ( G ) .dansArbre (X . bt ([] . bt (G .X \== ’ racine vide ’ . X ).X ) : .´ TD 2. bt ( G1 .X . D1 )) : . 29 30 31 32 % transfert /3 transfert ( bt ([] .Y . D ) . D1 )) : G \== [] . 9 10 11 12 13 14 % profondeur /2 profondeur ([] .[]) . NG ) . ND .G . D ) .[])). M ) . plusGrand (X . TERMES CORRIGES 66 TD 2.9 – dictionnaires binaires 1 2 3 % racine /2 racine ( bt (_ .0). racine ([] .Y .X @ > Y . D ). bt (G .D . D1 ). bt (G . D ) . D )) : . bt ( G1 . bt (G . D )) : . D ) . Y \== ’ racine vide ’ . D1 )) : . inserer (X . RG ) . D ) . G ) : . 21 22 23 24 25 26 27 28 % supprimer /3 supprimer (X . arbreBinaire ( D ). Y ) : . D )) : .G .Y . bt (G .[] .X @ < Y . ND ) . D )) : . supprimer (X .X . inserer (X .dansArbre (X . plusGrand (X .Y . 4 5 6 7 8 % plusGrand /2 plusGrand ( ’ racine vide ’ . supprimer (X .Z . 2. transfert ( bt (G . N ) : profondeur (G ._ .Y . D ) . Dictionnaires binaires Listing 2. bt (G . Arbres binaires Listing 2. Y . inserer (X . D ).Y . bt (G .Y . plusGrand (X . X .X @ > Y . D \== [] . bt (G . profondeur (D . racine (D . supprimer (X . D )) : racine (G . ’ racine vide ’ ). dansArbre (X .Y . bt (G . bt (G .Y .X .Y . D ) . D )) : . RG ) . G ). bt (G . X . supprimer (X . G1 ). D )). G1 ). transfert (D .5 : Arbres et dictionnaires binaires 4 17 1. D ). D ) .G \== []. D ) . dicoBinaire ( bt (G .X \== ’ racine vide ’. D1 ).Z . X ) .Y . bt (G . max ( NG . 15 16 17 18 19 20 % inserer /3 inserer (X . arg (N . N ). T ). N1 is N -1 . Arbres syntaxiques ?. base ( Arg ) . ?. functor ( NT . A \== T . N ) . AT . a). AT .A . 4 5 6 7 % base /2 base (N . Arg ) . Arg1 ) . substituer (A . T ) : . sousTerme (N .display(2 * (a + b * c)). arg (N .S .F . true. 23 24 25 26 27 28 29 30 % substituer /5 substituer ( Nb . T ).atomic ( T ) .7 : Ope 4 18 1.display(((2 * *(+(*(2. substituer (A . ?. *(b. *(b.display(2 + a +(+(+(2.S . substituer ( Nb . Arg .N .N . ?. sousTerme (N .A . Arg1 ) . c)) true. base ( T ) : . AT .A . b).N .T .67 TD 2. AT . arg ( Nb .N . base (N . substituer (A . T ). +(*(2.6 : Termes de base 4 17 Listing 2.F . T ). Arg ) . base (0 . a). NT ). T ) : .F .F .N > 1 .A . T ) : . NT .S . Arg ) . Op´ erateurs « linguistiques » ?. b)). sousTerme (S . substituer ( Nb1 .compound ( T ) . +(a. functor (T .display(2 * (a + b) * c).10 – termes de base 1 2 3 % base /1 base ( T ) : .display(2 * a + b * c). 12 13 14 15 % sousTerme /3 sousTerme (N .A . sousTerme ( N1 . *(2. substituer (0 . 2.N > 0 .display(diane est la secretaire de la mairie de brest). true. c) + b + c). +(a. T ) : . arg ( Nb . *(*(2. Nb ) . Arg ). ?. sousTerme (S .N .S . AT . c) . a) + b) * c). Nb ) . a).T . T ). NT ). Nb1 is Nb -1 .T . ´rateurs TD 2. functor ( AT .N .T . NT ) : compound ( AT ) . 8 9 10 11 % sousTerme /2 sousTerme (T . NT ) : Nb > 0 . AT .N . functor (T .atomic ( T ). N1 is N -1 . N ) . T ). NT ). b). c))) true. 16 17 18 19 20 21 22 % substituer /4 substituer (A .compound ( T ) . base ( N1 . T ) : . ERROR: Syntax error: Operator expected ERROR: diane ERROR: ** here ** ERROR: est la secretaire de la mairie de brest . c) true. ?. brest)) true.alors). ?.la). ?. but). op(500.et).yfx. de(le(maire). ?. op(400. op(300. ERROR: Syntax error: Operator expected ERROR: display(pierre est le ERROR: ** here ** ERROR: maire de brest) . brest)) true.op(200. op(200.op(300.display(pierre est le maire de brest).fx. est(diane. true.de).des). h)))) true. . op(100.ou).si). regle(arriere(r2. et(d.´ TD 2. ERROR: Syntax error: Operator expected ERROR: display(jean est le gardien de but ERROR: ** here ** ERROR: des verts) . ?. ?. op(600.le). g). Op´ erateurs « de r` egles » ????- op(800.display(regle r2 arriere si f ou g alors h). op(700. regle(avant(r1.display(jean est le gardien de but des verts). verts)) true.est).yfx.xfy.xfx. si(alors(ou(et(a. c). de(de(la(secretaire).xfx. true. la(mairie)). TERMES CORRIGES 68 ?.display(diane est la secretaire de la mairie de brest). est(jean. op(700.op(100. ?.arriere). si(alors(ou(f.fx.fx.display(jean est le gardien de but des verts). ?. 3. est(pierre.fx. true.avant).display(regle r1 avant si a et b ou c alors d et e).xfx.xfx. ?. e))))) true. b). des(de(le(gardien).regle).display(pierre est le maire de brest).xfy. dernier (X .’. liste ([ _ | Q ]) : .liste ( Q ).’ @• @ ’. Repr´ esentation arborescente a ’. 69 .c|[]] ≡ [a.c]] ≡ [a.[ X ]).Corrig´ es TD 3 Listes ´sentations de listes TD 3.[ _ | Q ]) : . 7 8 9 10 % dernier /2 dernier (X .1 – listes (1) 1 2 3 % liste /1 liste ([]). 11 12 13 % nieme /3 nieme (1 .2 : Informations sur les listes 4 19 Listing 3.[]))) ≡ [a|[b|[c|[]]]] ≡ [a|[b|[c]]] ≡ [a|[b.’(c.[ T | _ ]).dernier (X .c] TD 3.1 : Repre 4 19 1. Q ).b. Diff´ erentes ´ ecritures ’.b|[c]] ≡ [a.T .’(b. 4 5 6 % premier /2 premier (X .’(a.b|[c|[]]] ≡ [a.’.c|[]]] ≡ [a|[b.b.[ X | _ ]).’ • @ ’.’ @• @ b @• c [] 2. ?Elem) : Succeeds when the Index-th element of List unifies with Elem. N is M + 1.suffixe (S .?List) : Succeeds when Y immediatly follows X in List.hors (X . LISTES CORRIGES 70 14 nieme (N .0 .[ T | Q ]) : .Y . 27 28 29 30 % suivants /3 suivants (X .suivants (X . Q ) . longueur (N . Q ) .nieme (M .nonvar ( X ). hors (X .3 : Manipulation de listes 4 21 . 48 49 50 51 52 % sousListe /2 sousListe ([] . Par exemple. 31 32 33 34 % unique /2 unique (X . prefixe ([ T | P ] .N . X \== T .´ TD 3. Counting starts at 1. 35 36 37 38 39 % occurence /3 occurences (X . 44 45 46 47 % suffixe /2 suffixe (L . Y | _ ]). L ) . nth1(?Index.[ _ | Q ]) : .X .nonvar ( X ).dans (X .[ T | Q ]) : . suivants (X .Y . 15 16 17 18 % longueur /2 longueur (0 .[ _ | Q ]) : .[ T | Q ]) : . dans (X . prefix(?Prefix.[ X | Q ]) : . last(?List.[ X | _ ]).?Y.occurences (X . Q ) .[ _ | Q ]) : . unique (X . L ) : .Y .N .[ _ | Q ]) : . % sousListe ([ T | Q ] .N . N is M + 1.occurences (X .suffixe (S . Les impl´ementations de Prolog pr´ed´efinissent certains des pr´edicats de’information sur les listes. Q ). X \== T . length(?List. prefixe ([ T | Q ] . Q ).[ T | Q ]) : . L ) : . dans SWI-Prolog : : True if Term is bound to the empty list ([]) or a term with functor ‘.X . occurences (X . is list(+Term) TD 3.[]) : . suffixe ([ T | Q ] . sousListe ([ T | Q ] . 19 20 21 22 % dans /2 dans (X .longueur (M .[ _ | Q ]) : .’ and arity 2 and the second argument is a list. L ) . _ ). suffixe (S . Q ).?Int) : True if Int represents the number of elements of list List.unique (X . Q ).M . member(?Elem. L ).?Elem) : Succeeds if Elem unifies with the last element of List. nextto(?X. Q ). 40 41 42 43 % prefixe /2 prefixe ([] .X \== T . hors (X .[]) : .[ X . P ).prefixe (P . N is M + 1. _ ). occurences (X . Q ) .?List) : True iff Prefix is a leading substring of List.[ X | Q ]) : .?List) : Succeeds when Elem can be unified with one of the members of List.prefixe (P . 23 24 25 26 % hors /2 hors (X . Q ).?List.[]). Q ) . S ). N1 is N .[ T | L ]) : .[ X | L ]) : . QA ) .[]).[ T | L1 ] .substituer (X .N > 1 . substituer (X . TQ . L2 ) . 11 12 13 14 15 % supprimer /3 supprimer (_ . Qs ).[] .[ Q | QQ ]) : transposerPremiers (R . QA .[]). Ts . L2 ) : . 25 26 27 % decaler /2 decaler (L ._ . N1 is N -1 .L .[ T | Q ] .[]).[ X | L ]). aplatir (Q . QL ).conc (Q ._ . L1 ) .supprimer (X . transposer (N .[ T | Q ] .Q .[ T | L1 ] . L1 ) . fin ).[ X ]). supprimer (X .[ T | TQ ] . 40 41 42 % transposer /2 transposer ([ T | Q ] . conc ([ D ] . L ) : aplatir (T .Y .[ X | L1 ] . L ). L ). xfy .[ T | QL ]) : . 34 35 36 37 38 39 % aplatir /2 aplatir ([] . inverser ([ T | Q ] . L . transposerPremiers ([ T | Q ] .Y .L .[]).Y .[]). L ). conc ([ T | Q ] . L ).[ T | Q ] . aplatir (T . L2 ). transposer ( N1 . L1 .1 . T ) . L ). L2 ). 31 32 33 convertir ([] .[]). 43 44 45 46 47 48 % transposer /3 transposer (0 .[] .Y . 28 29 30 % convertir /2 : . L ) : .T \= [] .71 Listing 3.2 – listes (2) 1 2 3 % conc /3 conc ([] .!. TA ) .[ Ts | Qs ]) : N > 0 .supprimer (X . L ) : .ajouter (X . transposer (N . L ). ajouter (X .[ T | L2 ]) : .op (100 .[ X | L1 ] .substituer (X . L1 . 16 17 18 19 % inverser /2 inverser ([] . substituer (X . L1 . T et L ) : .[] .conc ( L1 .1 . conc ( TA . L ). 54 55 56 57 58 % creerListe /3 creerListe (X .[] . LD ). L1 .[ X ]) : .longueur (N .L . 7 8 9 10 % ajouter /3 ajouter (X . creerListe (X . T \= [ _ | _ ]. 49 50 51 52 53 % tr an sposerPremiers /3 tr an sp oserPremiers ([] . conc ( L1 . . X \= T .[ D ] . convertir ([ T | Q ] .convertir (Q . creerListe (X .inverser (Q . L1 .N . L1 . 4 5 6 % inserer /3 inserer (X . tr an sp oserPremiers ([[ T | Q ]| R ] . QQ ). X \= T .[ T | L2 ]) : . et ). L2 ) .[ T ] .[ T ]) : .[ Y | L2 ]) : . aplatir ([ T | Q ] . L ) . 20 21 22 23 24 % substituer /3 substituer (_ . LD ) : . N1 . supprimer (X . F . Each of the arguments may be a variable. L ) . Par exemple. longueur (N .T . univ (F . Les impl´ementations de Prolog pr´ed´efinissent certains des pr´edicats de manipulation de listes. LISTES CORRIGES 72 59 60 61 62 63 % univ /2 univ (F . permutation(?List1. univ (F .F . select(?Elem. univ (F .1 . Accu .T . possibly holding lists as elements into a ‘flat’ list by replacing each list with its elements (recursively). triSelection (L .. enOrdre ([ T1 . Q ). arg ( Accu . . N ) . 5 6 7 8 9 % enOrdre /1 enOrdre ([]).N .´ TD 3.?Elem. append(?ListOfLists.[ T | Q ]) : var ( F ) .N . T2 | Q ]) : . flatten(+List1.[ Arg | Q ]) : N > 0 . univ (_ .0 . ?Term =. selection ( Min . Accu1 .-List2) : Reverse the order of the elements in List1 and unify the result with the elements of List2. triSelection ( L1 . Arg ).arg (N .[ T | Q ]) : nonvar ( F ) .?List. N ) .3 – tris de listes 1 2 3 4 % triPermutation /2 triPermutation (L .?List2) : Permuation is true when List1 is a permutation of List2. functor (F . but not both._ .N . Accu1 is Accu + 1 .[ Arg ]) : . 10 11 12 13 14 15 16 % triSelection /2 triSelection ([] .?List2.N .T1 @ = < T2 . enOrdre ( LT ). Q ) .N .L . LT ) : permutation (L . functor (F . Q ). delete(+List1. Q ). univ (F .4 : Tris de listes 4 25 Listing 3. dans SWI-Prolog : : List is a list which head is the functor of Term and the remaining arguments are the arguments of the term.N .?Rest) : Select Elem from List leaving Rest. append(?List1.[ Min | LT ]) : minimum ( Min . enOrdre ([ T2 | Q ]). LT ) .[]). Arg ) .?List3) : Succeeds when List3 unifies with the concatenation of List1 and List2.?List) : Concatenate a list of lists.[]).1 . enOrdre ([ _ ]). LT ).?List2) : Delete all members of List1 that simultaneously unify with Elem and unify the result with List2. ?List TD 3. Unify the resulting flat list with List2. univ (F . L1 ) . reverse(+List1.-List2) : Transform List1. Accu < N . 64 65 66 67 68 69 70 % univ /4 univ (F . Y | Q ] . fusion ([ X | QX ] . longueur (R . L2 ) .[ X .L . L ).[] . LT2 ) .[] .minimum ( M2 .[ T | Q ] .[ T | Q ] . L1 ) .[ T | LQ ] .[ Y | QY ] .triDicho (Q .[ T2 | Q ]) . LT ) : . fusion ([ X | QX ] . minimum ( M2 . L ) . LT ).Q .[ X ]).[ X | L ]) : . fusion ( QX . L1 ). . 45 46 47 48 49 50 % dicho /3 dicho (L . conc ( L1 . Q ).[ Y | QY ] . insertionDicho (X . L ) : . T2 | Q ]) : .[ X ]).[]). triBulles (L . Q ).separation (Q . Y | Q ] . 22 23 24 25 % triBulles /2 triBulles (L . insertionDicho (X . bulles ([ Y | Q ] . 26 27 28 29 % bulles /2 bulles ([ X . 51 52 53 54 55 56 57 58 59 % triFusion /2 triFusion ([] .bulles (L . _ ). fusion ([ X | QX ] .[ T | Q ]) . LT2 . T1 @ > M2 .X @ > Y . conc ( L2 . LX ) : dicho (L . L ) . LQ ) . Y | Q ] .[ T2 | Q ]) . L1 .\+ bulles (L . LT ).[]). triFusion ([ X .[ T1 .[ X | Q ]) . LInf . 60 61 62 63 64 % separation /3 separation ([] .[Y . T1 @ = < M2 . LT ).L . triDicho ([ T | Q ] . minimum ( T1 . L1 .[ T | Q ]).[ X ] . R is N //2 . bulles ([ X . 30 31 32 33 % triDicho /2 triDicho ([] . L2 . L2 ) . L1 . separation ([ X ] . triFusion ([ X ] . Q2 ). triBulles ( L1 .X @ > Y . conc ( L1 . L2 ) : longueur (N . insertionDicho (X . Y | Q ] . separation ([ X . X @ > T .73 17 18 19 20 21 % minimum /2 minimum (T . LX ) : dicho (L . X @ < T . Y | Q ] . fusion ( LT1 .T . LSup ) . QY . LT ) : separation ([ X .minimum ( M2 . 65 66 67 68 69 70 % fusion /3 fusion (L . % division enti` e re conc ( L1 . LQ ) . X | Q ] . L ).L . LT ) : . L1 .[]). fusion ([] . L1 . 71 72 73 74 75 % triRapide /2 triRapide ([] . insertionDicho (X . LT1 ) . triFusion ( L2 .[ Y | QY ] . insertionDicho (T .[]). LQ . triFusion ( L1 . 34 35 36 37 38 39 40 41 42 43 44 % insertionDicho /3 insertionDicho (X .[ T ]).[ Y | Q2 ]) : . LX ).[ X | Q ]) : . L1 .X @ = < Y .[ Y | Q ]) : .[ X | Q1 ] . T2 | Q ]) : .X @ = < Y .[]).[ T1 . X | Q ]) : . triRapide ([ T | Q ] . LX ) : dicho (L . insertionDicho (X .[] . LX ). LX ).[ T | Q ]) . LT ) : partition (Q . Q1 . L2 ) : . L1 . predsort(+Pred. triRapide ( LSup . partition ([ T | Q ] . 3 4 5 % depiler /3 depiler (T . 9 10 11 % sommet /2 sommet (X . 15 16 17 % defiler /3 defiler (X . LInf . 12 13 14 % enfiler /3 enfiler (X . L2 ) : . L2 ). 6 7 8 % pileVide /1 pileVide ([]). msort(+List.[ T | LSup ]) : T @ > Pivot . LISTES CORRIGES 74 76 77 78 triRapide ( LInf . but only compares the keys. LTInf ) . _ .6).4 – piles et files 1 2 % empiler /3 empiler (X .-Sorted) TD 3.[ T | LTSup ] . LInf . > or =.[] . Q ). Duplicates are removed.conc ( L2 . the result is the same as sort/2. . conc ( LTInf . L1 .[ T | Q ] . If built-in predicate compare/3 is used. LSup ).inserer (X . L1 . Pivot .´ TD 3. The implementation is in C. 18 19 20 % fileVide /1 fileVide ([]). L1 ). but determines the order of two terms by calling Pred(-Delta. keysort(+List. terms whose principal functor is (-)/2.inserer (X . dans SWI-Prolog : : True if Sorted can be unified with a list holding the elements of List. that is.[]). partition (Q . LSup ). but does not remove duplicates. partition (Q . and whose second argument is the satellite data to be carried along with the key. partition ([ T | Q ] .-Sorted) : Sorts similar to sort/2. LSup ) : T @ = < Pivot . LInf . +E1. Par exemple. L1 . L2 ) : .[ T | LInf ] .premier (X . using natural merge sort. Pivot . LT ). Pivot . Certaines impl´ementations de Prolog proposent un (ou des) pr´edicat(s) de tri de listes.[ X ] .+List. LTSup ) . sort(+List.5 : Piles et files 4 25 Listing 3. +E2) . 79 80 81 82 83 84 85 % partition /4 partition ([] . sorted to the standard order of terms (see section 4. whose first argument is the sorting key. Pivot . L ). keysort/2 sorts List like msort/2.-Sorted) : Equivalent to sort/2. L2 ).-Sorted) : List is a proper list whose elements are Key-Value. L1 . L ) : . This call must unify Delta with one of <. QL ) . Q1 ) : hors (T . : Unifies Set with a list holding the same elements as List in the same order.-Set3) : Succeeds if Set3 unifies with the union of Set1 and Set2.+Set2. union(+Set1. union (Q . L ) . E ).+Delete. L ) : .-Set) .L .-Set3) : Succeeds if Set3 unifies with the intersection of Set1 and Set2.[ T | Q1 ]) : dans (T . 20 21 22 23 24 25 % union /3 union ([] . Set1 and Set2 are lists without duplicates.They need not be ordered . L ). Par exemple. intersection ([ T | Q ] . QL ) . listeEnsemble ([ T | Q1 ] . intersection (Q .6 : Ensembles 4 27 Listing 3. Q1 ). Q1 . sousEnsemble (Q . only the first is retained. _ ). intersection(+Set1.L .[ T | Q2 ]) : supprimer (T . L ) . subset(+Subset. If list contains duplicates.L .-Result) : Delete all elements of set Delete from Set and unify the resulting set with Result. Q2 ). listeEnsemble (Q .75 21 22 23 % tete /2 tete (X .+Set) : Succeeds if all elements of Subset are elements of Set as well. union ([ T | Q ] .hors (T .[]). ensemble ([ T | Q ]) : . intersection (Q . QL .L . sousEnsemble ([ T | Q ] . ensemble ( Q ). L . TD 3.5 – ensembles 1 2 3 % ensemble /1 ensemble ([]). supprimer (T . subtract(+Set.[ T | Q1 ]) : . _ . Certaines impl´ementations de Prolog proposent un (ou des) pr´edicat(s) sur les ensembles. E ) : dans (T .L . 26 27 28 29 30 31 % sousEnsemble /2 sousEnsemble ([] . Q1 ).L . is set(+Set) list to set(+List. E ) . Q1 ). Set1 and Set2 are lists without duplicates. QL .+Set2. Q ) . Q ) . supprimer (T .dernier (X .[]). intersection ([ T | Q ] . 10 11 12 13 14 15 16 17 18 19 % intersection /3 intersection ([] . L ). dans SWI-Prolog : : Succeeds if Set is a list without duplicates. 4 5 6 7 8 9 % listeEnsemble /2 listeEnsemble ([] . T2 .8 : Listes et arithme 4 28 Listing 3. N6 .T2 >= T1 . ´tique TD 3. C1 \== C3 . Q ). somme ([ T | Q ] .[ football . francais ]) . S1 \== S2 . espagnol . Tableau ). N1 . T2 | Q ] . N2 . T1 .somme (Q . Tableau ) . dans ( S2 . bleu . precede ( m ( vert . 15 16 17 18 19 20 21 22 23 % puzzle /1 puzzle ( Tableau ) : tableau ( Tableau ) . N7 .T1 > T2 . Max ) : .Min > Max . football ) . S1 ) . N5 . S5 ) . La maison verte est situ´ee avant la maison de l’espagnol.[ blanc . Max . S2 \== S3 . N1 \== N3 .[ football . dans ( m ( blanc . N is T + NQ . C1 \== C2 .[ anglais .[ blanc . m ( N3 . espagnol .dans ( T1 . vert ]) . N2 \== N3 . tennis ]) . anglais . 1 2 3 4 5 Chaque indice diminue le nombre de solutions possibles : 216 → 72 → 24 → 6 → 2 → 1. 9 10 11 % entiers /3 entiers ( Min . dans ( N2 . Q ).[ anglais . L’anglais habite la maison blanche. m ( C3 . vert ]) .[ football .0). bleu . dans ( m ( vert . S2 ) . 24 25 26 27 % precede /2 precede (T .7 : Puzzle logique 4 27 Listing 3. S3 ) . m ( C6 . maximum ([ T1 . La maison blanche est situ´ee avant la maison o` u on pratique le football. dans ( S3 . maximum ([ T2 | Q ] . precede ( T1 . dans ( N3 . On retrouve bien les 5 indices propos´es dans le pr´edicat puzzle/1 des lignes 19 `a 23 : 19 20 21 22 23 : : : : : Dans la maison verte on pratique la natation. Tableau ) . X ). N1 . espagnol . Tableau ) . Max ).[ T | Q ]) : . tennis ]) . Tableau ) . vert ]) . espagnol .7 – listes et arithm´etique 1 2 3 4 % maximum /2 maximum ([ X ] . premier ( m ( C7 . Le tennisman habite au d´ebut de la rue. S2 ) . maximum ([ T1 | Q ] . dans ( S1 . LISTES CORRIGES 76 TD 3. dans ( C3 . . T2 | Q ] . N1 \== N2 . S1 \== S3 .[ blanc . C2 \== C3 . N ) : .[ anglais . NQ ) . natation . 5 6 7 8 % somme /2 somme ([] . tennis ]) . S4 ) .[]) : . dans ( N1 . dans ( C2 . Max ). bleu . N2 . tennis ) . S3 )]) : dans ( C1 . natation . natation . Max ) : . francais ]) .6 – puzzle logique 1 2 3 4 5 6 7 8 9 10 11 12 13 14 % tableau /1 tableau ([ m ( C1 . precede ( m ( blanc . m ( C2 .[ _ | Q ]) : . N3 . francais ]) . maximum ([ T1 . natation ) . T2 .´ TD 3.precede ( T1 . XY ) . List must be a proper list holding numbers. Op1 . filtre (P . E ). Certaines impl´ementations de Prolog proposent un (ou des) pr´edicat(s) sur les listes de nombres.?Value) : Low and High are integers.[ Min | E ]) : Min = < Max . Op3 . P is PQ + T1 * T2 . . Op2 . entiers ( Min1 . Max . Z ) : . PQ ).Y . S1 ) . PQ ).Q . operation ( XY . operation (X . Par exemple. Z ) : .[]).N > 1 . S ) : surface ([( X2 . Min1 is Min + 1 . Y2 )| Pts ] .-Sum) : Unify Sum to the result of adding all elements in List. max list(+List.-Max) : True if Max is the largest number in List. 25 26 27 28 % premiers /2 premiers (1 . produitScalaire ([ T1 | Q1 ] . sumlist(+List.[ E | Ps ]) : filtre (E .[1| LP ]) : .[1]). filtre (P . Max .-Min) : True if Min is the smallest number in List. When Value is a variable it is successively bound to all integers between Low and High.0 =:= T mod P . crible ( Es1 . entiers (2 .* .[] . R ) . Es .Z is X + Y .[]).Y1 * X2 )/2 + S1 .T .77 12 13 entiers ( Min .Z . XYZ ) . crible ([ E | Es ] . Low =<Value =<High. . numlist(+Low. premiers (N .-List) : If Low and High are integers with Low =< High.Y .[ T | Q ] . 29 30 31 32 33 % crible /2 crible ([] . Y2 )| Pts ] .Y .T . Z ) : . crible (E .[ T | PQ ]) : . TD 3.+High. S is ( X1 * Y2 .. Low+1.0 =\= T mod P .Z is X .Y .Z .+High.[ T2 | Q2 ] .High]. filtre (P . surface ([( X1 . 19 20 21 22 23 24 % surface /2 surface ([ _ ] .. unify List to a list [Low.Y .[ T | Q ] .N .9 : Le compte est bon 4 29 Listing 3. Q2 . dans SWI-Prolog : between(+Low. PQ ) : . .. 5 6 7 8 9 10 % calcul /5 calcul (X . operation (X . Es1 ) . Expr ) : operation (X .Q .0).0).Z is X * Y .R . LP ). High >=Low.+ . If Value is an integer. P ) : produitScalaire ( Q1 . Y1 ) . operation ( XYZ .( X2 .[] .Y . filtre (P . PQ ) .8 – « le compte est bon » 1 2 3 4 % operation /4 operation (X . E ) . 34 35 36 37 38 % filtre /3 filtre (_ . 14 15 16 17 18 % produitScalaire /3 produitScalaire ([] . Ps ). min list(+List. 9] . LISTES CORRIGES 78 11 12 13 E1 =. C3 . X4 ]) . N2 . R1 . [ Op2 |[ E1 . Chiffres . Ch ) .Lgr = < Lgr1 . Z ]] . N1 .R . Ch1 . normalise (_ . [ Op6 |[ Z .. R ) . T ]] . N1 . E2 ]]. Ch2 ) . R1 . Ch2 . normalise (0 . N3 . 29 30 31 32 33 34 % sommeChiffre /7 sommeChiffre ( C1 . [ Op1 |[ X . NN2 . Lgr ) : . E2 =. Ch2 ) . 14 15 16 17 18 19 20 21 22 calcul (X . normalise (0 .´ TD 3. Ch3 ) . NN2 .[0 . E1 =.R . NN2 .. normalise (0 . N3 . Op6 . C2 .5 . operation (Z .10 : Casse-te 4 30 Listing 3.T .R . S is C1 + C2 + R1 . ˆte cryptarithme ´tique TD 3. R is S // 10. somme ([ C1 | N1 ] . Lgr ) . Expr ) : permutation ([ X . [ Op5 |[ E1 .9 – casse-tˆetes cryptarithm´etiques 1 2 3 4 % somme /3 somme ( N1 . Lgr3 ] ..Y .Z . N3 ) . NN1 ). NN3 ) .T . R2 . Lgr3 . sommeChiffre ( C1 . T ] .Z . X4 . operation ( XY . Lgr2 . Ch ). X2 . D is Lgr . [ Op4 |[ X .Lgr1 .R . longueur ( Lgr3 .D . N1 . longueur ( Lgr2 . Ch1 . calcul ( X1 . Chiffres ).8 . Lgr ) : Lgr > Lgr1 . LX ) . ZT ) . T ]]. Expr ) : operation (X .2 .3 . N2 . Y ]] . Ch ) : supprimer ( C1 . NN1 .Y . R2 .Z . Lgr ) . C2 .R . X3 . N1 . C3 is S mod 10 . N2 . Lgr1 . Expr ).0 ..[ C2 | N2 ] . ZT .7 . 15 16 17 18 19 20 21 22 % normalise /5 normalise (X . N1 ) . maximum ([ Lgr1 . R1 . XY ) . E2 =. Ch1 . Expr =. Ch3 . NN3 . NN1 . Op4 . NN3 .0 . C3 . N2 .. NN1 . Lgr ). conc ( LX . NN2 . somme ( NN1 . Expr =. Ch2 .1 . 23 24 25 26 27 % compte /5 compte (X .R .6 . N3 . N3 .0 . 23 24 25 26 27 28 % somme /7 somme ([] .[ C3 | N3 ] .. supprimer ( C2 .Y . Lgr1 . X2 . N3 ) : normalise ( N1 . N1 .4 .[ X1 . NN3 ) : longueur ( Lgr1 .[] . 5 6 7 8 9 10 11 12 13 14 % normalise /6 normalise ( N1 . % division enti` e re . Lgr ) . Ch ) : somme ( N1 . Y ]] . NN1 . supprimer ( C3 .T . _ ). Op5 . Ch1 . creerListe (X . N2 . Lgr2 . X3 .Y .0 . N2 ) . [ Op3 |[ E2 . Lgr1 .[] . Na1 ) .12 : Les mutants 4 31 Listing 3. Nd1 ) .N2 is N +N . NAntiDiag ) : N1 is 1 -N . but not both. Ny1 ) . A is X -Y .11 : Proble 4 30 Listing 3. Ny . S2 .supp (X . conc ([ T | Q ] . NDiag ).11 – mutants 1 2 3 4 5 % mutant /3 mutant ( A1 . name(N.?String) : String is a list of character codes representing the same text as Atom. supp (X . Each of the arguments may be a variable.Q .[ T | Q ] . D is X +Y . NAntiDiag . L ) . NDiag . ´s TD 3. 15 16 17 % diagonales /2 diagonales (N . Par exemple. When String is bound to an character code list describing an integer and Atom is a variable. conc (_ . Ny . antiDiagonales (N . A2 .[]). TD 3. 7 8 9 10 11 12 13 14 % nreines /5 nreines ([] . nreines ([ X | Xs ] . L1 ) . entiers (2 . 22 23 24 25 % supp /3 supp (T . NAntiDiag ) . N2 . L ). L2 ) . L ). name ( A2 . L1 ) .13 : Mots croise 4 31 Listing 3.[ T | Q ] . Ys ). entiers ( N1 . NAntiDiag ). dans SWI-Prolog : name( ?AtomOrInt. conc ( L1 ._ . Na . supp (D .79 `me des n reines TD 3.10 – probl`eme des n reines 1 2 3 4 5 6 % nreines /2 nreines (N .12 – mots crois´es . Nd . NCases ) .[ T | Q ] . NCases .[ Y | Ys ]) : supp (Y . 400 is N + 100 succeeds). nreines ( Xs . N2 is N -1 . _ . diagonales (N . L ) : entiers (1 . "300"). L ). S2 .[ T | L ]) : . Q )._ . L2 ) . Na1 . Les impl´ementations de Prolog proposent un pr´edicat permettant de transformer un atome en une liste de ses codes ASCII ou r´eciproquement.N . Nd1 . Ny1 . NDiag ) : . Mutant ) : name ( A1 . Na . 18 19 20 21 % antiDiagonales /2 antiDiagonales (N . N2 . NDiag ) . Atom will be unified with the integer value described by String (e. Nd . supp (A . name ( Mutant . nreines ( NCases .g. Mot2 .1 .dico ( Mot ) .2) . selectMot ( M7 .2) .longueur (N . M5 . .1 . 9 10 11 12 % interCar /4 interCar ( Mot1 .´ TD 3.4). interCar ( M6 . N1 .4) .1) .3) . N ). selectMot ( M6 . Car ) : . M7 .1) .N . M2 . M1 .2 . N ) : . M7 ) : selectMot ( M1 . selectMot ( M2 . 3 4 5 % selectMot /2 selectMot ( Mot . M6 . M5 . 13 14 15 16 17 18 19 20 21 22 % motsCroises /7 motsCroises ( M1 . M5 . M7 .nieme ( Car . M2 .2) .2) . Car ).4) . selectMot ( M3 . 6 7 8 % rang /3 rang ( Mot . interCar ( M1 . M4 . selectMot ( M5 . Mot ). selectMot ( M4 .4 .2) .4) . N1 . N2 . M5 . N2 ) : rang ( Mot1 . Mot ). nbCars ( Mot . M3 . Car ) . interCar ( M3 . interCar ( M1 .2) .1 . N ) : .N . interCar ( M6 .1 . interCar ( M4 .2 . rang ( Mot2 . LISTES CORRIGES 80 1 2 % nbCars /2 nbCars ( Mot .2) . interCar ( M2 . consonne ( v ). DU * DFU ) : .2 – traitements g´en´eriques 1 2 3 4 % map /3 map (_ .X .[ FT | FQ ]) : But =.V1 * U )/( V ^2)) : . V * U1 + U * V1 ) : . U1 ) .d (U . U1 ) .3 : Du mot aux syllabes 4 33 Listing 4. d (V . atomic ( N ) .X . consonne ( c ).[ T | Q ] . d ( U *V .X .1 : De 4 33 Listing 4. voyelle ( u ). cos ( X )) : .( -1)* sin ( X )) : .X . d ( sin ( X ) .2 : Traitements ge 4 33 Listing 4. voyelle ( e ). consonne ( g ).X .X . U1 ) .( U1 * V . consonne ( w ). consonne ( r ).0) : .X . consonne ( p ). consonne ( z ).V1 ) : .Corrig´ es TD 4 Contrˆ ole de la r´ esolution ´rivation symbolique TD 4. consonne ( s ). d (V . d ( U /V . voyelle ( y ).X .[] . consonne ( h ).X .!. d ( U +V .d (F . DFU ) . d (U .U . U \== X .N \== X . map (F .X . exp ( X )) : .1/ X ) : .X . ´ ne ´riques TD 4. U1 ) . consonne ( x ). U1 + V1 ) : .d (U . d ( X ^( N ) .d (U .X . consonne ( k ).d (U . [F .!.!.X . U1 . consonne ( d ). !.X . voyelle ( o ). consonne ( t ).T .X . V1 ) .X . d (V . FQ ). FT ] .1 – d´erivation symbolique 1 2 3 4 5 6 7 8 9 10 11 12 % d /3 d (C .X . call ( But ) . !. d (F .X . !.. d ( cos ( X ) . consonne ( q ). d (U -V . d ( exp ( X ) . !. !. consonne ( l ). . DU ). voyelle ( i ). atomic ( C ) . 4 5 6 7 8 9 10 % consonne /1 consonne ( b ). !.C \== X .3 – c´esure de mots 1 2 3 % voyelle /1 voyelle ( a ). V1 ) . N *( X ^( N -1))) : . consonne ( n ). map (F . d ( ln ( X ) .!. 81 consonne ( f ). V1 ) .[]). d (V . TD 4. consonne ( j ).X . consonne ( m ).X .Q . V1 ) . Lettres ) . C3 | L ] . syllabes ([ C3 | L ] . C2 . Sep . S ). Sep . Sep . l ]). Syllabes1 ) . consonne ( C2 ) . syllabes ([ C1 . Separateur . C1 . V2 | L ] . consonne ( C ) .[ V1 . syllabes ([ C1 .[ C3 | S ]). inseparables ([ t . C1 .´ TD 4. C2 . C2 ]) . C3 | S ]) : consonne ( C1 ) . n ]).[]).[ C1 .4 – gestion d’un compteur 1 % cptInit /2 . Sep . C3 ]) . inseparables ([ c . inseparables ([ b . syllabes ([ L | Ls ] . consonne ( C3 ) . Syllabes1 ). C3 ]) . consonne ( C2 ) . syllabes ([ V1 . inseparables ([ p . recomposer ( Syllabes . codes ( Cs . C2 .[ L | S ]) : . V2 | L ] . C1 . syllabes ([ V1 .name (L . inseparables ([ f . !. r ]). Sep . Sep . l ]). C2 . voyelle ( V2 ) . V2 | S ]) : voyelle ( V1 ) . syllabes ([ V2 | L ] . !. C1 . r ]).[ V2 | S ]).[ V2 | S ]). Lettres ) : . !. Sep . 29 30 31 32 33 34 % cesures /3 cesures ( Mot . Sep . \+ inseparables ([ C2 .C . Codes ) . h ]). C2 .[ C ]) . V2 | S ]) : voyelle ( V1 ) . 26 27 28 % recomposer /2 recomposer ( Mot . consonne ( C2 ) . inseparables ([ c . !.syllabes ( Ls .[ C3 | S ]). CONTROLE ˆ ´ CORRIGES DE LA RESOLUTION 82 11 12 13 14 15 16 17 18 % inseparables /1 inseparables ([ b . Ls ). 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 % syllabes /3 syllabes ([ V1 .[ V1 . voyelle ( V2 ) . syllabes ( Lettres . Sep .[ V1 . l ]).codes ( Codes . l ]). TD 4. l ]). r ]). inseparables ([ c .[ V2 | S ]). C2 . Sep . V2 | S ]) : voyelle ( V1 ) . r ]). inseparables ([ v . consonne ( C3 ) . consonne ( C1 ) . inseparables ([ C2 . codes ([ C | Cs ] .[]). h ]). syllabes ([] . Lettres ) : . Lettres ) . V2 | L ] . inseparables ([ p . Lettres ). syllabes ([ V2 | L ] . Sep . syllabes ([ V2 | L ] . inseparables ([ t . _ . Sep . r ]). Sep . inseparables ([ d .[ L | Ls ]) : . \+ inseparables ([ C1 . h ]).4 : Gestion d’un compteur 4 34 Listing 4. inseparables ([ g . Sep . C2 . C2 ]) . name ( Mot . Separateur . r ]). C2 . inseparables ([ C1 . inseparables ([ f . Codes ). Sep . C3 | S ]) : consonne ( C1 ) . r ]). inseparables ([ p .C .name ( Mot . consonne ( C2 ) . C3 | L ] . 19 20 21 22 % codes /2 codes ([] . voyelle ( V2 ) . r ]). syllabes ([ C3 | L ] . codes ( Codes . Sep .[ C1 . Sep . inseparables ([ g . 23 24 25 % decomposer /2 decomposer ( Mot . Syllabes ) : decomposer ( Mot . consonne ( C1 ) . !. inseparables ([ g . pour(to(:=(i. V =:= 122 .display(selon x dans [a1:r1. ?. Val .display(si p alors q). recorda ( Cpt . [])))) true. ?. r))) true. Inc ) : integer ( Inc ) . r2).display(si p alors q sinon r). integer ( Val ) . r2).display(repeter r jusqua p). 11 12 13 % cptVal /2 cptVal ( Cpt .a2:r2]). ?. si(alors(p.killCpt ( Cpt ). Val ) : killCpt ( Cpt ) . recorda ( Cpt . fail . r))) true. 8 9 10 % cptFin /2 cptFin ( Cpt ) : . _ ). Val ) : . si(alors(p.display(pour i := 0 to 5 faire r). Val . recorded ( Cpt . cptVal (c . 5).(:(a2.1) . ?. 14 15 16 17 18 % cptInc /2 cptInc ( Cpt .recorded ( Cpt .display(pour i := 5 downto 0 faire r). autrement(. repeter(jusqua(r.(:(a1. r1).5 : Structures de contro 4 35 1. q)) true.recorded ( Cpt . put ( V ) .a2:r2] autrement r). selon(dans(x. faire(5. ˆ le TD 4. Ref ) . _ ). killCpt ( _ ).83 2 3 cptInit ( Cpt . erase ( Ref ) . sinon(q. Repr´ esentation arborescente ?. 19 20 21 22 23 24 25 26 % alphabet /0 alphabet : cptInit (c . cptFin ( c ). . p)) true. 4 5 6 7 % killCpt /1 killCpt ( Cpt ) : ._ . ! . ?. _ ). repeat . . cptInc (c . selon(dans(x. r))) true. r))) true. 0).97) . . erase ( Ref ) . pour(downto(:=(i.(:(a2. r1). .display(selon x dans [a1:r1. put (32) .(:(a1.V . [])). Ref ) . faire(0. ?. V ) . V is Val + Inc . Val . 1) ) jusqua ( V =:= Max ) . fx . = Xi alors call ( Qi ) sinon call ( R ). repeter ( cptVal (X .Min > Max . xfx . CONTROLE ˆ ´ CORRIGES DE LA RESOLUTION 84 2. pour X := Max downto Min faire Q : cptInit (X . op (900 . sinon ). call ( Q ).call ( P ) . choixMenu ( Menu .! . xfx . Choix . pour ) . alors ) . to ) .Min > Max . op (900 . cptFin ( X ). Fin )). pour X := Min to Max faire Q : cptInit (X . cptFin ( X ). itemMenu ( Menu . downto ). fx . call ( Q ). [ Xi : Qi ] : .call ( P ) .´ TD 4. !. Gestion d’un menu Listing 4. 3. !. Q.6 – gestion d’un menu 1 2 3 4 5 6 7 8 9 % menu /1 menu ( Menu ) : repeter ( afficherMenu ( Menu ) . op (850 . cptInc (X .op (900 . xfx . fx . op (750 . !. ! . Choix ) . Min ) . selon ) . op (800 . 7 8 9 10 11 12 % si /1 si P alors si P alors si P alors si P alors Q sinon R : . [ Xi : Qi | XQ ] : = Xi alors call ( Qi ) sinon ( selon X dans XQ ). si ) . V ) . op (850 . op (750 . 19 20 21 22 23 24 25 26 % selon /1 selon X dans si X selon X dans si X selon X dans si X [ Xi : Qi autrement R ] : . faire ). op (850 . op (900 .! . 13 14 15 16 17 18 % repeter /1 repeter Q jusqua P : repeat . jusqua ). op (800 . xfx . 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 % pour /1 pour X := Min to Max faire Q : . xfx . ! . Q sinon R : . xfx . fx .: . call ( Q ) . xfx . cptDec (X . call ( Q ) . Choix ) ) jusqua ( finMenu ( Menu . dans ) . Structures de base Listing 4. call ( P ) .1) ) jusqua ( V =:= Min ) . xfx . = Xi alors call ( Qi ). Q : . op (850 . pour X := Max downto Min faire Q : . V ) .!. repeter ) . .:).call ( R ) . xfx .:=) . xfx . call ( Q ) .5 – structures de contrˆole 1 2 3 4 5 6 ::::::- op (900 . Max ) . repeter ( cptVal (X . fx . op (850 . autrement ). op (800 . si ). read ( Choix ). quitter ( test ) : . ] ’) . nl . faire . 4 : quitter ( test ) autrement ( write ( ’ *** choix incorrect *** ’) . write ( ’ 5. write ( ’ 1.. 3 : exSdc ( selon X dans [ Xi : Qi ]) . 7 : exSdc ( repeter Q jusqua P ) .. nl .... 4 : exSdc ( selon X dans [ Xi : Qi autrement R ]) . ’) ... tab (2) . Choix ) : write ( Menu ) . si . si . tab (2) .... nl . nl .. ’) .. tab (2) .. 39 40 41 42 43 44 45 46 47 48 49 50 % afficherMenu /1 afficherMenu ( sdc ) : nl . tab (2) ....... Fin ) : . autrement . 13 14 15 % finMenu /3 finMenu ( Menu . 6 : exSdc ( pour X := Max downto Min faire Q ) . pour .nbItems ( Menu . itemMenu ( test . faire .. write ( ’ 4.. dans [ . nbItems ( test .8). Choix ) : selon Choix dans [ 1 : exSdc ( si P alors Q ) . Fin ).... dans [ .. Fin .nl . write ( ’ . write ( ’ . repeter . 2 : write ( deux ) . nl .. write ( ’ 3.. 35 36 37 38 % quitter /1 quitter ( sdc ) : . write ( ’ > votre choix : ’) . nl .. Fin . write ( ’ 6. write ( ’ > votre choix : ’) . ’) .. nl . jusqua .... nl ) ]. fin de l ’ ’ exemple ’) . alors . selon . ’) . tab (2) . Choix ) : write ( Menu ) . 4 5 6 % finmenu /3 finMenu ( Menu .. ’) . 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 % itemMenu /2 itemMenu ( sdc . Listing 4. nl ) ]. 3 : write ( trois ) .4).7 – exemples de menus 1 2 3 % nbItems /2 nbItems ( sdc . nl . := . selon . write ( ’ 7.. nl ... Fin ) : . write ( ’ 2. tab (2) . nl .85 10 11 12 % choixMenu /2 choixMenu ( Menu .nl .nbItems ( Menu .. to .. 8 : quitter ( sdc ) autrement ( write ( ’ *** choix incorrect *** ’) .. . 5 : exSdc ( pour X := Min to Max faire Q ) . alors . tab (2) ... := . sinon .. fin de la demonstration ’) . write ( ’ STRUCTURES DE CONTROLE ’) .. Fin ). Choix ) : selon Choix dans [ 1 : write ( un ) . 31 32 33 34 % choixMenu /2 choixMenu ( Menu .. downto . ] ’) . 2 : exSdc ( si P alors Q sinon R ) . pour . read ( Choix ). ! . write ( ’ 2. nl . write ( Tete ) . nl . tab (2) . exSdc ( TeteClause ) : afficherClause ( TeteClause ) . 102 103 104 105 exSdc ( selon X dans [ Xi : Qi autrement R ]) : . 92 93 94 95 exSdc ( si P alors Q sinon R ) : . write ( ’ REGLES DU ’) . 88 89 90 91 exSdc ( si P alors Q ) : . ’) . tab (8) . write ( ’ : ’) . write ( ’ 3. write ( ’ EXEMPLE D ’ ’ APPLICATION : ’) .! . appel ( test ( to )). afficherCorps ( Corps ) . nl . afficherClause ( _ ) : . write ( ’ test si un nombre est negatif ’) . nl . 58 59 60 61 62 63 64 65 % afficherClause /1 afficherClause ( Tete ) : clause ( Tete . write ( ’ 8. nl .! .! .! . fail . tab (8) . exSdc ( TeteClause ) : nl . write ( ’. nl . quitter ’) . write ( ’ . ’) . . appel ( test ( selon )). fail . write ( ’ 4. nl . write ( ’. 106 107 108 109 exSdc ( pour X := Min to Max faire Q ) : write ( ’ calcul iteratif de n ! ’) . ’) . write ( ’ calcul de la valeur absolue d ’ ’ un nombre ’) . un ’) . nl .’) . nl .nl . tab (2) . appel ( test ( sinon )). write ( ’ teste une valeur entiere comprise entre 0 et 4 exclus ’) . nl . nl . nl . write ( C ) . write ( ’ : . write ( C1 ) . tab (8) . write ( C1 ) . afficherCorps (( C1 . fail . fail . write ( TeteClause ) . nl . quitter ’) . 96 97 98 99 100 101 exSdc ( selon X dans [ Xi : Qi ]) : .´ TD 4. afficherCorps ( C2 ). nl . C2 )) : . nl . tab (2) . nl .! . afficherMenu ( test ) : nl . tab (2) . CONTROLE ˆ ´ CORRIGES DE LA RESOLUTION 86 51 52 53 54 55 56 57 tab (2) . deux ’) . Corps ) . appel ( test ( si )). tab (2) . C2 )) : . write ( ’ EXEMPLE DE MENU ’) . write ( ’ gestion d ’ ’ un menu ’) . 77 78 79 80 81 82 83 84 85 86 87 % exSdc /1 exSdc ( TeteClause ) : nl . trois ’) . appel ( test ( autrement )). 66 67 68 69 70 71 72 73 74 75 76 % afficherCorps /1 afficherCorps (( C1 . nl . afficherCorps ( C ) : tab (8) . write ( ’ 1. afficherCorps ( C2 ). ’) . write ( X ) . write ( Y )) . recorded ( fact . Choix ) . write ( Fact ) .1 .87 110 111 112 113 114 exSdc ( pour X := Max downto Min faire Q ) : write ( ’ calcul iteratif de la somme des n premiers entiers ’) . Choix ) ) jusqua ( finMenu ( Menu . test ( to ) : repeter entrer ( X ) jusqua ( X >= 0) . si Choix == 4 alors fin sinon test ( autrement ). write ( ’| ? . write ( ’. appel ( test ( repeter )). ’) . 115 116 117 118 exSdc ( repeter Q jusqua P ) : write ( ’ test d ’ ’ un nombre entre au clavier ’) . 2 : write ( deux ) . killCpt ( fact ). 3 : write ( trois ) ]. nl . choixMenu ( test . nl ). test ( selon ) : repeter entrer ( X ) jusqua ( X > 0 . write ( But ) . test ( sinon ) : entrer ( X ) .! .4)) . R3 ) . itemMenu ( test . . nl . 122 123 124 125 126 127 128 129 % appel /1 appel ( But ) : afficherClause ( But ) . recorda ( fact . Choix . si ( call ( But ) . 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 % test /1 test ( si ) : entrer ( X ) . R0 ) . si X >= 0 alors write ( X ) sinon ( Y is . nl . Fact . R2 ) ). erase ( R1 ) .. Fact . Val . nl . I ) . nl ) alors write ( ’ true ’) sinon write ( ’ false ’) . recorda ( fact . Fact is Val * I . si X < 0 alors ( write ( ’ nombre negatif ’) . pour i := 1 to X faire ( recorded ( fact . 119 120 121 exSdc ( _ ) : write ( ’ pas d ’ ’ exemple . nl . X < 4) . write ( ’! = ’) .X . appel ( test ( downto )). selon X dans [ 1 : write ( un ) . desole . nl .. test ( autrement ) : repeter ( afficherMenu ( test ) . R1 ) . nl . nl . ’) . cptVal (i . write ( ’ valeur absolue : ’) . Y ) : . recorda ( somme . ArgY ) .X . Val . Y ). Y ).F . unifier2 (X . Y ).Y . nonvar ( Y ) .1 . read ( X ) ) jusqua integer ( X ). nl .0 .var ( X ) . Y ) : . X == Y . unifier (X .var ( X ) . Y = X . var ( Y ) . unifierArguments2 (N ._ .X . N1 is N . X = Y . recorda ( somme .6 : Unification 4 36 Listing 4. functor (Y . compound ( Y ) . arg (N . nonOccur (X . N ) . X = Y . nonvar ( Y ) . compound ( Y ) .nonvar ( X ) . Y ) : compound ( X ) . unifier (X .F . R0 ) .F . _ ). N ) . N ) .F . Y ) : compound ( X ) .) : ’) . Somme is Val + I . R1 ) . unifierArguments ( N1 . write ( Somme ) .atomic ( X ) . var ( Y ) . R2 ) ). 27 28 % unifierArguments2 /3 . Y ) . Y ) : . X = Y . unifierArguments (N . N ) .8 – unification 1 2 3 4 5 6 7 8 9 % unifier /2 unifier (X . write ( ’ premiers entiers = ’) . write ( X ) . I ) . unifierArguments (0 .´ TD 4.X . 17 18 19 20 21 22 23 24 25 26 % unifier2 /2 unifier2 (X . atomic ( Y ) . killCpt ( somme ). erase ( R1 ) . ArgY ) . 10 11 12 13 14 15 16 % unifierArguments /3 unifierArguments (N . var ( Y ) . CONTROLE ˆ ´ CORRIGES DE LA RESOLUTION 88 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 test ( downto ) : repeter entrer ( X ) jusqua ( X >= 0) . Y ) : N > 0 . Y ) : . R3 ) . functor (Y . recorded ( somme . Y ) : . var ( Y ) . Somme . unifier ( ArgX . X ) . functor (X .nonvar ( X ) . cptVal (i . Y = X . test ( repeter ) : repeter entrer ( X ) jusqua ( X =:= 0). functor (X . X == Y . unifier2 (X . arg (N . ArgX ) . nonOccur (Y . X = Y .var ( X ) . unifier2 (X .var ( X ) .X . write ( ’ la somme des ’) . TD 4. 185 186 187 188 189 190 191 192 193 % entrer /1 entrer ( X ) : repeter ( write ( ’ entrer un nombre entier ( puis . Y ) : . pour i := X downto 1 faire ( recorded ( somme . atomic ( Y ) . unifier2 (X .atomic ( X ) . Y ) : . unifier (X . Y ) : . unifier (X .X . Somme . _ . fail . 20 21 22 23 24 25 26 27 % toutes /3 toutes (X . 28 29 30 31 32 % recuperer /1 recuperer ([ T | Q ]) : retract ( solution ( T )) . Y ).2).recuperer ( L ). L ).N . Terme . N1 .call ( s ( X )) . toutes (X . 9 10 11 12 13 % sall /1 sall ( L ) : . s (2).! . L ) : call ( But ) . functor ( Terme . ArgX ) .X . s (4). N1 is N .7 : Ensemble de solutions 4 37 Listing 4.recuperer ( L ). 6 7 8 % s2 /2 s2 ( X ) : . nieme (N .N1 is N + 1. assert ( solution ( X )) . T \== ’ $fin$ ’ . unifier2 ( ArgX . assert ( solution ( X )) . I1 is I + 1 . N2 ). arg ( I1 . N ) .Y . But . TD 4. Terme . arg (N .X .N . N2 ) . varLiees (X .9 – ensemble de solutions 1 2 % s /1 s (1). N2 ) : nonvar ( Terme ) .N . sall ( L ) : .1 .89 29 30 31 32 33 unifierArguments2 (N . Arg ) .s ( X ) ._ . Terme . . N3 ). But .assert ( solution ( ’ $fin$ ’)) . fail . sall ( L ) : . N1 . nbVars ( Arg . N1 . N ) : . ArgY ) ._ . fail . 3 4 5 % s1 /1 s1 ( X ) : . arg (N . N1 ) : .N . L ) : . 44 45 46 47 48 49 % nbVars /5 nbVars (N . 34 35 36 37 % varLiees /2 varLiees ( ’ $leurre$ ’ .X . Y ). fail . N1 . !. unifierArguments2 ( N1 . Terme .N . dernier (X . N1 . toutes (_ . fail . unif ierArguments2 (0 . N1 ).X . 14 15 16 % sd /1 sd ( X ) : .Y ) : .sn (X . _ ). !. s (5). 17 18 19 % sn /2 sn (X . nbVars ( Terme . N3 ) : I < N . nbVars (I . Y ) : N > 0 . 38 39 40 41 42 43 % nbVars /3 nbVars ( v ( N ) . s (3). _ ) : .assert ( solution ( ’ $fin$ ’)) . nbVars ( I1 .sall ( L ) . L )._ .sall ( L ) . N2 . ArgY ) .var ( Y ) . nbVars (0 . tester ( C ) : . imp ( p ( x ) . q (x . 8 9 10 11 12 % tester /1 tester (( C1 . In4 ) . tout (x . formule (5 . P1 ). imp ( q (x . et ( non ( tout (y . CONTROLE ˆ ´ CORRIGES DE LA RESOLUTION 90 33 34 recuperer ( Q ). f ( y )))))). op (150 . tester ( C1 ) . non P1 ou Q1 ) : . non ( r ( y )))))))). implOut (P . tester ( C2 )). y ) . ou ). tester ( C2 ). tout (x . implOut (Q . P ) . formule (2 . fx . In2 ) . TD 4. imp ( q (x . In5 ) . affirme )) . p ( x ))). nl . eq ). implOut ( tout (X . deduire . vrai ) . []). deduire . tout (x .! . q ( x )))). C2 )) : . imp ( p ( x ) .regle (C . tout (y . formule (3 . formule (4 . P1 ) . imp ) . existe (y . y ) . ou ( imp ( q (x . []) . op (200 . assert ( regle (B . xfy . affirme ). tout (y . tout (x . op (300 .% mise en clauses implications n´ e gations ’ quel que soit ’ ’ et ’ sur ’ ou ’ 21 22 23 24 25 26 % implOut /2 : ´ e limination des implications implOut ( P eq Q . % d´ e placement des skolem ( In2 . C ) .! . In1 ) . non ) . existe (u . % d´ e placement des distrib ( In4 . xfy . imp ( q (x . Out . regle (C .! . xfy . implOut ( P imp Q .10 – chaˆınage avant 1 2 3 4 5 6 7 % deduire /0 deduire : regle (B . xfy . Q1 ). TD 4.op (100 . non ( existe (u . affirmer ( B ) . et ) . Out ) : implOut ( In . % distribution de toClause ( In5 . tout (x .! . 12 13 14 15 16 17 18 19 20 % toClause /2 : mise sous forme clausale toClause ( In . tout (X . imp ( p ( x ) . y ) . implOut (Q .11 – mise sous forme clausale 1 2 : .´ TD 4.op (250 . Q1 ). tester ( C ) . P1 ) .! . ( tester ( C1 ) .! . 3 4 5 6 7 8 9 10 11 % formule /2 formule (1 . In3 .! . P1 )) : . . p ( f ( u )))))) . p ( f ( u ))))) . write ( B ) . y ) . imp ( p ( x ) . implOut (P . % ´ e limination des negIn ( In1 . implOut (P . : . % skol´ e misation toutOut ( In3 . C2 )) : . p ( x ))))))). recuperer ([]).8 : Chaˆınage avant 4 38 Listing 4. 13 14 15 16 17 18 % affirmer /1 affirmer ( B ) : \+ tester ( B ) .9 : Mise sous forme clausale 4 38 Listing 4. tester (( C1 . ( P1 et Q1 ) ou ( non P1 et non Q1 )) : . write ( ’ affirm´ e ’) . ! . P ). Vars ) : . name ( Symbol . P1 ou Q1 . negation (P . Nombre ) . toutOut (Q . P1 ) . P1 ) : toutOut ( P et Q . toutOut (P .! .! . P1 ). P ) . P1 ). Reste is N mod 10 . skolem (Q . negation (P . negIn (P . P ) .! . negIn ( P ou Q . L2 ) .N < 10 . Sb ) . 1) : . implOut (P .91 27 28 29 30 31 implOut ( existe (X . intStr (N . Vars ). Accu . 57 58 59 60 61 62 % genSymbol /2 genSymbol ( Racine . P1 et Q1 . Q1 . P1 )) : .asserta ( ’ $nombre ’( Racine . P1 ) . skolem (P .! .! . Symbol ) : nombre ( Racine . Vars ) : . N is N1 + 1 . P ). P ) . existe (X . L2 . [] . ! . Vars ) . P1 ) . conc ( L1 . ! . skolem (P . implOut (P . negIn ( P et Q .! . negation (Q . 72 73 74 75 76 77 % nombre /2 nombre ( Racine . negation (P . P2 . P1 ) . skolem (P . 48 49 50 51 52 53 54 55 56 % skolem /3 : skol´ e misation skolem ( tout (X . P ) . skolem ( existe (X . skolem ( P et Q . Q1 . : .! . implOut ( P ou Q .! . 63 64 65 % intStr /2 intStr (N . L ). intStr ( Quotient . [ C | Accu ] . Skolem . P1 ) . P1 ). tout (X . P ) . asserta ( ’ $nombre ’( Racine . P ) . P ) . C is Reste + 48 . P . 66 67 68 69 70 71 % intStr /3 intStr (N . P1 . P2 . C is N + 48. P1 ) . negation ( P ou Q . P1 ou Q1 ) toutOut (P . [ C | Accu ]) : . L ).! . toutOut (P . negation ( P et Q . P1 )) : . 32 33 34 35 36 37 38 39 % negIn /2 : d´ e placement des n´ e gations negIn ( non P . N )). Q1 ). P1 ). negIn (P . P1 et Q1 ) toutOut ( P ou Q . non P ). implOut (Q .! .. tout (X . substitute (X . Q1 ). P1 ) .! . P1 ). existe (X . genSymbol ( ’ $f ’ . 78 79 80 81 82 83 % toutOut /2 : d´ e placement toutOut ( tout (X . Vars ) : . L ) .! . 1)). [ X | Vars ]). P1 ) : . negation ( tout (X . [ Sb | Vars ] . name ( Racine . Vars ) . negIn (P . negation (P . Q1 ). _ ). P1 ). Q1 ). Vars ). Q1 ). P1 . P1 et Q1 ) : . Accu . negIn ( existe (X . Q1 ). skolem (P . skolem ( P1 . 40 41 42 43 44 45 46 47 % negation /2 negation ( non P . negIn (Q . implOut (P . P1 ). negIn (Q . Q1 ). toutOut (P . : . des ’ quel que soit ’ ! . P1 et Q1 ) : . L1 ) . implOut (Q .! . L ). intStr ( Nombre . negation (P . P1 et Q1 ) : .! . P1 ) . nombre ( Racine . P . negation (P . P1 ).! . implOut (P . P1 ). negation (Q . P ) . P ). P1 )) : . P1 )) : . Skolem =. toutOut (Q . P1 ) : . Q1 ).! . non P1 ) : . P1 )) : . Vars ).! . negIn ( tout (X . P1 ) . P1 ou Q1 ) : . Vars ) : . P1 . implOut ( non P . negation ( existe (X . P1 ou Q1 ) : . N ) : retract ( ’ $nombre ’( Racine .intStr (N . P1 ) .! . 84 85 % distrib /2 : distribution de ’ et ’ sur ’ ou ’ . P1 ou Q1 ) : . N1 )) . L ) : Quotient is N /10 . negIn (P . L ) : . tout (X . skolem ( P ou Q .! . skolem (Q . existe (X . negIn (P . implOut ( P et Q . implOut (P . negIn (P . putIn (P .! . Neg . Neg1 ) .! . putClause ([ c ( Pos . P1 et Q1 ) : . []) . distrib ( Q ou R . notIn (P . distrib1 (P . [ X ]). Pos1 . toClause (_ . P1 ) . []). Q1 ) . ’) .´ TD 4. fail . distrib (P . . ’) . putConjonction ([ T1 . 121 122 123 124 125 126 127 128 129 130 131 132 133 % putClause /1 : affichage des clauses putClause ([]).write ( T ). R ) : . 134 135 136 137 138 % putDisjonction /1 putDisjonction ([ T ]) : . 102 103 104 105 106 107 108 109 110 % inClause /5 inClause ( P ou Q .! . distrib ( P ou Q . 111 112 113 114 115 % notIn /2 notIn (X .! .3) . notIn (X . [ _ | L ]) : . toClause (Q . 89 90 91 92 93 94 95 % distrib1 /2 distrib1 (( P et Q ) ou R . putClause ( Cs ). C ). putClause ([] . ’) . toClause (P . distrib1 ( P ou ( Q et R ) .! . 96 97 98 99 100 101 % toClause /3 : mise en clauses toClause ( P et Q . T2 | Q ] . tab (3) . Neg )| Cs ]) : . P1 ) . [ Y | L1 ]) : . inClause (P . Pos . [ X | L ] . Pos ). 139 140 141 142 143 144 % putConjonction /2 putConjonction ([ T ] . Neg ) . distrib ( P et Q .! . C2 ). Neg2 . write ( ’. Neg . write ( ’. nl .! . N ) : write ( T1 ) . distrib (P . putConjonction ( Neg . Neg2 ).’) . Pos . L ). Pos ) . distrib1 ( P1 ou Q1 . Neg . toClause (P . inClause ( non P . nl . putDisjonction ( Pos ) . L ) : . Q1 ). P ). distrib (Q .putIn (X . Neg . [ Y | L ] . _ ) : .write ( T ). putIn (X . C3 .! . write ( ’ . 116 117 118 119 120 % putIn /3 putIn (X . []) : . write ( ’. P1 ) . [ X | _ ]) : . Neg1 ) : . C1 .notIn (X . R ). C3 ) . putClause ( Pos . notIn (X . putDisjonction ([ T2 | Q ]). Pos2 .3) . Pos . Cs ) : . Neg1 . ’) . Neg ) . P1 ) . putIn (X . L1 ). Pos1 . write ( ’ : . Neg1 ) : . Q1 ). nl . Pos . distrib ( P ou R . Neg ) : . putConjonction ([ T2 | Q ] . Pos . T2 | Q ]) : write ( T1 ) . putConjonction ( Neg .! .! . Pos1 . P1 et Q1 ) : .’) .putClause ( Pos . Neg ) : putDisjonction ( Pos ) . CONTROLE ˆ ´ CORRIGES DE LA RESOLUTION 92 86 87 88 distrib ( P ou Q . N ). C1 . Neg ). !.!. Pos1 . L . distrib ( P ou R . Q1 ).! . C2 ) : . [] . distrib (P . write ( ’: . inClause (P . inClause (Q . tab ( N ) . Neg )| Cs ] . putClause ( Pos . nl . putIn (P . Neg . putDisjonction ([ T1 . notIn (P . Pos2 . P ). Pos . write ( ’ . C . ’) . Neg ) : . distrib (Q . P1 et Q1 ) : .inClause (P . [] . nl . [ c ( Pos . scanner . morin . livraison ( f2 . paris ).400). grenoble ). pj2 .100).17 .200).400). % etc 21 22 23 24 25 26 27 28 29 30 % livraison /4 : table des livraisons livraison ( f1 . pj1 . pj1 . fournisseur ( f3 . livraison ( f2 . livraison ( f2 . disque . vis . rennes ). paris ). pj4 . vis .300). p4 . p3 . piece ( p4 . livraison ( f4 . vert . piece ( p3 . p3 .600).10 .500). livraison ( f2 . pj3 . piece ( p2 . bleu . % etc 7 8 9 10 11 12 13 % piece /5 : table des pi` e ces d´ e tach´ e es piece ( p1 .14 .1 : De 4 42 1. rouge . rennes ).1 – cr´eation des tables 1 2 3 4 5 6 % fournisseur /4 : table des fournisseurs fournisseur ( f1 .200). projet ( pj4 . pj2 . pj4 . p3 . console . p3 . fournisseur ( f4 . p1 .200). Cr´ eation des tables : les diff´erentes tables de la base « fournisseurs-pi`eces-projets » se traduisent simplement par des faits Prolog. livraison ( f4 . p3 .500).17 . rennes ). % etc 14 15 16 17 18 19 20 % projet /3 : table des projets projet ( pj1 . ecrou . paris ). p3 . dupont .300). chacune des tables sera d’abord cr´e´ee par une requˆete du type : 93 . pj7 . p6 .200). rouge . livraison ( f3 . projet ( pj3 . livraison ( f1 .20 . brest ). p3 . projet ( pj2 . paris ). p6 .700). grenoble ). % etc En sql. pj7 . pj6 . boulon . Listing 5.20 . martin . fournisseur ( f2 .Corrig´ es TD 5 Bases de donn´ ees ´finition des donne ´es TD 5. lecteur .12 .30 . pj5 . albin . livraison ( f2 . rennes ). p3 . brest ).800). pj1 . livraison ( f3 . livraison ( f2 . p1 . p5 . livraison ( f2 . pj3 . livraison ( f2 . pj2 . NOM.table des fournisseurs CREATE TABLE F ( F CHAR(5) NOT NULL UNIQUE. % ´ e viter les doublons !. -.’martin’.N). PJ. NOM CHAR(20).PJ) ).PJ.pjBrest(R. N = console.’rennes’) .projet(R.NATURE) AS false.20. PJ.VILLE) VALUES (’f1’. -.VILLE = ’brest’ .PRIORITE. 5 6 7 8 9 10 affirmer ( Vue ) : \+ Vue . c’est-`a-dire sans existence physique sur le disque.NATURE. PJ CHAR(4) NOT NULL. NATURE CHAR(10).en SQL R = pj4. POIDS DECIMAL(3).brest)). R = pj3. VILLE CHAR(15) ).N.´ TD 5. NOM CHAR(20). QUANTITE DECIMAL(5). Il faut ensuite ins´erer les donn´ees particuli`eres dans chacune des tables : INSERT INTO F (P. But ) : call ( But ) . COULEUR CHAR(6). On obtient de la mˆeme mani`ere les vues fpDistincts/2 et pjF1P1/2 : ?. assertz ( Vue ).dynamic fpDistincts/2. N = lecteur .table des projets CREATE TABLE PJ ( PJ CHAR(6) NOT NULL UNIQUE. affirmer ( _ ). mais qui apparaˆıt ` a l’utilisateur comme une table r´eelle.table des livraisons CREATE TABLE L ( F CHAR(5) NOT NULL.2 – cr´eation de vues 1 2 3 4 % creerVue /2 creerVue ( Vue . -. -. P CHAR(6) NOT NULL. N = lecteur .table des pi` eces d´ etach´ ees CREATE TABLE P ( P CHAR(6) NOT NULL UNIQUE.creerVue(pjBrest(R. Cr´ eation de vues : une vue est une table « virtuelle ». ?. % instantier les arguments de la vue affirmer ( Vue ). Listing 5. true .VILLE On v´erifie que la vue a bien ´et´e cr´e´ee : FROM PJ WHERE PJ.dynamic pjBrest/2.etc 2. BASES DE DONNEES ´ CORRIGES 94 -. SELECT PJ. CREATE VIEW PJBREST (PJ. La vue contenant les informations concernant les projets en cours `a brest est obtenue par l’appel : ?. PRIORITE DECIMAL(4). R = pj4. UNIQUE (F.P. N = console . R = pj3. ?.N). VILLE CHAR(15) ). true. -. VILLE CHAR(15) ). F = f4.PJ. VP = rennes . VP = rennes . D´ etails de chacun des projets . VF = brest. VP = grenoble . VP = rennes ._. F = f5.dynamic pjF1P1/2._.PJ. projet(PJ.95 ?. F = f5. VF = paris.VILLE <> P._. VP = grenoble .P = ’p1’) . VF = brest. VP = rennes . P = p3. V = brest .VILLE FROM PJ. F = f2. VF = rennes. VF = rennes. VF = brest. V = paris . P = p1. P = p2. P = p5. V = paris . VF = paris. F = f4. ?.VF). F = f3._. livraison(_. F = f2. VF = brest. F = f5. VF = paris. P = p5. VP = paris . VF = paris. VP = rennes . F = f2. VP = rennes.VILLE . VF = rennes. P = p2. F = f3. F = f2. VF = rennes. VP = paris . P = p6. ?. PJ = pj1. PJ = pj4._.VP). true. VF = paris. P = p6.P) AS SELECT F. PJ. P = p4. F = f3. VF = brest._.creerVue(fpDistincts(F. VP = rennes .VILLE) AS SELECT DISTINCT PJ. P WHERE F. VP = paris . V = brest . VP = paris .V) ) ). F = f1. F = f4. P = p3. P = p3. F = f5.F. F = f3. VP = rennes . F = f1. VF = brest. VF = paris.p1. PJ = pj4. VP = grenoble .P FROM F. P = p2. VP = grenoble . VP = grenoble . P = p1. VF = paris. L WHERE PJ.PJ = L. PJ = pj1. F = f1. En sql.PJ AND (L.P). les cr´eations des vues correspondantes peuvent s’´ecrire : CREATE VIEW FPDISTINCTS (F. VP = paris . P = p4. ˆtes simples TD 5. VP = paris .2 : Reque 4 43 1. VF = rennes. PJ = pj4. CREATE VIEW PFF1P1 (PJ. ( (livraison(f1. P = p3. P = p3._. P = p6._) .PJ. VP = rennes . VF = paris. P = p1.creerVue(pjF1P1(PJ._)). (fournisseur(F. false.F = ’f1’ OR L. piece(P. VF = rennes. P = p4. V = brest .V). F = f5. P. F = f5. P = p5. VF\==VP) ). 3 – jointures (1) 1 2 3 4 5 jointure1 (F . PJ = pj7.projet) tels que le fournisseur. 111. 101. = pj3. N = console. nth1(4._ .PJ.pj1. Triplets (fournisseur.P. F = f2 .N. fournisseur (F . BETWEEN 600 AND 750 . N = terminal. N = lecteur. D´ etails des projets rennais ?. 101] . 4.en SQL SELECT L. L. V = rennes.F . 115] . N = bande.PJ = ’pj1’ ORDER BY L.livraison(F._ . grenoble ._ . brest . rennes .QUANTITE false. -. WHERE L.P . Livraisons dont la quantit´ e est comprise entre 600 et 750 ?. N = bande. L = [103.L).3 : Jointures 4 43 1.V). F = f3 . Q >= 600. PJ. Q =< 750.en SQL SELECT PJ.livraison(F. N = disque.VILLE FROM PJ WHERE PJ.QUANTITE F = f1. = pj4. 98.piece.NATURE. V = rennes. N = scanner. 108. -.NATURE.F._. PJ. PJ. V = grenoble. name(V. Projets qui se d´ eroulent dans une ville dont la quatri` eme lettre est un n ?PJ PJ PJ projet(PJ. PJ = pj5. P = p1.en SQL SELECT PJ.VILLE = ’rennes’ . L = [114. false.PJ. . L. 3.F FROM L WHERE L. brest .N.V). 110. = pj1. -.projet(PJ.P . L. V ) . 110._. 110. PJ.110). 115]. bordeaux . P = p3. BASES DE DONNEES ´ CORRIGES 96 ?PJ PJ PJ PJ PJ PJ PJ projet(PJ. F = f1 .VILLE FROM PJ .rennes).PJ. FROM L F = f2. Q = 700 .Q). 114.en SQL SELECT PJ. PJ . V V V V V V V = = = = = = = paris . 110.VILLE LIKE ’___n%’ . 101. PJ = pj4.en SQL SELECT DISTINCT L. 101. = pj7. N = capteur .L. piece (P . = pj5.VILLE FROM PJ WHERE PJ. R´ ef´ erences des fournisseurs du projet pj1 ?. 5. = pj5. = pj2. 101. -. L = [114._ . 101. PJ ) : livraison (F . = pj7. rennes. projet ( PJ .P. TD 5.PJ. la piece et le projet soient situ´ es dans la mˆ eme ville : Listing 5. -. 110.´ TD 5._ . PJ. = pj2. Q = 600 . V ). PJ = pj5. V ) . = pj6. _ ) . 2.PJ. N = capteur._ ._). 3. 2.P . _ ) .F. fail . fournisseur (F .en SQL SELECT F.P. ?.projet) tels qu’un des ´ el´ ements ne soit pas situ´ e dans la mˆ eme ville que les deux autres : Listing 5.jointure2(F. -. P = p5.VILLE <> PJ.5 – jointures (3) 1 2 3 4 5 6 7 8 jointure3 (F . PJ = pj3 F = f2._ . F = f5.._ .piece.VILLE AND P. . V2 ) .PJ). P._ . F = f5. fournisseur (F .. fournisseur (F .PJ FROM F.PJ FROM F.VILLE = PJ.jointure1(F. V1 \== V3 . F = f5. _ ) . PJ . piece (P .F. _ ) . PJ = pj4 . PJ.en SQL SELECT F.4 – jointures (2) 1 2 3 4 5 6 jointure2 (F .VILLE <> P. . V2 \== V3 .VILLE) .P. PJ = pj4 .P ._ .VILLE AND F. \+ ( V1 == V2 .97 ?._ . Triplets (fournisseur..projet) tels que les trois ´ el´ ements soient situ´ es dans des villes diff´ erentes : Listing 5. -.P. PJ = pj1 .VILLE . PJ = pj4 . P = p6.PJ).PJ FROM F._ . jointure4 ( P ) : retract ( ’ d´ e j` a vu ’( P ))._ . P = p6. PJ = pj7 . P = p5. PJ = pj4. J WHERE NOT ( F.P . affirmer ( ’ d´ e j` a vu ’( P )) . V1 ) ._ . P = p6. -. P. PJ = pj7 F = f5. P = p1. P. F = f1.6 – jointures (4) 1 2 3 4 5 6 7 jointure4 ( P ) : livraison (F . P = p1.jointure3(F. R´ ef´ erences des pi` eces provenant d’un fournisseur rennais : Listing 5. J WHERE F.piece._ . .P . V3 ) .VILLE ._ .VILLE <> PJ. P. J WHERE F._ . rennes ) . V3 ) .P. false.en SQL SELECT F.P.PJ).F.._ ._ . PJ. F = f2. V2 == V3 ). projet ( PJ . V1 ) . .VILLE AND P. F = f4. P = p3.P. .VILLE AND P._ . V2 ) . ?.VILLE = P.VILLE = PJ. PJ . F = f1._ . Triplets (fournisseur. . P. PJ = pj2 false. V1 \== V2 . P = p3.VILLE = P. piece (P . 4. PJ ) : livraison (F . PJ ) : livraison (F . PJ. projet ( PJ . P.P . P WHERE PJ. _ ) ._ . true.PJ ._ . rennes ) .F = F. F.F AND F. F. PJ = pj7. affirmer ( ’ d´ e j` a vu ’( PJ )) .F = F. PJ = pj2 .´ TD 5. VF ) .jointure4(P). fail . _ ) .VILLE = ’rennes’ .jointure5(P). R´ ef´ erences des pi` eces provenant d’un fournisseur rennais. PJ .en SQL SELECT DISTINCT L.dynamic ’d´ ej` a vu’/1.8 – jointures (6) 1 2 3 4 5 6 7 8 9 jointure6 ( PJ ) : projet ( PJ .PJ = PJ. V \== VF .4 : Unions 4 43 . PJ = pj4 .F AND L._ .P = P. ?.en SQL SELECT DISTINCT L. PJ = pj3 . P = p6.P .dynamic ’d´ ej` a vu’/1.VILLE = ’rennes’ . -. 6. et destin´ ees ` a un projet rennais : Listing 5.P FROM L.V <> F.dynamic ’d´ ej` a vu’/1. P = p1 ._ . livraison (F . true.en SQL SELECT DISTINCT PJ. ?. projet ( PJ . fail .VILLE = ’rennes’ AND F._ . true.7 – jointures (5) 1 2 3 4 5 6 7 8 jointure5 ( P ) : livraison (F .F AND PJ. PJ = pj6 . fournisseur (F . ?. fournisseur (F . -. -.jointure6(PJ). ?. jointure6 ( PJ ) : retract ( ’ d´ e j` a vu ’( PJ )). rennes ) . BASES DE DONNEES ´ CORRIGES 98 ?. ?.V AND L. 5. P = p6. PJ = pj1 . V ) ._ . PJ .F = F. WHERE PJ. Num´ eros des projets dont au moins un des fournisseurs ne se trouve pas dans la mˆ eme ville que celle o` u se d´ eroule le projet : Listing 5. F. affirmer ( ’ d´ e j` a vu ’( P )) . PJ WHERE PJ.PJ FROM L. PJ = pj5 .P AND P._ . TD 5. jointure5 ( P ) : retract ( ’ d´ e j` a vu ’( P )).P FROM L. 10 – union (2) 1 2 3 4 5 6 union2 ( C ) : piece (_ .100. ?. ?. VALUES (’f10’.F .99 1. N ) .VILLE) true.9 – union (1) 1 2 3 4 5 6 union1 ( V ) : ( fournisseur (_ . functor ( Nouveau . true. 2.5 : Mises a 4 43 1. C = rouge . V ). V = bordeaux. V )) . V ). Listing 5. ?. union1 ( V ) : retract ( ’ d´ e j` a vu ’( V )). V = brest . Nouveau ) : functor ( Ancien .’ibm’.NOM.VILLE FROM P UNION SELECT J. N ) ._ .dynamic ’d´ ej` a vu’/1. V = rennes .11 – mises `a jour (1) 1 2 3 4 modifier ( Ancien . -. clause ( Ancien . 2.’lyon’) ._ ._ .dynamic ’d´ ej` a vu’/1.COULEUR FROM P .100. true. affirmer ( ’ d´ e j` a vu ’( C )) . projet (_ .assert(fournisseur(f10._ . affirmer ( ’ d´ e j` a vu ’( V )) . true . fail .VILLE FROM J ORDER BY 1 . piece (_ .en SQL INSERT INTO F (P.COULEUR FROM P UNION SELECT P. -.en SQL SELECT P.union2(C). Villes dans lesquelles sont localis´ es au moins un fournisseur.ibm. C = vert . V = paris ._ .F . ?. union2 ( C ) : retract ( ’ d´ e j` a vu ’( C )).en SQL SELECT F. une pi` ece ou un projet Listing 5._ .PRIORITE. V = grenoble . ` jour TD 5. Couleurs de pi` eces Listing 5.lyon)). C = bleu. -. . RefAncien ) .VILLE FROM F UNION SELECT P._ . Introduction d’un nouveau fournisseur : l’insertion d’un nouveau fournisseur se fait simplement ` a l’aide du pr´edicat assert/1.union1(V).C . ?. fail . _ ) ._ . Changer la couleur rouge en orange : le pr´edicat modifier/2 permet de modifier un fait de la base de donn´ees. N ._._ . Listing 5.orange). . Q1 is (1+ Taux )* Q ._. PJ . P = p6.modifCouleurPiece(rouge. Pds . ?. Q1 )) .P .en SQL UPDATE P SET COULEUR = ’orange’ WHERE P. !. ?. V ) . 3. _ )._.12 – mises `a jour (2) 1 2 3 4 5 6 7 modifCouleurPiece ( Couleur1 . Q ) . _ ). P = p1 .13 – mises `a jour (3) 1 2 3 4 5 6 7 modifQuantite ( Couleur ._). Le taux d’augmentation sera ´ecrit sous la forme d’un r´eel (exemple : 10% → 0. V ) .N . modifQuantite (_ . BASES DE DONNEES ´ CORRIGES 100 5 6 7 erase ( RefAncien ) .´ TD 5._._). _ ) ._). projet/3._ . false. on utilisera le pr´edicat modifier/2 pour augmenter les livraisons. ?. Couleur2 ) : Couleur1 \== Couleur2 . modifCouleurPiece (_ . Pds . piece (P .piece(P.1). modifier ( piece (P . Q ) ._. assert ( Nouveau ) .N . V )) . PJ .dynamic [fournisseur/4. fail .COULEUR = ’rouge’ . piece/5.rouge. La modification d’une couleur de pi`ece utilise alors le pr´edicat modifier/2 pr´ec´edent.P .piece(P. Couleur . piece (P .piece(P. PJ . modifier ( livraison (F .orange. Couleur2 . P = p4 . Couleur1 . En SWI-Prolog. livraison/4].P . -. true.rouge. P = p4 . P = p6. Pds . Augmenter les livraisons pour les pi` eces d´ etach´ ees oranges : ici encore. livraison (F . les faits ` a modifier doivent avoir ´et´e d´eclar´es dynamiques au pr´ealable : :._. fail . Listing 5. Taux ) : piece (P . Couleur1 . P = p1 . ?. livraison (F . Q = 220. fail . ?.14 – mises `a jour (4) 1 2 3 4 5 6 7 8 9 modifPriorite (F . . retract ( livraison (_ .P. F = f5.0 ._.Q)._). 5. -. P = p6._. modifier ( fournisseur ( F1 . Modifier la priorit´ e de fournisseurs : de la mˆeme mani`ere que dans les deux pr´ec´edents pr´edicats. F = f1._._. P = p1. F1 = f2.. F = f1. Supprimer les projets se d´ eroulant ` a Grenoble Listing 5. F = f1. F = f5.0._). F = f1. P = p1.on suppose que la requ^ ete -. false.0 . V1 )) .modifPriorite(f4.P. P = p1. Q = 200 .15 – suppression 1 2 3 4 5 supprimerProjet ( Ville ) : retract ( projet ( PJ .. _ ) . F = f5._.1). N1 . PJ . ?. P = p1. _ ). Q = 700 . fournisseur ( F1 . N1 . Listing 5. Ville )) . Q = 550.P2. true. P1 . Delta ) : fournisseur (F .fournisseur(f4._. P1 = 10 . P1 .P .PRIORITE < 20 . _ ) .0.P4. P4 = 20. P2 . Q = 110. . true._ ._._. P2 = 20._ . _ )) . livraison(F. P1 < P . -.modifQuantite(orange. fournisseur(F1.orange._). P = p1.PRIORITE + 10 WHERE F. Q = 100 . P = p6._). V1 ) . P1 < P4. ?.PRIORITE FROM F WHERE F.P1.. P2 is P1 + Delta .101 ?- piece(P. modifPriorite (_ .F = ’f4’ ._ .en SQL SELECT F. . on utilise le pr´edicat modifier/2 pour changer la priorit´e d’un fournisseur._). supprimerProjet ( _ ). Q = 500.fournisseur(f2. F = f5._ .piece(P..Q). ?. -.orange.10). fournisseur ( F1 .en SQL 4._.0 . P = p1. fail . ?. livraison(F.pr´ ec´ edente donne 20 UPDATE F SET PRIORITE = F. Q = 770. ?. BASES DE DONNEES ´ CORRIGES 102 ?._.pj2. false.PJ = L.´ TD 5.en SQL DELETE FROM L WHERE ’grenoble’ = ( SELECT PJ.VILLE FROM PJ WHERE PJ.VILLE = ’grenoble’ .grenoble).supprimerProjet(grenoble)._). false._.PJ ). ?. false. PJ = pj2 . ?. . DELETE FROM PJ WHERE PJ. true. -.projet(pj2.livraison(_._)._.projet(PJ. route (s .a . K ). 4 5 6 7 % estim /3 estim (a .Corrig´ es TD 6 Recherche dans les graphes ´seau routier TD 6. 8.12. KDS ) . P ) . K ).g .C . N ) .4). 103 .10.g . KP1 .f . estim (e . 8 9 10 % successeur /3 successeur ( V1 . route (d .9). Listing 6. N ) : .A .5). estim (d . K ) : successeur (D . estim (s .6.g .0).4. estim (f . route (f . estim (g .5).C . route (a .C .[ D ] .0 .g . route (a .4).4). estim (c .S .K .A .2 – recherche simple 1 2 % chemin /4 chemin (D .1 : Re 4 45 a • s• 4 •b 4 c • 3 5 @4 @•d •g 5 3 2 •e 4 • f s •XXX   a •H • c HH  b Hd • • @ @e • •e @ @ @•f b @•f • • • c d • • g c (19) • g (17) XXX XXd •H  HH a He • • @ b @•f • •b @ @ @e @• • • • a •f c g (13) • (25) g Listing 6. route (b .0).4). 3 4 5 6 7 8 % chemin /5 chemin (A .[ S | P ] .P .A .g .g . estim (b . chemin (S .C .g .e . route ( V1 .e .3).2). V1 . 6.7).g .chemin (D .3). route (e .C . K ).d .3.route ( V2 .g .0. N ).9). K ) : . route (b .0). chemin (D .c .C .1 – r´eseau routier 1 2 3 % route /3 route (s .5). KP1 is KP + KDS .4). KP .A .b . V2 . V2 .d .A . \+ dans (S . Cout ) : - . Cout ).[ A | Passe ] .(0 .K -K -[ D | Passe ] . PilFil . C1 ) . vider ( E1 . Cout ). 26 27 28 profondeur1 (D . V2 ) .V2 . 9 10 11 12 13 14 15 16 17 18 % rechercher /5 rechercher ( profondeur . E2 ) . R1 is C1 transvaser (( V1 .F .F . V1 = < R2 . Cout ).A . W1 is V1 + V2 . V2 =\= C2 . 7 8 9 10 % vider /1 vider (( V1 . Chemin .[ A | Passe ] . 21 22 23 % successeur /3 successeur ( E1 . Suivants ) . W2 )) : capacite (1 . Chemin .0)) : capacite (1 .4 – recherche avanc´ee 1 2 3 4 % chemin /5 chemin ( Methode .V2 .I . PilFil ) . profondeur ([ K -K -[ D | Passe ]| Reste ] .remplir ( E1 .I .F .A . Chemin . E2 ). PilFil . Cout ) : heuristique ( PilFil . R2 is C2 transvaser (( V1 . Chemin .V1 . Cout ) : successeurs ( profondeur .A . C2 ) .R1 . Pile1 ) . K ). V2 > R1 . V2 ) . Cout ) : profondeur ( PilFil . K ). transvaser ( E1 . conc ( Suivants . E ). PilFil . C1 ) .( V1 .F . rechercher ( largeur . rechercher ( Methode . V2 ) .[ E -0 -[ I ]]) : . W2 is V2 . C2 )) : capacite (2 .A . Chemin .0)) : . . C2 ) .! . RECHERCHE DANS LES GRAPHES CORRIGES Listing 6.F . W2 )) : capacite (2 . Cout ). V2 ) . Chemin .104 ´ TD 6. . Chemin . 29 30 31 32 % largeur /4 largeur ([ K -K -[ A | Passe ]| _ ] .( W1 . Chemin . V2 )) : .A ._ .A .(0 .A . Chemin . 3 4 5 6 % remplir /1 remplir (( V1 . R2 is C2 transvaser (( V1 ..V2 =\= 0..V1 =\= 0. Chemin .empiler profondeur ( Pile1 .. Chemin .( V1 . remplir (( V1 . Chemin . C1 ) .F . PilFil .R2 . C2 ) . Chemin . Cout ). 5 6 7 8 % initialiser /4 initialiser ( heuristique .F . W1 is V1 . V2 ) .[0 -[ I ]]).V1 . V2 )) : . Cout ) : profondeur ([0 -0 -[ D ]] .( C1 . Cout ) : largeur ( PilFil .F .capacite (1 . Cout ). V2 ) . 19 20 21 22 23 24 25 % profondeur /4 profondeur ([ K -K -[ A | Passe ]| _ ] . R1 is C1 . Cout ). largeur ([ K -K -[ D | Passe ]| Reste ] . Listing 6.F . capacite (2 . V1 > R2 . 11 12 13 14 15 16 17 18 19 20 % transvaser /2 transvaser (( V1 .. vider (( V1 . rechercher ( heuristique .F . Chemin ..8). V2 = < R1 .3 – transvasements 1 2 % capacite /2 capacite (1 . PilFil . C2 )) : . E2 .F . V2 ) .1) : . .A . Chemin . E2 ) . Cout ) : initialiser ( Methode .I .F .. Reste . initialiser (_ . W2 is V1 + V2 . Cout ) : meilleur ( PilFil . % . rechercher ( meilleur .capacite (2 .( W1 .F . V1 =\= C1 .I .5). estim (I .( C1 . V2 ) . \+ dans (S ... % .. meilleur ([ K -K -[ D | Passe ]| Reste ] ..K -K -[ D | Passe ] . % . Chemin . Chemin . Dˆıner des philosophes chinois t12 b2 p11 p12 b1 t11 p22 t22 p41 t21 t41 p21 t42 p42 t31 b3 p32 p31 t32 b4 . Cout ) : successeurs ( meilleur . E1 is KP1 + ESA ) . Cout ) : successeurs ( heuristique .. KDS ) .[ D | Passe ]) . KP1 is KP + KDS )...A .. % .A . Suivants ) ..A . Suivants ) : findall ( KP1 . Chemin . Cout ). ( successeur (D .[ D | Passe ]) . heuristique ([ EDA -0 -[ D ]] .. KDS ) . FileTriee ) . conc ( Reste . Suivants ).._ . Cout ). Cout )... D | Passe ] .KP1 -[ S . 36 37 38 largeur1 (D .A . 47 48 49 meilleur1 (D .A . Cout ) : meilleur ([0 -0 -[ D ]] .enfiler sort ( File1 .. ( successeur (D .enfiler largeur ( File1 .2 : Re 4 48 1. FileTriee ) ._ .enfiler sort ( File1 .. Chemin . ESA ) . K )..[ A | Passe ] .. Suivants . Suivants ) : ..A ..KP -[ D | Passe ] ..A .A ..E -K -[ D | Passe ] .trier heuristique ( FileTriee .S . Cout ) : estim (D . Chemin . File1 ) .. Suivants ) . ´seaux de petri TD 6.A . % . % . \+ dans (S . Cout ) : largeur ([0 -0 -[ D ]] .. conc ( Reste ..! ...A . estim (S . File1 ) .. 39 40 41 42 43 44 45 46 % meilleur /4 meilleur ([ K -K -[ A | Passe ]| _ ] .A . Chemin .A .A . Cout ). Suivants ).. KP .A .. Chemin ..trier meilleur ( FileTriee .. findall ( E1 .A .105 33 34 35 successeurs ( largeur . Chemin . File1 ) . Suivants . 62 63 64 65 66 67 68 69 70 71 72 73 74 75 % successeurs /4 successeurs ( heuristique .KP1 -[ S . EDA ) .S ...A .A .A . Chemin . 50 51 52 53 54 55 56 57 % heuristique /4 heuristique ([ E -K -[ A | Passe ]| _ ] . KP1 is KP + KDS .KP -[ D | Passe ] . K )..K -K -[ D | Passe ] . heuristique ([ E -K -[ D | Passe ]| Reste ] . Cout ). Suivants ) ... Chemin .[ A | Passe ] . conc ( Reste .. Suivants . successeurs (_ . Cout )... 58 59 60 61 heuristique1 (D .A ... D | Passe ] . Chemin .. T ) . simulRdp ( continue ) : . 37 38 39 40 41 42 43 % putState /0 putState : marquage (P . write ( Ts ) . nl . simulRdp ( Suite ). _ ). I ) : retract ( marquage (P .transition (T . !. 28 29 30 31 32 33 34 35 36 % putRdp /3 putRdp ( Ts . write ( ’ Transition choisie : ’) . tir ( T ) . nl . maj ([ P | Ps ] . nl . stopSimul ( In . Amont . RECHERCHE DANS LES GRAPHES CORRIGES 106 2. I ).T . Aval ) . ! . putRdp ( Ts . write ( ’ Etat du systeme : ’) .setof (T . tab (2) . M )) .transition (T . preCond ( Ps ). nl . write ( T ) . valid ( T ) . continue ( Suite ). tab (2) .dynamic germeAlea /1. stopSimul (_ . maj ( Ps . tab (4) . maj ( Amont . 8 9 10 % valids /1 valids ( Ts ) : . 52 53 : . 11 12 13 % valid /1 valid ( T ) : . 44 45 46 47 % continue /2 continue ( Suite ) : write ( ’ Continue ( y / n ) ? ’) . place (P .´ TD 6. continue ) : . write ( ’ !!! deadlock !!! ’ ). Suite ) . Stop ). _ ) . read ( In ) . preCond ( Amont ). State ) . N > 0 . M1 )) . aleaList ( Ts . write ( ’ Transitions valides : ’) . 54 55 56 % alea /1 alea ( X ) : - . 21 22 23 24 25 26 27 % maj /2 maj ([] . write ( State ) . 1). assert ( marquage (P . -1) . maj ( Aval . 14 15 16 17 % preCond /1 preCond ([]).nl . fail . N ) . M1 is M + I .5 – r´eseaux de Petri 1 2 3 4 5 6 7 % simulRdp /1 simulRdp ( stop ) : .T . 48 49 50 51 % stopSimul /2 stopSimul (y . Suite ) : nl . putState : . Simulateur de r´ eseaux de petri Listing 6. tab (2) . stop ). simulRdp ( continue ) : valids ( Ts ) . Ts ). N ) .!. 18 19 20 % tir /1 tir ( T ) : . preCond ([ P | Ps ]) : .marquage (P . putState . Amont .!.nl . N > 0 . assert ( germeAlea ( C )). L ) ._ . : . X2 is ( X1 *824) mod 10657 .S .alea ( Y ) .abolish ( germeAlea /1) . nieme (X . alea (N ._ . L ).longueur (N .0 . ._ ._ . 64 65 66 % aleaList /2 aleaList (L ._ . stamp_date_time (T .T . X is floor ( N * Y ) + 1. assert ( germeAlea ( X2 )) . T ) : .0) . date (_ . _ ) . X ) : . get_time ( T ) . X is X2 /10657. X ) . ! . C is floor ( S *10000) . 61 62 63 % alea /2 alea (N .107 57 58 59 60 retract ( germeAlea ( X1 )) . 67 68 69 70 71 72 73 : ._ .use_module ( library ( date )). 108 ´ TD 6. RECHERCHE DANS LES GRAPHES CORRIGES . Troisi` eme partie Annexes 109 . . . . . . . . . . . . .3 2. .9 3. . . . . . . . . . . . . . . . . . . . . . . . . . Traitements g´en´eriques . . . . . . . . . . . . Les mutants . . . . . . . . . . . . . . . . . . . . . . . .6 1. . . . . . . . . . . . . . . . . . .8 3. . . . . . . . . . .Liste des exercices 1. . . . . . Formes clausales . . . . . . . . . . . . . . . . . . . . . . . . . . . Gestion d’un compteur . . . . . . . . . . . . . . . . . . . . . . . . . . . . Informations sur les listes . . . . . . . . . . . . . . . . . . . . . . . . . . .4 2. . Listes et arithm´etique . .12 3. . . . . . . . . . . . . . . . . . . .7 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Etat-civil . . . . . .7 3. . . . . . . . . . . . . . . . . . . . . . . Repr´esentations de listes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 1. . . . . . . . . . . . . . . . . . . . . . Arbres et dictionnaires binaires Termes de base . Arithm´etique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 2. . . . . . . . . Un petit r´eseau routier . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13 4. . . . . . . . . . . 9 9 10 10 11 12 12 13 15 15 16 16 17 17 18 19 19 21 25 25 27 27 28 29 30 30 31 31 33 33 33 34 35 36 37 38 38 42 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Polynˆomes . . . . . . . . . . . . . . . . . . . . . . . . . . . . Une base de donn´ees Air-Enib . . . . .5 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7 4. . . . . . . . . . . . . . . . . . . . . .11 3. . .1 1. . . . . . . . . . . . . . . . . . .1 3. .5 1. . . . . . . . . . . . .7 1. . . .6 3. . . . . . . . . . . . . . . . . . . . . . .5 2. .6 2. . . . . . . . . Structures de contrˆ ole . .6 4. . . . . . . . . . . . .4 3. .1 2. . . . . . . . . .8 4. . . . . . . . . . . . Manipulation de listes . .2 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Le compte est bon . . . . . . . . . . . .2 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Du mot aux syllabes . . . . . . .1 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8 2. . . . . . . . . . . . . . . Ensembles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Coloriage d’une carte . . . . . . . . . . . .4 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Alg`ebre de Boole . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 3. . Mise sous forme clausale . . . . . . . . . . Unification . . . . Entiers naturels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 . . . . . . . . Des relations aux pr´edicats . . . . . . . . .10 3. . . . . . . . . Mots crois´es . . . . Op´erateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Piles et files . . Tris de listes . . . Probl`eme des n reines . . . . . . . . . . . . . . . . . . .2 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 4. . . . . . Puzzle logique . . . . Casse-tˆete cryptarithm´etique . . . . . . . . . . . . .9 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . D´efinition des donn´ees . . . . . . . . . . . . . . . . . . . . . Ensemble de solutions . Chaˆınage avant . . . . . . .5 3. . . . . . . . . . . Arbre g´en´ealogique . . .4 1. . . . .1 Puzzle logique . . . . . . . . . . . . . . . . . . . . . . . . . D´erivation symbolique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 43 43 43 45 48 . . . . . . . . . .2 Requˆetes simples Jointures . . . . . . . . . . . R´eseau routier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4 5. . . . . . .112 5. . . . . . . . . . Mises `a jour . . . . . . . . .1 6. . . . . . . . . .3 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 5. . . . . . . . . . . . . . . . . . .5 6. . . . . R´eseaux de petri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Unions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . « le compte est bon » . . . . . . . . . . . .4 1. .5 1. . . . . . . . . . . . . . . . .5 3. . . . . . . gestion d’un menu . . . . . . . . . . . . . . . . . . . .3 3. . . . . . . . . . . . . . . . . . . . fonctions math´ematiques . . . . . . . . . . . . . . . 113 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . d´erivation symbolique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c´esure de mots . . mutants . . . . . . . . . . . . . . . . . . . .3 4. . .7 2. .1 3. .10 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10 3. . . . . . . . . . . . . . . . . . . . . . . . . ensembles . . . . . . . . . . . . . . .9 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . circuits logiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6 4. . . . . . . . . . . . . . . . listes (2) . . . . . . . . . dictionnaires binaires . . . . . . . . . . . . . . . . . . . . unification . . . . . . nombres complexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4 3. . . .2 2. . . . . . . . . . . . . . . . . . . . . . .6 2. . . . . . .5 2. . . . . . .7 4. . . . . . . . . . . . . fiches d’´etat-civil . . . . . . . . . . . . . . .8 2. . .1 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 1. . . . . . . . . . . . . . . . . . . . . . . . .1 1. . . . . . . . . . . . . . . . . . . . . . listes (1) . . . . . . . . . . . . . . . . . . .7 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . mots crois´es . . . . . . 57 57 57 58 59 59 60 61 63 63 64 64 65 65 65 66 66 67 69 71 72 74 75 76 76 77 78 79 79 79 81 81 81 82 84 84 85 88 . . . . . . . . . . . . . .6 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9 3. . . . . . . . . . . . . . . . . . . . . . . . .Listings 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . listes et arithm´etique . . . . . . . . . . .5 4. . . . . . . . . . . . . tris de listes . . . . . . . . . . .2 3. . . . . . . . . . polynˆ omes . . . . . . . . structures de contrˆ ole . . . . traitements g´en´eriques . . . . .12 4. . . . . . . .1 2. . . . . . . . . . . . . . . . . . . . . . . termes de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . entiers naturels . . . . . . . . . . . . . . . . . . . . . vols Air-Enib . . . . . . . . casse-tˆetes cryptarithm´etiques probl`eme des n reines . puzzle logique . . . . . . . .11 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . gestion d’un compteur . . . . . . . . . villes voisines . . . . . . . . . . g´en´ealogie . . . . . . . . . . .7 1.8 3. . . . . intervalles . . . . . . . . . . . . . . . . . . . . . . . . . arbres binaires .8 2. . .3 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . op´erateurs logiques . . . . . . op´erateurs d´eriv´es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8 des relations aux pr´edicats . . . . . . exemples de menus . .4 2. . . . .4 4. . . . . . . . . . . . . . suites r´ecurrentes . . . . . . . . . . . . . . . . coloriage d’une carte . .2 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . piles et files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . jointures (6) . . . . . . . . . . . . . . . . . . . .3 5. . . . . . . . . . . . . . . transvasements . . suppression . . . . . . . . . . .13 5. . . . . . . . . . . . . . . . . . . . . . . . . . .6 5. . .3 6. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . jointures (3) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9 5. .4 6. . .9 4.2 6. . . . . . . . . . . . . . . . . . . . . mises ` a jour (2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11 5. . . . . . . jointures (4) . . . . . . .14 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . cr´eation de vues . . . . . . . . chaˆınage avant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . r´eseau routier . . . . . . . . . . . . .15 6. . .11 5. . . . . . . . . . . . . . . . . . . . . . . . jointures (5) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12 5. .5 ensemble de solutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . mise sous forme clausale cr´eation des tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . mises ` a jour (4) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . jointures (1) . .1 5. . . . . . mises ` a jour (3) . . . . . . . . . . . . . . . . . . . .5 5. . . . 89 90 90 93 94 96 97 97 97 98 98 99 99 99 100 100 101 101 103 103 104 104 106 . . . . . . . . . . . . . . . . . . . . union (2) . . . . . . recherche avanc´ee . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . mises ` a jour (1) . . . . . . . . . .10 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4 5. .2 5. . . . . . .114 LISTINGS 4. . . . . . .8 5. . . . . . . . . . . . . . . . recherche simple . . . . . . . . .7 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . jointures (2) . . . . . . . . . union (1) . . . .1 6. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10 5. . . r´eseaux de Petri . . . . . . . . . . Programming in Prolog : using the ISO standard. 1996 [7] O’Keefe R.A.. 1991 [2] Blackburn P. Prolog programming for artificial intelligence... MIT Press.. Ed-Dbali A. 1988 [6] Deransart P. Masson. Prolog : the standard. MIT Press.W.. How to learn..org)..C. L’art de Prolog. Warren’ s abstract machine : a tutorial reconstruction. Prolog. (free online version : http://www. Springer. 1990 [8] Sterling L... Cahiers de Logique et d’Epist´emologie. The craft of Prolog. Springer.learnprolognow.. 1990 115 . Mellish C. 2003 [5] Coello H. tout de suite !. Springer.S. Bos J... Prolog by example. Addison Wesley.. teach and use it.. Striegnitz K. 2007 [3] Bratko I. Cervoni L. College Publications. Cotta J.Bibliographie [1] Ait Kaci H. Shapiro E. 2000 [4] Clocksin F.
Copyright © 2024 DOKUMEN.SITE Inc.