SlideShare a Scribd company logo
1 of 193
Download to read offline
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. 
4. 
5. 
6. 

Pa9ern	
  matching:	
  l’algoritmo	
  RETE	
  
Risoluzione	
  dei	
  confliC	
  &	
  Esecuzione	
  
RiferimenF	
  
Informazioni	
  

4	
  Giugno	
  2013	
  

Sistemi	
  a	
  Regole	
  di	
  Produzione	
  

2	
  
FondamenF	
  di	
  Intelligenza	
  ArFficiale	
  M	
  

SISTEMI	
  A	
  REGOLE	
  
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:	
  
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	
  
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	
  
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	
  
Sistemi	
  a	
  Regole	
  
Programmi	
  logici	
  

4	
  Giugno	
  2013	
  

Regole	
  di	
  produzione	
  

Sistemi	
  a	
  Regole	
  di	
  Produzione	
  

8	
  
Sistemi	
  a	
  Regole	
  
Programmi	
  logici	
  

4	
  Giugno	
  2013	
  

Regole	
  di	
  produzione	
  

Sistemi	
  a	
  Regole	
  di	
  Produzione	
  

9	
  
Sistemi	
  a	
  Regole	
  
Programmi	
  logici	
  

4	
  Giugno	
  2013	
  

Regole	
  di	
  produzione	
  

Sistemi	
  a	
  Regole	
  di	
  Produzione	
  

10	
  
Sistemi	
  a	
  Regole	
  
Programmi	
  logici	
  

4	
  Giugno	
  2013	
  

Regole	
  di	
  produzione	
  

Sistemi	
  a	
  Regole	
  di	
  Produzione	
  

11	
  
Sistemi	
  a	
  Regole	
  
Programmi	
  logici	
  

4	
  Giugno	
  2013	
  

Regole	
  di	
  produzione	
  

Sistemi	
  a	
  Regole	
  di	
  Produzione	
  

12	
  
Sistemi	
  a	
  Regole	
  
Programmi	
  logici	
  

4	
  Giugno	
  2013	
  

Regole	
  di	
  produzione	
  

Sistemi	
  a	
  Regole	
  di	
  Produzione	
  

13	
  
Sistemi	
  a	
  Regole	
  
Programmi	
  logici	
  

4	
  Giugno	
  2013	
  

Regole	
  di	
  produzione	
  

Sistemi	
  a	
  Regole	
  di	
  Produzione	
  

14	
  
FondamenF	
  di	
  Intelligenza	
  ArFficiale	
  M	
  

SISTEMI	
  A	
  REGOLE	
  DI	
  PRODUZIONE	
  
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	
  
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	
  
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	
  
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	
  
FondamenF	
  di	
  Intelligenza	
  ArFficiale	
  M	
  

JBOSS	
  DROOLS	
  
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	
  
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	
  
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	
  
...	
  

4	
  Giugno	
  2013	
  

Sistemi	
  a	
  Regole	
  di	
  Produzione	
  

Address	
  
-­‐	
  street:	
  String	
  
-­‐	
  zip:	
  long	
  
-­‐	
  city:	
  String	
  
...	
  
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	
  
FondamenF	
  di	
  Intelligenza	
  ArFficiale	
  M	
  

PATTERN	
  MATCHING:	
  	
  
L’ALGORITMO	
  RETE	
  
Pa9ern	
  Matching:	
  l’algoritmo	
  RETE	
  

A	
  REGOLA	
  DI	
  ESEMPIO	
  
1

4	
  Giugno	
  2013	
  

Sistemi	
  a	
  Regole	
  di	
  Produzione	
  

34	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
Pa9ern	
  Matching:	
  l’algoritmo	
  RETE	
  

A	
  REGOLA	
  DI	
  ESEMPIO	
  
2

4	
  Giugno	
  2013	
  

Sistemi	
  a	
  Regole	
  di	
  Produzione	
  

48	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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.	
  
Pa9ern	
  Matching:	
  l’algoritmo	
  RETE	
  

A	
  REGOLA	
  DI	
  ESEMPIO	
  
