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