I presented these slides introducing Production Rules Systems in June 2013 to the students of the 'Fondamenti di Intelligenza Artificiale' course of the University of Bologna, Italy. I pass from the theory to the practice, showing the architecture and the components of PRSs. In the final part, an intuition of the operating principles are also given.
CON OCCHI DIVERSI - catechesi per candidati alla Cresima
Introducing PRSs and Drools (in Italian)
1. Sistemi
a
Regole
di
Produzione
Stefano
Bragaglia
Fondamen(
di
Intelligenza
Ar(ficiale
M
4
Giugno
2013
2. Sommario
1. Sistemi
a
regole
2. Sistemi
a
regole
di
produzione
• JBoss
Drools
• Un
caso
d’uso
3.
4.
5.
6.
Pa9ern
matching:
l’algoritmo
RETE
Risoluzione
dei
confliC
&
Esecuzione
RiferimenF
Informazioni
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
2
4. 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
5. Sistemi
a
Regole
• Il
Modus
Ponens,
anche
de9o
Principio
di
disgiunzione,
Affermazione
dell’antecedente
o
Ragionamento
direFo,
prevede
che:
p(x)
,
p(X)
q(Y)
q(y)
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.
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
5
6. Sistemi
a
Regole
• Il
Modus
Ponens,
anche
de9o
Principio
di
disgiunzione,
Affermazione
dell’antecedente
o
Ragionamento
direFo,
prevede
che:
premessa
p(x)
,
p(X)
q(Y)
implicazione
conseguenza
q(y)
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
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
6
7. Sistemi
a
Regole
Programmi
logici
• Backward-‐chaining
• Dal
goal
ai
faC,
applicando
le
regole
all’indietro
• Generalmente
conservaFvi
• Unificazione
• Backtracking
4
Giugno
2013
Regole
di
produzione
• Forward-‐chaining
• I
faC
aCvano
le
regole
che
generano
nuovi
faC
• Potenzialmente
distruCve
• Pa9ern
matching
• Parallelismo
Sistemi
a
Regole
di
Produzione
7
8. Sistemi
a
Regole
Programmi
logici
4
Giugno
2013
Regole
di
produzione
Sistemi
a
Regole
di
Produzione
8
9. Sistemi
a
Regole
Programmi
logici
4
Giugno
2013
Regole
di
produzione
Sistemi
a
Regole
di
Produzione
9
10. Sistemi
a
Regole
Programmi
logici
4
Giugno
2013
Regole
di
produzione
Sistemi
a
Regole
di
Produzione
10
11. Sistemi
a
Regole
Programmi
logici
4
Giugno
2013
Regole
di
produzione
Sistemi
a
Regole
di
Produzione
11
12. Sistemi
a
Regole
Programmi
logici
4
Giugno
2013
Regole
di
produzione
Sistemi
a
Regole
di
Produzione
12
13. Sistemi
a
Regole
Programmi
logici
4
Giugno
2013
Regole
di
produzione
Sistemi
a
Regole
di
Produzione
13
14. Sistemi
a
Regole
Programmi
logici
4
Giugno
2013
Regole
di
produzione
Sistemi
a
Regole
di
Produzione
14
16. 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
17. Sistemi
a
Regole
di
Produzione
Schema
archite9urale
e
principio
di
funzionamento
Productions:!
Patterns"
+ Actions!
a
PM
1
Pattern
Matching!
Facts:!
triples "
(now beans)!
2
Agenda
Conflict
Resolution!
3
Execution!
WM
Output!
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
17
18. Sistemi
a
Regole
di
Produzione
Schema
archite9urale
e
principio
di
funzionamento
Productions:!
Patterns"
+ Actions!
a
PM
1
Pattern
Matching!
Facts:!
triples "
(now beans)!
Agenda
Conflict
Resolution!
3
Execution!
WM
Output!
4
Giugno
2013
2
ELABORAZIONE
SUDDIVISA
IN
3
STADI
Sistemi
a
Regole
di
Produzione
18
19. Sistemi
a
Regole
di
Produzione
Schema
archite9urale
e
principio
di
funzionamento
3
MEMORIE
Productions:!
Patterns"
+ Actions!
a
PM
1
Pattern
Matching!
Facts:!
triples "
(now beans)!
Agenda
Conflict
Resolution!
3
Execution!
WM
Output!
4
Giugno
2013
2
ELABORAZIONE
SUDDIVISA
IN
3
STADI
Sistemi
a
Regole
di
Produzione
19
21. JBoss
Drools
• 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
Fusion
(event
processing)
Expert
(rule
engine)
Guvnor
(rule
repo)
jBPM
(workflow)
Planner
(constraints)
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
21
22. JBoss
Drools
• 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
Fusion
(event
processing)
Expert
(rule
engine)
Guvnor
(rule
repo)
jBPM
(workflow)
Planner
(constraints)
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
22
23. 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
24. 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
25. JBoss
Drools
• Sintassi
del
linguaggio
Drools:
queries
query
"ID_query"
/*
premessa
*/
//
pattern
(composito)
end
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
25
26. 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
27. 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
28. JBoss
Drools
• Sintassi
del
linguaggio
Drools:
oggeH
declare
Person
/*
dichiarazione
*/
name:
String
address:
Address
=
new
Address(...)
end
Person
-‐
name:
String
-‐
address:
Address
...
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
Address
-‐
street:
String
-‐
zip:
long
-‐
city:
String
...
28
29. 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
30. 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
31. 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
32. 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
35. Pa9ern
matching:
l’algoritmo
RETE
rule
"Trova
gli
Stefano"
when
$p:
Person(
name
==
"Stefano"
)
then
System.out.println($p);
end
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
Root
node
Entry
Point
nodes
35
36. Pa9ern
matching:
l’algoritmo
RETE
rule
"Trova
gli
Stefano"
when
$p:
Person(
name
==
"Stefano"
)
then
System.out.println($p);
end
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
Root
node
Entry
Point
nodes
Object
Type
nodes
36
37. Pa9ern
matching:
l’algoritmo
RETE
rule
"Trova
gli
Stefano"
when
$p:
Person(
name
==
"Stefano"
)
then
System.out.println($p);
end
Root
node
Entry
Point
nodes
Object
Type
nodes
Alfa
nodes
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
37
38. Pa9ern
matching:
l’algoritmo
RETE
rule
"Trova
gli
Stefano"
when
$p:
Person(
name
==
"Stefano"
)
then
System.out.println($p);
end
Root
node
Entry
Point
nodes
Object
Type
nodes
Alfa
nodes
Memory
nodes
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
38
39. Pa9ern
matching:
l’algoritmo
RETE
rule
"Trova
gli
Stefano"
when
$p:
Person(
name
==
"Stefano"
)
then
System.out.println($p);
end
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
40. Pa9ern
matching:
l’algoritmo
RETE
rule
"Trova
gli
Stefano"
when
$p:
Person(
name
==
"Stefano"
)
then
System.out.println($p);
end
Root
node
Entry
Point
nodes
Object
Type
nodes
Alfa
nodes
Memory
nodes
Terminal
nodes
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
40
41. Pa9ern
matching:
l’algoritmo
RETE
Root
node
Entry
Point
nodes
Object
Type
nodes
Alfa
nodes
ALFA
NETWORK
rule
"Trova
gli
Stefano"
when
$p:
Person(
name
==
"Stefano"
)
then
System.out.println($p);
end
Memory
nodes
Terminal
nodes
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
41
42. Pa9ern
matching:
l’algoritmo
RETE
Root
node
Entry
Point
nodes
Object
Type
nodes
Alfa
nodes
ALFA
NETWORK
rule
"Trova
gli
Stefano"
when
$p:
Person(
name
==
"Stefano"
)
then
System.out.println($p);
end
Memory
nodes
Terminal
nodes
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
42
43. Pa9ern
matching:
l’algoritmo
RETE
WM
p1: Person("Stefano", null)
a1: Address("Via Po 2", 40068,
San Lazzaro)
p2: Person(Stefano, a1)
p3: Person(Giacomo, a1)
_
Person[Stefano,
null]
Person[Stefano,
Address[Via
Po
2,
40068,
San
Lazzaro]]
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
Root
node
Entry
Point
nodes
Object
Type
nodes
Alfa
nodes
ALFA
NETWORK
rule
Trova
gli
Stefano
when
$p:
Person(
name
==
Stefano
)
then
System.out.println($p);
end
Memory
nodes
Terminal
nodes
43
44. Pa9ern
matching:
l’algoritmo
RETE
Root
node
rule
Trova
gli
Stefano
when
$p:
Person(
name
==
Stefano
)
then
System.out.println($p);
end
Object
Type
nodes
Alfa
nodes
p1
Person[Stefano,
null]
_
Person[Stefano,
Address[Via
Po
2,
40068,
San
Lazzaro]]
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
ALFA
NETWORK
WM
p1: Person(Stefano, null)
a1: Address(Via Po 2, 40068,
San Lazzaro)
p2: Person(Stefano, a1)
p3: Person(Giacomo, a1)
Entry
Point
nodes
Memory
nodes
Terminal
nodes
44
45. Pa9ern
matching:
l’algoritmo
RETE
Root
node
rule
Trova
gli
Stefano
when
$p:
Person(
name
==
Stefano
)
then
System.out.println($p);
end
Object
Type
nodes
Alfa
nodes
p1
Person[Stefano,
null]
_
Person[Stefano,
Address[Via
Po
2,
40068,
San
Lazzaro]]
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
ALFA
NETWORK
WM
p1: Person(Stefano, null)
a1: Address(Via Po 2, 40068,
San Lazzaro)
p2: Person(Stefano, a1)
p3: Person(Giacomo, a1)
Entry
Point
nodes
Memory
nodes
Terminal
nodes
45
46. Pa9ern
matching:
l’algoritmo
RETE
Root
node
rule
Trova
gli
Stefano
when
$p:
Person(
name
==
Stefano
)
then
System.out.println($p);
end
Object
Type
nodes
Alfa
nodes
p1, p2
Person[Stefano,
null]
Person[Stefano,
Address[Via
Po
2,
40068,
San
Lazzaro]]
_
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
ALFA
NETWORK
WM
p1: Person(Stefano, null)
a1: Address(Via Po 2, 40068,
San Lazzaro)
p2: Person(Stefano, a1)
p3: Person(Giacomo, a1)
Entry
Point
nodes
Memory
nodes
Terminal
nodes
46
47. Pa9ern
matching:
l’algoritmo
RETE
Root
node
rule
Trova
gli
Stefano
when
$p:
Person(
name
==
Stefano
)
then
System.out.println($p);
end
Object
Type
nodes
Alfa
nodes
p1, p2
Person[Stefano,
null]
Person[Stefano,
Address[Via
Po
2,
40068,
San
Lazzaro]]
_
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
ALFA
NETWORK
WM
p1: Person(Stefano, null)
a1: Address(Via Po 2, 40068,
San Lazzaro)
p2: Person(Stefano, a1)
p3: Person(Giacomo, a1)
Entry
Point
nodes
Memory
nodes
Terminal
nodes
47
49. Pa9ern
matching:
l’algoritmo
RETE
rule
Trova
gli
Stefano
e
indirizzi
when
$a:
Address()
$p:
Person(
name
==
Stefano
)
then
System.out.println($p+/+$a+
);
end
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
Root
node
Entry
Point
nodes
49
50. Pa9ern
matching:
l’algoritmo
RETE
rule
Trova
gli
Stefano
e
indirizzi
when
$a:
Address()
$p:
Person(
name
==
Stefano
)
then
System.out.println($p+/+$a+
);
end
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
Root
node
Entry
Point
nodes
Object
Type
nodes
50
51. Pa9ern
matching:
l’algoritmo
RETE
rule
Trova
gli
Stefano
e
indirizzi
when
$a:
Address()
$p:
Person(
name
==
Stefano
)
then
System.out.println($p+/+$a+
);
end
Root
node
Entry
Point
nodes
Object
Type
nodes
Memory
nodes
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
51
52. Pa9ern
matching:
l’algoritmo
RETE
rule
Trova
gli
Stefano
e
indirizzi
when
$a:
Address()
$p:
Person(
name
==
Stefano
)
then
System.out.println($p+/+$a+
);
end
Root
node
Entry
Point
nodes
Object
Type
nodes
Memory
nodes
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
52
53. Pa9ern
matching:
l’algoritmo
RETE
rule
Trova
gli
Stefano
e
indirizzi
when
$a:
Address()
$p:
Person(
name
==
Stefano
)
then
System.out.println($p+/+$a+
);
end
Root
node
Entry
Point
nodes
Object
Type
nodes
Alfa
nodes
Memory
nodes
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
53
54. Pa9ern
matching:
l’algoritmo
RETE
rule
Trova
gli
Stefano
e
indirizzi
when
$a:
Address()
$p:
Person(
name
==
Stefano
)
then
System.out.println($p+/+$a+
);
end
Root
node
Entry
Point
nodes
Object
Type
nodes
Alfa
nodes
Memory
nodes
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
54
55. Pa9ern
matching:
l’algoritmo
RETE
rule
Trova
gli
Stefano
e
indirizzi
when
$a:
Address()
$p:
Person(
name
==
Stefano
)
then
System.out.println($p+/+$a+
);
end
Root
node
Entry
Point
nodes
Object
Type
nodes
Alfa
nodes
Memory
nodes
Beta
nodes
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
55
56. Pa9ern
matching:
l’algoritmo
RETE
rule
Trova
gli
Stefano
e
indirizzi
when
$a:
Address()
$p:
Person(
name
==
Stefano
)
then
System.out.println($p+/+$a+
);
end
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
57. Pa9ern
matching:
l’algoritmo
RETE
rule
Trova
gli
Stefano
e
indirizzi
when
$a:
Address()
$p:
Person(
name
==
Stefano
)
then
System.out.println($p+/+$a+
);
end
Root
node
Entry
Point
nodes
Object
Type
nodes
Alfa
nodes
Memory
nodes
Beta
nodes
Memory
nodes
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
57
58. Pa9ern
matching:
l’algoritmo
RETE
rule
Trova
gli
Stefano
e
indirizzi
when
$a:
Address()
$p:
Person(
name
==
Stefano
)
then
System.out.println($p+/+$a+
);
end
Root
node
Entry
Point
nodes
Object
Type
nodes
Alfa
nodes
Memory
nodes
Beta
nodes
Memory
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
59. Pa9ern
matching:
l’algoritmo
RETE
rule
Trova
gli
Stefano
e
indirizzi
when
$a:
Address()
$p:
Person(
name
==
Stefano
)
then
System.out.println($p+/+$a+
);
end
Root
node
Entry
Point
nodes
Object
Type
nodes
Alfa
nodes
Memory
nodes
Beta
nodes
Memory
nodes
Terminal
nodes
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
59
60. Pa9ern
matching:
l’algoritmo
RETE
rule
Trova
gli
Stefano
e
indirizzi
when
$a:
Address()
$p:
Person(
name
==
Stefano
)
then
System.out.println($p+/+$a+
);
end
Root
node
Entry
Point
nodes
Object
Type
nodes
Alfa
nodes
Memory
nodes
Beta
nodes
Memory
nodes
Terminal
nodes
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
60
61. Pa9ern
matching:
l’algoritmo
RETE
rule
Trova
gli
Stefano
e
indirizzi
when
$a:
Address()
$p:
Person(
name
==
Stefano
)
then
System.out.println($p+/+$a+
);
end
Root
node
Entry
Point
nodes
Object
Type
nodes
Alfa
nodes
Memory
nodes
Beta
nodes
Memory
nodes
Terminal
nodes
NB:
Introduco
la
regola
precedente:
I
nodi
della
RETE
vengono
condivisi
quando
possibile!
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
61
62. Pa9ern
matching:
l’algoritmo
RETE
rule
Trova
gli
Stefano
e
indirizzi
when
$a:
Address()
$p:
Person(
name
==
Stefano
)
then
System.out.println($p+/+$a+
);
end
Root
node
Entry
Point
nodes
Object
Type
nodes
Alfa
nodes
Memory
nodes
Beta
nodes
Memory
nodes
Terminal
nodes
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
62
63. Pa9ern
matching:
l’algoritmo
RETE
Root
node
Entry
Point
nodes
Object
Type
nodes
Alfa
nodes
Memory
nodes
ALFA
NETWORK
rule
Trova
gli
Stefano
e
indirizzi
when
$a:
Address()
$p:
Person(
name
==
Stefano
)
then
System.out.println($p+/+$a+
);
end
Beta
nodes
Memory
nodes
Terminal
nodes
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
63
64. Pa9ern
matching:
l’algoritmo
RETE
Root
node
Entry
Point
nodes
Object
Type
nodes
Alfa
nodes
BETA
NETWORK
Memory
nodes
ALFA
NETWORK
rule
Trova
gli
Stefano
e
indirizzi
when
$a:
Address()
$p:
Person(
name
==
Stefano
)
then
System.out.println($p+/+$a+
);
end
Beta
nodes
Memory
nodes
Terminal
nodes
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
64
65. Pa9ern
matching:
l’algoritmo
RETE
Root
node
Entry
Point
nodes
Object
Type
nodes
Alfa
nodes
BETA
NETWORK
Memory
nodes
ALFA
NETWORK
rule
Trova
gli
Stefano
e
indirizzi
when
$a:
Address()
$p:
Person(
name
==
Stefano
)
then
System.out.println($p+/+$a+
);
end
Beta
nodes
Memory
nodes
Terminal
nodes
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
65
66. Pa9ern
matching:
l’algoritmo
RETE
Root
node
Entry
Point
nodes
Object
Type
nodes
Alfa
nodes
WM
BETA
NETWORK
Memory
nodes
ALFA
NETWORK
rule
Trova
gli
Stefano
e
indirizzi
when
$a:
Address()
$p:
Person(
name
==
Stefano
)
then
System.out.println($p+/+$a+
);
end
Beta
nodes
_
Person[p1,
-‐]/Address[a1]
Person[p1,
-‐]/Address[a2]
Person[p2,
-‐]/Address[a1]
Person[p2,
a1]/Address[a2]
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
Memory
nodes
Terminal
nodes
66
67. Pa9ern
matching:
l’algoritmo
RETE
Root
node
rule
Trova
gli
Stefano
e
indirizzi
when
$a:
Address()
$p:
Person(
name
==
Stefano
)
then
System.out.println($p+/+$a+
);
end
Alfa
nodes
a1
_
Person[p1,
-‐]/Address[a1]
Person[p1,
-‐]/Address[a2]
Person[p2,
-‐]/Address[a1]
Person[p2,
a1]/Address[a2]
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
Memory
nodes
ALFA
NETWORK
Object
Type
nodes
BETA
NETWORK
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)
Entry
Point
nodes
Beta
nodes
Memory
nodes
Terminal
nodes
67
68. Pa9ern
matching:
l’algoritmo
RETE
Root
node
rule
Trova
gli
Stefano
e
indirizzi
when
$a:
Address()
$p:
Person(
name
==
Stefano
)
then
System.out.println($p+/+$a+
);
end
Alfa
nodes
a1
Person[p1,
-‐]/Address[a1]
_
Person[p1,
-‐]/Address[a2]
Person[p2,
-‐]/Address[a1]
Person[p2,
a1]/Address[a2]
p1
Memory
nodes
ALFA
NETWORK
Object
Type
nodes
BETA
NETWORK
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)
Entry
Point
nodes
Beta
nodes
p1-a1
Memory
nodes
Terminal
nodes
NB:
Stampa
semplificata
e
output
prima
regola
omesso!
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
68
69. Pa9ern
matching:
l’algoritmo
RETE
Root
node
rule
Trova
gli
Stefano
e
indirizzi
when
$a:
Address()
$p:
Person(
name
==
Stefano
)
then
System.out.println($p+/+$a+
);
end
Alfa
nodes
a1
a2
Person[p1,
-‐]/Address[a1]
Person[p1,
-‐]/Address[a2]
_
Person[p2,
-‐]/Address[a1]
Person[p2,
a1]/Address[a2]
p1
Memory
nodes
ALFA
NETWORK
Object
Type
nodes
BETA
NETWORK
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)
Entry
Point
nodes
Beta
nodes
p1-a1
p1-a2
Memory
nodes
Terminal
nodes
NB:
Stampa
semplificata
e
output
prima
regola
omesso!
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
69
70. Pa9ern
matching:
l’algoritmo
RETE
Root
node
rule
Trova
gli
Stefano
e
indirizzi
when
$a:
Address()
$p:
Person(
name
==
Stefano
)
then
System.out.println($p+/+$a+
);
end
Alfa
nodes
a1
a2
Person[p1,
-‐]/Address[a1]
Person[p1,
-‐]/Address[a2]
Person[p2,
-‐]/Address[a1]
Person[p2,
a1]/Address[a2]
_
p1
p2
Memory
nodes
ALFA
NETWORK
Object
Type
nodes
BETA
NETWORK
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)
Entry
Point
nodes
Beta
nodes
p1-a1
p1-a2
p2-a1
p2-a2
Memory
nodes
Terminal
nodes
NB:
Stampa
semplificata
e
output
prima
regola
omesso!
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
70
71. Pa9ern
matching:
l’algoritmo
RETE
Root
node
rule
Trova
gli
Stefano
e
indirizzi
when
$a:
Address()
$p:
Person(
name
==
Stefano
)
then
System.out.println($p+/+$a+
);
end
Alfa
nodes
a1
a2
Person[p1,
-‐]/Address[a1]
Person[p1,
-‐]/Address[a2]
Person[p2,
-‐]/Address[a1]
Person[p2,
a1]/Address[a2]
_
p1
p2
Memory
nodes
ALFA
NETWORK
Object
Type
nodes
BETA
NETWORK
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)
Entry
Point
nodes
Beta
nodes
p1-a1
p1-a2
p2-a1
p2-a2
Memory
nodes
Terminal
nodes
NB:
Stampa
semplificata
e
output
prima
regola
omesso!
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
71
72. Pa9ern
matching:
l’algoritmo
RETE
Root
node
rule
Trova
gli
Stefano
e
indirizzi
when
$a:
Address()
$p:
Person(
name
==
Stefano
)
then
System.out.println($p+/+$a+
);
end
Alfa
nodes
a1
a2
Person[p1,
-‐]/Address[a1]
Person[p1,
-‐]/Address[a2]
Person[p2,
-‐]/Address[a1]
Person[p2,
a1]/Address[a2]
_
p1
p2
Memory
nodes
ALFA
NETWORK
Object
Type
nodes
BETA
NETWORK
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)
Entry
Point
nodes
Beta
nodes
p1-a1
p1-a2
p2-a1
p2-a2
Memory
nodes
Terminal
nodes
NB:
Stampa
semplificata
e
output
prima
regola
omesso!
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
72
NB:
WM
=
insieme
delle
memories
(distribuita);
oggeH
ripetuC
(ricondante):
spazio
vs
tempo.
74. Pa9ern
matching:
l’algoritmo
RETE
rule
Trova
Stefano
col
suo
indirizzo
when
$a:
Address()
$p:
Person(
name
==
Stefano,
address
==
$a
)
then
System.out.println($p);
end
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
Root
node
Entry
Point
nodes
Object
Type
nodes
Alfa
nodes
Dummy
nodes
Memory
nodes
74
75. Pa9ern
matching:
l’algoritmo
RETE
rule
Trova
Stefano
col
suo
indirizzo
when
$a:
Address()
$p:
Person(
name
==
Stefano,
address
==
$a
)
then
System.out.println($p);
end
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
76. Pa9ern
matching:
l’algoritmo
RETE
rule
Trova
Stefano
col
suo
indirizzo
when
$a:
Address()
$p:
Person(
name
==
Stefano,
address
==
$a
)
then
System.out.println($p);
end
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
77. Pa9ern
matching:
l’algoritmo
RETE
rule
Trova
Stefano
col
suo
indirizzo
when
$a:
Address()
$p:
Person(
name
==
Stefano,
address
==
$a
)
then
System.out.println($p);
end
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
78. Pa9ern
matching:
l’algoritmo
RETE
rule
Trova
Stefano
col
suo
indirizzo
when
$a:
Address()
$p:
Person(
name
==
Stefano,
address
==
$a
)
then
System.out.println($p);
end
Root
node
Entry
Point
nodes
Object
Type
nodes
Alfa
nodes
Dummy
nodes
Memory
nodes
Beta
nodes
Delayed
nodes
Memory
nodes
Terminal
nodes
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
78
79. Pa9ern
matching:
l’algoritmo
RETE
rule
Trova
Stefano
col
suo
indirizzo
when
$a:
Address()
$p:
Person(
name
==
Stefano,
address
==
$a
)
then
System.out.println($p);
end
Root
node
Entry
Point
nodes
Object
Type
nodes
Alfa
nodes
Dummy
nodes
Memory
nodes
Beta
nodes
Delayed
nodes
Memory
nodes
Terminal
nodes
NB:
I
nodi
della
RETE
vengono
condivisi
quando
possibile!
Questa
è
la
prima
regola…
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
79
80. Pa9ern
matching:
l’algoritmo
RETE
rule
Trova
Stefano
col
suo
indirizzo
when
$a:
Address()
$p:
Person(
name
==
Stefano,
address
==
$a
)
then
System.out.println($p);
end
Root
node
Entry
Point
nodes
Object
Type
nodes
Alfa
nodes
Dummy
nodes
Memory
nodes
Beta
nodes
Delayed
nodes
Memory
nodes
Terminal
nodes
NB:
I
nodi
della
RETE
vengono
condivisi
quando
possibile!
Questa
è
la
seconda…
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
80
81. Pa9ern
matching:
l’algoritmo
RETE
rule
Trova
Stefano
col
suo
indirizzo
when
$a:
Address()
$p:
Person(
name
==
Stefano,
address
==
$a
)
then
System.out.println($p);
end
Root
node
Entry
Point
nodes
Object
Type
nodes
Alfa
nodes
Dummy
nodes
Memory
nodes
Beta
nodes
Delayed
nodes
Memory
nodes
Terminal
nodes
NB:
I
nodi
della
RETE
vengono
condivisi
quando
possibile!
Questa
è
l’ulCma
regola!
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
81
82. Pa9ern
matching:
l’algoritmo
RETE
Root
node
Object
Type
nodes
Alfa
nodes
Dummy
nodes
ALFA
NETWORK
Entry
Point
nodes
Memory
nodes
Beta
nodes
Delayed
nodes
Memory
nodes
BETA
NETWORK
rule
Trova
Stefano
col
suo
indirizzo
when
$a:
Address()
$p:
Person(
name
==
Stefano,
address
==
$a
)
then
System.out.println($p);
end
Terminal
nodes
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
82
83. Pa9ern
matching:
l’algoritmo
RETE
Root
node
Object
Type
nodes
Alfa
nodes
Dummy
nodes
Memory
nodes
Beta
nodes
WM
Delayed
nodes
Memory
nodes
_
Person[Stefano,
Address[Via
Po
2,
40068,
San
Lazzaro]]
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
ALFA
NETWORK
Entry
Point
nodes
BETA
NETWORK
rule
Trova
Stefano
col
suo
indirizzo
when
$a:
Address()
$p:
Person(
name
==
Stefano,
address
==
$a
)
then
System.out.println($p);
end
Terminal
nodes
83
84. Pa9ern
matching:
l’algoritmo
RETE
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)
Root
node
Object
Type
nodes
Alfa
nodes
Dummy
nodes
a1
_
Person[Stefano,
Address[Via
Po
2,
40068,
San
Lazzaro]]
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
ALFA
NETWORK
Entry
Point
nodes
Memory
nodes
Beta
nodes
Delayed
nodes
Memory
nodes
BETA
NETWORK
rule
Trova
Stefano
col
suo
indirizzo
when
$a:
Address()
$p:
Person(
name
==
Stefano,
address
==
$a
)
then
System.out.println($p);
end
Terminal
nodes
84
85. Pa9ern
matching:
l’algoritmo
RETE
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)
_
Person[Stefano,
Address[Via
Po
2,
40068,
San
Lazzaro]]
Root
node
Object
Type
nodes
Alfa
nodes
Dummy
nodes
a1
p1
Memory
nodes
Beta
nodes
Delayed
nodes
p1,a1
ALFA
NETWORK
Entry
Point
nodes
Memory
nodes
BETA
NETWORK
rule
Trova
Stefano
col
suo
indirizzo
when
$a:
Address()
$p:
Person(
name
==
Stefano,
address
==
$a
)
then
System.out.println($p);
end
Terminal
nodes
NB:
L’output
delle
prime
due
regole
è
stato
omesso!
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
85
86. Pa9ern
matching:
l’algoritmo
RETE
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)
_
Person[Stefano,
Address[Via
Po
2,
40068,
San
Lazzaro]]
Root
node
Object
Type
nodes
Alfa
nodes
Dummy
nodes
a1
a2
p1
Memory
nodes
Beta
nodes
Delayed
nodes
p1,a1
p1,a2
ALFA
NETWORK
Entry
Point
nodes
Memory
nodes
BETA
NETWORK
rule
Trova
Stefano
col
suo
indirizzo
when
$a:
Address()
$p:
Person(
name
==
Stefano,
address
==
$a
)
then
System.out.println($p);
end
Terminal
nodes
NB:
L’output
delle
prime
due
regole
è
stato
omesso!
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
86
87. Pa9ern
matching:
l’algoritmo
RETE
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)
Person[Stefano,
Address[Via
Po
2,
40068,
San
Lazzaro]]
_
Root
node
Object
Type
nodes
Alfa
nodes
Dummy
nodes
a1
a2
p1
p2
Memory
nodes
Beta
nodes
Delayed
nodes
p1,a1
p1,a2
p2,a1
p2,a2
p1,a1
ALFA
NETWORK
Entry
Point
nodes
Memory
nodes
BETA
NETWORK
rule
Trova
Stefano
col
suo
indirizzo
when
$a:
Address()
$p:
Person(
name
==
Stefano,
address
==
$a
)
then
System.out.println($p);
end
Terminal
nodes
NB:
L’output
delle
prime
due
regole
è
stato
omesso!
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
87
88. Pa9ern
matching:
l’algoritmo
RETE
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)
Person[Stefano,
Address[Via
Po
2,
40068,
San
Lazzaro]]
_
Root
node
Object
Type
nodes
Alfa
nodes
Dummy
nodes
a1
a2
p1
p2
Memory
nodes
Beta
nodes
Delayed
nodes
p1,a1
p1,a2
p2,a1
p2,a2
p1,a1
ALFA
NETWORK
Entry
Point
nodes
Memory
nodes
BETA
NETWORK
rule
Trova
Stefano
col
suo
indirizzo
when
$a:
Address()
$p:
Person(
name
==
Stefano,
address
==
$a
)
then
System.out.println($p);
end
Terminal
nodes
NB:
L’output
delle
prime
due
regole
è
stato
omesso!
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
88
90. Risoluzione
dei
ConfliC
Esecuzione
a i
ai
a i
AGENDA
FIFO
ai
ai
4
Giugno
2013
ai
ai
ai
ai
ai
ai
Sistemi
a
Regole
di
Produzione
ai
ai
ai
E
X
E
C
!
90
91. Risoluzione
dei
ConfliC
Esecuzione
a i
ai
i
a
• oggeC
filtraF
• rif.
regola
-‐
salience
-‐
codice
a i
AGENDA
FIFO
ai
ai
4
Giugno
2013
ai
ai
ai
ai
ai
ai
Sistemi
a
Regole
di
Produzione
ai
ai
ai
E
X
E
C
!
91
92. Risoluzione
dei
ConfliC
Esecuzione
a i
ai
i
a
• oggeC
filtraF
• rif.
regola
-‐
salience
-‐
codice
a i
AGENDA
FIFO
ai
ai
ai
ai
ai
ai
ai
ai
ai
ai
ai
E
X
E
C
!
NB:
In
verità,
una
MapInteger,
QueueAc(va(on
ordinata
per
chiavi
decrescen(!
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
92
93. Risoluzione
dei
ConfliC
Esecuzione
a i
ai
Codice:
i
a
• oggeC
filtraF
• rif.
regola
-‐
salience
-‐
codice
a i
AGENDA
-‐
Azioni
logiche
(pot.
distruave)
-‐
Effea
collaterali
(non
rever(bili!)
FIFO
ai
ai
4
Giugno
2013
ai
ai
ai
ai
ai
ai
Sistemi
a
Regole
di
Produzione
ai
ai
ai
E
X
E
C
!
93
94. Risoluzione
dei
ConfliC
Esecuzione
r1
r2
PM
f
WM
4
Giugno
2013
a1
a2
Agenda
rule
r1
when
F()
then
assert(new
G());
end
rule
r2
when
$f:
F()
then
retract($f);
end
Sistemi
a
Regole
di
Produzione
?!?
94
95. Risoluzione
dei
ConfliC
Esecuzione
r1
r2
PM
a1
a2
Agenda
f
WM
a1 a2
PM
rule
r1
when
F()
then
assert(new
G());
end
a2 a1
PM
Agenda
WM
Prima
inserisco
G,
poi
elimino
F.
4
Giugno
2013
rule
r2
when
$f:
F()
then
retract($f);
end
Agenda
WM
Prima
elimino
F,
a1
non
sussiste
più,
G
mai
asserito.
Sistemi
a
Regole
di
Produzione
?!?
r1 r2
rule
r1
salience
10
...
rule
r2
salience
5
...
Stabilisco
un
ordine
di
precedenza
tra
r1
e
r2
(fisso).
95
97. 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
99. 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:
stefano.bragaglia@unibo.it
4
Giugno
2013
Sistemi
a
Regole
di
Produzione
99
100. Introduzione
a
Drools
Stefano
Bragaglia
Fondamen(
di
Intelligenza
Ar(ficiale
M
5
Giugno
2013
101. RingraziamenF
• Si
ringrazia
l’Ing.
So9ara
per
aver
fornito
la
versione
iniziale
di
questa
esercitazione.
5
Giugno
2013
Introduzione
a
Drools
101
102. 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
104. 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
105. 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
106. 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
107. 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
108. 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
109. 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
110. DroolsTest.java:
caricamento
della
base
di
conoscenza
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
package
com.sample
public
class
DroolsTest
{
public
static
final
void
main(String[]
args)
{..}
private
static
KnowledgeBase
readKnowledgeBase()
throws
Exception
{
KnowledgeBuilder
kbuilder
=
KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource(Sample.drl),
ResourceType.DRL);
KnowledgeBuilderErrors
errors
=
kbuilder.getErrors();
if
(errors.size()
0)
{
for
(KnowledgeBuilderError
error:
errors)
{
System.err.println(error);
}
throw
new
IllegalArgumentException(Could
not
parse
knowledge.);
}
KnowledgeBase
kbase
=
KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
return
kbase;
}
..
}
5
Giugno
2013
Introduzione
a
Drools
110
111. Sample.drl:
file
di
regole
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
package
com.sample
import
com.sample.DroolsTest.Message;
rule
Hello
World
when
m
:
Message(
status
==
Message.HELLO,
myMessage
:
message
)
then
System.out.println(myMessage);
m.setMessage(Goodbye
cruel
world);
m.setStatus(Message.GOODBYE);
update(m);
end
rule
GoodBye
16.
17.
18.
19.
20.
when
Message(
status
==
Message.GOODBYE,
myMessage
:
message
)
then
System.out.println(myMessage);
end
5
Giugno
2013
Introduzione
a
Drools
111
112. 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
115. 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
116. Pa9ern
Semplici
• Creare
un
nuovo
proge9o
come
com.sample
Mail
-‐
sender:
Person
-‐
recipient:
Person
-‐
body:
String
DroolsTest.java
• Creare
I
POJO/BEAN
rappresentaF
nella
figura
di
destra
5
Giugno
2013
-‐
age:
Integer
-‐
name:
String
-‐
...
+
...
HelloWorld
• Rimuovere
ogni
riferimento
a
Message
da
Person
+
...
*
*
Aggiungere
i
campi
costru9ore,
geFer,
seFer,
equals(…),
hashcode()
e
toString().
N.B.:
Eclipse
consente
di
generare
tuC
quesF
metodi
automaFcamente.
Introduzione
a
Drools
116
117. 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
5
Giugno
2013
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();
Introduzione
a
Drools
117
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
5
Giugno
2013
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
Introduzione
a
Drools
118
119. 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
5
Giugno
2013
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
Introduzione
a
Drools
119
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
5
Giugno
2013
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
[||]...
Introduzione
a
Drools
120
121. 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
5
Giugno
2013
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
[||]...
Introduzione
a
Drools
121
123. 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
124. Pa9ern
ComposiF:
Join
• Scrivere
una
regola
per
trovare
tu9e
le
coppie
di
persone
5
Giugno
2013
rule
Regola:
Join
1
when
...
then
...
end
Introduzione
a
Drools
124
125. Pa9ern
ComposiF:
Join
• Scrivere
una
regola
per
trovare
tu9e
le
coppie
di
persone
5
Giugno
2013
rule
Regola:
Join
1
when
$p1:
Person()
$p2:
Person()
then
System.out.println(J1:
+
$p1
+
vs.
+
$p2);
end
Introduzione
a
Drools
125
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…
5
Giugno
2013
rule
Regola:
Join
1
when
$p1:
Person()
$p2:
Person()
then
System.out.println(J1:
+
$p1
+
vs.
+
$p2);
end
Introduzione
a
Drools
126
127. 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…
5
Giugno
2013
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
Introduzione
a
Drools
127
128. Pa9ern
ComposiF:
Join
• Trovare
le
coppie
(non
degeneri)
di
omonimi
rule
Regola:
Join
3
when
...
then
...
end
“Dummy”
nodes!
5
Giugno
2013
Introduzione
a
Drools
128
129. 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
“Dummy”
nodes!
5
Giugno
2013
Introduzione
a
Drools
129
130. Pa9ern
ComposiF:
Join
• Trovare
le
coppie
(non
degeneri)
di
omonimi
• Evitare
le
coppie
inverse:
(a,b)
e
non
(b,a)
“Dummy”
nodes!
5
Giugno
2013
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
Introduzione
a
Drools
130
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
5
Giugno
2013
rule
Regola:
Join
5
when
...
then
...
end
Introduzione
a
Drools
131
132. Pa9ern
ComposiF:
Join
• Trovare
le
coppie
(non
degeneri)
composte
da
un
uomo
ed
una
donna*
in
cui
lei
è
più
giovane
*
Estendere
opportunamente
il
BEAN
5
Giugno
2013
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?
Introduzione
a
Drools
132
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
5
Giugno
2013
rule
Regola:
Join
Multipli
when
...
then
...
end
Introduzione
a
Drools
133
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
5
Giugno
2013
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
Introduzione
a
Drools
134
135. 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
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
NB:
La
Dot
NotaFon
rende
i
pa9ern
più
compaC
5
Giugno
2013
Introduzione
a
Drools
135
137. 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
138. QuanFficatori
Esistenziali
• Stampare
il
nome
delle
persone
– Che
anno
ricevuto
almeno
una
mail
5
Giugno
2013
rule
Regola
QE1
when
...
then
...
end
Introduzione
a
Drools
138
139. 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
NB:
le
regole
sca9ano
0
o
1
volte
per
persona
5
Giugno
2013
Introduzione
a
Drools
139
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
...
then
...
end
5
Giugno
2013
Introduzione
a
Drools
140
141. QuanFficatori
Esistenziali
• Stampare
il
nome
delle
persone
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
NB:
le
regole
sca9ano
0
o
1
volte
per
persona
5
Giugno
2013
Introduzione
a
Drools
– Che
anno
ricevuto
almeno
una
mail
– Che
non
hanno
ricevuto
alcuna
mail
141
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
5
Giugno
2013
rule
Regola
QE3
when
...
then
...
end
Introduzione
a
Drools
142
143. 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
NB:
le
regole
sca9ano
0
o
1
volte
per
persona
5
Giugno
2013
Introduzione
a
Drools
143
145. 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
146. 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
147. Concatenazione
di
Regole
• Scrivere
una
regola
per
stampare
un
messaggio
a
video
per
ogni
Pair
presente
in
WM
5
Giugno
2013
rule
Regola
CdR
1
when
...
then
...
end
Introduzione
a
Drools
147
148. Concatenazione
di
Regole
• Scrivere
una
regola
per
stampare
un
messaggio
a
video
per
ogni
Pair
presente
in
WM
5
Giugno
2013
rule
Regola
CdR
1
when
$p:
Pair()
then
System.out.println(CdR1
–
Pair:
+
$p);
end
Introduzione
a
Drools
148
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
...
then
...
end
5
Giugno
2013
Introduzione
a
Drools
149
150. 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
NB:
L’ordine
delle
regole
è
ininfluente
5
Giugno
2013
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
Introduzione
a
Drools
150