3

4	
  Giugno	
  2013	
  

Sistemi	
  a	
  Regole	
  di	
  Produzione	
  

73	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
FondamenF	
  di	
  Intelligenza	
  ArFficiale	
  M	
  

RISOLUZIONE	
  DEI	
  CONFLITTI	
  
ED	
  ESECUZIONE	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
FondamenF	
  di	
  Intelligenza	
  ArFficiale	
  M	
  

RIFERIMENTI	
  
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	
  
FondamenF	
  di	
  Intelligenza	
  ArFficiale	
  M	
  

INFORMAZIONI	
  
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	
  
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	
  
FondamenF	
  di	
  Intelligenza	
  ArFficiale	
  M	
  

GUIDA	
  INTRODUTTIVA	
  
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. 
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	
  
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	
  
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	
  
FondamenF	
  di	
  Intelligenza	
  ArFficiale	
  M	
  

ESERCIZI	
  
Esercizi	
  

PATTERN	
  SEMPLICI	
  
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	
  

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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
Esercizi	
  

PATTERN	
  COMPOSITI	
  
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	
  

5	
  Giugno	
  2013	
  

rule	
  Regola:	
  Join	
  1	
  
when	
  
	
  	
  ...	
  
then	
  
	
  	
  ...	
  
end	
  

Introduzione	
  a	
  Drools	
  

124	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
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	
  
Esercizi	
  

QUANTIFICATORI	
  ESISTENZIALI	
  
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	
  

5	
  Giugno	
  2013	
  

rule	
  Regola	
  QE1	
  
when	
  
	
  	
  ...	
  
then	
  
	
  	
  ...	
  
end	
  

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	
  

NB:	
  le	
  regole	
  sca9ano	
  0	
  o	
  1	
  volte	
  per	
  persona	
  
5	
  Giugno	
  2013	
  

Introduzione	
  a	
  Drools	
  

139	
  
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	
  

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	
  
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	
  
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	
  
Esercizi	
  

CONCATENAZIONE	
  DI	
  REGOLE	
  
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	
  

5	
  Giugno	
  2013	
  

rule	
  Regola	
  CdR	
  1	
  
when	
  
	
  	
  ...	
  
then	
  
	
  	
  ...	
  
end	
  

Introduzione	
  a	
  Drools	
  

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	
  
	
  	
  $p:	
  Pair()	
  
then	
  
	
  	
  System.out.println(CdR1	
  –	
  Pair:	
  	
  +	
  $p);	
  
end	
  

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	
  
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	
  
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)

More Related Content

Similar to Introducing PRSs and Drools (in Italian)

Cap6 cosa serve_progett_concet_n
Cap6 cosa serve_progett_concet_nCap6 cosa serve_progett_concet_n
Cap6 cosa serve_progett_concet_nRiccardo Grosso
 
AlgoMOOC 01.02 (2018) - Organizzazione del corso
AlgoMOOC 01.02 (2018) - Organizzazione del corsoAlgoMOOC 01.02 (2018) - Organizzazione del corso
AlgoMOOC 01.02 (2018) - Organizzazione del corsoAlessandro Bogliolo
 
Scrivere e leggere log con elastic
Scrivere e leggere log con elasticScrivere e leggere log con elastic
Scrivere e leggere log con elasticMassimiliano Arione
 
An MPI approach to build philogenetics trees
An MPI approach to build philogenetics treesAn MPI approach to build philogenetics trees
An MPI approach to build philogenetics treesAlessandro Della Rocca
 
Come installare Liferay 7 su JBOSS EAP con il supporto​ Oracle Database
Come installare Liferay 7 su JBOSS EAP con il supporto​ Oracle DatabaseCome installare Liferay 7 su JBOSS EAP con il supporto​ Oracle Database
Come installare Liferay 7 su JBOSS EAP con il supporto​ Oracle DatabaseAntonio Musarra
 
Log files - Approcci al Troubleshooting
 Log files - Approcci al Troubleshooting Log files - Approcci al Troubleshooting
Log files - Approcci al TroubleshootingFulvio Corno
 
