Paradigme de Programmation II.
Transcription
Paradigme de Programmation II.
Paradigme de Programmation II. H. Toussaint [email protected] Septembre 2008 1 Premiers problèmes. Exercice 1.1 Traduire en formules prédicatives les énoncés suivants : - un chien est un animal, donc une tête de chien est une tête d’animal ; - qui vole un œuf vole un bœuf ; - qui a bu boira ; - le plus rapide des athlètes a gagné ; - a chaque injonction d’un agent, un conducteur doit montrer ses papiers. Exercice 1.2 Traduire sous forme de clauses de Horn le système de connaissances suivant : - une table est un meuble rigide, posé sur quatre pieds et coiffé d’un longue planche ; - un fauteuil est un meuble ayant quatre pieds ainsi qu’un dossier ; - une armoire est un meuble rigide ayant des portes, des planches ainsi que des vitres ; - un meuble rigide est un meuble en bois ou un meuble en acier. Grâce à ce système formel, qualifier l’espèce à laquelle appartient le meuble M , étant donné que M est en bois, qu’il a des portes, des planches, des vitres et qu’il est de couleur verte. A cet effet, mettre en évidence les règles, les faits, les questions et utiliser la résolution SLD. Exercice 1.3 Traduire sous forme de clauses de Horn le système de reconnaissance de véhicules suivant : - un avion de chasse est un véhicule automobile monoplace ayant des ailes, un nez pointu et armé de bombes ; - un char est un véhicule automobile quadriplace, ayant des chenilles et armé d’un canon ; - une moto est un véhicule automobile biplace ayant deux roues et un guidon ; - un véhicule automobile est un véhicule ayant pour combustible du kérosène, ou du diesel, ou de l’essence. Grâce à ce système formel, qualifier l’espèce de véhicule à laquelle appartient toto étant donné que toto a pour combustible de l’essence, qu’il est de couleur rouge, qu’il est biplace, qu’il a deux roues et un guidon. A cet effet, mettre en évidence les règles, les faits et les questions. 2 Termes, substitutions, unification. 2.1 Rappels. Etant donnés un ensemble de variables Var et un ensemble de fonctions F, l’ensemble T erm des termes est défini inductivement comme suit : 1. les variables sont des termes, 2. les constantes sont des termes, 3. si f /n ∈ F et si t1 , . . . , tn sont des termes, alors f (t1 , . . . , tn ) est un terme. Un atome est une expression de la forme p(t1 , . . . , tn ) ou p est un prédicat d’arité n et t1 , . . . , tn sont des termes. Une substitution est un ensemble de la forme σ = {X1 /t1 , . . . , Xn /tn } tel que - ∀i ∈ {1, . . . , n} Xi ∈ Var - ∀i ∈ {1, . . . , n} ti ∈ T erm - ∀i, j ∈ {1, . . . , n} i 6= j ⇒ Xi 6= Xj - ∀i ∈ {1, . . . , n} Xi 6= ti n def def [ On a dom(σ) = {X1 , . . . , Xn } et codom(σ) = var(ti ) i=1 Composition 1 La composition σθ de σ = {X1 /t1 , . . . , Xm /tm } par θ = {Y1 /u1 , . . . , Yn /un } est obtenue à partir de {X1 /t1 θ, . . . , Xm /tm θ, Y1 /u1 , . . . , Yn /un } en supprimant tous les Xi /ti θ tels que Xi = ti θ et tous les Yj /uj tels que Yj ∈ dom(σ). Unification Deux termes t1 , t2 s’unifient ssi il existe une substitution σ telle que t1 σ = t2 σ. La substitution σ s’appelle unificateur de t1 et t2 . Particularité Une substitution α est dite plus particulière qu’une autre substitution β s’il existe une substitution σ telle que α = βσ. On note alors par exemple α E β Most General Unifier Un mgu de deux termes est un unificateur α tel que pour tout autre unificateur β de ces deux termes, β est plus particulier que α. Ce qui se dit aussi : α mgu de t1 et t2 ⇔ α unif icateur de t1 et t2 ∧ ∀β unif icateur de t1 et t2 , β E α ⇔ α unif icateur de t1 et t2 ∧ ∀β unif icateur de t1 et t2 , ∃σ t.q. β = ασ On peut déterminer le mgu de deux termes à l’aide de l’algorithme d’unification de Herbrand. {f (t1 , . . . , tn ) = f (u1 , . . . , un )} ∪ E {t1 = u1 , . . . , tn = un } ∪ E {f (t1 , . . . , tn ) = f (u1 , . . . , um )} ∪ E {⊥} si m 6= n {f (t1 , . . . , tn ) = g(u1 , . . . , um )} ∪ E {⊥} si f 6= g {X = X} ∪ E 2.2 E si X ∈ Var {t = X} ∪ E {X = t} ∪ E si X ∈ Var et t 6∈ Var {X = t} ∪ E {X = t} ∪ E[X ← t] si X ∈ var(E) et X 6∈ var(t) {⊥} si X ∈ var(t) Exercices. Exercice 2.1 Les ensembles suivants constituent-ils des substitutions ? Dans l’affirmative déterminer leurs domaine et codomaine. 1. {a, b, c, d, e} 6. {A/B, X/A, B/c} 2. {X/X, X/f (X)} 7. {X/f (X), Y /f (X, Y ), Z/a} 3. {A/B} 8. {} 4. {f (X)/K} 9. {X/f (X), Y /g(X, f (K)), Z/X} 5. {X/K, K/X} 10. X/p(X) Exercice 2.2 Composer les substitutions suivantes : 1. {}{X/a, Y /b} 5. {X/a}{X/f (X)} 2. {X/a, Y /b}{} 6. {X/Y, Y /X}{X/Y, Y /X} 3. {X/a, Y /b}{X/a} 7. {X/a, W/X}{X/f (W ), Y /b} 4. {X/f (X)}{X/a} 8. {X/f (W ), Y /b}{X/a, W/X} Exercice 2.3 On considère 4 fonctions θi : T erm −→ T erm (i ∈ {1, . . . , 4}). Pour chacune d’elles, on donne les valeurs en trois points distincts. On demande d’indiquer quelles fonctions ne sont certainement pas des fonctions qui traduisent des substitutions, et d’expliquer brièvement pourquoi : 1. θ1 (f (X, Y )) = f (c, d) θ1 (f (Y, X)) = f (d, c) θ1 (h(a, X)) = h(c, c) 2 θ3 (f (Y, X)) = f (Z, Z) 2. θ2 (f (X, Y )) = f (a, b) θ2 (h(a, X)) = h(b, a) θ2 (f (Y, X)) = f (b, a) 4. θ4 (f (X, Y )) = f (a, b) θ4 (h(a, X)) = h(a, b) 3. θ3 (f (X, Y )) = f (Z, Z) θ3 (h(a, X)) = h(a, Z) θ4 (f (Y, X)) = f (a, b) Exercice 2.4 Considérant la relation ”est plus particulière que”, déterminer parmi les substitutions suivantes, celles qui sont en relation ? (dessinez le graphe, restreint, de la relation ; justifiez) 1. { } 4. {Y /X} 7. {X/Y, Y /X} 2. {X/Y } 5. {W/X} 8. {X/f (a), W/a} 3. {X/a} 6. {X/f (X)} 9. {X/f (a), W/X} Exercice 2.5 Dans chacun des cas suivants, dire si e1 et e2 sont unifiables. Si oui donner un unificateur principal. 1. e1 = f (X, g(a, Y ), Z) et e2 = f (h(U, c), g(U, W ), k(X)) 2. e1 = f (X, h(Z), h(X)) et e2 = f (g(a, Y ), h(b), h(Y )) 3. e1 = f (h(Z), X, h(X)) et e2 = f (g(a, Y ), h(b), h(Y )) 4. e1 = p(f (Y ), W, g(Z)) et e2 = p(U, U, V ) 5. e1 = p(f (Y ), W, g(Z)) et e2 = p(V, U, V ) 6. e1 = p(a, X, f (g(Y ))) et e2 = p(Z, h(Z, W ), f (W )) 3 3 Une structure de données utile : les listes. 3.1 Listes. Deux éléments permettent de construire des listes : - la constante nil, notée aussi [ ] - le symbole fonctionnel d’arité 2 : •( , ), noté aussi [ , ] Le premier élément représente une liste vide. Tandis que le second ne représente un liste que si le premier argument est un terme et le second argument est une liste. On dispose toutefois d’un sucre syntaxique [t1 , t2 , . . . , tn ] ≡ [t1 | [t2 | . . . [tn | nil]]] [t1 , t2 , . . . , tk | t] ≡ [t1 | [t2 | . . . [tk | t]]] •(a, []) [a|[]] [a] •(a, •(b, [])) [a|[b|[]]] [a, b] •(a, •(b, •(c, []))) [a|[b|[c|[]]]] [a, b, c] •(a, X) [a|X] [a|X] •(a, •(b, X)) [a|[b|X]] [a, b|X] 3.2 Exercices. Exercice 3.1 Parmi les termes ci-dessous, indiquer ceux qui sont des listes. Parmi ceux qui sont des listes, indiquer ceux qui sont clos. 1. f (a, X) 2. [X | Y ] 3. [a, b | c] 4. 5. 6. 7. X [X, f (a, X)] g([a, b]) [f (a, b)] 8. [a, b | [ ]] 11. [[a, b] | [a, b]] 9. [ ] 12. [X, Y | Z, W ] 10. [X | [ ]] 13. nil Exercice 3.2 Eliminer le sucre syntaxique des termes suivants : 1. [[ ], [a, b]] 2. [a, [[ ], b] | [c, d]] 3. [X, Y, Z] 4. [nil, •(a, •(b, nil))] 5. [X, Y | Z] Exercice 3.3 Ecrire la tête et la queue pour chacune des listes suivantes : 1. [a, b, c, d] 2. [a] 3. [ ] 7. [the, [cat, sat], down] 4. [[the, cat], sat] 5. [the, cat] 6. [the, [cat, sat]] Exercice 3.4 Dire des termes suivants s’ils sont ground, var ou any : 1. [ ] 3. f (toto, lulu, b212) 5. s(s(s(s(K)))) 2. [A, B, C, D] 4. [a | b] 6. f ([ ]) 4 7. v(a, b, [V ], k) 4 Logique. 4.1 4.1.1 Rappels. Logique mathématique = système reposant sur – une syntaxe = un langage – une sémantique déclarative = une interprétation des formules. – une sémantique procédurale = une théorie de la preuve. 4.1.2 Logique des propositions Le langage de la logique des propositions est formé de : – propositions simples, – propositions composées via les connecteurs ∧, ∨, ¬, ⇒, ⇔ La sémantique déclarative de la logique des propositions est définie à l’aide des tables de vérités. p 1 1 0 0 q 1 0 1 0 p∧q 1 0 0 0 p∨q 1 1 1 0 p⇒q 1 0 1 1 p⇔q 1 0 0 1 Une proposition P est une conséquence logique de S ssi tout modèle de S est un modèle de P . On note alors S |= P . La sémantique procédurale de la logique des propositions est basée sur les axiomes de Hilbert P ⇒ (Q ⇒ P ) [P ⇒ (Q ⇒ R)] ⇒ [(P ⇒ Q) ⇒ (P ⇒ R)] (¬P ⇒ ¬Q) ⇒ (Q ⇒ P ) et sur des règles d’inférence ou dérivation : Modus Ponens P P ⇒Q Q Modus Tollens ¬Q P ⇒Q ¬P Chaı̂nage P ⇒Q Q⇒R P ⇒R Si une proposition P peut être établie à partir des propositions S par application des axiomes et règles d’inférences, on note : S ` P . Ce système est – complet : si S |= P alors S ` P . – cohérent : si S ` P alors S |= P . – décidable. Wang A1 , . . . , Am → B1 , . . . , Bn (m, n ≥ 0) représente A1 ∧ . . . ∧ Am ⇒ B1 ∨ . . . ∨ Bn (si m, n > 0) 5 B1 ∨ . . . ∨ Bn (si m = 0, n > 0) ¬(A1 ∧ . . . ∧ Am ) (si m > 0, n = 0) f alse (si m, n = 0) Axiomes : Si α et β sont des suites de propositions simples α et β ont au moins une proposition en commun Alors α → β est un théorème On le note : `W (α → β) Règles de déductions Premier groupe Introduction d’un connecteur dans l’antécédent RA¬ α, Γ → Π, A `W α, ¬A, Γ → Π RA∧ α, A, B, Γ → Π `W α, A ∧ B, Γ → Π RA∨ α, A, Γ → Π; α, B, Γ → Π `W α, A ∨ B, Γ → Π RA⇒ α, B, Γ → Π; α, Γ → Π, A `W α, A ⇒ B, Γ → Π RA⇔ A, B, α, Γ → Π; α, Γ → Π, A, B `W α, A ⇔ B, Γ → Π Deuxième groupe Introduction d’un connecteur dans le conséquent RC¬ A, α, → β, Γ `W α → β, ¬A, Γ RC∧ α → β, A, Γ; α → β, B, Γ `W α → β, A ∧ B, Γ RC∨ α → β, A, B, Γ `W α → β, A ∨ B, Γ RC⇒ α, A, → β, B, Γ `W α → β, A ⇒ B, Γ `W α, → β, A ⇒ B, Γ RC⇔ 4.1.3 A, α → β, B, Γ; B, α → β, A, Γ; Logique des prédicats. Le langage de la logique des prédicats est composé de formules bien formées (wff) : – propositions simples, – si w1 et w2 sont des wff alors w1 ∧ w2 , w1 ∨ w2 , ¬w1 , w1 ⇒ w2 , w1 ⇔ w2 , ∀X(w1 ), ∃X(w1 ), (w1 ) où X est non quantifié dans w1 sont des formules bien formées. Clauses Une clause est une construction de la forme L1 ∨ . . . ∨ Ln où chaque Li est un atome ou la négation d’un atome. Les variables d’une clause sont implicitement quantifiées universellement en tête de clause. Une clause de Horn est une clause contenant au plus un atome non nié. Rem. Possibilité demise sous forme clausale. 6 La sémantique procédurale de la logique des prédicats est définie formellement par un système d’axiomes et de méta-règles. Résolution pratique : algorithme basé sur le principe de Robinson. Pour prouver S ` T hm : – Situation initiale Syst = S et clause = ¬T hm. – Situation générale Syst = ens. de clauses et clause = clause. 1. sélectionner dans Syst une clause dont une renommination C est complémentaire à clause. 2. si impossible, terminer, 3. sinon clause := resolv(clause, C), puis répéter – Situation finale 1. Clause est vide : conclure ok... 2. Clause non vide : conclure ko. La sémantique declarative de la logique des prédicats 4.2 Exercices. Exercice 4.1 Calculer les tables de vérité des propositions suivantes. 1. (p ∨ (q ∧ r)) ⇔ (p ∨ q) ∧ (p ∨ r) 2. ((p ∧ q) ⇒ r) ⇔ (p ⇒ r) ∨ (q ⇒ r) 3. [(p ∨ q) ⇒ r] ⇒ [(p ⇒ r) ∧ (q ⇒ r)] 4. [p ⇒ (q ⇒ r)] ⇒ [(p ⇒ q) ⇒ (p ⇒ r)] 5. [p ⇒ q] ⇔ [¬q ⇒ ¬p] Exercice 4.2 Soit la formule A ⇒ A. Montrez que ` A ⇒ A et que |= A ⇒ A Exercice 4.3 En s’appuyant uniquement sur la sémantique procédurale, prouver que : 1. A ⇒ (B ⇒ C); B ` A ⇒ C 2. A ⇒ B; B ⇒ C ` A ⇒ C Exercice 4.4 On considère la règle de déduction suivante (Wang) : α, Γ → Π, A `W où α, ¬A, Γ → Π α est une suite de propositions simples A est une proposition Γ, Π sont des suites de propositions On demande - de montrer au niveau procédural que ce schéma de déduction est correct - de montrer au niveau des modèles que ce schéma de déduction est correct Exercice 4.5 Montrez ”par Wang” que les formules ci-dessous sont des tautologies. 1. p ⇒ (q ⇒ p) 2. [p ⇒ (q ⇒ r)] ⇒ [(p ⇒ q) ⇒ (p ⇒ r)] Exercice 4.6 Dans les formules suivantes, remplacer le ”?” par l’un des connecteurs logiques ⇒, ⇐ ou ⇔ de manière à obtenir une tautologie. 1. ∀x : (p(x) ∧ q(x)) ? ∀x : p(x) ∧ ∀x : q(x) 7 2. ∀x : (p(x) ∨ q(x)) ? ∀x : p(x) ∨ ∀x : q(x) 3. ∃x : (p(x) ∧ q(x)) ? ∃x : p(x) ∧ ∃x : q(x) 4. ∃x : (p(x) ∨ q(x)) ? ∃x : p(x) ∨ ∃x : q(x) Exercice 4.7 (Skolem). Mettre sous forme clausale les expressions prédicatives suivantes. 1. ∀x∀y∃u [Q(u, y) ⇒ R(a, u, y, z)] 2. ∀xq(x) ⇒ ∃yq(y) 3. ∀x(q(x) ⇒ ∃yq(y)) 4. ∀x∀y∀z(p(x, y) ⇒ (p(y, z) ⇒ p(x, z))) Exercice 4.8 Soit la base de connaissance suivante : ∀x (Oiseau(x) ∧ P attes(x, palmes) ⇒ N age(x)) (1) ∀x (P oisson(x) ⇒ N age(x)) (2) Oiseau(donald) (3) P attes(donald, palmes) (4) On demande de transformer cette base en clauses, puis de démontrer selon la procédure de Robinson-Herbrandt que l’on a N age(donald) Exercice 4.9 Etablir – selon la théorie des preuves de la logique des propositions, – grâce à l’algorithme de Wang, – selon la procédure de Robinson-Herbrandt, – selon la théorie des modèles de la logique des propositions, les propositions suivantes : 1. (p ⇒ (p ∨ q)) 2. ((p ∧ q) ⇒ p) 3. ((p ∧ q) ⇒ (p ∨ q)) 8 5 Prolog. 5.1 Rappels. L’arbre et/ou de recherche. A chaque requête, on associe, un arbre composé de noeuds et (→ conjonction d’atomes) et de noeuds ou (→ atome). Tout “noeud et” a autant de fils “noeuds ou” que la conjonction associée contient d’atomes. Tout “noeud ou” a autant de fils noeud et qu’il existe, dans le programme considéré de clauses unifiables à l’atome associé Sauf pour la racine le mgu correspondant à la réduction est indiqué en face du “noeud et”. On convient de construire l’arbre de telle sorte – qu’une lecture gauche-droite des “noeuds ou” reflète une lecture gauche-droite des atomes dans la conjonction associée au “noeud père et” – qu’une lecture gauche-droite des “noeuds et” reflète une lecture haut-bas des clauses du programme. Backtracking. Le backtracking est lié à deux choses : – demande de nouvelles solutions – report d’échec Noeud OU. 1. Demande de nouvelles solutions ? @ B B@ (1) BBN @ BB . .@ ... .@ ?6 B @ B@ B @ BB @ @ ... S’il existe un frère à droite – on élimine les instantiations à partir de (1) – on examine le frère de droite le plus à gauche Sinon, on reporte l’échec au noeud père 2. Report d’échec B@ B@ (1) BBN @ BB . .@ ... .@ 6 B @ B@ B @I BB @ @ ... S’il existe un frère à droite – on élimine les instantiations à partir de (1) – on examine le frère de droite le plus à gauche Sinon, on reporte l’échec au noeud père Noeud ET 1. Demande de nouvelles solutions ? @ @ R @ @ @ ... Faire passer la demande de nouvelles solutions au fils le plus à droite. 2. Report d’échec @ B B@ BBM @ BB . .@ . . . .@ S’il existe un frère à gauche – éliminer les instantiations pour la branche considérée – envoyer une demande de nouvelles solutions au frère de gauchele plus à droite. 9 6 @ Sinon, rapporter l’échec au noeud père et éliminer les instantiations faites dans le sous-arbre considéré. @ @ ... @ @ Le cut. est un atome spécial noté ! La résolution du cut réussit toujours directement. Elle implique que tous les choix de clauses depuis la création de ! (dans un but de la SLD-dérivation ) jusqu’à sa résolution sont figés (ie. ne pourront plus être reconsidérés). Utilisation : – Confirmation du choix d’une règle pour établir l’objectif. – Conclusion court-circuitée à l’échec d’un objectif : !, fail. – Forcer la terminaison de génération de solutions alternatives. La négation. La requête not(A) réussit si A n’est pas démontrable. Il ne s’agit pas de la négation logique (not(A) n’est pas forcément démontrable). La négation de Prolog correspond à ”l’hypothèse du monde clos”. Le prédicat not|1 peut se programmer comme suit : not B :- B,!,fail. not B. 5.2 Exercices. Exercice 5.1 Soit le programme Prolog suivant : repas(X,soupe,Z) :- boisson(X), platprincipal(Z). repas(X,Y,Z) :- entree(X), platprincipal(Y), dessert(Z). platprincipal(X) :-poisson(X). platprincipal(beefsteackfrites). boisson(eau). boisson(vin). entree(radis). dessert(gateau). dessert(fruit). poisson(sole). Réaliser l’arbre et/ou de dérivation pour la requête repas(X, Y, sole). Et fournir la trace de l’exécution. Exercice 5.2 Soit la procédure Prolog length/2 composée des deux clauses ci-dessous : length(a,[]). length(s(X),[H|T]) :- length(X,T). Représenter les arbres de dérivation correspondant aux requêtes suivantes : ?-length(s(s(a)),[a,b]). ?-length(s(a),[a,b]). ?-length(X,[a,b]). ?-length(s(s(a)),X). ?-length(X,Y). Exercice 5.3 On considère le programme suivant dans lequel les prédicats t1 et t2 sont ”logiquement” équivalents : p(a,b). t_1(a). t_1(X):-t_1(X),p(X,Y). t_2(X):-t_2(X),p(X,Y). t_2(a). Montrer que t1 (Z) réussit et que t2 (Z) échoue à partir de ce programme. 10 Exercice 5.4 Soit le programme Prolog suivant : a(X,Y,Z) :- b(X,Y),c(Y,Z). b(X,Y) :- e(X,Y). b(h,X). c(X,Y) :- d(X),d(Y),!,e(X,Z),f(Z,Y). c(4,5). d(4). d(5). e(X,X). f(X,3). Réaliser l’arbre de dérivation associé à la requête a(X, 4, Z). Exercice 5.5 Soit le programme Prolog ci-dessous : max(s(X),a,s(X)) :- !. max(a,s(X),s(X)) :- !. max(a,a,a) :- !. max(s(X),s(Y),s(Z)) :- max(X,Y,Z). On demande de donner les réponses fournies par Prolog pour les questions ci-dessous en expliquant intuitivement comment elles sont obtenues : 1. ?-max(s(s(a)),s(a),X). 2. ?-max(X,s(a),s(s(a))). 3. ?-max(X,s(a),s(a)). 4. ?-max(X,Y,s(a)). 5. ?-max(X,s(Y),s(s(a))). Exercice 5.6 Soit le programme formé du seul fait p(a). Donner les résultats des requêtes X = b, not p(X). et not p(X), X = b. Exercice 5.7 Soit le programme Prolog ci-dessous : p(a). q(b). r(c). p(b). q(c). r(a). q1 (X) :- p(Y), not (X=Y), q(X). q1 (X,Y) :- p(Y), not (X=Y), q(X). q2 (X) :- q(X), p(Y), not (X=Y). q2 (X,Y) :- q(X), p(Y), not (X=Y). q3 (X) :- q(X), not (p(X)). q4 (X) :- p(X), q(X), r(X). q5 (X,Y,Z) :- p(X), q(Y), r(Z). On demande de donner les résultats fournis par Prolog pour les questions ci-dessous, en justifiant intuitivement la réponse : 1. 2. 3. 4. ?-q1 (a). ?-q1 (b). ?-q1 (X). ?-q1 (a,c). 5. 6. 7. 8. ?-q1 (b,b). ?-q2 (a). ?-q2 (X,Y). ?-q3 (X). 9. ?-q4 (X). 10. ?-q5 (X,Y,Z). Exercice 5.8 Soit le programme Prolog ci-dessous : p(X,Y,Z) :- q(X), not (r(X)), r(Y), !, s(Z). q(a). q(b). r(a). r(c). s(a). s(d). On demande de donner la (les) réponse(s) fournie(s) par Prolog pour la question ci-dessous en expliquant intuitivement comment elle(s) est (sont) obtenue(s) : ?-p(X,Y,Z). 11 6 6.1 6.1.1 Programmation. Rappels. Méthodologie de programmation. Spécification – – – – induction généralisation de structures généralisation opérationnelle décomposition construction ? Description logique – dérivation syntaxique – permutation de – clauses – sous-buts dérivation ? Programme logique 6.1.2 Spécification. Procédure p(T1 , · · · , Tn ) Type T1 : type 1 ... Tn : type n Relation . . . Conditions d’application – directionalités – préconditions d’environnement Effet de bord . . . 6.1.3 Description logique. Une description logique, se présente de façon générale, sous la forme : ∀X1 , · · · , Xn : p(X1 , · · · , Xn ) ⇐⇒ Def avec Def formule dont les variables distinctes de X1 , . . ., Xn sont implicitement quantifiées existentiellement en tête. Le plus souvent, on l’exprime de la façon suivante : ∀X1 , · · · , Xn : p(X1 , · · · , Xn ) ⇐⇒ E1 ∨ · · · ∨ Em avec – Ei de la forme Ci ∧ (Li1 ∨ · · · ∨ Liki ) – Ci et Lij conjonctions de littéraux – C1 ∨ · · · Cm ⇐⇒ true – si Lj contient un littéral de la forme p(t1 , · · · , tn ) alors ht1 , · · · , tn i < hX1 , · · · , Xn i 6.1.4 Spécification. Induction directe – Choisir un paramètre d’induction xk – Choisir une relation bien fondée sur le type de xk – Déterminer les conditions Ci grâce aux différentes formes structurelles de xk 12 – Construire Fi , pour tout i, en – réduisant le problème à des sous-problèmes plus simples et/ou – utilisant des appels récursifs avec des arguments t1 , . . ., tn t.q. tk < xk Avec X comme paramètre d’induction, on obtient la schéma suivant : p(X, Y ) ⇔ minimal(X) ∧ directly solve(X, Y ) ∨ ¬minimal(X) ∧ decompose(X, P artX, RemX) ∧ process(P artX, P artY ) ∧ p(RemX, RemY ) ∧ compose(P artY, remY, Y ) Généralisation structurelle. p(X, Y ) ⇔ p tupl([X], Y ) p tupl(List X, Y ) ⇔ List X = [] ∧ Y = [] ∨ List X = [X|T ail X] ∧ minimal(X) ∧ directly solve(X, Head Y ) ∧ p tupl(T ail X, T ail Y ) ∧ append(Head Y, T ail Y, Y ) ∨ List X = [X|T ail X] ∧ ¬minimal(X) ∧ decompose(X, List smallerX) ∧ append(List smallerX, T ail X, N ew list X) ∧ p tupl(N ew list X, P art Y ) ∧ compose(X, P art Y, Y ). Généralisation opérationnelle. – voir le paramètre d’induction X comme X: e1 e2 · · · en – caractériser un état général de l’exécution comme e1 · · · ei P ref X Int Y X: | ei+1 · · · en Suf X {z } déjà examiné | {z à examiner } – l’exécution consiste alors à réduire Suf X à quelque chose de plus petit en tirant profit de P ref X et Int Y – selon que P ref X est nécessaire ou pas, on appliquera respectivement la généralisation ascendante ou la généralisation descendante – Introduction d’un prédicat géneral p gen(Suf X, Y, Int Y, P ref X) Procédure p gen(Suf X, Y, Int Y, P ref X) Type : P ref X, Suf X : type X Y, Int Y : type Y Restriction sur les paramètres : – (P ref X, Int Y ) ∈ p – ∃X de type type X t.q. X = P ref X<>Suf X 13 Relation : (X, Y ) ∈ p – Construction d’une description logique pour p gen par induction sur Suf X avec une relation bien fondée définie sur type X. Généralisation descendante. Procédure p desc(XX, Y, Int Y ) Type : XX : type X Y, Int Y : type Y Inf o P ref X : . . . Relation : Y = Int Y <>Y Y avec (XX, Y Y ) ∈ p p(X, Y ) ⇔ p desc(X, Y, α) p desc(XX, Y, Int Y ) ⇔ minimal(XX) ∧ extend Int min(XX, Int Y, Y ) ∨ ¬minimal(XX) ∧ decompose(XX, F irst XX, Rem XX) ∧ extend Int(F irst XX, Int Y, N ew Int Y ) ∧ p desc(Rem XX, Y, N ew Int Y ) Généralisation ascendante Procédure p asc(Suf X, Y, Int Y, Inf o P ref X) Type : Suf X : type X Y, Int Y : type Y Restriction sur les paramètres : ∃X, P ref X t.q. – X = P ref X<>Suf X – (P ref X, Int Y ) ∈ p – Inf o P ref X représente une certaine information à propos de X Relation : (X, Y ) ∈ p p(X, Y ) ⇔ p asc(X, Y, αY , α X) p asc(Suf X, Y, Int Y, Inf o P ref X) ⇔ minimal(Suf X) ∧ Y = Int Y ∨ ¬minimal(Suf X) ∧ decompose(Suf X, F irst Suf X, Rem Suf X) ∧ extend Int(F irst Suf X, Inf o P ref X, Int Y, N ew Int Y ) ∧ extend Inf o(F irst Suf X, Inf o P ref X, N ew Inf o P ref X) ∧ p asc(Rem Suf X, Y, N ew Int Y, N ew Inf o P ref X) 6.2 Exercices. Exercice 6.1 Spécifier et donner une description logique par induction directe des prédicats suivants : – length(L, Lg) : Lg est la longueur de la liste L, – somme(X, Y, Z) : Z=X+Y, – produit(X, Y, Z) : Z=X*Y, – f iltre(L1, L2) : L2 est la liste des éléments de L1 vérifiant le prédicat p/1, où p/1 désigne un prédicat nommé p à un seul argument supposé déclaré. Exercice 6.2 Construire une description logique pour max(T, M ) où T est un arbre binaire étiqueté par des entiers, et où M est l’étiquette maximale de T . Procéder en suite à une généralisation structurelle. 14 Exercice 6.3 Construire une description logique pour palindrome(L) définie par palindrome(L) ≡ ≡ L est un palindrome L lu de gauche à droite = L lu de droite à gauche – par une induction directe sur L – par une généralisation sous forme de “difference-list” – par transformation depuis la version obtenue par induction directe Exercice 6.4 Construire une description logique pour f act(N, F ) définie par f act(N, F ) ≡ F = N ! – par induction sur N – par généralisation descendante – par généralisation ascendante Exercice 6.5 Construire, selon la méthodologie exposée au cours, une procédure logique pour la relation minmax(L, M in, M ax) où M in et M ax représentent respectivement les valeurs minimum et maximum d’éléments de L. (A toutes fins utiles, il conviendra d’écrire une spécification en précisant les types nécessaires et des directionalités raisonnables, de construire une description logique, et d’en dériver une procédure en effectuant une analyse dataflow) 15