ELFE - Cours 4
Transcription
ELFE - Cours 4
Contenu Requêtes relationnelles en Datalog Opérations de l’algèbre relationnelle ELFE - Cours 4 Requêtes relationnelles en Datalog Satisfaisabilité de formules booléennes en Datalog Fonctionnalités supplémentaires en DES Agregation Groupage Chemin le plus court : Datalog et SQL C. Kuttler Licence 3 informatique, Université Lille Les formules booléennes en Datalog Le problème Premier codage de formules booléennes en Datalog Qui est l’assassin ? 24 janvier 2013 2 / 35 1 / 35 Datalog et l’algèbre relationnelle Exemple : schéma du TP5 BDD I I I I I les mêmes relations qu’on peut définir en algèbre relationnelle, ou SQL, peuvent être définies en Datalog I Nous supposons un nom de relation (symbole de prédicat) r en Datalog, pour chaque tableau R I Nous montrons comment exprimer, en Datalog, des requêtes sur une base de données relationnelle, du type SELECT-FROM-WHERE, ou des requêtes en algèbre relationnelle articles(aid : int, anom : string , acoul : string ) fournisseurs(fid : int, fnom : string , fad : string ) catalogue(fid : int, aid : int, prix : real) declaration de types (create table) + ajout a la EDB (inserts) : :− t y p e ( a r t i c l e s ( a i d : i n t , anom : s t r i n g , a c o u l : s t r i n g ) ) . :− t y p e ( f o u r n i s s e u r s ( f i d : i n t , fnom : s t r i n g , f a d : s t r i n g ) ) . :− t y p e ( c a t a l o g u e ( f i d : i n t , a i d : i n t , p r i x : r e a l ) ) . a r t i c l e s ( 1 , ’ L e f t Handed Toaster Cover ’ , ’ rouge ’ ) . a r t i c l e s ( 2 , ’Smoke S h i f t e r End ’ , ’ n o i r ’ ) . ... f o u r n i s s e u r s ( 1 , ’ k i v e n t o u t ’ , ’ 59 rue du Chti , F−75001 P a r i s ’ ) . f o u r n i s s e u r s ( 2 , ’ Big Red Tool and Die ’ , ’ 4 My Way, Bermuda Shorts , OR 90305 , USA ’ ) . ... catalogue (1 ,1 ,36.10). catalogue (1 ,2 ,42.30). 3 / 35 4 / 35 Projection πAcoul (Articles) Selection σ Afficher toutes les couleurs d’articles Afficher tous les articles rouges c o u l e u r (C) :− a r t i c l e s ( , , C ) . a r t r o u g e (Anom) :− a r t i c l e s ( Aid , Anom , A c o u l ) , A c o u l= ’ rouge ’ . Résultat : DES> c o u l e u r (X) { c o u l e u r ( a r g e n t e ) , c o u l e u r ( cyan ) , c o u l e u r ( magenta ) , c o u l e u r ( n o i r ) , c o u l e u r ( opaque ) , c o u l e u r ( r o u g e ) , couleur ( superjaune ) , couleur ( vert ) } I n f o : 8 t u p l e s computed . a r t v e r t (Anom) :− a r t i c l e s ( Aid , Anom , A c o u l ) , A c o u l= ’ v e r t ’ . SQL : CREATE VIEW a r t r o u g e as SELECT anom FROM a r t i c l e s WHERE a c o u l= ’ rouge ’ CREATE VIEW a r t v e r t as SELECT anom FROM a r t i c l e s WHERE a c o u l= ’ v e r t ’ CREATE VIEW c o u l e u r AS SELECT a c o u l FROM c a t a l o g u e 5 / 35 Jointure 6 / 35 Produit cartésien toutes les combinaisons de fournisseurs et articles. Règle : c a r t (Anom , Fnom ) :− a r t i c l e s ( , Anom , ) , f o u r n i s s e u r s ( , Fnom , ) . Qui vend quel article a quel prix ? t o u t (Anom , Acoul , Fnom , P r i x ) :− a r t i c l e s ( Aid , Anom , A c o u l ) , c a t a l o g u e ( Fid , Aid , P r i x ) , f o u r n i s s e u r s ( Fid , Fnom , ) . Requête et résultat : DES> c a r t (X , Y) { c a r t ( ’ 7 Segment D i s p l a y ’ c a r t ( ’ 7 Segment D i s p l a y ’ ... c a r t ( ’Smoke S h i f t e r End ’ c a r t ( ’Smoke S h i f t e r End ’ I n f o : 54 t u p l e s computed . SELECT anom , a c o u l , fnom , p r i x FROM ( a r t i c l e s j o i n c a t a l o g u e u s i n g a i d ) j o i n f o u r n i s s e u r s using f i d , ’ Alien Aircaft Inc . ’ ) , , ’ Autolux ’ ) , , ’ Vendrien ’ ) , , k i v e n t o u t )} SELECT anom , fnom FROM a r t i c l e s , f o u r n i s s e u r s 7 / 35 8 / 35 Intersection Différence articles existant en rouge et en vert les articles existant en rouge, mais pas en vert r o u g e e t v e r t (X) :− a r t r o u g e (X ) , a r t v e r t (X ) . r o u g e p a s v e r t (X) :− a r t r o u g e (X ) , not ( a r t v e r t (X ) ) . c r e a t e view r o u g e e t v e r t as ( art rouge intersect art vert ) CREATE VIEW r o u g e p a s v e r t AS ( a r t r o u g e MINUS a r t v e r t ) 9 / 35 Union Quantification existentielle les articles rouges ou verts r o u g e o u v e r t (X) :− r o u g e o u v e r t (X) :− 10 / 35 Articles offerts par au moins un fournisseur a r t r o u g e (X ) . a r t v e r t (X ) . vendu (Anom) :− c a t a l o g u e ( , Aid , ) , a r t i c l e s ( Aid , Anom , ) . CREATE VIEW r o u g e o u v e r t AS ( a r t r o u g e UNION a r t v e r t ) SELECT anom FROM a r t i c l e s a WHERE e x i s t s ( s e l e c t ∗ from c a t a l o g u e c where c . a i d=a . a i d ) 11 / 35 12 / 35 Quantification universelle Fonctionnalités supplémentaires de DES Les opérations montrées jusqu’ici peuvent être faites avec n’importe quel DATALOG. Pour augmenter son attractivité, DES offre : Il faut passer par la négation, et donc des strates d’ordre supérieur. I fonctions d’agrégation I group by I group by - having I jointures externes 13 / 35 Agrégation 14 / 35 Exemples Profitez de la doc : DES> / h e l p c o u n t ∗ Aggregate Functions : c o u n t /1 Count b u t n u l l s w r t . i t s argument . R e t u r n s an i n t e g e r ∗ Predicates : c o u n t /3 A g g r e g a t e r e t u r n i n g t h e number o f t h e t u p l e s i n a r e l a t i o n w r t . an argument , i g n o r i n g n u l l s c o u n t /2 A g g r e g a t e r e t u r n i n g t h e number o f t h e t u p l e s i n a r e l a t i o n ( c f . SQL ’ s COUNT( ∗ ) ) DES implémente les fonctions d’agrégation habituelles I count - COUNT (∗) I count(Var) - COUNT (Column) I min I max I sum I avg Versions avec 1,2 ou 3 arguments a utiliser dans différents contextes. 15 / 35 16 / 35 count/2 Exemple : count/3 Paramètres : 1. requête 2. compter cette variable 3. associer résultat a cette variable Combien d’articles rouges ? Combien d’articles ? DES> c o u n t ( a r t i c l e s ( , , ) , C) c o m b i e n r o u g e (R): − c o u n t ( a r t i c l e s ( Aid , , ’ rouge ’ ) , Aid , R ) . Info : Processing : a n s w e r (C) :− count ( a r t i c l e s ( , , ) , [ ] , C ) . { answer (13) } I n f o : 1 t u p l e computed . Requête et résultat : DES> c o m b i e n r o u g e (R) { combien rouge (5) } I n f o : 1 t u p l e computed . SQL : SELECT count ( ∗ ) as R FROM a r t i c l e s WHERE a c o u l= ’ rouge ’ 17 / 35 Prix moyen du fournisseur X (avg/3) 18 / 35 Prédicat de groupage de DES : syntaxe p r i x m o y e n f i d (X , R) :− avg ( c a t a l o g u e (X , , P ) , P , R ) . group by /3 : Requete : prix moyen du fournisseur 1 group by ( Relation A , [ Var 1 , . . . , V a r n ] , C ) DES> p r i x m o y e n ( 1 , P) SQL : prix moyen du fournisseur 1 SELECT avg ( p r i x ) FROM c a t a l o g u e WHERE f i d = 1 19 / 35 % FROM % a t t r i b u t s de g r o u p a g e % HAVING / p r o j e c t i o n 20 / 35 Prix moyen par fournisseur (group by + avg/1) Nombre d’articles par couleur (group by + count /1) p r i x m o y e n ( Fid , Pmo) :− g r o u p b y ( c a t a l o g u e ( Fid , Aid , P ) , [ Fid ] , Pmo=avg (P ) ) . c o u l (C , R) :− g r o u p b y ( a r t i c l e s (A , N, C ) , [C] , R=c o u n t ) . DES> p r i x m o y e n ( F , P) { prixmoyen (1 ,19585.389166666668) , prixmoyen (2 ,8.333333333333334) , prixmoyen ( 3 , 6 . 7 5 ) , prixmoyen (4 ,42.699999999999996) , prixmoyen (5 ,234555.67)} I n f o : 5 t u p l e s computed . Requête et résultat : DES> c o u l (C , R) { coul ( argente , 1 ) , . . . coul ( vert ,2)} I n f o : 8 t u p l e s computed . SELECT f i d , avg ( p r i x ) FROM c a t a l o g u e GROUP BY f i d 21 / 35 Couleur avec plus de 2 articles (group by-count-TEST) 22 / 35 Chemin le plus court en datalog c o u l 2 (C) :− group by ( a r t i c l e s (A , N, C ) , [C] , (R=count , R>2) ). p a t h (X , Y , 1 ) :− edge (X , Y ) . p a t h (X , Y , L ) :− p a t h (X , Z , L0 ) , edge ( Z , Y) , c o u n t ( edge (A , B ) , Max ) , L0<Max , L i s L0 +1. Résultat : DES> c o u l 2 (X) { coul 2 ( rouge ) } I n f o : 1 t u p l e computed . % requete : s h o r t e s t p a t h s (X , Y , L ) :− min ( p a t h (X , Y , Z ) , Z , L ) . SELECT a c o u l FROM a r t i c l e s GROUP BY a c o u l HAVING count (∗) >2 La condition L < 0 assure la terminaison (elle interdit de boucler infiniment dans un cycle). 23 / 35 24 / 35 CREATE OR REPLACE VIEW s h o r t e s t p a t h s ( O r i g i n , D e s t i n a t i o n , L e n g t h ) AS WITH RECURSIVE p a t h ( O r i g i n , D e s t i n a t i o n , L e n g t h ) AS (SELECT edge . ∗ , 1 FROM edge ) UNION (SELECT p a t h . O r i g i n , edge . D e s t i n a t i o n , p a t h . L e n g t h+1 FROM path , edge WHERE p a t h . D e s t i n a t i o n=edge . O r i g i n and p a t h . L e n g t h < (SELECT COUNT( ∗ ) FROM Edge ) ) SELECT O r i g i n , D e s t i n a t i o n ,MIN( L e n g t h ) FROM p a t h GROUP BY O r i g i n , D e s t i n a t i o n ; La clause WHERE en SQL I renvoie, pour un tuple du tableau, soit vrai, soit faux I est donc une condition/formule booléenne I les formules booléennes ne sont pas triviales a coder I tester la satisfaisabilité d’une formule booléenne est un problème difficile (connu sous SAT) % r e q u e t e en SQL SELECT ∗ FROM s h o r t e s t p a t h s ; 25 / 35 Satisfaisabilité d’une formule booléenne (SAT) 26 / 35 Formules booléennes et Datalog I I la question s’il existe une interprétation, qui rend cette formule vraie I Datalog sait aussi bien trouver que vérifier des solutions a des problèmes. Pour pouvoir résoudre une problème logique, il faut savoir interprétation : association de valeurs aux variables I I ce problème est NP-complet (algo en M1) I I on peut vérifier rapidement une solution I I I on ne sait pas trouver les solutions efficacement, quand la taille des formules augmente Datalog nous rend la solution. Ce que nous faisons : I I 27 / 35 d’abord l’exprimer en logique booléenne, puis le coder en Datalog un puzzle logique, puis son codage en logique, puis en Datalog préliminaire : codage systématique d’un formule booléenne, en Datalog 28 / 35 (A or not B) and (A or not C) and (B or C) and not A Un meurtre (1/2) bool ( 0 ) . bool ( 1 ) . Connaissances autour d’un meurtre : M1 Si Jean n’a pas rencontré Pierre, alors soit Pierre est l’assassin, ou Jean est un menteur. p1 (A , B , C) :− A=1, b o o l (A ) , b o o l (B ) , b o o l (C ) . p1 (A , B , C) :− B=0, b o o l (A ) , b o o l (B ) , b o o l (C ) . M2 Si Pierre n’est pas l’assassin, alors Jean n’a pas rencontré Pierre, et le délit a eu lieu après minuit. p2 (A , B , C) :− A=1, b o o l (A ) , b o o l (B ) , b o o l (C ) . p2 (A , B , C) :− C=0, b o o l (A ) , b o o l (B ) , b o o l (C ) . M3 Si le délit a eu lieu après minuit, alors Pierre est l’assassin, ou Jean n’est pas un menteur. p3 (A , B , C) :− B=1, b o o l (A ) , b o o l (B ) , b o o l (C ) . p3 (A , B , C) :− C=1, b o o l (A ) , b o o l (B ) , b o o l (C ) . Modélisation en logique propositionnelle : Variables propositionnelles : p4 (A , B , C) :− A=0, b o o l (A ) , b o o l (B ) , b o o l (C ) . r (A , B , C) :− p1 (A , B , C ) , p2 (A , B , C ) , p3 (A , B , C ) , p4 (A , B , C ) . s a t (A , B , C) :− r (A , B , C ) , b o o l (A ) , b o o l (B) , b o o l (C ) . I A : Jean a rencontré Pierre I B : Pierre est l’assassin I C : Jean est un menteur I D : le délit a eu lieu après minuit. 29 / 35 Un meurtre (1/2) Un meurtre (1/2) Modélisation en logique propositionnelle : Formalisation Variables propositionnelles : I A : Jean a rencontré Pierre I B : Pierre est l’assassin I C : Jean est un menteur I D : le délit a eu lieu après minuit. 30 / 35 Conjonction des formules propositionnelles M1,M2 et M3 M1 not A ⇒ (B or C ) M2 not B ⇒ (not(A) and D) M3 D ⇒ (B or not(C )) Réécriture sans implication Formalisation Conjonction des formules propositionnelles M1,M2 et M3 M1 A or B or C M1 not A ⇒ (B or C ) M2 B or (not(A) and D) M2 not B ⇒ (not(A) and D) M3 not(D) or B or not(C ) M3 D ⇒ (B or not(C )) 31 / 35 32 / 35 M1 A or B or C M2 B or (not(A) and D) M3 B or not(C ) or not(D) La solution bool ( 0 ) . bool ( 1 ) . m1(A , B , C) :− A=1, m1(A , B , C) :− B=1, m1(A , B , C) :− C=1, b o o l (A ) , b o o l (B) , b o o l (C ) . b o o l (A ) , b o o l (B) , b o o l (C ) . b o o l (A) , b o o l (B) , b o o l (C ) . I A : Jean a rencontré Pierre I B : Pierre est l’assassin I C : Jean est un menteur I D : le délit a eu lieu après minuit. DES> s o l (A , B , C ,D) m2(A , B ,D) :− B=1, b o o l (A ) , b o o l (B) , b o o l (D ) . m2(A , B ,D) :− A=0,D=1, b o o l (A ) , b o o l (B) , b o o l (D ) . { m3(B , C ,D) :− B=1, m3(B , C ,D) :− C=0, m3(B , C ,D) :− D=0, } I n f o : 2 t u p l e s computed . sol 1 (1 ,1 ,0 ,0) , sol 1 (1 ,1 ,1 ,0) b o o l (B ) , b o o l (C ) , b o o l (D ) . b o o l (B) , b o o l (C ) , b o o l (D ) . b o o l (B ) , b o o l (C ) , b o o l (D ) . s o l (A , B , C ,D) :− m1(A , B , C ) , m2(A , B , D) , m3(B , C , D ) . 33 / 35 Question Pensez-vous qu’il est possible de coder la logique booléenne en Datalog, I avec une seule clause non-récursive I et plusieurs faits ? Si oui, on pourrait écrire le puzzle logique en SQL avec une requête conjonctive. Peut-on écrire un puzzle logique sous une telle forme ? Si oui, les requêtes les plus simples en SQL seraient dures. 35 / 35 34 / 35