Back to Basics, webinar 6: Messa in esercizio
Back to Basics, webinar 6: Messa in esercizioBack to Basics, webinar 6: Messa in esercizio
Back to Basics, webinar 6: Messa in esercizioMongoDB
 
MuleSoft_Meetup__Official__8_.pdf
MuleSoft_Meetup__Official__8_.pdfMuleSoft_Meetup__Official__8_.pdf
MuleSoft_Meetup__Official__8_.pdfFlorence Consulting
 
Enterprise Applications - Angular Day 2018
Enterprise Applications - Angular Day 2018Enterprise Applications - Angular Day 2018
Enterprise Applications - Angular Day 2018Paolo Galfione
 
DotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptDotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptSinergia Totale
 
Laboratorio Di Basi Di Dati 08 Il Web Server Apache
Laboratorio Di  Basi Di  Dati 08  Il  Web Server  ApacheLaboratorio Di  Basi Di  Dati 08  Il  Web Server  Apache
Laboratorio Di Basi Di Dati 08 Il Web Server Apacheguestbe916c
 
Presentazione ufficiale splittata
Presentazione ufficiale splittataPresentazione ufficiale splittata
Presentazione ufficiale splittataFrancesco Rizzo
 

Similar to Introducing PRSs and Drools (in Italian) (12)

Cap6 cosa serve_progett_concet_n
Cap6 cosa serve_progett_concet_nCap6 cosa serve_progett_concet_n
Cap6 cosa serve_progett_concet_n
 
AlgoMOOC 01.02 (2018) - Organizzazione del corso
AlgoMOOC 01.02 (2018) - Organizzazione del corsoAlgoMOOC 01.02 (2018) - Organizzazione del corso
AlgoMOOC 01.02 (2018) - Organizzazione del corso
 
Scrivere e leggere log con elastic
Scrivere e leggere log con elasticScrivere e leggere log con elastic
Scrivere e leggere log con elastic
 
An MPI approach to build philogenetics trees
An MPI approach to build philogenetics treesAn MPI approach to build philogenetics trees
An MPI approach to build philogenetics trees
 
Come installare Liferay 7 su JBOSS EAP con il supporto​ Oracle Database
Come installare Liferay 7 su JBOSS EAP con il supporto​ Oracle DatabaseCome installare Liferay 7 su JBOSS EAP con il supporto​ Oracle Database
Come installare Liferay 7 su JBOSS EAP con il supporto​ Oracle Database
 
Log files - Approcci al Troubleshooting
 Log files - Approcci al Troubleshooting Log files - Approcci al Troubleshooting
Log files - Approcci al Troubleshooting
 
Back to Basics, webinar 6: Messa in esercizio
Back to Basics, webinar 6: Messa in esercizioBack to Basics, webinar 6: Messa in esercizio
Back to Basics, webinar 6: Messa in esercizio
 
MuleSoft_Meetup__Official__8_.pdf
MuleSoft_Meetup__Official__8_.pdfMuleSoft_Meetup__Official__8_.pdf
MuleSoft_Meetup__Official__8_.pdf
 
Enterprise Applications - Angular Day 2018
Enterprise Applications - Angular Day 2018Enterprise Applications - Angular Day 2018
Enterprise Applications - Angular Day 2018
 
DotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptDotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScript
 
Laboratorio Di Basi Di Dati 08 Il Web Server Apache
Laboratorio Di  Basi Di  Dati 08  Il  Web Server  ApacheLaboratorio Di  Basi Di  Dati 08  Il  Web Server  Apache
Laboratorio Di Basi Di Dati 08 Il Web Server Apache
 
Presentazione ufficiale splittata
Presentazione ufficiale splittataPresentazione ufficiale splittata
Presentazione ufficiale splittata
 

More from Stefano Bragaglia

ILP 2014 - Nonmonotonic Learning in Large Biological Network
ILP 2014 - Nonmonotonic Learning in Large Biological NetworkILP 2014 - Nonmonotonic Learning in Large Biological Network
ILP 2014 - Nonmonotonic Learning in Large Biological NetworkStefano Bragaglia
 
