600 likes | 695 Views
Βάσεις Γνώσεων. Σχεσιακή άλγεβρα , κατηγοριοποίηση και αποτίμηση προγραμμάτων στην Datalog Πάνος Βασιλειάδης pvassil@cs.uoi.gr Μάιος 200 3. www.cs.uoi.gr/~pvassil/courses/knowledge_bases/. Περιεχόμενα. Built-ins Σχεσιακή άλγεβρα και Datalog
E N D
ΒάσειςΓνώσεων Σχεσιακή άλγεβρα, κατηγοριοποίηση και αποτίμηση προγραμμάτων στην Datalog Πάνος Βασιλειάδης pvassil@cs.uoi.gr Μάιος2003 www.cs.uoi.gr/~pvassil/courses/knowledge_bases/
Περιεχόμενα • Built-ins • Σχεσιακή άλγεβρα και Datalog • Απλοϊκή αποτίμηση (Naïve evaluation) • Κατηγοριοποίηση των προγραμμάτων Datalog • Ημι-απλοϊκή αποτίμηση (Semi-naïve evaluation)
Built-in Predicates • Μπορούμε να επεκτείνουμε τη Datalog με ενσωματωμέναpredicates του τύπου: >, <, , , =, • Για παράδειγμα, brother(X,Y):- parent(X,Z),parent(Y,Z),XY
Built-in Predicates • Τα built-in predicates μπορούν να θεωρηθούν: • Τμήματα της EDB, που δεν είναι αποθηκευμένα με τον κλασσικό τρόπο στη ΒΔ • Predicates που γράφονται με infix notation --ήτοι, αντί για (Χ,Υ) γράφουμε ΧΥ • Το πρόβλημα με τα built-in predicates είναι ότι υπονοούν άπειρες σχέσεις. Αυτό έχει ως αποτέλεσμα ότι κάποια queries μπορεί να έχουν μη πεπερασμένο αποτέλεσμα
Built-in Predicates simpleCitizen(X):- president(Y),XY • Στο παράδειγμα, έστω ότι το presidentEDB. H παραγωγή των facts που ανήκουν στην simpleCitizen, παράγει άπειραfacts (υποθέτωντας ότι το domain των strings είναι άπειρο) • Κατά συνέπεια πρέπει να βρούμε μηχανισμούς για να αποτρέπουμε τέτοια φαινόμενα. • Ασφάλεια (safety)είναι η ιδιότητα ενός προγράμματος να παράγει πεπερασμένα facts.
Ασφάλεια για Built-in Predicates • Αρκεί κάθε μεταβλητή που εμφανίζεται σε ένα built-in predicate στο body ενός κανόνα • Είτε να εμφανίζεται σε ένα «κανονικό» predicateστο body του κανόνα, • Είτε να σχετίζεται μέσω ισότητας με μια μεταβλητή που πληροί την παραπάνω ιδιότητα (1), • Είτε να ισούται με μια σταθερή τιμή r(X,V) :- p(a,X),q(Z,T),T=4,X=Z,V=X • Οι μεταβλητές αυτές ονομάζονται limited
Ασφαλείς κανόνες simpleCitizen(X):- president(Y),citizen(X),XY simpleCitizen(X):- president(Y),citizen(X),X=Z, Y=V, ZV • Υπάρχουν και επεκτάσεις με αριθμητικάbuilt-ins και τους ίδιους κανόνες ασφάλειας, π.χ., Y=V+Ζ • Υπάρχει και μια επέκταση των κανόνων ασφάλειας: εκτός από ισότητα, αρκεί και διάστημα τιμών, π.χ., 4Υ, Υ8
Datalog και Σχεσιακή Άλγεβρα • Μπορούμε να δείξουμε την ισοδυναμία Datalog και ενός υποσυνόλου της σχεσιακής άλγεβρας • Θα δείξουμε πώς μια έκφραση σε σχεσιακή άλγεβρα μεταφράζεται σε Datalog • … και το αντίστροφο...
Σχεσιακή Άλγεβρα -> Datalog • Ε=Ε1Ε2. Αν θεωρήσουμε ότι τα Ε, Ε1 και Ε2 έχουν arity n, μπορούμε να γράψουμε απλά: e(X1,…,Xn):- e1(X1,…,Xn) e(X1,…,Xn):- e2(X1,…,Xn) • Ε=Ε1Ε2. Αν θεωρήσουμε ότι τα Ε, Ε1 και Ε2 έχουν arity n+m, n,m, αντίστοιχα, μπορούμε να γράψουμε: e(X1,…,Xn+m):- e1(X1,…,Xn),e2(Xn+1,…,Xn+m)
Σχεσιακή Άλγεβρα -> Datalog • Ε=πi1,i2,…,ik(Ε1). Αν θεωρήσουμε ότι το Ε1 έχει arity n, μπορούμε να γράψουμε : e(Xi1,…,Xiκ):- e1(X1,…,Xn) • Ε=σF(Ε1). Ανυποθέσουμε ότι η F είναι της μορφής XθY, όπου τα Χ και Υ είναι terms (variables ή constants), και θ κάποιο built-in, μπορούμε να γράψουμε: e(X1,…,Xn):- e1(X1,…,Xn),XθY (προφανώς, ο κανόνας πρέπει να είναι ασφαλής)
Παράδειγμα • Έστω η έκφραση: canBuy(PID,ItemID) = likes(PID,ItemID) – [broken(ItemID) πPID (likes(PID,ItemID))] • το πPID (likes(PID,ItemID))δίνει l1(P) :- likes(P,I) • το broken(ItemID) πPID (likes(PID,ItemID)) δίνει lb(P,I) :- b(I),l1 (P) • Για την πλήρη έκφραση έχω: canBuy(P,I) :- likes(P,I), lb(P,I) • Προσοχή: η δοθείσα αλγεβρική έκφραση τελικά υπολογίζεται από ένα πρόγραμμαDatalog με τα τρία αυτά rules που συντάξαμε.
Datalog -> Σχεσιακή Άλγεβρα • Κάθε clause στην Datalog μπορεί να μεταφρασθεί σε μια πρόταση σε σχεσιακή άλγεβρα • Έστω μια Datalog clauseC p(α1,…,αn):- q1(β1,…,βk),…,qm(βs,…,βh) • Θα δούμε ότι μπορεί να μετατραπεί σε μια έκφραση της μορφής Expr(Q1,…,Qm) P • Με Qi (κεφαλαία γράμματα) αναφερόμαστε στον πίνακα που αντιστοιχεί στο predicate qi.
Αλγόριθμος Datalog2RA(C) INPUT: a clause C LHS :- RHS of the form p(α1,…,αn):- q1(β1,…,βk),…,qm(βs,…,βh) OUTPUT: μια έκφραση Expr(Q1,…,Qm) με τους πίνακες που αντιστοιχούν στα predicates του clause BEGIN εφάρμοσε τον κανόνα R1 στο C END R2(C) BEGIN • Για κάθεσταθερή τιμή αστο body, στη θέση $i πρόσθεσε μια επιλογήσ$i=α αντικαθιστώντας το α με μια dummy μεταβλητή • Για κάθε μεταβλητή Yπου συναντάται 2 φορές στο body, στις θέσεις $i,$j πρόσθεσε μια επιλογήσ$i=$jαντικαθιστώντας το Y σε μία εκ των δύο θέσεων,με μια dummy μεταβλητή Χ ; • Μετέτρεψε τον κανόνα σεi=1..mQi; • Σπρώξε τα EQ στις επιλογές όπου γίνεται; • Γράψε την έκφραση ως Expr(Q1,…,Qm) P END R1(C) BEGIN • Για κάθεσταθερή τιμή αστο head, φτιάξε μια dummy μεταβλητή Χ, βάλτη στη θέση της α, και πρόσθεσε eq(X,α) στο body ; • RETURN πpos(1),…,pos(n) R2(RHS) END
Παράδειγμα p(X,X,Z) :- s(X,Y), r(Y,a,Z) R1:π$1,$1,$5R2[s(X,Y), r(Y,a,Z)] $1$2 $3 $4 $5 R2: π$1,$1,$5σ$4=α$2=$3R2[s(Ν1,Ν2),r(Y,Ν4,Z)] R2: π$1,$1,$5σ$4=α$2=$3(S R) R2: π$1,$1,$5σ$4=αR2[S $2=$1 R] π$1,$1,$5σ$4=α(S $2=$1 R) P
Παράδειγμα p(b,X,Z) :- s(X,Y), r(Y,a,Z) R1: p(N,X,Z) :- s(X,Y), r(Y,a,Z),eq(N,b) R1:π$6,$1,$5R2[s(X,Y), r(Y,a,Z) ,eq(N,b)] R2:π$6,$1,$5σ$4=α$2=$3R2[s(Ν1,Ν2),r(Y,Ν4,Z),eq(N,b)] R2: π$6,$1,$5σ$4=α$2=$3(S R EQ) R2: π’b’,$1,$5σ$4=αR2[S $2=$1 R] π’b’,$1,$5σ$4=α(S $2=$1 R) P
Datalog -> Σχεσιακή Άλγεβρα • Στο τέλος, όλες οι εκφράσεις που αφορούν το ίδιο predicate P Expri(Q1,…,Qm) P ενσωματώνονται σε μία αλγεβρική έκφραση P = Expr1(Q1,…,Qm)…Exprs(Q1,…,Qm) • Η εν λόγω έκφραση λέει ότι το σύνολο των facts του P που μας αφορούν είναι ακριβώς και μόνο εκείνα που παράγονται από το πρόγραμμά μας.
Datalog -> Σχεσιακή Άλγεβρα • Παρατηρήστε επίσης ότι ΔΕΝ χρησιμοποιήσαμε τον αλγεβρικό τελεστή αφαίρεσης για να περιγράψουμε το τυχαίο πρόγραμμα Datalog. • Η σχεσιακή άλγεβρα χωρίς αφαίρεση ονομάζεται positive relational algebra -- RA+και αποδεικνύεται ότι είναι ισοδύναμη με την Datalog χωρίς αναδρομή και χωρίς άρνηση
Datalog & Σχεσιακή Άλγεβρα • Ε=Ε1-Ε2. Όταν θα εισάγουμε την άρνηση στην Datalog θα μπορούμε να γράψουμε: e(X1,…,Xn):- e1(X1,…,Xn),e2(X1,…,Xn)
Μέθοδοι Αποτίμησης • Απλοϊκή (Naïve) • Ημι-απλοϊκή (Semi-Naïve) • Ερώτηση – Υποερώτηση (Query-Subquery) • Μαγικά Σύνολα (Magic Sets)
Naïve Evaluation Strategy • Η απλοϊκή μέθοδος είναι μια bottom-up παραλλαγή του υποδειγματικού τρόπου παραγωγής που εξετάσαμε την προηγούμενη φορά • Υπάρχουν δύο βαριάντες, η Jacobi και η Gauss-Seidel • Για επανάληψη δίνουμε και τον γενικό αλγόριθμο bottom-up υπολογισμού, που είχαμε πει...
Αλγόριθμος Infer(S) INPUT: ένα πεπερασμένο σύνολο S από rules και ground facts OUTPUT: όλα τα ground facts που παράγονται από την εφαρμογή του EP, ήτοι, το cons(S) [ΠΡΟΣΟΧΗ: όχι σε ένα βήμα, αλλά όλα] BEGIN old {} ; new S ; WHILE new old DO { old new ; new new INFER1(new); } RETURN all ground facts of new END
Αλγόριθμος Jacobi(S) INPUT: ένα πεπερασμένο σύνολο S από rules και ground facts (EDB) OUTPUT: όλα τα ground facts που αντιστοιχούν στα predicates του SR1,…,Rn BEGIN FOR i := 1 TO n DO Ri={}; DO{ cond true; FOR i := 1 TO n DO Roldi=Ri; FOR i := 1 TO n DO{ Ri = evaluate Ri over [Rold1,…, Roldn] IF Roldi!=Ri THEN cond false } } WHILE cond != true; FOR i := 1 TO n DO RETURN(Ri); END
Αλγόριθμος Jacobi(S) • Ο αλγόριθμος κάθε φορά έχει μια κατάσταση, η οποία αποτελείται από τις εγγραφές που υπολογίσαμε για κάθε Ri • Σε κάθε iteration, έστω k, του αλγόριθμου (μέσα στο DO..WHILE) οι νέες τιμές για το predicate Ri προκύπτουν από • το πρόγραμμα, • το EDBκαι • τις τιμές των όλων των Rj στο προηγούμενο iteration (για j από 1ως n), τις οποίες και έχουμε κρατήσειστα Roldj • Ο αλγόριθμος σταματά όταν Roldi = Ri (ήτοι, δεν παρήχθησαν νέα facts) για όλα τα Ri
1o Παράδειγμα • R1: anc(X,Y) :- par(X,Y) • R2: anc(X,Y) :- anc(X,Z),par(Z,Y) EDB • par(δευκαλίων,έλλην) par(έλλην,ξούθος) • par(έλλην,δώρος) par(ξούθος,αχαιός) • par(έλλην,αίολος) par(ξούθος,ίων)
1o Παράδειγμα • 1ο iteration (Anc1είναι το Ri = ότι έχουμε στην ΕDB) • Anc1 = { (δευκαλίων,έλλην), (έλλην,αίολος), (έλλην,δώρος), (έλλην,ξούθος),(ξούθος,αχαιός), (ξούθος,ίων)} • 2ο iteration (Roldi = Anc1και παράγουμε …) • Anc2 = Anc1{(δευκαλίων,αίολος), (δευκαλίων,δώρος), (δευκαλίων,ξούθος), (έλλην,αχαιός),(έλλην,ίων)} • 3ο iteration • Anc3 =Anc2{(δευκαλίων,αχαιός), (δευκαλίων,ίων)} • 4ο iteration(όπου σταματάμε) • Anc4 =Anc3
2o Παράδειγμα (Same Generation “Cousins”) • R1: sgc(X,Y) :- eq(X,Y) • R2: sgc(X,Y) :- par(X,X1),sgc(X1,Y1),par(Y,Y1) • G1: ? – sgc(δώρος,Χ) EDB: par και eq • eq(α,β) έχει το ρόλο της ισότητας, π.χ., eq(ίων,ίων) μακεδνός θυία δευκαλίων δώρος έλλην αχαιός ξούθος ίων αίολος
2o Παράδειγμα (Same Generation “Cousins”) • Πρώτα θα υπολογίσουμε όλα τα παραγόμενα facts από το παραπάνω πρόγραμμα • Μετά θα απαντήσουμε και τον goal που ρωτάει για τους συγγενείς ίδιας γενιάς του Δώρου
2o Παράδειγμα • 1ο iteration (Sgc1είναι το Ri = ότι έχουμε στην ΕDB) • Sgc1 = { (δευκαλίων, δευκαλίων), (έλλην, έλλην), …, (ίων,ίων)} • G1 = {} • 2ο iteration (Roldi = Sgc1και παράγουμεαδέρφια) • Sgc2 = Sgc1{(θυία,έλλην), (έλλην, θυία),(δώρος,αίολος), (αίολος,δώρος),(δώρος,ξούθος), (ξούθος,δώρος),(αίολος,ξούθος), (ξούθος,αίολος),(αχαιός,ίων),(ίων,αχαιός)} • G1 = {} • Ήδη παρατηρούμε (α) τις διπλοεγγραφές και (β) ότι ενώ ήδη θα μπορούσαμε να έχουμε απαντήσεις στην ερώτησή μας, πρέπει να περιμένουμε να τρέξουν όλοι οι κανόνες
2o Παράδειγμα • 3ο iteration (Roldi = Sgc2και παράγουμεξαδέρφια) • Sgc3 = Sgc2{(δώρος,μακεδνός), (μακεδνός,δώρος), (μακεδνός,ξούθος), (ξούθος,μακεδνός),(αίολος,μακεδνός), (μακεδνός,αίολος)} • G1 = {} • 4ο iteration (σταματάμε) • Sgc4 = Sgc3 • G1 = {ότι κάνει unify με το sgc(δώρος,Χ)} = {(δώρος,δώρος), (δώρος,αίολος), (δώρος,ξούθος), (δώρος,μακεδνός)}
Αλγόριθμος Gauss-Seidel(S) INPUT: ένα πεπερασμένο σύνολο S από rules και ground facts (EDB) OUTPUT: όλα τα ground facts που αντιστοιχούν στα predicates του SR1,…,Rn BEGIN FOR i := 1 TO n DO Ri={}; DO{ cond true; FOR i := 1 TO n DO{ Roldi=Ri; Ri = evaluate Ri over [R1,…, Ri-1, Roldi …, Roldn] IF Roldi!=Ri THEN cond false } } WHILE cond != true; FOR i := 1 TO n DO RETURN(Ri); END
Αλγόριθμος Gauss-Seidel(S) • Λίγο πιο έξυπνος από τον Jacobi. • Σε κάθε iteration, έστω k, του αλγόριθμου (μέσα στο DO..WHILE) οι νέες τιμές για το predicate Ri προκύπτουν από • το πρόγραμμα, • το EDBκαι • τιςνέες τιμές των Rj που υπολογίσαμε στο τρέχονiteration (για j από 1ως i-1), τις οποίες και έχουμε κρατήσει στα Rj • τις τιμές των Rj στο προηγούμενοiteration (για j από i ως n), τις οποίες και έχουμε κρατήσειστα Roldj • Ο αλγόριθμος σταματά όταν Roldi = Ri (ήτοι, δεν παρήχθησαν νέα facts) για όλα τα Ri
Κατηγοριοποίηση των κανόνων Datalog • Έστω ένα πρόγραμμα Datalog P όπου ο κάθε κανόνας είναι της μορφής : p(α1,…,αn):- q1(β1,…,βk),…,qm(βs,…,βh) • ΈστωXP=(p1,…,pr)το σύνολο των IDB predicates του P. • Θα δώσουμε χαρακτηρισμούς για τα διάφορα predicates, κανόνες και το πρόγραμμα, οι οποίοι είναι απαραίτητοι στη συνέχεια.
Γράφος εξάρτησης • Ο γράφος εξάρτησης (dependency graph) του P είναι ένα κατευθυνόμενος γράφος GP=<Ν,Ε> του οποίου • Οι κόμβοι Nείναι τα predicates του IDB, ήτοιpiXP • Μια ακμή eEορίζεται ως εξής: e=<pi,pj>,τ.ώ.,pjεμφανίζεται στο body ενός από τους rules που ορίζουν τοpi (η ακμή έχει φοράhead -> body)
Παράδειγμα • Έστω το παρακάτω παράδειγμα, όπου τα piανήκουν στο IDBκαι τα ciανήκουν στο EDB. • p1(X,Y) :- c1(X,Y) • p1(X,Y) :- p1(X,Z),p3(Z,Y) • p1(X,Y) :- p2(X,Y) • p2(X,Y) :- c3(X,Y) • p2(X,Y) :- p1(X,Z),p3(Z,Y) • p3(X,Y) :- c4(X,Y) • p3(X,Y) :- p3(X,Z),c2(Z,Y)
Παράδειγμα • Οι κόμβοι ανήκουν ΜΟΝΟ στο IDBκαι οι ακμές κατευθύνονται από το head προς το body. • p1(X,Y) :- c1(X,Y) • p1(X,Y) :- p1(X,Z),p3(Z,Y) • p1(X,Y) :- p2(X,Y) • p2(X,Y) :- c3(X,Y) • p2(X,Y) :- p1(X,Z),p3(Z,Y) • p3(X,Y) :- c4(X,Y) • p3(X,Y) :- p3(X,Z),c2(Z,Y) p1 p2 p3
Παράδειγμα – Elmasri & Navathe • Στο βιβλίο, οι κόμβοι ανήκουν ΚΑΙ στο ΕDB. Ο γράφος αλλάζει, αλλά όχι ουσιαστικά. • p1(X,Y) :- c1(X,Y) • p1(X,Y) :- p1(X,Z),p3(Z,Y) • p1(X,Y) :- p2(X,Y) • p2(X,Y) :- c3(X,Y) • p2(X,Y) :- p1(X,Z),p3(Z,Y) • p3(X,Y) :- c4(X,Y) • p3(X,Y) :- p3(X,Z),c2(Z,Y) p1 c1 p2 p3 c2 c4 c3
Αναδρομικοί κανόνες • Ένας κανόνας p(α1,…,αn):- q1(β1,…,βk),…,qm(βs,…,βh) είναι αναδρομικός (recursive) αν έστω και ένα από τα qi είναι το p. • Π.χ., • O anc(X,Y) :-anc(X,Z),par(Z,Y) είναι αναδρομικός, ενώ • ο aunt(X,Z):- par(X,Y),sister(Y,Z) δεν είναι.
Αναδρομικό πρόγραμμα • Ένα πρόγραμμα είναι αναδρομικό αν ο γράφος εξάρτησης περιέχει έστω και ένα κύκλο • Προφανώς, αν έστω και ένας από τους κανόνες είναι αναδρομικός, έχω αυτόματα κύκλο. • Μπορώ κάλλιστα, όμως, να έχω μη αναδρομικούς κανόνες και αναδρομικό πρόγραμμα
Παράδειγμα • Οι κόμβοι p,r,w αντιστοιχούν σε predicates του IDB-- οι υπόλοιποι σε predicates του EDB. • p(X,Y) :- r(X,Z),t(X,X) • p(X,Y) :- w(X,Y) • r(X,Y) :- t(X,Y) • r(X,Y) :- s(W,X),p(W,Y) • w(X,Y) :- s(W,X),t(Z,Y) p r w
Αναδρομικά predicates • Ένα predicate είναι αναδρομικό αν ο κόμβος που το αναπαριστά περιέχεται έστω και σε ένα κύκλο • Δύο predicates είναι αμοιβαία αναδρομικά (mutually recursive) αν οι κόμβοι που τα αναπαριστούν περιέχονται στον ίδιο κύκλο • Π.χ., στο προηγούμενο παράδειγμα, ταp και rείναι αμοιβαία αναδρομικά, ενώ το wδεν είναι αναδρομικό
Γραμμικοί κανόνες • Ένας κανόνας p(α1,…,αn):- q1(β1,…,βk),…,qm(βs,…,βh) είναι γραμμικός (linear) σε σχέση με το qi ανυπάρχει το πολύ μία εμφάνιση του qi στο body. • Π.χ., • O anc(X,Y) :-anc(X,Z),par(Z,Y) είναι γραμμικόςσε σχέση με το anc, ενώ • ο anc(X,Z):- anc(X,Y),anc(Y,Z) δεν είναι.
Γραμμικοί κανόνες • Ένας κανόνας p(α1,…,αn):- q1(β1,…,βk),…,qm(βs,…,βh) είναι γραμμικός (linear) ανυπάρχει το πολύ ένα qi στο body που να είναι αμοιβαία αναδρομικό με το p. • Δεν απαγορεύεται τοp να είναι αμοιβαία αναδρομικό με τον εαυτό του (ήτοι, το pνα εμφανίζεται και στο body).
Γραμμικοί κανόνες • Κάποιοι κανόνες μπορεί να είναι και γραμμικοί και αναδρομικοί • Π.χ., • O anc(X,Y) :-anc(X,Z),par(Z,Y) είναι γραμμικόςσε σχέση με το anc, αλλά και αναδρομικός • ο anc(X,Z):- anc(X,Y),anc(Y,Z) είναι εμφανώς αναδρομικός, αλλά δεν είναι γραμμικός.
Γραμμικά προγράμματα • Ένα πρόγραμμα είναι γραμμικό αν όλοι του οι κανόνες είναι γραμμικοί
Παράδειγμα • Έστω το παρακάτω παράδειγμα, όπου τα piανήκουν στο IDBκαι τα ciανήκουν στο EDB. • p1(X,Y) :- c1(X,Y) • p1(X,Y) :- p1(X,Z),p3(Z,Y) • p1(X,Y) :- p2(X,Y) • p2(X,Y) :- c3(X,Y) • p2(X,Y) :- p1(X,Z),p3(Z,Y) • p3(X,Y) :- p1(X,Y) • p3(X,Y) :- p3(X,Z),c2(Z,Y)
Παράδειγμα – dependency graph • Οι κόμβοι ανήκουν ΜΟΝΟ στο IDBκαι οι ακμές κατευθύνονται από το head προς το body. • p1(X,Y) :- c1(X,Y) • p1(X,Y) :- p1(X,Z),p3(Z,Y) • p1(X,Y) :- p2(X,Y) • p2(X,Y) :- c3(X,Y) • p2(X,Y) :- p1(X,Z),p3(Z,Y) • p3(X,Y) :- p1(X,Y) • p3(X,Y) :- p3(X,Z),c2(Z,Y) p1 p2 p3
Παράδειγμα – παρατηρήσεις • Οι p1,p2,p3 είναι αμοιβαία αναδρομικοί: ανήκουν στον κύκλο p2->p3->p1->p2 • Όντες αμοιβαία αναδρομικοί είναι και αναδρομικοί, προφανώς. • Όλοι οι κανόνες είναι γραμμικοί για κάθε predicate ξεχωριστά (κάθε predicate εμφανίζεται το πολύ μία φορά ανά κανόνα) • p1(X,Y) :- c1(X,Y) • p1(X,Y) :- p1(X,Z),p3(Z,Y) • p1(X,Y) :- p2(X,Y) • p2(X,Y) :- c3(X,Y) • p2(X,Y) :- p1(X,Z),p3(Z,Y) • p3(X,Y) :- p1(X,Y) • p3(X,Y) :- p3(X,Z),c2(Z,Y) p1 p2 p3
Παράδειγμα – παρατηρήσεις • Ο κανόνας 2 ΔΕΝ είναι γραμμικός: και το p1και το p3είναι αμοιβαία αναδρομικά με το p1του head • Ο κανόνας 5 ΔΕΝ είναι γραμμικός: και το p1και το p3είναι αμοιβαία αναδρομικά με το p2του head • Κατά συνέπεια, το πρόγραμμα ΔΕΝ είναι γραμμικό • p1(X,Y) :- c1(X,Y) • p1(X,Y) :- p1(X,Z),p3(Z,Y) • p1(X,Y) :- p2(X,Y) • p2(X,Y) :- c3(X,Y) • p2(X,Y) :- p1(X,Z),p3(Z,Y) • p3(X,Y) :- p1(X,Y) • p3(X,Y) :- p3(X,Z),c2(Z,Y) p1 p2 p3
Ημι-απλοϊκή μέθοδος αποτίμησης • Η ημι-απλοϊκή (semi-naïve) μέθοδος είναι μια bottom-up παραλλαγή του naïve τρόπου παραγωγής, με σκοπό να αποφύγει την επανάληψη της παραγωγής των ίδιων facts περισσότερες από μία φορές. • Θυμηθείτε λίγο την εκτέλεση της Jacobi μεθόδου...
1ο iteration (Anc1είναι το Ri = ότι έχουμε στην ΕDB) Anc1 = { (δευκαλίων,έλλην), (έλλην,αίολος), (έλλην,δώρος), (έλλην,ξούθος),(ξούθος,αχαιός), (ξούθος,ίων)} 2ο iteration (Roldi = Anc1και παράγουμε...) Anc2 = Anc1{(δευκαλίων,αίολος), (δευκαλίων,δώρος), (δευκαλίων,ξούθος), (έλλην,αχαιός),(έλλην,ίων)} 3ο iteration Anc3 =Anc2{(δευκαλίων,αχαιός), (δευκαλίων,ίων)} R1: anc(X,Y) :- par(X,Y) R2: anc(X,Y) :- anc(X,Z),par(Z,Y) EDB par(δευκαλίων,έλλην) par(έλλην,ξούθος) par(έλλην,δώρος) par(ξούθος,αχαιός) par(έλλην,αίολος) par(ξούθος,ίων) Ημι-απλοϊκή μέθοδος αποτίμησης