Introducing PRSs and Drools (in Italian)
-
Upload
stefano-bragaglia -
Category
Education
-
view
411 -
download
2
description
Transcript of Introducing PRSs and Drools (in Italian)
Sistemi a Regole di Produzione
Stefano Bragaglia
Fondamen( di Intelligenza Ar(ficiale M 4 Giugno 2013
Sommario
1. Sistemi a regole 2. Sistemi a regole di produzione • JBoss Drools • Un caso d’uso
3. Pa9ern matching: l’algoritmo RETE 4. Risoluzione dei confliC & Esecuzione 5. RiferimenF 6. Informazioni
4 Giugno 2013 Sistemi a Regole di Produzione 2
SISTEMI A REGOLE FondamenF di Intelligenza ArFficiale M
Sistemi a Regole
• Le regole sono il principale modo di esprimere la conoscenza in molF campi dell’I.A.
• I Fpi di regole più comuni sono: – i programmi logici (es.: Prolog) – le regole di produzione (es.: Drools)
• Entrambi i Fpi sono molto comuni, basate su principi simili ma realizzate in modo duale
4 Giugno 2013 Sistemi a Regole di Produzione 4
Sistemi a Regole • Il Modus Ponens, anche de9o Principio di disgiunzione,
Affermazione dell’antecedente o Ragionamento direFo, prevede che:
se è vero che p(X) implica q(Y) e p(x) è vero, allora q(y) è ugualmente vero
• Es.: Se piove, allora la strada si bagna. Qui piove. Dunque questa strada è bagnata.
q(y)
, p(x) p(X) q(Y)
4 Giugno 2013 Sistemi a Regole di Produzione 5
Sistemi a Regole • Il Modus Ponens, anche de9o Principio di disgiunzione,
Affermazione dell’antecedente o Ragionamento direFo, prevede che:
se è vero che p(X) implica q(Y) e p(x) è vero, allora q(y) è ugualmente vero
• Es.: Se piove, allora la strada si bagna. implicazione Qui piove. premessa Dunque questa strada è bagnata. conseguenza
implicazione premessa
conseguenza q(y)
, p(x) p(X) q(Y)
4 Giugno 2013 Sistemi a Regole di Produzione 6
Sistemi a Regole
Programmi logici • Backward-‐chaining • Dal goal ai faC, applicando le regole all’indietro
• Generalmente conservaFvi
• Unificazione • Backtracking
Regole di produzione • Forward-‐chaining • I faC aCvano le regole che generano nuovi faC
• Potenzialmente distruCve
• Pa9ern matching • Parallelismo
4 Giugno 2013 Sistemi a Regole di Produzione 7
Sistemi a Regole
Programmi logici Regole di produzione
4 Giugno 2013 Sistemi a Regole di Produzione 8
Sistemi a Regole
Programmi logici Regole di produzione
4 Giugno 2013 Sistemi a Regole di Produzione 9
Sistemi a Regole
Programmi logici Regole di produzione
4 Giugno 2013 Sistemi a Regole di Produzione 10
Sistemi a Regole
Programmi logici Regole di produzione
4 Giugno 2013 Sistemi a Regole di Produzione 11
Sistemi a Regole
Programmi logici Regole di produzione
4 Giugno 2013 Sistemi a Regole di Produzione 12
Sistemi a Regole
Programmi logici Regole di produzione
4 Giugno 2013 Sistemi a Regole di Produzione 13
Sistemi a Regole
Programmi logici Regole di produzione
4 Giugno 2013 Sistemi a Regole di Produzione 14
SISTEMI A REGOLE DI PRODUZIONE FondamenF di Intelligenza ArFficiale M
Sistemi a Regole di Produzione
• I sistemi a regole di produzione, o ProducCon Rule Systems (PRS): – sono sistemi a regole, Rule Based Systems (RBS), – basaF sul principio deduCvo del Modus Ponens, – che ado9ano un approccio reaHvo/generaCvo.
4 Giugno 2013 Sistemi a Regole di Produzione 16
Sistemi a Regole di Produzione
Agenda
PM
WM
Pattern Matching!
Conflict Resolution! Execution!
Patterns "+ Actions!
triples "(now beans)!
Output!
Productions:!a
1 2 3
Facts:!
Schema archite9urale e principio di funzionamento
4 Giugno 2013 Sistemi a Regole di Produzione 17
Sistemi a Regole di Produzione
Agenda
PM
WM
Pattern Matching!
Conflict Resolution! Execution!
Patterns "+ Actions!
triples "(now beans)!
Output!
Productions:!a
1 2 3
Facts:!
ELABORAZIONE SUDDIVISA IN 3 STADI
Schema archite9urale e principio di funzionamento
4 Giugno 2013 Sistemi a Regole di Produzione 18
Sistemi a Regole di Produzione
Agenda
PM
WM
Pattern Matching!
Conflict Resolution! Execution!
Patterns "+ Actions!
triples "(now beans)!
Output!
Productions:!a
1 2 3
Facts:!
ELABORAZIONE SUDDIVISA IN 3 STADI
3 MEMORIE
Schema archite9urale e principio di funzionamento
4 Giugno 2013 Sistemi a Regole di Produzione 19
JBOSS DROOLS FondamenF di Intelligenza ArFficiale M
JBoss Drools
Expert (rule engine) Fusion (event processing) jBPM (workflow) Guvnor (rule repo)
Planner (constraints)
• AlternaCve – OPS5, CLIPS, Jess, ILOG, Jrules, BizTalk, …
• Sistema di riferimento – JBoss Drools (h9p://www.jboss.org/drools)
• Perchè? – Open source, Java-‐based, integrato con Eclipse
• Parte di una piaRaforma integrata
4 Giugno 2013 Sistemi a Regole di Produzione 21
JBoss Drools
Expert (rule engine) Fusion (event processing) jBPM (workflow) Guvnor (rule repo)
Planner (constraints)
• AlternaCve – OPS5, CLIPS, Jess, ILOG, Jrules, BizTalk, …
• Sistema di riferimento – JBoss Drools (h9p://www.jboss.org/drools)
• Perchè? – Open source, Java-‐based, integrato con Eclipse
• Parte di una piaRaforma integrata
4 Giugno 2013 Sistemi a Regole di Produzione 22
JBoss Drools • Sintassi del linguaggio Drools: regole rule "ID_regola" /* IMPLICAZIONE */ // attributi when /* premessa */ // pattern (composito) then /* conseguenza */ // azioni logiche // effetti collaterali end
4 Giugno 2013 Sistemi a Regole di Produzione 23
JBoss Drools • Sintassi del linguaggio Drools: regole rule "Cancella gli Stefano" /* IMPLICAZIONE */ salience 5 when /* premessa */ $p: Person ( name == "Stefano" ) then /* conseguenza */ retract($p); System.out.println($p); end
4 Giugno 2013 Sistemi a Regole di Produzione 24
JBoss Drools • Sintassi del linguaggio Drools: queries query "ID_query" /* premessa */ // pattern (composito) end
4 Giugno 2013 Sistemi a Regole di Produzione 25
JBoss Drools • Sintassi del linguaggio Drools: queries query "Trova gli Stefano" /* premessa */ $p: Person ( name == "Stefano" ) end
4 Giugno 2013 Sistemi a Regole di Produzione 26
JBoss Drools • Sintassi del linguaggio Drools: oggeH declare ID_Class /* dichiarazione */ // dichiarazione di campo // dichiarazione di campo end
4 Giugno 2013 Sistemi a Regole di Produzione 27
JBoss Drools • Sintassi del linguaggio Drools: oggeH declare Person /* dichiarazione */ name: String address: Address = new Address(...) end
Person -‐ name: String -‐ address: Address ...
Address -‐ street: String -‐ zip: long -‐ city: String ...
4 Giugno 2013 Sistemi a Regole di Produzione 28
JBoss Drools • Sintassi del linguaggio Drools: evenC declare ID_Event /* dichiarazione */ // annotazioni // annotazioni // dichiarazioni di campo // dichiarazioni di campo end
4 Giugno 2013 Sistemi a Regole di Produzione 29
JBoss Drools • Sintassi del linguaggio Drools: evenC declare Alarm /* dichiarazione */ @role( event ) @timestamp( time ) message: String time: long end
4 Giugno 2013 Sistemi a Regole di Produzione 30
JBoss Drools
• Sintassi del linguaggio Drools: – Operatori relazionali: == != >= > <= < – Operatori logici: && , || – Negazione: not – Operatori funzionali: min, max, count, accumulate – Dot notaCon: name == "…" o $p.getName().equals("…")
4 Giugno 2013 Sistemi a Regole di Produzione 31
JBoss Drools • Caso d’uso: sistema marcatempo aziendale – Ogni dipendente ha un badge con RFID – Quando passa a9raverso un gate, la WM riceve un evento “passed” (marcato temporalmente) a9raverso l’entry-‐point corrispondente al dipendente • Filtrando il primo e l’ulFmo evento “passed” di ogni giorno per ogni dipendente, si determina quante ore ha lavorato
• Se non ci sono evenF “passed” per un dato dipendente in un dato giorno e non è in vacanza/malato, allora è assente
• Accumulando il numero di ore lavorate in un mese da un dipendente si può calcolare in proporzione la sua busta paga
• Sapendo che un dipendente è assegnato a un proge9o, l’azienda può calcolare i mesi/uomo dedicaF a quel proge9o
4 Giugno 2013 Sistemi a Regole di Produzione 32
PATTERN MATCHING: L’ALGORITMO RETE
FondamenF di Intelligenza ArFficiale M
1A REGOLA DI ESEMPIO Pa9ern Matching: l’algoritmo RETE
4 Giugno 2013 Sistemi a Regole di Produzione 34
rule "Trova gli Stefano" when $p: Person( name == "Stefano" ) then System.out.println($p); end
Pa9ern matching: l’algoritmo RETE Root node
Entry Point nodes
4 Giugno 2013 Sistemi a Regole di Produzione 35
rule "Trova gli Stefano" when $p: Person( name == "Stefano" ) then System.out.println($p); end
Pa9ern matching: l’algoritmo RETE Root node
Entry Point nodes
Object Type nodes
4 Giugno 2013 Sistemi a Regole di Produzione 36
rule "Trova gli Stefano" when $p: Person( name == "Stefano" ) then System.out.println($p); end
Pa9ern matching: l’algoritmo RETE Root node
Entry Point nodes
Object Type nodes
Alfa nodes
4 Giugno 2013 Sistemi a Regole di Produzione 37
rule "Trova gli Stefano" when $p: Person( name == "Stefano" ) then System.out.println($p); end
Pa9ern matching: l’algoritmo RETE Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Memory nodes
4 Giugno 2013 Sistemi a Regole di Produzione 38
rule "Trova gli Stefano" when $p: Person( name == "Stefano" ) then System.out.println($p); end
Pa9ern matching: l’algoritmo RETE Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Memory nodes
NB: I faH contenuC in un (Alfa) Memory Node fanno match con un paRern semplice!
4 Giugno 2013 Sistemi a Regole di Produzione 39
rule "Trova gli Stefano" when $p: Person( name == "Stefano" ) then System.out.println($p); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Memory nodes
4 Giugno 2013 Sistemi a Regole di Produzione 40
rule "Trova gli Stefano" when $p: Person( name == "Stefano" ) then System.out.println($p); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
ALFA
NETWORK
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Memory nodes
4 Giugno 2013 Sistemi a Regole di Produzione 41
rule "Trova gli Stefano" when $p: Person( name == "Stefano" ) then System.out.println($p); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
ALFA
NETWORK
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Memory nodes
4 Giugno 2013 Sistemi a Regole di Produzione 42
rule "Trova gli Stefano" when $p: Person( name == "Stefano" ) then System.out.println($p); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
ALFA
NETWORK
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Memory nodes
_ Person[Stefano, <null>] Person[Stefano, Address[Via Po 2, 40068, San Lazzaro]]
WM
p1: Person("Stefano", null) a1: Address("Via Po 2", 40068, ���
"San Lazzaro") p2: Person("Stefano", a1) p3: Person("Giacomo", a1)
4 Giugno 2013 Sistemi a Regole di Produzione 43
rule "Trova gli Stefano" when $p: Person( name == "Stefano" ) then System.out.println($p); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
ALFA
NETWORK
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Memory nodes p1
Person[Stefano, <null>] _ Person[Stefano, Address[Via Po 2, 40068, San Lazzaro]]
WM
p1: Person("Stefano", null) a1: Address("Via Po 2", 40068, ���
"San Lazzaro") p2: Person("Stefano", a1) p3: Person("Giacomo", a1)
4 Giugno 2013 Sistemi a Regole di Produzione 44
rule "Trova gli Stefano" when $p: Person( name == "Stefano" ) then System.out.println($p); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
ALFA
NETWORK
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Memory nodes p1
Person[Stefano, <null>] _ Person[Stefano, Address[Via Po 2, 40068, San Lazzaro]]
WM
p1: Person("Stefano", null) a1: Address("Via Po 2", 40068, ���
"San Lazzaro") p2: Person("Stefano", a1) p3: Person("Giacomo", a1)
4 Giugno 2013 Sistemi a Regole di Produzione 45
rule "Trova gli Stefano" when $p: Person( name == "Stefano" ) then System.out.println($p); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
ALFA
NETWORK
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Memory nodes p1, p2
Person[Stefano, <null>] Person[Stefano, Address[Via Po 2, 40068, San Lazzaro]] _
WM
p1: Person("Stefano", null) a1: Address("Via Po 2", 40068, ���
"San Lazzaro") p2: Person("Stefano", a1) p3: Person("Giacomo", a1)
4 Giugno 2013 Sistemi a Regole di Produzione 46
rule "Trova gli Stefano" when $p: Person( name == "Stefano" ) then System.out.println($p); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
ALFA
NETWORK
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Person[Stefano, <null>] Person[Stefano, Address[Via Po 2, 40068, San Lazzaro]] _
WM Memory nodes
p1: Person("Stefano", null) a1: Address("Via Po 2", 40068, ���
"San Lazzaro") p2: Person("Stefano", a1) p3: Person("Giacomo", a1) p1, p2
4 Giugno 2013 Sistemi a Regole di Produzione 47
2A REGOLA DI ESEMPIO Pa9ern Matching: l’algoritmo RETE
4 Giugno 2013 Sistemi a Regole di Produzione 48
rule "Trova gli Stefano e indirizzi" when $a: Address() $p: Person( name == "Stefano" ) then System.out.println($p+"/"+$a+" "); end
Pa9ern matching: l’algoritmo RETE Root node
Entry Point nodes
4 Giugno 2013 Sistemi a Regole di Produzione 49
rule "Trova gli Stefano e indirizzi" when $a: Address() $p: Person( name == "Stefano" ) then System.out.println($p+"/"+$a+" "); end
Pa9ern matching: l’algoritmo RETE Root node
Entry Point nodes
Object Type nodes
4 Giugno 2013 Sistemi a Regole di Produzione 50
rule "Trova gli Stefano e indirizzi" when $a: Address() $p: Person( name == "Stefano" ) then System.out.println($p+"/"+$a+" "); end
Pa9ern matching: l’algoritmo RETE Root node
Entry Point nodes
Object Type nodes
Memory nodes
4 Giugno 2013 Sistemi a Regole di Produzione 51
rule "Trova gli Stefano e indirizzi" when $a: Address() $p: Person( name == "Stefano" ) then System.out.println($p+"/"+$a+" "); end
Pa9ern matching: l’algoritmo RETE Root node
Entry Point nodes
Object Type nodes
Memory nodes
4 Giugno 2013 Sistemi a Regole di Produzione 52
rule "Trova gli Stefano e indirizzi" when $a: Address() $p: Person( name == "Stefano" ) then System.out.println($p+"/"+$a+" "); end
Pa9ern matching: l’algoritmo RETE Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Memory nodes
4 Giugno 2013 Sistemi a Regole di Produzione 53
rule "Trova gli Stefano e indirizzi" when $a: Address() $p: Person( name == "Stefano" ) then System.out.println($p+"/"+$a+" "); end
Pa9ern matching: l’algoritmo RETE Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Memory nodes
4 Giugno 2013 Sistemi a Regole di Produzione 54
rule "Trova gli Stefano e indirizzi" when $a: Address() $p: Person( name == "Stefano" ) then System.out.println($p+"/"+$a+" "); end
Pa9ern matching: l’algoritmo RETE Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Memory nodes
Beta nodes
4 Giugno 2013 Sistemi a Regole di Produzione 55
rule "Trova gli Stefano e indirizzi" when $a: Address() $p: Person( name == "Stefano" ) then System.out.println($p+"/"+$a+" "); end
Pa9ern matching: l’algoritmo RETE Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Memory nodes
Beta nodes
NB: I Beta Nodes fanno il prodoRo cartesiano degli oggeH filtraC dagli Alfa padre!
4 Giugno 2013 Sistemi a Regole di Produzione 56
rule "Trova gli Stefano e indirizzi" when $a: Address() $p: Person( name == "Stefano" ) then System.out.println($p+"/"+$a+" "); end
Pa9ern matching: l’algoritmo RETE
Memory nodes
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Memory nodes
Beta nodes
4 Giugno 2013 Sistemi a Regole di Produzione 57
rule "Trova gli Stefano e indirizzi" when $a: Address() $p: Person( name == "Stefano" ) then System.out.println($p+"/"+$a+" "); end
Pa9ern matching: l’algoritmo RETE
Memory nodes
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Memory nodes
Beta nodes
NB: Le tuple contenute in un (Beta) Memory Node fanno match con un paRern composito!
4 Giugno 2013 Sistemi a Regole di Produzione 58
rule "Trova gli Stefano e indirizzi" when $a: Address() $p: Person( name == "Stefano" ) then System.out.println($p+"/"+$a+" "); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
Memory nodes
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Memory nodes
Beta nodes
4 Giugno 2013 Sistemi a Regole di Produzione 59
rule "Trova gli Stefano e indirizzi" when $a: Address() $p: Person( name == "Stefano" ) then System.out.println($p+"/"+$a+" "); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
Memory nodes
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Memory nodes
Beta nodes
4 Giugno 2013 Sistemi a Regole di Produzione 60
rule "Trova gli Stefano e indirizzi" when $a: Address() $p: Person( name == "Stefano" ) then System.out.println($p+"/"+$a+" "); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
Memory nodes
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Memory nodes
Beta nodes
NB: Introduco la regola precedente: I nodi della RETE vengono condivisi quando possibile! 4 Giugno 2013 Sistemi a Regole di Produzione 61
rule "Trova gli Stefano e indirizzi" when $a: Address() $p: Person( name == "Stefano" ) then System.out.println($p+"/"+$a+" "); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
Memory nodes
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Memory nodes
Beta nodes
4 Giugno 2013 Sistemi a Regole di Produzione 62
rule "Trova gli Stefano e indirizzi" when $a: Address() $p: Person( name == "Stefano" ) then System.out.println($p+"/"+$a+" "); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
Memory nodes
ALFA
NETWORK
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Memory nodes
Beta nodes
4 Giugno 2013 Sistemi a Regole di Produzione 63
rule "Trova gli Stefano e indirizzi" when $a: Address() $p: Person( name == "Stefano" ) then System.out.println($p+"/"+$a+" "); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
Memory nodes
ALFA
NETWORK
BE
TA
NETWORK
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Memory nodes
Beta nodes
4 Giugno 2013 Sistemi a Regole di Produzione 64
rule "Trova gli Stefano e indirizzi" when $a: Address() $p: Person( name == "Stefano" ) then System.out.println($p+"/"+$a+" "); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
Memory nodes
ALFA
NETWORK
BE
TA
NETWORK
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Memory nodes
Beta nodes
4 Giugno 2013 Sistemi a Regole di Produzione 65
rule "Trova gli Stefano e indirizzi" when $a: Address() $p: Person( name == "Stefano" ) then System.out.println($p+"/"+$a+" "); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
Memory nodes
ALFA
NETWORK
BE
TA
NETWORK
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Memory nodes
Beta nodes
_ Person[p1, -‐]/Address[a1] Person[p1, -‐]/Address[a2] Person[p2, -‐]/Address[a1] Person[p2, a1]/Address[a2]
WM
4 Giugno 2013 Sistemi a Regole di Produzione 66
rule "Trova gli Stefano e indirizzi" when $a: Address() $p: Person( name == "Stefano" ) then System.out.println($p+"/"+$a+" "); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
Memory nodes
ALFA
NETWORK
BE
TA
NETWORK
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Memory nodes
Beta nodes
_ Person[p1, -‐]/Address[a1] Person[p1, -‐]/Address[a2] Person[p2, -‐]/Address[a1] Person[p2, a1]/Address[a2]
WM
a1: Address("Via Po 2", 40068, ��� "San Lazzaro")
p1: Person("Stefano", null) a2: Address("Via Roma 5", 40128, "Bologna") p2: Person("Stefano", a1) p3: Person("Giacomo", a1)
a1���
4 Giugno 2013 Sistemi a Regole di Produzione 67
rule "Trova gli Stefano e indirizzi" when $a: Address() $p: Person( name == "Stefano" ) then System.out.println($p+"/"+$a+" "); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
Memory nodes
ALFA
NETWORK
BE
TA
NETWORK
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Memory nodes
Beta nodes
Person[p1, -‐]/Address[a1] _ Person[p1, -‐]/Address[a2] Person[p2, -‐]/Address[a1] Person[p2, a1]/Address[a2]
WM
a1: Address("Via Po 2", 40068, ��� "San Lazzaro")
p1: Person("Stefano", null) a2: Address("Via Roma 5", 40128, "Bologna") p2: Person("Stefano", a1) p3: Person("Giacomo", a1)
a1
p1
p1-a1
NB: Stampa semplificata e output prima regola omesso! 4 Giugno 2013 Sistemi a Regole di Produzione 68
rule "Trova gli Stefano e indirizzi" when $a: Address() $p: Person( name == "Stefano" ) then System.out.println($p+"/"+$a+" "); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
Memory nodes
ALFA
NETWORK
BE
TA
NETWORK
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Memory nodes
Beta nodes
Person[p1, -‐]/Address[a1] Person[p1, -‐]/Address[a2] _ Person[p2, -‐]/Address[a1] Person[p2, a1]/Address[a2]
WM
a1: Address("Via Po 2", 40068, ��� "San Lazzaro")
p1: Person("Stefano", null) a2: Address("Via Roma 5", 40128, "Bologna") p2: Person("Stefano", a1) p3: Person("Giacomo", a1)
a1���a2
p1
p1-a1 p1-a2���
NB: Stampa semplificata e output prima regola omesso! 4 Giugno 2013 Sistemi a Regole di Produzione 69
rule "Trova gli Stefano e indirizzi" when $a: Address() $p: Person( name == "Stefano" ) then System.out.println($p+"/"+$a+" "); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
Memory nodes
ALFA
NETWORK
BE
TA
NETWORK
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Memory nodes
Beta nodes
Person[p1, -‐]/Address[a1] Person[p1, -‐]/Address[a2] Person[p2, -‐]/Address[a1] Person[p2, a1]/Address[a2] _
WM
a1: Address("Via Po 2", 40068, ��� "San Lazzaro")
p1: Person("Stefano", null) a2: Address("Via Roma 5", 40128, "Bologna") p2: Person("Stefano", a1) p3: Person("Giacomo", a1)
a1���a2
p1���p2
p1-a1 p1-a2���p2-a1 p2-a2
NB: Stampa semplificata e output prima regola omesso! 4 Giugno 2013 Sistemi a Regole di Produzione 70
rule "Trova gli Stefano e indirizzi" when $a: Address() $p: Person( name == "Stefano" ) then System.out.println($p+"/"+$a+" "); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
Memory nodes
ALFA
NETWORK
BE
TA
NETWORK
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Memory nodes
Beta nodes
Person[p1, -‐]/Address[a1] Person[p1, -‐]/Address[a2] Person[p2, -‐]/Address[a1] Person[p2, a1]/Address[a2] _
WM
a1: Address("Via Po 2", 40068, ��� "San Lazzaro")
p1: Person("Stefano", null) a2: Address("Via Roma 5", 40128, "Bologna") p2: Person("Stefano", a1) p3: Person("Giacomo", a1)
a1���a2
p1���p2
p1-a1 p1-a2���p2-a1 p2-a2
NB: Stampa semplificata e output prima regola omesso! 4 Giugno 2013 Sistemi a Regole di Produzione 71
rule "Trova gli Stefano e indirizzi" when $a: Address() $p: Person( name == "Stefano" ) then System.out.println($p+"/"+$a+" "); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
Memory nodes
ALFA
NETWORK
BE
TA
NETWORK
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Memory nodes
Beta nodes
Person[p1, -‐]/Address[a1] Person[p1, -‐]/Address[a2] Person[p2, -‐]/Address[a1] Person[p2, a1]/Address[a2] _
WM
a1: Address("Via Po 2", 40068, ��� "San Lazzaro")
p1: Person("Stefano", null) a2: Address("Via Roma 5", 40128, "Bologna") p2: Person("Stefano", a1) p3: Person("Giacomo", a1)
a1���a2
p1���p2
p1-a1 p1-a2���p2-a1 p2-a2
NB: Stampa semplificata e output prima regola omesso!
NB: WM = insieme delle memories (distribuita); oggeH ripetuC (ricondante): spazio vs tempo. 4 Giugno 2013 Sistemi a Regole di Produzione 72
3A REGOLA DI ESEMPIO Pa9ern Matching: l’algoritmo RETE
4 Giugno 2013 Sistemi a Regole di Produzione 73
rule "Trova Stefano col suo indirizzo" when $a: Address() $p: Person( name == "Stefano", address == $a ) then System.out.println($p); end
Pa9ern matching: l’algoritmo RETE Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Dummy nodes
Memory nodes
4 Giugno 2013 Sistemi a Regole di Produzione 74
rule "Trova Stefano col suo indirizzo" when $a: Address() $p: Person( name == "Stefano", address == $a ) then System.out.println($p); end
Pa9ern matching: l’algoritmo RETE Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Dummy nodes
Memory nodes
NB: Questo Alfa node conCene un riferimento incrociato che non si può ancora risolvere.
4 Giugno 2013 Sistemi a Regole di Produzione 75
rule "Trova Stefano col suo indirizzo" when $a: Address() $p: Person( name == "Stefano", address == $a ) then System.out.println($p); end
Pa9ern matching: l’algoritmo RETE Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Dummy nodes
Memory nodes
Beta nodes
4 Giugno 2013 Sistemi a Regole di Produzione 76
rule "Trova Stefano col suo indirizzo" when $a: Address() $p: Person( name == "Stefano", address == $a ) then System.out.println($p); end
Pa9ern matching: l’algoritmo RETE Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Dummy nodes
Memory nodes
Beta nodes
Delayed nodes
NB: Il precedente Alfa node è inserito qui perchè può risolvere il riferimento incrociato.
4 Giugno 2013 Sistemi a Regole di Produzione 77
rule "Trova Stefano col suo indirizzo" when $a: Address() $p: Person( name == "Stefano", address == $a ) then System.out.println($p); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
Memory nodes
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Dummy nodes
Memory nodes
Beta nodes
Delayed nodes
4 Giugno 2013 Sistemi a Regole di Produzione 78
rule "Trova Stefano col suo indirizzo" when $a: Address() $p: Person( name == "Stefano", address == $a ) then System.out.println($p); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
Memory nodes
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Dummy nodes
Memory nodes
Beta nodes
Delayed nodes
NB: I nodi della RETE vengono condivisi quando possibile! Questa è la prima regola… 4 Giugno 2013 Sistemi a Regole di Produzione 79
rule "Trova Stefano col suo indirizzo" when $a: Address() $p: Person( name == "Stefano", address == $a ) then System.out.println($p); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
Memory nodes
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Dummy nodes
Memory nodes
Beta nodes
Delayed nodes
NB: I nodi della RETE vengono condivisi quando possibile! Questa è la seconda… 4 Giugno 2013 Sistemi a Regole di Produzione 80
rule "Trova Stefano col suo indirizzo" when $a: Address() $p: Person( name == "Stefano", address == $a ) then System.out.println($p); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
Memory nodes
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Dummy nodes
Memory nodes
Beta nodes
Delayed nodes
NB: I nodi della RETE vengono condivisi quando possibile! Questa è l’ulCma regola! 4 Giugno 2013 Sistemi a Regole di Produzione 81
rule "Trova Stefano col suo indirizzo" when $a: Address() $p: Person( name == "Stefano", address == $a ) then System.out.println($p); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
Memory nodes
ALFA
NETWORK
BE
TA NETWORK
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Dummy nodes
Memory nodes
Beta nodes
Delayed nodes
4 Giugno 2013 Sistemi a Regole di Produzione 82
rule "Trova Stefano col suo indirizzo" when $a: Address() $p: Person( name == "Stefano", address == $a ) then System.out.println($p); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
Memory nodes
ALFA
NETWORK
BE
TA NETWORK
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Dummy nodes
Memory nodes
Beta nodes
Delayed nodes
_ Person[Stefano, Address[Via Po 2, 40068, San Lazzaro]]
WM
4 Giugno 2013 Sistemi a Regole di Produzione 83
rule "Trova Stefano col suo indirizzo" when $a: Address() $p: Person( name == "Stefano", address == $a ) then System.out.println($p); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
Memory nodes
ALFA
NETWORK
BE
TA NETWORK
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Dummy nodes
Memory nodes
Beta nodes
Delayed nodes WM
a1: Address("Via Po 2", 40068, ��� "San Lazzaro")
p1: Person("Stefano", null) a2: Address("Via Roma 5", 40128, "Bologna") p2: Person("Stefano", a1) p3: Person("Giacomo", a1)
a1
_ Person[Stefano, Address[Via Po 2, 40068, San Lazzaro]]
4 Giugno 2013 Sistemi a Regole di Produzione 84
rule "Trova Stefano col suo indirizzo" when $a: Address() $p: Person( name == "Stefano", address == $a ) then System.out.println($p); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
Memory nodes
ALFA
NETWORK
BE
TA NETWORK
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Dummy nodes
Memory nodes
Beta nodes
Delayed nodes WM
a1: Address("Via Po 2", 40068, ��� "San Lazzaro")
p1: Person("Stefano", null) a2: Address("Via Roma 5", 40128, "Bologna") p2: Person("Stefano", a1) p3: Person("Giacomo", a1)
a1���
_ Person[Stefano, Address[Via Po 2, 40068, San Lazzaro]]
p1���
NB: L’output delle prime due regole è stato omesso!
p1,a1���
4 Giugno 2013 Sistemi a Regole di Produzione 85
rule "Trova Stefano col suo indirizzo" when $a: Address() $p: Person( name == "Stefano", address == $a ) then System.out.println($p); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
Memory nodes
ALFA
NETWORK
BE
TA NETWORK
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Dummy nodes
Memory nodes
Beta nodes
Delayed nodes WM
a1: Address("Via Po 2", 40068, ��� "San Lazzaro")
p1: Person("Stefano", null) a2: Address("Via Roma 5", 40128, "Bologna") p2: Person("Stefano", a1) p3: Person("Giacomo", a1)
NB: L’output delle prime due regole è stato omesso!
a1���a2
p1���
p1,a1���p1,a2 _
Person[Stefano, Address[Via Po 2, 40068, San Lazzaro]]
4 Giugno 2013 Sistemi a Regole di Produzione 86
rule "Trova Stefano col suo indirizzo" when $a: Address() $p: Person( name == "Stefano", address == $a ) then System.out.println($p); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
Memory nodes
ALFA
NETWORK
BE
TA NETWORK
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Dummy nodes
Memory nodes
Beta nodes
Delayed nodes
Person[Stefano, Address[Via Po 2, 40068, San Lazzaro]] _
WM
a1: Address("Via Po 2", 40068, ��� "San Lazzaro")
p1: Person("Stefano", null) a2: Address("Via Roma 5", 40128, "Bologna") p2: Person("Stefano", a1) p3: Person("Giacomo", a1)
NB: L’output delle prime due regole è stato omesso!
a1���a2
p1���p2
p1,a1���p1,a2 p2,a1 p2,a2
p1,a1���
4 Giugno 2013 Sistemi a Regole di Produzione 87
rule "Trova Stefano col suo indirizzo" when $a: Address() $p: Person( name == "Stefano", address == $a ) then System.out.println($p); end
Pa9ern matching: l’algoritmo RETE
Terminal nodes
Memory nodes
ALFA
NETWORK
BE
TA NETWORK
Root node
Entry Point nodes
Object Type nodes
Alfa nodes
Dummy nodes
Memory nodes
Beta nodes
Delayed nodes
Person[Stefano, Address[Via Po 2, 40068, San Lazzaro]] _
WM
a1: Address("Via Po 2", 40068, ��� "San Lazzaro")
p1: Person("Stefano", null) a2: Address("Via Roma 5", 40128, "Bologna") p2: Person("Stefano", a1) p3: Person("Giacomo", a1)
NB: L’output delle prime due regole è stato omesso!
a1���a2
p1���p2
p1,a1���p1,a2 p2,a1 p2,a2
p1,a1���
4 Giugno 2013 Sistemi a Regole di Produzione 88
RISOLUZIONE DEI CONFLITTI ED ESECUZIONE
FondamenF di Intelligenza ArFficiale M
Risoluzione dei ConfliC & Esecuzione
ai
ai ai ai ai ai ai ai ai ai ai
E X E C
FIFO
ai ai
a i
!
AGENDA
4 Giugno 2013 Sistemi a Regole di Produzione 90
Risoluzione dei ConfliC & Esecuzione
ai
ai ai ai ai ai ai ai ai ai ai
E X E C
ai • oggeC filtraF • rif. regola -‐ salience -‐ codice
FIFO
ai ai
a i
!
AGENDA
4 Giugno 2013 Sistemi a Regole di Produzione 91
Risoluzione dei ConfliC & Esecuzione
ai
ai ai ai ai ai ai ai ai ai ai
E X E C
ai • oggeC filtraF • rif. regola -‐ salience -‐ codice
FIFO
ai ai
a i
!
AGENDA
4 Giugno 2013 Sistemi a Regole di Produzione 92
NB: In verità, una Map<Integer, Queue<Ac(va(on>> ordinata per chiavi decrescen(!
Risoluzione dei ConfliC & Esecuzione
ai
ai ai ai ai ai ai ai ai ai ai
E X E C
ai • oggeC filtraF • rif. regola -‐ salience -‐ codice
FIFO
ai ai
a i
Codice: -‐ Azioni logiche (pot. distruave) -‐ Effea collaterali (non rever(bili!)
!
AGENDA
4 Giugno 2013 Sistemi a Regole di Produzione 93
Risoluzione dei ConfliC & Esecuzione
PM
r1 r2
WM
f
Agenda a1 a2
rule "r1" when F() then assert(new G()); end
rule "r2" when $f: F() then retract($f); end ?!?
4 Giugno 2013 Sistemi a Regole di Produzione 94
Risoluzione dei ConfliC & Esecuzione
PM
r1 r2
WM
f
Agenda a1 a2
rule "r1" when F() then assert(new G()); end
rule "r2" when $f: F() then retract($f); end ?!?
a1 < a2
PM
Agenda WM
PM
Agenda WM
a2 < a1 r1 < r2
rule "r1" salience 10 ...
rule "r2" salience 5 ...
Prima inserisco G, poi elimino F.
Prima elimino F, a1 non sussiste più, G mai asserito.
Stabilisco un ordine di precedenza tra r1 e r2 (fisso).
4 Giugno 2013 Sistemi a Regole di Produzione 95
RIFERIMENTI FondamenF di Intelligenza ArFficiale M
RiferimenF • Charles L. Forgy, “RETE: A Fast Algorithm for the Many PaFer/
Many Object Match Problem”, ArFficial Intelligence, 19, pp. 17-‐37, 1982
• R.B. Doorenbos, “Produc(on Matching for Large Learning Systems”, Ph.D. Thesis, 1995
• Schmit, Struhmer and Stojanovic, “Blending Complex Event Processing with the RETE algorithm”, in Proceedings of iCEP2008, 2008
• h9p://en.wikipedia.org/wiki/Rete_algorithm • h9p://en.wikipedia.org/wiki/Complex_event_processing
4 Giugno 2013 Sistemi a Regole di Produzione 97
INFORMAZIONI FondamenF di Intelligenza ArFficiale M
Informazioni
• Domani esercitazione in laboratorio
• Possibilità di svolgere aCvità proge9uali o tesi – Drools, Event Calculus, Expecta(ons, MS-‐Kinect, Android SDK, SOA/Cloud, …
• Per domande, dubbi, richieste: [email protected]
4 Giugno 2013 Sistemi a Regole di Produzione 99
Introduzione a Drools
Stefano Bragaglia
Fondamen( di Intelligenza Ar(ficiale M 5 Giugno 2013
RingraziamenF
• Si ringrazia l’Ing. So9ara per aver fornito la versione iniziale di questa esercitazione.
5 Giugno 2013 Introduzione a Drools 101
Sommario 1. Guida IntroduCva 2. Esercizi • PaFern Semplici • PaFern Composi( • Quan(ficatori Esistenziali • Concatenazione di Regole • Features Avanzate: FROM, COLLECT, ACCUMULATE • Query • Truth Maintenance
3. Informazioni
5 Giugno 2013 Introduzione a Drools 102
GUIDA INTRODUTTIVA FondamenF di Intelligenza ArFficiale M
0. Documentazione Disponibile gratuitamente sul sito h9p://www.jboss.org/drools/documentaFon • Installazione:
Drools IntroducCon (Cap. 2) • Esempi di base:
Drools Expert (Cap. 7) • Ragionamento temporale:
Drools Fusion (Cap. 2)
5 Giugno 2013 Introduzione a Drools 104
1. Eclipse Scaricare la versione di Eclipse più approrpiata al proprio sistema dal sito h9p://www.eclipse.org/downloads/
5 Giugno 2013 Introduzione a Drools 105
2. Drools Plugin Installare il plugin di Drools per Eclipse • Help > Install New Sokware… • Add… • Name:
Drools Update Site – 5.5.0 Final • LocaFon:
h9p://download.jboss.org/drools/release/5.5.0.Final/org.drools.updatesite/
• Ok • Drools and jBPM > Jboss Drools
Core • Finish • … • Riavviare Eclipse
5 Giugno 2013 Introduzione a Drools 106
3. Creare un RunCme I file per eseguire Drools sono staF già scaricaF assieme al plugin, occorre solo indicare al sistema dove trovarli • Eclipse > Preferences… • Drools > Installed Drools Run(me • Add… • Create a new Drools 5 Run(me… • Selezionare la cartella in cui salvare
il runFme (in laboratorio /usr/share/eclipse/library/drools-‐5.5.0 )
• Ok • … • Selezionare il runFme appena
creato • Ok
5 Giugno 2013 Introduzione a Drools 107
4. Creare un progeRo Ora che la pia9aforma è propriamente installata e configurata, creare un proge9o Drools “Hello World!” • File > New > Project… • Drools > Drools Project • Next • Project name: HelloWorld • Next • Verificare che siano selezionaF
• Add a sample HelloWorld rule fine to this project.
• Add a sample Java class for loading and execu(ng the HelloWorld rules.
• Next • Verificare che sia selezionato il
runFme precedentemente creato • Finish
5 Giugno 2013 Introduzione a Drools 108
DroolsTest.java: main Java
1. package com.sample 2. 3. public class DroolsTest { 4. 5. public static final void main(String[] args) { 6. try { 7. // load up the knowledge base 8. KnowledgeBase kbase = readKnowledgeBase(); 9. StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); 10. KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test"); 11. // go ! 12. Message message = new Message(); 13. message.setMessage("Hello World"); 14. message.setStatus(Message.HELLO); 15. ksession.insert(message); 16. ksession.fireAllRules(); 17. logger.close(); 18. } catch (Throwable t) { 19. t.printStackTrace(); 20. } 21. } 22. 23. private static KnowledgeBase readKnowledgeBase() throws Exception {..} 24. .. 25. }
5 Giugno 2013 Introduzione a Drools 109
DroolsTest.java: caricamento della base di conoscenza
1. package com.sample 2. 3. public class DroolsTest { 4. 5. public static final void main(String[] args) {..} 6. 7. private static KnowledgeBase readKnowledgeBase() throws Exception { 8. KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); 9. kbuilder.add(ResourceFactory.newClassPathResource("Sample.drl"), ResourceType.DRL); 10. KnowledgeBuilderErrors errors = kbuilder.getErrors(); 11. if (errors.size() > 0) { 12. for (KnowledgeBuilderError error: errors) { 13. System.err.println(error); 14. } 15. throw new IllegalArgumentException("Could not parse knowledge."); 16. } 17. KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); 18. kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); 19. return kbase; 20. } 21. .. 22. }
5 Giugno 2013 Introduzione a Drools 110
Sample.drl: file di regole
1. package com.sample 2. 3. import com.sample.DroolsTest.Message; 4. 5. rule "Hello World" 6. when 7. m : Message( status == Message.HELLO, myMessage : message ) 8. then 9. System.out.println(myMessage); 10. m.setMessage("Goodbye cruel world"); 11. m.setStatus(Message.GOODBYE); 12. update(m); 13. end 14. 15. rule "GoodBye" 16. when 17. Message( status == Message.GOODBYE, myMessage : message ) 18. then 19. System.out.println(myMessage); 20. end
5 Giugno 2013 Introduzione a Drools 111
5. Debug del progeRo Maggiori de9agli nel Cap. 7.6 della documentazione di Drools Expert h9p://www.jboss.org/drools/documentaFon • Impostare un breakpoint su
ksession.fireAllRules();
• Passare alla Drools PerspecFve • Window > Open Perspec(ve >
Other… • Selezionare Drools • Ok • Cliccare su Drools
• Lanciare una sessione di debug • Selezionare la sessione tra le
variabili di debug • Aggiungere view:
• Window > Show View > Other… • Agenda, Audit, WM, ecc. • Ok
5 Giugno 2013 Introduzione a Drools 112
ESERCIZI FondamenF di Intelligenza ArFficiale M
PATTERN SEMPLICI Esercizi
5 Giugno 2013 Introduzione a Drools 114
Pa9ern Semplici
• Un pa9ern semplice è un insieme di vincoli da rispe9are su faC di uno stesso Fpo in WM
• Per poterli applicare, occorre che Drools sappia come sono faC quesF oggeC
• I faC sono definiF come POJO o BEAN e poi importaF nel file .drl di Drools col comando
import com.sample.DroolsTest.Message;
5 Giugno 2013 Introduzione a Drools 115
Pa9ern Semplici
• Creare un nuovo proge9o come HelloWorld
• Rimuovere ogni riferimento a Message da DroolsTest.java
• Creare I POJO/BEAN rappresentaF nella figura di destra
5 Giugno 2013 Introduzione a Drools 116
com.sample
Person -‐ age: Integer -‐ name: String -‐ ...
+ ...
Mail -‐ sender: Person -‐ recipient: Person -‐ body: String
+ ... * * Aggiungere i campi costru9ore, geFer, seFer, equals(…), hashcode() e toString().
N.B.: Eclipse consente di generare tuC quesF metodi automaFcamente.
Pa9ern Semplici • Creare un nuovo file di regole (es.: exercise.drl)
• Indicare questa nuova risorsa (ancora vuota) come risorsa da caricare in DroolsTest.java
• Asserire (almeno) le istanze a destra prima di far sca9are la valutazione delle regole nella sessione a9uale
Person p1 = new Person("Andrew", 35); Person p2 = new Person("Barbara", 22); Person p3 = new Person("Cal", 8); Person p4 = new Person("Cal", 15); Person p5 = new Person("Daisy", 25); Person p6 = new Person("Cal", 40); ksession.insert(p1); ksession.insert(p2); ksession.insert(p3); ksession.insert(p4); ksession.insert(p5); ksession.insert(p6); ksession.insert(new Mail(p1, p4, "Do your homeworks!")); ksession.insert(new Mail(p5, p5, "Remember to do the homeworks!")); ... ksession.fireAllRules();
5 Giugno 2013 Introduzione a Drools 117
Pa9ern Semplici
• Scrivere una regola che stampi a video il contenuto di ogni Mail
• Scrivere una regola che stampi a video il contenuto di ogni Person
package com.sample import com.sample.Mail; import com.sample.Person; rule "Regola: Simple 1" when // pattern della premessa then // action della conseguenza end rule "Regola: Simple 2" when // pattern della premessa then // action della conseguenza end // NB: Le regole scattano per ogni fatto // appartenente al tipo indicato
5 Giugno 2013 Introduzione a Drools 118
Pa9ern Semplici
• Scrivere una regola che stampi a video il contenuto di ogni Mail
• Scrivere una regola che stampi a video il contenuto di ogni Person
package com.sample import com.sample.Mail; import com.sample.Person; rule "Regola: Simple 1" when $m: Mail() then System.out.println("S1-‐Mail: " + $m); end rule "Regola: Simple 2" when $p: Person() then System.out.println("S2-‐Person: " + $p); end // NB: Le regole scattano per ogni fatto // appartenente al tipo indicato
5 Giugno 2013 Introduzione a Drools 119
Pa9ern Semplici • Trovare tu9e le Person che si
chiamano "Cal" e hanno meno di 10 anni o età compresa tra i 18 e i 35 anni
package com.sample import com.sample.Mail; import com.sample.Person; rule "Regola: Simple 3" when ... then ... end // NB: Uso di operatori di precedenza // [()], and [&&] e or [||]...
5 Giugno 2013 Introduzione a Drools 120
Pa9ern Semplici • Trovare tu9e le Person che si
chiamano "Cal" e hanno meno di 10 anni o età compresa tra i 18 e i 35 anni
package com.sample import com.sample.Mail; import com.sample.Person; rule "Regola: Simple 3" when $p: Person( name == "Cal", age < 10 || (age >= 18 && age <= 35) ) then System.out.println("S3-‐Person: " + $p); end // NB: Uso di operatori di precedenza // [()], and [&&] e or [||]...
5 Giugno 2013 Introduzione a Drools 121
PATTERN COMPOSITI Esercizi
5 Giugno 2013 Introduzione a Drools 122
Pa9ern ComposiF: Join
• Più pa9ern in una stessa regola selezionano oggeC di più Fpi
• La regola abbina automaFcamente quesF oggeC, costruendo tu9e le loro possibili combinazioni
• I nodi di Join (Beta nodes) fanno il “prodo9o cartesiano” degli oggeC che ricevono in ingresso
5 Giugno 2013 Introduzione a Drools 123
Pa9ern ComposiF: Join
• Scrivere una regola per trovare tu9e le coppie di persone
rule "Regola: Join 1" when ... then ... end
5 Giugno 2013 Introduzione a Drools 124
Pa9ern ComposiF: Join
• Scrivere una regola per trovare tu9e le coppie di persone
rule "Regola: Join 1" when $p1: Person() $p2: Person() then System.out.println("J1: " + $p1 + " vs. " + $p2); end
5 Giugno 2013 Introduzione a Drools 125
Pa9ern ComposiF: Join
• Scrivere una regola per trovare tu9e le coppie di persone
• Evitare di accoppiare una persona con se stessa poichè non ha senso…
rule "Regola: Join 1" when $p1: Person() $p2: Person() then System.out.println("J1: " + $p1 + " vs. " + $p2); end
5 Giugno 2013 Introduzione a Drools 126
Pa9ern ComposiF: Join
• Scrivere una regola per trovare tu9e le coppie di persone
• Evitare di accoppiare una persona con se stessa poichè non ha senso…
rule "Regola: Join 1" when $p1: Person() $p2: Person() then System.out.println("J1: " + $p1 + " vs. " + $p2); end rule "Regola: Join 2" when $p1: Person() $p2: Person( this != $p1 ) then System.out.println("J2: " + $p1 + " vs. " + $p2); end
5 Giugno 2013 Introduzione a Drools 127
Pa9ern ComposiF: Join
• Trovare le coppie (non degeneri) di omonimi
rule "Regola: Join 3" when ... then ... end
5 Giugno 2013 Introduzione a Drools 128
“Dummy” nodes!
Pa9ern ComposiF: Join
• Trovare le coppie (non degeneri) di omonimi
rule "Regola: Join 3" when $p1: Person( $n: name ) $p2: Person( this != $p1, name == $n ) then System.out.println("J3: " + $p1 + " vs. " + $p2); end
5 Giugno 2013 Introduzione a Drools 129
“Dummy” nodes!
Pa9ern ComposiF: Join
• Trovare le coppie (non degeneri) di omonimi
• Evitare le coppie inverse: (a,b) e non (b,a)
rule "Regola: Join 3" when $p1: Person( $n: name ) $p2: Person( this != $p1, name == $n ) then System.out.println("J3: " + $p1 + " vs. " + $p2); end rule "Regola: Join 4" when $p1: Person( $n: name ) $p2: Person( this != $p1, $p1 < $p2, name == $n ) then System.out.println("J4: " + $p1 + " vs. " + $p2); end
5 Giugno 2013 Introduzione a Drools 130
“Dummy” nodes!
Pa9ern ComposiF: Join
• Trovare le coppie (non degeneri) composte da un uomo ed una donna* in cui lei è più giovane
* Estendere opportunamente il BEAN
rule "Regola: Join 5" when ... then ... end
5 Giugno 2013 Introduzione a Drools 131
Pa9ern ComposiF: Join
• Trovare le coppie (non degeneri) composte da un uomo ed una donna* in cui lei è più giovane
* Estendere opportunamente il BEAN
rule "Regola: Join 5" when $p1: Person( gender == "male", $e : age ) $p2: Person( gender == "female", age < $e ) then System.out.println("J5: " + $p1 + " vs. " + $p2); end // Sufficiente? Inversioni? // Unica soluzione possibile?
5 Giugno 2013 Introduzione a Drools 132
Pa9ern ComposiF: Join
• Stampare il testo del messaggio di una Mail, a pa9o che il mi9ente sia una persona di almeno 20 anni di nome Daisy che ha mandato la mail a se stessa
rule "Regola: Join Multipli" when ... then ... end
5 Giugno 2013 Introduzione a Drools 133
Pa9ern ComposiF: Join
• Stampare il testo del messaggio di una Mail, a pa9o che il mi9ente sia una persona di almeno 20 anni di nome Daisy che ha mandato la mail a se stessa
rule "Regola: Join Multipli" when $p: Person( age >= 20, name == "Daisy" ) $pp: Person( this == $p ) // $pp serve davvero? $m: Mail ( sender == $p, recipient == $pp, $b: body ) then System.out.println("J5.body: " + $b); end
5 Giugno 2013 Introduzione a Drools 134
Pa9ern ComposiF: Join
• Stampare il testo del messaggio di una Mail, a pa9o che il mi9ente sia una persona di almeno 20 anni di nome Daisy che ha mandato la mail a se stessa
NB: La Dot NotaFon rende i pa9ern più compaC
rule "Regola: Join Multipli" when Mail ( $p: sender, sender.name == "Daisy", sender.age >= 20, recipient == $p, $t: body.toString() ) // Possibile, ma sconsigliato then System.out.println("J5.body: " + $t); end
5 Giugno 2013 Introduzione a Drools 135
QUANTIFICATORI ESISTENZIALI Esercizi
5 Giugno 2013 Introduzione a Drools 136
QuanFficatori Esistenziali
• Drools supporta naFvamente i quanFficatori esistanziali ∃ e ∀ mediante le parole chiave exists e forall il cui scope è un pa9ern – exists P(…) la WM conFene almeno un fa9o fa match
– not P(…) (so9ointeso exists) la WM non conFene alcun fa9o che fa match
– forall P(…) tuC gli oggeC di Fpo P in WM fanno match
5 Giugno 2013 Introduzione a Drools 137
QuanFficatori Esistenziali
• Stampare il nome delle persone – Che anno ricevuto almeno una mail
rule "Regola QE1" when ... then ... end
5 Giugno 2013 Introduzione a Drools 138
QuanFficatori Esistenziali
• Stampare il nome delle persone – Che anno ricevuto almeno una mail
rule "Regola QE1" when $p: Person( $n: name ) exists Mail( receiver == $p ) then System.out.println("QE1: " + $n + " ha ricevuto mail"); end
5 Giugno 2013 Introduzione a Drools 139
NB: le regole sca9ano 0 o 1 volte per persona
QuanFficatori Esistenziali
• Stampare il nome delle persone – Che anno ricevuto almeno una mail
– Che non hanno ricevuto alcuna mail
rule "Regola QE1" when $p: Person( $n: name ) exists Mail( receiver == $p ) then System.out.println("QE1: " + $n + " ha ricevuto mail"); end rule "Regola QE2" when ... then ... end
5 Giugno 2013 Introduzione a Drools 140
QuanFficatori Esistenziali
• Stampare il nome delle persone – Che anno ricevuto almeno una mail
– Che non hanno ricevuto alcuna mail
rule "Regola QE1" when $p: Person( $n: name ) exists Mail( receiver == $p ) then System.out.println("QE1: " + $n + " ha ricevuto mail"); end rule "Regola QE2" when $p: Person( $n: name ) not Mail( receiver == $p ) then System.out.println("QE2: " + $n + " non ha ricevuto mail"); end
5 Giugno 2013 Introduzione a Drools 141
NB: le regole sca9ano 0 o 1 volte per persona
QuanFficatori Esistenziali
• Stampare il nome delle persone – Che anno ricevuto almeno una mail
– Che non hanno ricevuto alcuna mail
– Per cui tu9e le mail ricevute provengono da un mi9ente di nome Cal
rule "Regola QE3" when ... then ... end
5 Giugno 2013 Introduzione a Drools 142
QuanFficatori Esistenziali
• Stampare il nome delle persone – Che anno ricevuto almeno una mail
– Che non hanno ricevuto alcuna mail
– Per cui tu9e le mail ricevute provengono da un mi9ente di nome Cal
rule "Regola QE3" when $p: Person( $n: name ) forall ( Mail( $s: sender, receiver == $p ) Person( this == $s, name == "Cal" ) ) then System.out.println("QE3: " + $n + " ha ricevuto solo mail da Cal"); end
5 Giugno 2013 Introduzione a Drools 143
NB: le regole sca9ano 0 o 1 volte per persona
CONCATENAZIONE DI REGOLE Esercizi
5 Giugno 2013 Introduzione a Drools 144
Concatenazione di Regole
• Drools supporta la generazione di classi all’interno dei file .drl
• Con opportune dichiarazioni (Fpicamente incluse prima delle regole) si possono introdurre BEAN al volo da usare nelle regole:
declare Pair first: Person second: Person end
5 Giugno 2013 Introduzione a Drools 145
Concatenazione di Regole
• Oltre ad eseguire codice Java generico, il conseguente di una regola può eseguire “operazioni logiche”: – Inserimento di nuovi faC nella WM – Rimozione di faC dalla WM – Aggiornamento di faC nella WM
• Queste operazioni, a loro volta, possono aCvare le regole in cascata
5 Giugno 2013 Introduzione a Drools 146
Concatenazione di Regole
• Scrivere una regola per stampare un messaggio a video per ogni Pair presente in WM
rule "Regola CdR 1" when ... then ... end
5 Giugno 2013 Introduzione a Drools 147
Concatenazione di Regole
• Scrivere una regola per stampare un messaggio a video per ogni Pair presente in WM
rule "Regola CdR 1" when $p: Pair() then System.out.println("CdR1 – Pair: " + $p); end
5 Giugno 2013 Introduzione a Drools 148
Concatenazione di Regole
• Scrivere una regola per stampare un messaggio a video per ogni Pair presente in WM
• Scrivere una regola per generare e inserire in WM un ogge9o Pair per ogni coppia di persone disFnte senza ripeFzioni
rule "Regola CdR 1" when $p: Pair() then System.out.println("CdR1 – Pair: " + $p); end rule "Regola CdR 2" when ... then ... end
5 Giugno 2013 Introduzione a Drools 149
Concatenazione di Regole
• Scrivere una regola per stampare un messaggio a video per ogni Pair presente in WM
• Scrivere una regola per generare e inserire in WM un ogge9o Pair per ogni coppia di persone disFnte senza ripeFzioni
rule "Regola CdR 1" when $p: Pair() then System.out.println("CdR1 – Pair: " + $p); end rule "Regola CdR 2" when $p1: Person() $p2: Person() then Pair p = new Pair(); p.setFirst($p1); p.setSecond($p2); insert(p); // oppure insert(new Pair($p1, $p2)); end
5 Giugno 2013 Introduzione a Drools 150
NB: L’ordine delle regole è ininfluente
Concatenazione di Regole
• Generare tu9e le coppie di Person ordinate e disFnte, inserendole in WM come Pair
rule "Regola CdR 3" when ... then Pair p = new Pair(); p.setFirst($p1); p.setSecond($p2); insert(p); // oppure insert(new Pair($p1, $p2)); end
5 Giugno 2013 Introduzione a Drools 151
Concatenazione di Regole
• Generare tu9e le coppie di Person ordinate e disFnte, inserendole in WM come Pair
rule "Regola CdR 3" when $p1: Person() $p2: Person( this != $p1 ) // Verifico che non ci sia la coppia simm. not Pair( first == $p2, second == $p1 ) then Pair p = new Pair(); p.setFirst($p1); p.setSecond($p2); insert(p); // oppure insert(new Pair($p1, $p2)); end
5 Giugno 2013 Introduzione a Drools 152
Concatenazione di Regole
Mondo di Java Mondo delle regole
5 Giugno 2013 Introduzione a Drools 153
Person Person
La classe Person, definita in Java, diventa disponibile nel mondo delle regole mediante: import com.sample.Person;
L’operazione opposta non è generalmente possibile.
Pair Pair
Diventa possibile grazie alla reflecFon/introspecFon di Java:
FactType pairClass = ksession.getKnowledgeBase().getFactType("com.sample", "Pair"); Object pairObject = pairClass.newInstance(); pairClass.set(pairObject, "first", p1); pairClass.set(pairObject, "second", p2); ksession.insert(pairObject);
FEATURES AVANZATE: FORM, COLLECT, ACCUMULATE
Esercizi
5 Giugno 2013 Introduzione a Drools 154
Features Avanzate: FROM
• Il costru9o from consente di accedere agli oggeC di una Collection, anche se quesF non sono esplicitamente presenF nella WM
rule "Esempio di FROM" when $l: List() // inserita come List<? extends Person> $p: Person() from $l // come un join classico then System.out.println($l + "/" + $p); end
5 Giugno 2013 Introduzione a Drools 155
NB: Sca9a (fino a) $l.size() volte!
Features Avanzate: FROM
• Aggiungere a Person un campo children di Fpo Collection<? extends Person>
• Scrivere una regola che stampi i figli di ogni persona
rule "Regola FA:FROM 1" when ... then ... end
5 Giugno 2013 Introduzione a Drools 156
Features Avanzate: FROM
• Aggiungere a Person un campo children di Fpo Collection<? extends Person>
• Scrivere una regola che stampi i figli di ogni persona
rule "Regola FA:FROM 1" when $parent: Person( $children: children ) $child: Person() from $children then System.out.println("FA:FROM1 " + $parent + " è genitore di " + $child); end
5 Giugno 2013 Introduzione a Drools 157
Features Avanzate: FROM
• Definire un POJO/BEAN che ca9uri l’astrazione di nodo di un albero
• Solo il nodo radice è asserito nella WM
5 Giugno 2013 Introduzione a Drools 158
CollecFon .
CollecFon .
...
N
N N N
N N N
... ...
Features Avanzate: FROM
• Definire un POJO/BEAN che ca9uri l’astrazione di nodo di un albero
• Solo il nodo radice è asserito nella WM
• Implementare un Visitor mediante un set di regole che a9raversi l’albero visitando tuC i nodi in ordine qualsiasi
5 Giugno 2013 Introduzione a Drools 159
CollecFon .
CollecFon .
...
N
N N N
N N N
... ...
rule "Regola FA:FROM 2" when $n: Node() then System.out.println("FA:FROM2 " + $n + " visitato"); end rule "Regola FA:FROM 3" when Node( $children: children ) $child: Node() from $children then insert($child); end
Features Avanzate: FROM
• Definire un POJO/BEAN che ca9uri l’astrazione di nodo di un albero
• Solo il nodo radice è asserito nella WM
• Implementare un Visitor mediante un set di regole che a9raversi l’albero visitando tuC i nodi in ordine qualsiasi
5 Giugno 2013 Introduzione a Drools 160
rule "Regola FA:FROM 2" when $n: Node() then System.out.println("FA:FROM2 " + $n + " visitato"); end rule "Regola FA:FROM 3" when Node( $children: children ) $child: Node() from $children then insert($child); end
Features Avanzate: FROM
• In quale ordine sono visitaF i nodi?
• Del tu9o casuale: alcuni visitaF in ampiezza, altri in profondità…
5 Giugno 2013 Introduzione a Drools 161
rule "Regola FA:FROM 2" when $n: Node() then System.out.println("FA:FROM2 " + $n + " visitato"); end rule "Regola FA:FROM 3" when Node( $children: children ) $child: Node() from $children then insert($child); end
Features Avanzate: FROM
• In quale ordine sono visitaF i nodi?
• Del tu9o casuale: alcuni visitaF in ampiezza, altri in profondità…
• La salience fissa la priorità delle regole e impone il strategia di a9raversamento dell’albero
5 Giugno 2013 Introduzione a Drools 162
rule "Regola FA:FROM 2" when $n: Node() then System.out.println("FA:FROM2 " + $n + " visitato"); end rule "Regola FA:FROM 3" when Node( $children: children ) $child: Node() from $children then insert($child); end
Features Avanzate: FROM
• Strategia di ricerca: – Breadth-‐first – Depth-‐first
5 Giugno 2013 Introduzione a Drools 163
NB: Le aCvazioni delle due regole vengono comunque inframmezzate. È possibile implementare corre9amente queste strategia di ricerca complicando un po’ i pa9ern.
rule "Regola FA:FROM 2” salience 10 when $n: Node() then System.out.println("FA:FROM2 " + $n + " visitato"); end rule "Regola FA:FROM 3" salience 5 when Node( $children: children ) $child: Node() from $children then insert($child); end
Features Avanzate: FROM
• Strategia di ricerca: – Breadth-‐first – Depth-‐first
5 Giugno 2013 Introduzione a Drools 164
NB: Le aCvazioni delle due regole vengono comunque inframmezzate. È possibile implementare corre9amente queste strategia di ricerca complicando un po’ i pa9ern.
rule "Regola FA:FROM 2" salience 5 when $n: Node() then System.out.println("FA:FROM2 " + $n + " visitato"); end rule "Regola FA:FROM 3" salience 10 when Node( $children: children ) $child: Node() from $children then insert($child); end
Features Avanzate: FROM
• Strategia di ricerca: – Breadth-‐first – Depth-‐first
5 Giugno 2013 Introduzione a Drools 165
NB: Le aCvazioni delle due regole vengono comunque inframmezzate. È possibile implementare corre9amente queste strategia di ricerca complicando un po’ i pa9ern.
Features Avanzate: COLLECT
• Il costru9o collect è duale di form e produce una Collection accorpando gli oggeC presenF nella WM che corrispondono ad un certo pa9ern
rule "Esempio di COLLECT" when $c: collect ( Person() ) // costruita come Collection<? extends Person> $p: Person() from $c // come un join classico then System.out.println($c + "/" + $p); end
5 Giugno 2013 Introduzione a Drools 166
NB: Sca9a esa9amente $c.size() volte!
Features Avanzate: ACCUMULATE
• Il costru9o accumulate è conce9ualmente simile a collect
• Effe9ua operazioni generiche su Collection di oggeC costruite implicitamente a parFre da un pa9ern
• Si compone di più parF (opzionali) • Esistono abbreviazioni per le funzioni notevoli: min, max, count, ecc.
5 Giugno 2013 Introduzione a Drools 167
Features Avanzate: ACCUMULATE
• Sintassi generale: … $y: Y(…) from accumulate ( $p: P(…) init( x = new X(); ) // inizializza…
action( x = f(x, $p) ) // accumula/esegui… return( new Y(x) ) // restituisce… ) // qualcosa filtrabile come Y(…) …
5 Giugno 2013 Introduzione a Drools 168
Features Avanzate: ACCUMULATE • Funzioni notevoli:
rule "Esempio di Funzioni notevoli" when accumulate( Person( $a: age ), $max: max( $a ), $min: min( $a ), $avg: average( $a ) ) then System.out.println( "M:" + $max + " m:" + $min + " a:" + $avg); end
5 Giugno 2013 Introduzione a Drools 169
Features Avanzate: ACCUMULATE
• Scrivere una regola per trovare tu9e le persone più giovani della somma dell’età dei loro figli
rule "Regola FA:ACCUMULATE 1" when ... then System.out.println("FA:ACCUMULATE1 " + $p); end
5 Giugno 2013 Introduzione a Drools 170
Features Avanzate: ACCUMULATE
• Scrivere una regola per trovare tu9e le persone più giovani della somma dell’età dei loro figli
rule "Regola FA:ACCUMULATE 1" when $p: Person( $age: age, $children: children ) Number( this.intValue() > $age ) from accumulate ( Person( $a: age ) from $children, init( int total = 0; ), action( total += $a; ), result( new Integer(total) ) ) then System.out.println("FA:ACCUMULATE1 " + $p); end
5 Giugno 2013 Introduzione a Drools 171
Features Avanzate: ACCUMULATE
• Scrivere una regola per trovare tu9e le persone più giovani della somma dell’età dei loro figli
// Formulazione alternativa, più semplice rule "Regola FA:ACCUMULATE 1" when $p: Person( $children: children ) accumulate( Person( $a: age ) from $children, $sum: sum($a) ) Person( this == $p, age < $sum ) then System.out.println("FA:ACCUMULATE1 " + $p); end
5 Giugno 2013 Introduzione a Drools 172
QUERIES Esercizi
5 Giugno 2013 Introduzione a Drools 173
Queries
• Consentono di individuare insiemi di oggeC presenF nella WM che rispondono a certe cara9erisFche
• Sfru9ano le capacità di filtraggio di RETE (sono come regole senza conseguente)
• Amme9ono l’uso di parametri con cui è anche possibile accedere ai risultaF
5 Giugno 2013 Introduzione a Drools 174
Queries
• Individuare le persone maggiorenni
query "Query: Q1" ... end
5 Giugno 2013 Introduzione a Drools 175
Queries
• Individuare le persone maggiorenni
query "Query: Q1" $p: Person( age > 18 ) end
5 Giugno 2013 Introduzione a Drools 176
Queries
• Individuare le persone maggiorenni
• Individuare le persone che hanno una data età
query "Query: Q1" $p: Person( age > 18 ) end query "Query: Q2" ( int $a ) ... end
5 Giugno 2013 Introduzione a Drools 177
Queries
• Individuare le persone maggiorenni
• Individuare le persone che hanno una data età
query "Query: Q1" $p: Person( age > 18 ) end query "Query: Q2" ( int $a ) Person( $n: name, age == $a ) end
5 Giugno 2013 Introduzione a Drools 178
Queries
• Individuare le persone maggiorenni
• Individuare le persone che hanno una data età
• Individuare le persone che hanno una data età o viceversa, o entrambe
query "Query: Q1" $p: Person( age > 18 ) end query "Query: Q2" ( int $a ) Person( $n: name, age == $a ) end query "Query: Q3" ( String $n, int $a ) ... end
5 Giugno 2013 Introduzione a Drools 179
Queries
• Individuare le persone maggiorenni
• Individuare le persone che hanno una data età
• Individuare le persone che hanno una data età o viceversa, o entrambe
query "Query: Q1" $p: Person( age > 18 ) end query "Query: Q2" ( int $a ) Person( $n: name, age == $a ) end query "Query: Q3" ( String $n, int $a ) Person( $n := name, $a := age ) end
5 Giugno 2013 Introduzione a Drools 180
Queries
• Mondo di Java
ksession.fireAllRules(); QueryResults qr = ksession. getQueryResults("Q1"); for (QueryResultsRow qrr: qr) System.out.println(qrr);
• Mondo delle regole $c: collect ?"Q3"( $n, 18 )
5 Giugno 2013 Introduzione a Drools 181
TRUTH MAINTENANCE Esercizi
5 Giugno 2013 Introduzione a Drools 182
Truth Maintenance
• Oltre ad asserire e ritrarre faC * (costruC insert e retract) è possibile farlo logicamente
• Ovvero i faC, che vengono asseri( (ritraa) al verificarsi di una condizione (il matching di un pa9ern), vengono automa&camente ritraa (asseri() quando la condizione non sussiste più
• I nuovi costruC sono insertLogical e retractLogical
* Esiste anche modify che fa in sequenza retract e insert
5 Giugno 2013 Introduzione a Drools 183
Truth Maintenance
• Partendo dal solito proge9o di partenza (Person e Mail e relaFve istanze da Java), scrivere un insieme di regole che realizza un semplice servizio pubblicitario che ada9a la pubblicità all’età delle persone
5 Giugno 2013 Introduzione a Drools 184
Truth Maintenance
• Dichiarare un fa9o Ad che conFene un riferimento a Person e un message (String) e un fa9o Birthday con un riferimento a Person
• Definire una query con cui individuare i message di Ad
...
5 Giugno 2013 Introduzione a Drools 185
Truth Maintenance
• Dichiarare un fa9o Ad che conFene un riferimento a Person e un message (String) e un fa9o Birthday con un riferimento a Person
• Definire una query con cui individuare i message di Ad
declare Ad target: Person message: String end declare Birthday person: Person end query "advertisement" ( Person $p ) Ad( target == $p, $m: message ) end
5 Giugno 2013 Introduzione a Drools 186
Truth Maintenance
• Scrivere una regola che suggerisca l’acquisto di un gioca9olo ad ogni persona minorenne
• Scrivere una regola che suggerisca l’acquisto di una automobile ad ogni persona maggiorenne
NB: operazioni logiche!
...
5 Giugno 2013 Introduzione a Drools 187
Truth Maintenance
• Scrivere una regola che suggerisca l’acquisto di un gioca9olo ad ogni persona minorenne
• Scrivere una regola che suggerisca l’acquisto di una automobile ad ogni persona maggiorenne
NB: operazioni logiche!
rule "Toy to Kids" when $p: Person( age < 18 ) then insertLogical(new Ad($p, $p.name + ", compra un’automobilina!")); end rule "Car to Men" when $p: Person( age >= 18 ) then insertLogical(new Ad($p, $p.name + ", compra una spider!")); end
5 Giugno 2013 Introduzione a Drools 188
Truth Maintenance • Scrivere una regola che, per ogni Ad, mandi una mail (crei un ogge9o Mail) usando i campi dell’Ad (sender == recipient)
• Scrivere una regola che, ogni volta che viene noFficato un Birthday, aggiorna l’età della relaFva Person
...
5 Giugno 2013 Introduzione a Drools 189
Truth Maintenance • Scrivere una regola che, per ogni Ad, mandi una mail (crei un ogge9o Mail) usando i campi dell’Ad (sender == recipient)
• Scrivere una regola che, ogni volta che viene noFficato un Birthday, aggiorna l’età della relaFva Person
rule "Send a Mail" when Ad( $t: target, $m: message ) then insert(new Mail($t, $t, $m)); end rule "Grow older!" when $p: Person( $a: age ) $b: Birthday( person == $p ) then System.out.println( "Buon compleanno, " + $p.getName()); modify($p) { age = $a + 1; // $p.setAge($a + 1); } retract($b); end
5 Giugno 2013 Introduzione a Drools 190
Truth Maintenance
1. Da Java: inserire un Birthday per una Person 2. Far sca9are le regole sulla sessione 3. Verificare che quali Ad sono in WM mediante
l’apposita query • Ripetere i passi precedenF finchè una Person diventa maggiorenne
• Cosa succede? Perchè? 5 Giugno 2013 Introduzione a Drools 191
INFORMAZIONI FondamenF di Intelligenza ArFficiale M
Informazioni
• Possibilità di svolgere aCvità proge9uali o tesi – Drools, Event Calculus, Expecta(ons, MS-‐Kinect, Android SDK, SOA/Cloud, …
• Per domande, dubbi, richieste: [email protected]
5 Giugno 2013 Introduzione a Drools 193