Stefano Bragaglia CV (January 2014)
Stefano Bragaglia CV (January 2014)Stefano Bragaglia CV (January 2014)
Stefano Bragaglia CV (January 2014)Stefano Bragaglia
 
A Distributed System Using MS Kinect and Event Calculus for Adaptive Physioth...
A Distributed System Using MS Kinect and Event Calculus for Adaptive Physioth...A Distributed System Using MS Kinect and Event Calculus for Adaptive Physioth...
A Distributed System Using MS Kinect and Event Calculus for Adaptive Physioth...Stefano Bragaglia
 
ePolicy's internal GlobalOpt webapp
ePolicy's internal GlobalOpt webappePolicy's internal GlobalOpt webapp
ePolicy's internal GlobalOpt webappStefano Bragaglia
 
RTAI - Earliest Deadline First
RTAI - Earliest Deadline FirstRTAI - Earliest Deadline First
RTAI - Earliest Deadline FirstStefano Bragaglia
 
Approximate Inference for Logic Programs with Annotated Disjunctions (RCRA 2009)
Approximate Inference for Logic Programs with Annotated Disjunctions (RCRA 2009)Approximate Inference for Logic Programs with Annotated Disjunctions (RCRA 2009)
Approximate Inference for Logic Programs with Annotated Disjunctions (RCRA 2009)Stefano Bragaglia
 
Stefano Bragaglia MSc Thesis, awarded as Best Italian thesis in AI 2009/2010
Stefano Bragaglia MSc Thesis, awarded as Best Italian thesis in AI 2009/2010Stefano Bragaglia MSc Thesis, awarded as Best Italian thesis in AI 2009/2010
Stefano Bragaglia MSc Thesis, awarded as Best Italian thesis in AI 2009/2010Stefano Bragaglia
 
Promotional poster for the ePolicy project
Promotional poster for the ePolicy projectPromotional poster for the ePolicy project
Promotional poster for the ePolicy projectStefano Bragaglia
 

More from Stefano Bragaglia (11)

A Study in (P)rose
A Study in (P)roseA Study in (P)rose
A Study in (P)rose
 
ILP 2014 - Nonmonotonic Learning in Large Biological Network
ILP 2014 - Nonmonotonic Learning in Large Biological NetworkILP 2014 - Nonmonotonic Learning in Large Biological Network
ILP 2014 - Nonmonotonic Learning in Large Biological Network
 
Stefano Bragaglia CV (January 2014)
Stefano Bragaglia CV (January 2014)Stefano Bragaglia CV (January 2014)
Stefano Bragaglia CV (January 2014)
 
A Distributed System Using MS Kinect and Event Calculus for Adaptive Physioth...
A Distributed System Using MS Kinect and Event Calculus for Adaptive Physioth...A Distributed System Using MS Kinect and Event Calculus for Adaptive Physioth...
A Distributed System Using MS Kinect and Event Calculus for Adaptive Physioth...
 
ePolicy's internal GlobalOpt webapp
ePolicy's internal GlobalOpt webappePolicy's internal GlobalOpt webapp
ePolicy's internal GlobalOpt webapp
 
Bolognese sauce
Bolognese sauceBolognese sauce
Bolognese sauce
 
RTAI - Earliest Deadline First
RTAI - Earliest Deadline FirstRTAI - Earliest Deadline First
RTAI - Earliest Deadline First
 
Approximate Inference for Logic Programs with Annotated Disjunctions (RCRA 2009)
Approximate Inference for Logic Programs with Annotated Disjunctions (RCRA 2009)Approximate Inference for Logic Programs with Annotated Disjunctions (RCRA 2009)
Approximate Inference for Logic Programs with Annotated Disjunctions (RCRA 2009)
 
Stefano Bragaglia MSc Thesis, awarded as Best Italian thesis in AI 2009/2010
Stefano Bragaglia MSc Thesis, awarded as Best Italian thesis in AI 2009/2010Stefano Bragaglia MSc Thesis, awarded as Best Italian thesis in AI 2009/2010
Stefano Bragaglia MSc Thesis, awarded as Best Italian thesis in AI 2009/2010
 
Ontology development
Ontology developmentOntology development
Ontology development
 
Promotional poster for the ePolicy project
Promotional poster for the ePolicy projectPromotional poster for the ePolicy project
Promotional poster for the ePolicy project
 

Recently uploaded

RICERCA_SUGLI ANFIBI PER LA PRIMA MEDIA.
RICERCA_SUGLI ANFIBI PER LA PRIMA MEDIA.RICERCA_SUGLI ANFIBI PER LA PRIMA MEDIA.
RICERCA_SUGLI ANFIBI PER LA PRIMA MEDIA.giuliofiorerm
 
XIII Lezione - Arabo G.Rammo @ Libera Accademia Romana
XIII Lezione - Arabo G.Rammo @ Libera Accademia RomanaXIII Lezione - Arabo G.Rammo @ Libera Accademia Romana
XIII Lezione - Arabo G.Rammo @ Libera Accademia RomanaStefano Lariccia
 
Ticonzero news 148.pdf aprile 2024 Terza cultura
Ticonzero news 148.pdf aprile 2024 Terza culturaTiconzero news 148.pdf aprile 2024 Terza cultura
Ticonzero news 148.pdf aprile 2024 Terza culturaPierLuigi Albini
 
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla Cresima
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla CresimaIL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla Cresima
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla CresimaRafael Figueredo
 
La seconda guerra mondiale per licei e scuole medie
La seconda guerra mondiale per licei e scuole medieLa seconda guerra mondiale per licei e scuole medie
La seconda guerra mondiale per licei e scuole medieVincenzoPantalena1
 
lezione di fisica_I moti nel piano_Amaldi
lezione di fisica_I moti nel piano_Amaldilezione di fisica_I moti nel piano_Amaldi
lezione di fisica_I moti nel piano_Amaldivaleriodinoia35
 
Corso di digitalizzazione e reti per segretario amministrativo
Corso di digitalizzazione e reti per segretario amministrativoCorso di digitalizzazione e reti per segretario amministrativo
Corso di digitalizzazione e reti per segretario amministrativovaleriodinoia35
 
XI Lezione - Arabo LAR Giath Rammo @ Libera Accademia Romana
XI Lezione - Arabo LAR Giath Rammo @ Libera Accademia RomanaXI Lezione - Arabo LAR Giath Rammo @ Libera Accademia Romana
XI Lezione - Arabo LAR Giath Rammo @ Libera Accademia RomanaStefano Lariccia
 
Esperimenti_laboratorio di fisica per la scuola superiore
Esperimenti_laboratorio di fisica per la scuola superioreEsperimenti_laboratorio di fisica per la scuola superiore
Esperimenti_laboratorio di fisica per la scuola superiorevaleriodinoia35
 
CON OCCHI DIVERSI - catechesi per candidati alla Cresima
CON OCCHI DIVERSI - catechesi per candidati alla CresimaCON OCCHI DIVERSI - catechesi per candidati alla Cresima
CON OCCHI DIVERSI - catechesi per candidati alla CresimaRafael Figueredo
 

Recently uploaded (10)

RICERCA_SUGLI ANFIBI PER LA PRIMA MEDIA.
RICERCA_SUGLI ANFIBI PER LA PRIMA MEDIA.RICERCA_SUGLI ANFIBI PER LA PRIMA MEDIA.
RICERCA_SUGLI ANFIBI PER LA PRIMA MEDIA.
 
XIII Lezione - Arabo G.Rammo @ Libera Accademia Romana
XIII Lezione - Arabo G.Rammo @ Libera Accademia RomanaXIII Lezione - Arabo G.Rammo @ Libera Accademia Romana
XIII Lezione - Arabo G.Rammo @ Libera Accademia Romana
 
Ticonzero news 148.pdf aprile 2024 Terza cultura
Ticonzero news 148.pdf aprile 2024 Terza culturaTiconzero news 148.pdf aprile 2024 Terza cultura
Ticonzero news 148.pdf aprile 2024 Terza cultura
 
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla Cresima
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla CresimaIL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla Cresima
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla Cresima
 
La seconda guerra mondiale per licei e scuole medie
La seconda guerra mondiale per licei e scuole medieLa seconda guerra mondiale per licei e scuole medie
La seconda guerra mondiale per licei e scuole medie
 
lezione di fisica_I moti nel piano_Amaldi
lezione di fisica_I moti nel piano_Amaldilezione di fisica_I moti nel piano_Amaldi
lezione di fisica_I moti nel piano_Amaldi
 
Corso di digitalizzazione e reti per segretario amministrativo
Corso di digitalizzazione e reti per segretario amministrativoCorso di digitalizzazione e reti per segretario amministrativo
Corso di digitalizzazione e reti per segretario amministrativo
 
XI Lezione - Arabo LAR Giath Rammo @ Libera Accademia Romana
XI Lezione - Arabo LAR Giath Rammo @ Libera Accademia RomanaXI Lezione - Arabo LAR Giath Rammo @ Libera Accademia Romana
XI Lezione - Arabo LAR Giath Rammo @ Libera Accademia Romana
 
Esperimenti_laboratorio di fisica per la scuola superiore
Esperimenti_laboratorio di fisica per la scuola superioreEsperimenti_laboratorio di fisica per la scuola superiore
Esperimenti_laboratorio di fisica per la scuola superiore
 
CON OCCHI DIVERSI - catechesi per candidati alla Cresima
CON OCCHI DIVERSI - catechesi per candidati alla CresimaCON OCCHI DIVERSI - catechesi per candidati alla Cresima
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  
  • 3. FondamenF  di  Intelligenza  ArFficiale  M   SISTEMI  A  REGOLE  
  • 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  
  • 15. FondamenF  di  Intelligenza  ArFficiale  M   SISTEMI  A  REGOLE  DI  PRODUZIONE  
  • 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  
  • 20. FondamenF  di  Intelligenza  ArFficiale  M   JBOSS  DROOLS  
  • 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  
  • 33. FondamenF  di  Intelligenza  ArFficiale  M   PATTERN  MATCHING:     L’ALGORITMO  RETE  
  • 34. Pa9ern  Matching:  l’algoritmo  RETE   A  REGOLA  DI  ESEMPIO   1 4  Giugno  2013   Sistemi  a  Regole  di  Produzione   34  
  • 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  
  • 48. Pa9ern  Matching:  l’algoritmo  RETE   A  REGOLA  DI  ESEMPIO   2 4  Giugno  2013   Sistemi  a  Regole  di  Produzione   48  
  • 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.  
  • 73. Pa9ern  Matching:  l’algoritmo  RETE   A  REGOLA  DI  ESEMPIO   3 4  Giugno  2013   Sistemi  a  Regole  di  Produzione   73  
  • 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  
  • 89. FondamenF  di  Intelligenza  ArFficiale  M   RISOLUZIONE  DEI  CONFLITTI   ED  ESECUZIONE  
  • 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  
  • 96. FondamenF  di  Intelligenza  ArFficiale  M   RIFERIMENTI  
  • 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  
  • 98. FondamenF  di  Intelligenza  ArFficiale  M   INFORMAZIONI  
  • 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  
  • 103. FondamenF  di  Intelligenza  ArFficiale  M   GUIDA  INTRODUTTIVA  
  • 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  
  • 113. FondamenF  di  Intelligenza  ArFficiale  M   ESERCIZI  
  • 114. Esercizi   PATTERN  SEMPLICI   5  Giugno  2013   Introduzione  a  Drools   114  
  • 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  
  • 122. Esercizi   PATTERN  COMPOSITI   5  Giugno  2013   Introduzione  a  Drools   122  
  • 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  
  • 136. Esercizi   QUANTIFICATORI  ESISTENZIALI   5  Giugno  2013   Introduzione  a  Drools   136  
  • 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  
  • 144. Esercizi   CONCATENAZIONE  DI  REGOLE   5  Giugno  2013   Introduzione  a  Drools   144  
  • 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