Introducing PRSs and Drools (in Italian)

193
Sistemi a Regole di Produzione Stefano Bragaglia Fondamen( di Intelligenza Ar(ficiale M 4 Giugno 2013

description

I presented these slides introducing Production Rules Systems in June 2013 to the students of the 'Fondamenti di Intelligenza Artificiale' course of the University of Bologna, Italy. I pass from the theory to the practice, showing the architecture and the components of PRSs. In the final part, an intuition of the operating principles are also given.

Transcript of Introducing PRSs and Drools (in Italian)

Page 1: Introducing PRSs and Drools (in Italian)

Sistemi  a    Regole  di  Produzione  

Stefano  Bragaglia    

Fondamen(  di  Intelligenza  Ar(ficiale  M  4  Giugno  2013    

Page 2: Introducing PRSs and Drools (in Italian)

Sommario  

1.  Sistemi  a  regole  2.  Sistemi  a  regole  di  produzione  •  JBoss  Drools  •  Un  caso  d’uso  

3.  Pa9ern  matching:  l’algoritmo  RETE  4.  Risoluzione  dei  confliC  &  Esecuzione  5.  RiferimenF  6.  Informazioni  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   2  

Page 3: Introducing PRSs and Drools (in Italian)

SISTEMI  A  REGOLE  FondamenF  di  Intelligenza  ArFficiale  M  

Page 4: Introducing PRSs and Drools (in Italian)

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  

Page 5: Introducing PRSs and Drools (in Italian)

Sistemi  a  Regole  •  Il  Modus  Ponens,  anche  de9o  Principio  di  disgiunzione,  

Affermazione  dell’antecedente  o  Ragionamento  direFo,  prevede  che:  

se  è  vero  che  p(X)  implica  q(Y)  e  p(x)  è  vero,  allora  q(y)  è  ugualmente  vero  

•  Es.:  Se  piove,  allora  la  strada  si  bagna.        Qui  piove.        Dunque  questa  strada  è  bagnata.  

q(y)  

,  p(x)   p(X)   q(Y)  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   5  

Page 6: Introducing PRSs and Drools (in Italian)

Sistemi  a  Regole  •  Il  Modus  Ponens,  anche  de9o  Principio  di  disgiunzione,  

Affermazione  dell’antecedente  o  Ragionamento  direFo,  prevede  che:  

se  è  vero  che  p(X)  implica  q(Y)  e  p(x)  è  vero,  allora  q(y)  è  ugualmente  vero  

•  Es.:  Se  piove,  allora  la  strada  si  bagna.                                implicazione      Qui  piove.                                                                                                                            premessa      Dunque  questa  strada  è  bagnata.                                  conseguenza  

implicazione  premessa  

conseguenza  q(y)  

,  p(x)   p(X)   q(Y)  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   6  

Page 7: Introducing PRSs and Drools (in Italian)

Sistemi  a  Regole  

Programmi  logici  •  Backward-­‐chaining  •  Dal  goal  ai  faC,  applicando  le  regole  all’indietro  

•  Generalmente  conservaFvi  

•  Unificazione  •  Backtracking  

Regole  di  produzione  •  Forward-­‐chaining  •  I  faC  aCvano  le  regole  che  generano  nuovi  faC  

•  Potenzialmente  distruCve  

•  Pa9ern  matching  •  Parallelismo  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   7  

Page 8: Introducing PRSs and Drools (in Italian)

Sistemi  a  Regole  

Programmi  logici   Regole  di  produzione  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   8  

Page 9: Introducing PRSs and Drools (in Italian)

Sistemi  a  Regole  

Programmi  logici   Regole  di  produzione  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   9  

Page 10: Introducing PRSs and Drools (in Italian)

Sistemi  a  Regole  

Programmi  logici   Regole  di  produzione  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   10  

Page 11: Introducing PRSs and Drools (in Italian)

Sistemi  a  Regole  

Programmi  logici   Regole  di  produzione  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   11  

Page 12: Introducing PRSs and Drools (in Italian)

Sistemi  a  Regole  

Programmi  logici   Regole  di  produzione  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   12  

Page 13: Introducing PRSs and Drools (in Italian)

Sistemi  a  Regole  

Programmi  logici   Regole  di  produzione  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   13  

Page 14: Introducing PRSs and Drools (in Italian)

Sistemi  a  Regole  

Programmi  logici   Regole  di  produzione  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   14  

Page 15: Introducing PRSs and Drools (in Italian)

SISTEMI  A  REGOLE  DI  PRODUZIONE  FondamenF  di  Intelligenza  ArFficiale  M  

Page 16: Introducing PRSs and Drools (in Italian)

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  

Page 17: Introducing PRSs and Drools (in Italian)

Sistemi  a  Regole  di  Produzione  

Agenda

PM

WM

Pattern Matching!

Conflict Resolution! Execution!

Patterns "+ Actions!

triples "(now beans)!

Output!

Productions:!a  

1 2 3

Facts:!

Schema  archite9urale  e  principio  di  funzionamento  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   17  

Page 18: Introducing PRSs and Drools (in Italian)

Sistemi  a  Regole  di  Produzione  

Agenda

PM

WM

Pattern Matching!

Conflict Resolution! Execution!

Patterns "+ Actions!

triples "(now beans)!

Output!

Productions:!a  

1 2 3

Facts:!

ELABORAZIONE  SUDDIVISA  IN  3  STADI  

Schema  archite9urale  e  principio  di  funzionamento  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   18  

Page 19: Introducing PRSs and Drools (in Italian)

Sistemi  a  Regole  di  Produzione  

Agenda

PM

WM

Pattern Matching!

Conflict Resolution! Execution!

Patterns "+ Actions!

triples "(now beans)!

Output!

Productions:!a  

1 2 3

Facts:!

ELABORAZIONE  SUDDIVISA  IN  3  STADI  

3  MEMORIE  

Schema  archite9urale  e  principio  di  funzionamento  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   19  

Page 20: Introducing PRSs and Drools (in Italian)

JBOSS  DROOLS  FondamenF  di  Intelligenza  ArFficiale  M  

Page 21: Introducing PRSs and Drools (in Italian)

JBoss  Drools  

Expert  (rule  engine)   Fusion  (event  processing)  jBPM  (workflow)  Guvnor  (rule  repo)  

Planner  (constraints)  

•  AlternaCve  –  OPS5,  CLIPS,  Jess,  ILOG,  Jrules,  BizTalk,  …  

•  Sistema  di  riferimento  –  JBoss  Drools  (h9p://www.jboss.org/drools)  

•  Perchè?    –  Open  source,  Java-­‐based,  integrato  con  Eclipse  

•  Parte  di  una  piaRaforma  integrata  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   21  

Page 22: Introducing PRSs and Drools (in Italian)

JBoss  Drools  

Expert  (rule  engine)   Fusion  (event  processing)  jBPM  (workflow)  Guvnor  (rule  repo)  

Planner  (constraints)  

•  AlternaCve  –  OPS5,  CLIPS,  Jess,  ILOG,  Jrules,  BizTalk,  …  

•  Sistema  di  riferimento  –  JBoss  Drools  (h9p://www.jboss.org/drools)  

•  Perchè?    –  Open  source,  Java-­‐based,  integrato  con  Eclipse  

•  Parte  di  una  piaRaforma  integrata  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   22  

Page 23: Introducing PRSs and Drools (in Italian)

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  

Page 24: Introducing PRSs and Drools (in Italian)

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  

Page 25: Introducing PRSs and Drools (in Italian)

JBoss  Drools  •  Sintassi  del  linguaggio  Drools:  queries    query  "ID_query"                                    /*  premessa  */      //  pattern  (composito)  end    

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   25  

Page 26: Introducing PRSs and Drools (in Italian)

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  

Page 27: Introducing PRSs and Drools (in Italian)

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  

Page 28: Introducing PRSs and Drools (in Italian)

JBoss  Drools  •  Sintassi  del  linguaggio  Drools:  oggeH    declare  Person                              /*  dichiarazione  */      name:  String      address:  Address  =  new  Address(...)  end  

Person  -­‐  name:  String  -­‐  address:  Address  ...  

Address  -­‐  street:  String  -­‐  zip:  long  -­‐  city:  String  ...  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   28  

Page 29: Introducing PRSs and Drools (in Italian)

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  

Page 30: Introducing PRSs and Drools (in Italian)

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  

Page 31: Introducing PRSs and Drools (in Italian)

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  

Page 32: Introducing PRSs and Drools (in Italian)

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  

Page 33: Introducing PRSs and Drools (in Italian)

PATTERN  MATCHING:    L’ALGORITMO  RETE  

FondamenF  di  Intelligenza  ArFficiale  M  

Page 34: Introducing PRSs and Drools (in Italian)

1A  REGOLA  DI  ESEMPIO  Pa9ern  Matching:  l’algoritmo  RETE  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   34  

Page 35: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano"  when      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p);  end  

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   35  

Page 36: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano"  when      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p);  end  

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

Object  Type  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   36  

Page 37: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano"  when      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p);  end  

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   37  

Page 38: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano"  when      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p);  end  

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   38  

Page 39: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano"  when      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p);  end  

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

NB:  I  faH  contenuC  in  un  (Alfa)  Memory  Node  fanno  match  con  un  paRern  semplice!  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   39  

Page 40: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano"  when      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p);  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   40  

Page 41: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano"  when      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p);  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

ALFA

 NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   41  

Page 42: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano"  when      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p);  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

ALFA

 NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   42  

Page 43: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano"  when      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p);  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

ALFA

 NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

_  Person[Stefano,  <null>]  Person[Stefano,  Address[Via  Po  2,  40068,  San  Lazzaro]]  

WM

p1: Person("Stefano", null) a1: Address("Via Po 2", 40068, ���

"San Lazzaro") p2: Person("Stefano", a1) p3: Person("Giacomo", a1)

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   43  

Page 44: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano"  when      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p);  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

ALFA

 NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes   p1

Person[Stefano,  <null>]  _  Person[Stefano,  Address[Via  Po  2,  40068,  San  Lazzaro]]  

WM

p1: Person("Stefano", null) a1: Address("Via Po 2", 40068, ���

"San Lazzaro") p2: Person("Stefano", a1) p3: Person("Giacomo", a1)

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   44  

Page 45: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano"  when      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p);  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

ALFA

 NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes   p1

Person[Stefano,  <null>]  _  Person[Stefano,  Address[Via  Po  2,  40068,  San  Lazzaro]]  

WM

p1: Person("Stefano", null) a1: Address("Via Po 2", 40068, ���

"San Lazzaro") p2: Person("Stefano", a1) p3: Person("Giacomo", a1)

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   45  

Page 46: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano"  when      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p);  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

ALFA

 NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  p1, p2

Person[Stefano,  <null>]  Person[Stefano,  Address[Via  Po  2,  40068,  San  Lazzaro]]  _  

WM

p1: Person("Stefano", null) a1: Address("Via Po 2", 40068, ���

"San Lazzaro") p2: Person("Stefano", a1) p3: Person("Giacomo", a1)

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   46  

Page 47: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano"  when      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p);  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

ALFA

 NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Person[Stefano,  <null>]  Person[Stefano,  Address[Via  Po  2,  40068,  San  Lazzaro]]  _  

WM Memory  nodes  

p1: Person("Stefano", null) a1: Address("Via Po 2", 40068, ���

"San Lazzaro") p2: Person("Stefano", a1) p3: Person("Giacomo", a1) p1, p2

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   47  

Page 48: Introducing PRSs and Drools (in Italian)

2A  REGOLA  DI  ESEMPIO  Pa9ern  Matching:  l’algoritmo  RETE  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   48  

Page 49: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano  e  indirizzi"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p+"/"+$a+"  ");  end  

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   49  

Page 50: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano  e  indirizzi"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p+"/"+$a+"  ");  end  

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

Object  Type  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   50  

Page 51: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano  e  indirizzi"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p+"/"+$a+"  ");  end  

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Memory  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   51  

Page 52: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano  e  indirizzi"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p+"/"+$a+"  ");  end  

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Memory  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   52  

Page 53: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano  e  indirizzi"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p+"/"+$a+"  ");  end  

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   53  

Page 54: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano  e  indirizzi"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p+"/"+$a+"  ");  end  

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   54  

Page 55: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano  e  indirizzi"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p+"/"+$a+"  ");  end  

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   55  

Page 56: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano  e  indirizzi"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p+"/"+$a+"  ");  end  

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

NB:  I  Beta  Nodes  fanno  il  prodoRo  cartesiano  degli  oggeH  filtraC  dagli  Alfa  padre!  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   56  

Page 57: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano  e  indirizzi"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p+"/"+$a+"  ");  end  

Pa9ern  matching:  l’algoritmo  RETE  

Memory  nodes  

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   57  

Page 58: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano  e  indirizzi"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p+"/"+$a+"  ");  end  

Pa9ern  matching:  l’algoritmo  RETE  

Memory  nodes  

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

NB:  Le  tuple  contenute  in  un  (Beta)  Memory  Node  fanno  match  con  un  paRern  composito!  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   58  

Page 59: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano  e  indirizzi"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p+"/"+$a+"  ");  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   59  

Page 60: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano  e  indirizzi"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p+"/"+$a+"  ");  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   60  

Page 61: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano  e  indirizzi"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p+"/"+$a+"  ");  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

NB:  Introduco  la  regola  precedente:  I  nodi  della  RETE  vengono  condivisi  quando  possibile!  4  Giugno  2013   Sistemi  a  Regole  di  Produzione   61  

Page 62: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano  e  indirizzi"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p+"/"+$a+"  ");  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   62  

Page 63: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano  e  indirizzi"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p+"/"+$a+"  ");  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   63  

Page 64: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano  e  indirizzi"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p+"/"+$a+"  ");  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  

NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   64  

Page 65: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano  e  indirizzi"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p+"/"+$a+"  ");  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  

NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   65  

Page 66: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano  e  indirizzi"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p+"/"+$a+"  ");  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  

NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

_  Person[p1,  -­‐]/Address[a1]        Person[p1,  -­‐]/Address[a2]  Person[p2,  -­‐]/Address[a1]        Person[p2,  a1]/Address[a2]  

WM

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   66  

Page 67: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano  e  indirizzi"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p+"/"+$a+"  ");  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  

NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

_  Person[p1,  -­‐]/Address[a1]        Person[p1,  -­‐]/Address[a2]  Person[p2,  -­‐]/Address[a1]        Person[p2,  a1]/Address[a2]  

WM

a1: Address("Via Po 2", 40068, ��� "San Lazzaro")

p1: Person("Stefano", null) a2: Address("Via Roma 5", 40128, "Bologna") p2: Person("Stefano", a1) p3: Person("Giacomo", a1)

a1���

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   67  

Page 68: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano  e  indirizzi"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p+"/"+$a+"  ");  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  

NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

Person[p1,  -­‐]/Address[a1]        _  Person[p1,  -­‐]/Address[a2]  Person[p2,  -­‐]/Address[a1]        Person[p2,  a1]/Address[a2]  

WM

a1: Address("Via Po 2", 40068, ��� "San Lazzaro")

p1: Person("Stefano", null) a2: Address("Via Roma 5", 40128, "Bologna") p2: Person("Stefano", a1) p3: Person("Giacomo", a1)

a1

p1

p1-a1

NB:  Stampa  semplificata  e  output  prima  regola  omesso!  4  Giugno  2013   Sistemi  a  Regole  di  Produzione   68  

Page 69: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano  e  indirizzi"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p+"/"+$a+"  ");  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  

NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

Person[p1,  -­‐]/Address[a1]        Person[p1,  -­‐]/Address[a2]  _  Person[p2,  -­‐]/Address[a1]        Person[p2,  a1]/Address[a2]  

WM

a1: Address("Via Po 2", 40068, ��� "San Lazzaro")

p1: Person("Stefano", null) a2: Address("Via Roma 5", 40128, "Bologna") p2: Person("Stefano", a1) p3: Person("Giacomo", a1)

a1���a2

p1

p1-a1 p1-a2���

NB:  Stampa  semplificata  e  output  prima  regola  omesso!  4  Giugno  2013   Sistemi  a  Regole  di  Produzione   69  

Page 70: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano  e  indirizzi"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p+"/"+$a+"  ");  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  

NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

Person[p1,  -­‐]/Address[a1]        Person[p1,  -­‐]/Address[a2]  Person[p2,  -­‐]/Address[a1]        Person[p2,  a1]/Address[a2]  _  

WM

a1: Address("Via Po 2", 40068, ��� "San Lazzaro")

p1: Person("Stefano", null) a2: Address("Via Roma 5", 40128, "Bologna") p2: Person("Stefano", a1) p3: Person("Giacomo", a1)

a1���a2

p1���p2

p1-a1 p1-a2���p2-a1 p2-a2

NB:  Stampa  semplificata  e  output  prima  regola  omesso!  4  Giugno  2013   Sistemi  a  Regole  di  Produzione   70  

Page 71: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano  e  indirizzi"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p+"/"+$a+"  ");  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  

NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

Person[p1,  -­‐]/Address[a1]        Person[p1,  -­‐]/Address[a2]  Person[p2,  -­‐]/Address[a1]        Person[p2,  a1]/Address[a2]  _  

WM

a1: Address("Via Po 2", 40068, ��� "San Lazzaro")

p1: Person("Stefano", null) a2: Address("Via Roma 5", 40128, "Bologna") p2: Person("Stefano", a1) p3: Person("Giacomo", a1)

a1���a2

p1���p2

p1-a1 p1-a2���p2-a1 p2-a2

NB:  Stampa  semplificata  e  output  prima  regola  omesso!  4  Giugno  2013   Sistemi  a  Regole  di  Produzione   71  

Page 72: Introducing PRSs and Drools (in Italian)

rule  "Trova  gli  Stefano  e  indirizzi"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano"  )  then      System.out.println($p+"/"+$a+"  ");  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  

NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

Person[p1,  -­‐]/Address[a1]        Person[p1,  -­‐]/Address[a2]  Person[p2,  -­‐]/Address[a1]        Person[p2,  a1]/Address[a2]  _  

WM

a1: Address("Via Po 2", 40068, ��� "San Lazzaro")

p1: Person("Stefano", null) a2: Address("Via Roma 5", 40128, "Bologna") p2: Person("Stefano", a1) p3: Person("Giacomo", a1)

a1���a2

p1���p2

p1-a1 p1-a2���p2-a1 p2-a2

NB:  Stampa  semplificata  e  output  prima  regola  omesso!  

NB:  WM  =  insieme  delle  memories  (distribuita);  oggeH  ripetuC  (ricondante):  spazio  vs  tempo.  4  Giugno  2013   Sistemi  a  Regole  di  Produzione   72  

Page 73: Introducing PRSs and Drools (in Italian)

3A  REGOLA  DI  ESEMPIO  Pa9ern  Matching:  l’algoritmo  RETE  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   73  

Page 74: Introducing PRSs and Drools (in Italian)

rule  "Trova  Stefano  col  suo  indirizzo"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano",                                address  ==  $a  )  then      System.out.println($p);  end  

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Dummy  nodes  

Memory  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   74  

Page 75: Introducing PRSs and Drools (in Italian)

rule  "Trova  Stefano  col  suo  indirizzo"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano",                                address  ==  $a  )  then      System.out.println($p);  end  

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Dummy  nodes  

Memory  nodes  

NB:  Questo  Alfa  node  conCene  un  riferimento  incrociato  che  non  si  può  ancora  risolvere.  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   75  

Page 76: Introducing PRSs and Drools (in Italian)

rule  "Trova  Stefano  col  suo  indirizzo"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano",                                address  ==  $a  )  then      System.out.println($p);  end  

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Dummy  nodes  

Memory  nodes  

Beta  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   76  

Page 77: Introducing PRSs and Drools (in Italian)

rule  "Trova  Stefano  col  suo  indirizzo"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano",                                address  ==  $a  )  then      System.out.println($p);  end  

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Dummy  nodes  

Memory  nodes  

Beta  nodes  

Delayed  nodes  

NB:  Il  precedente  Alfa  node  è  inserito  qui  perchè  può  risolvere  il  riferimento  incrociato.  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   77  

Page 78: Introducing PRSs and Drools (in Italian)

rule  "Trova  Stefano  col  suo  indirizzo"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano",                                address  ==  $a  )  then      System.out.println($p);  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Dummy  nodes  

Memory  nodes  

Beta  nodes  

Delayed  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   78  

Page 79: Introducing PRSs and Drools (in Italian)

rule  "Trova  Stefano  col  suo  indirizzo"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano",                                address  ==  $a  )  then      System.out.println($p);  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Dummy  nodes  

Memory  nodes  

Beta  nodes  

Delayed  nodes  

NB:  I  nodi  della  RETE  vengono  condivisi  quando  possibile!  Questa  è  la  prima  regola…  4  Giugno  2013   Sistemi  a  Regole  di  Produzione   79  

Page 80: Introducing PRSs and Drools (in Italian)

rule  "Trova  Stefano  col  suo  indirizzo"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano",                                address  ==  $a  )  then      System.out.println($p);  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Dummy  nodes  

Memory  nodes  

Beta  nodes  

Delayed  nodes  

NB:  I  nodi  della  RETE  vengono  condivisi  quando  possibile!  Questa  è  la  seconda…  4  Giugno  2013   Sistemi  a  Regole  di  Produzione   80  

Page 81: Introducing PRSs and Drools (in Italian)

rule  "Trova  Stefano  col  suo  indirizzo"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano",                                address  ==  $a  )  then      System.out.println($p);  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Dummy  nodes  

Memory  nodes  

Beta  nodes  

Delayed  nodes  

NB:  I  nodi  della  RETE  vengono  condivisi  quando  possibile!  Questa  è  l’ulCma  regola!  4  Giugno  2013   Sistemi  a  Regole  di  Produzione   81  

Page 82: Introducing PRSs and Drools (in Italian)

rule  "Trova  Stefano  col  suo  indirizzo"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano",                                address  ==  $a  )  then      System.out.println($p);  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Dummy  nodes  

Memory  nodes  

Beta  nodes  

Delayed  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   82  

Page 83: Introducing PRSs and Drools (in Italian)

rule  "Trova  Stefano  col  suo  indirizzo"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano",                                address  ==  $a  )  then      System.out.println($p);  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Dummy  nodes  

Memory  nodes  

Beta  nodes  

Delayed  nodes  

_  Person[Stefano,  Address[Via  Po  2,  40068,  San  Lazzaro]]  

WM

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   83  

Page 84: Introducing PRSs and Drools (in Italian)

rule  "Trova  Stefano  col  suo  indirizzo"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano",                                address  ==  $a  )  then      System.out.println($p);  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Dummy  nodes  

Memory  nodes  

Beta  nodes  

Delayed  nodes  WM

a1: Address("Via Po 2", 40068, ��� "San Lazzaro")

p1: Person("Stefano", null) a2: Address("Via Roma 5", 40128, "Bologna") p2: Person("Stefano", a1) p3: Person("Giacomo", a1)

a1

_  Person[Stefano,  Address[Via  Po  2,  40068,  San  Lazzaro]]  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   84  

Page 85: Introducing PRSs and Drools (in Italian)

rule  "Trova  Stefano  col  suo  indirizzo"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano",                                address  ==  $a  )  then      System.out.println($p);  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Dummy  nodes  

Memory  nodes  

Beta  nodes  

Delayed  nodes  WM

a1: Address("Via Po 2", 40068, ��� "San Lazzaro")

p1: Person("Stefano", null) a2: Address("Via Roma 5", 40128, "Bologna") p2: Person("Stefano", a1) p3: Person("Giacomo", a1)

a1���

_  Person[Stefano,  Address[Via  Po  2,  40068,  San  Lazzaro]]  

p1���

NB:  L’output  delle  prime  due  regole  è  stato  omesso!  

p1,a1���

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   85  

Page 86: Introducing PRSs and Drools (in Italian)

rule  "Trova  Stefano  col  suo  indirizzo"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano",                                address  ==  $a  )  then      System.out.println($p);  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Dummy  nodes  

Memory  nodes  

Beta  nodes  

Delayed  nodes  WM

a1: Address("Via Po 2", 40068, ��� "San Lazzaro")

p1: Person("Stefano", null) a2: Address("Via Roma 5", 40128, "Bologna") p2: Person("Stefano", a1) p3: Person("Giacomo", a1)

NB:  L’output  delle  prime  due  regole  è  stato  omesso!  

a1���a2

p1���

p1,a1���p1,a2 _  

Person[Stefano,  Address[Via  Po  2,  40068,  San  Lazzaro]]  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   86  

Page 87: Introducing PRSs and Drools (in Italian)

rule  "Trova  Stefano  col  suo  indirizzo"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano",                                address  ==  $a  )  then      System.out.println($p);  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Dummy  nodes  

Memory  nodes  

Beta  nodes  

Delayed  nodes  

Person[Stefano,  Address[Via  Po  2,  40068,  San  Lazzaro]]  _  

WM

a1: Address("Via Po 2", 40068, ��� "San Lazzaro")

p1: Person("Stefano", null) a2: Address("Via Roma 5", 40128, "Bologna") p2: Person("Stefano", a1) p3: Person("Giacomo", a1)

NB:  L’output  delle  prime  due  regole  è  stato  omesso!  

a1���a2

p1���p2

p1,a1���p1,a2 p2,a1 p2,a2

p1,a1���

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   87  

Page 88: Introducing PRSs and Drools (in Italian)

rule  "Trova  Stefano  col  suo  indirizzo"  when      $a:  Address()      $p:  Person(  name  ==  "Stefano",                                address  ==  $a  )  then      System.out.println($p);  end  

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Dummy  nodes  

Memory  nodes  

Beta  nodes  

Delayed  nodes  

Person[Stefano,  Address[Via  Po  2,  40068,  San  Lazzaro]]  _  

WM

a1: Address("Via Po 2", 40068, ��� "San Lazzaro")

p1: Person("Stefano", null) a2: Address("Via Roma 5", 40128, "Bologna") p2: Person("Stefano", a1) p3: Person("Giacomo", a1)

NB:  L’output  delle  prime  due  regole  è  stato  omesso!  

a1���a2

p1���p2

p1,a1���p1,a2 p2,a1 p2,a2

p1,a1���

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   88  

Page 89: Introducing PRSs and Drools (in Italian)

RISOLUZIONE  DEI  CONFLITTI  ED  ESECUZIONE  

FondamenF  di  Intelligenza  ArFficiale  M  

Page 90: Introducing PRSs and Drools (in Italian)

Risoluzione  dei  ConfliC  &  Esecuzione  

ai  

ai   ai   ai   ai   ai   ai   ai   ai   ai   ai  

E  X  E  C      

FIFO  

ai  ai  

a i  

!  

AGENDA  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   90  

Page 91: Introducing PRSs and Drools (in Italian)

Risoluzione  dei  ConfliC  &  Esecuzione  

ai  

ai   ai   ai   ai   ai   ai   ai   ai   ai   ai  

E  X  E  C      

ai  •  oggeC  filtraF  •  rif.  regola              -­‐  salience              -­‐  codice  

FIFO  

ai  ai  

a i  

!  

AGENDA  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   91  

Page 92: Introducing PRSs and Drools (in Italian)

Risoluzione  dei  ConfliC  &  Esecuzione  

ai  

ai   ai   ai   ai   ai   ai   ai   ai   ai   ai  

E  X  E  C      

ai  •  oggeC  filtraF  •  rif.  regola              -­‐  salience              -­‐  codice  

FIFO  

ai  ai  

a i  

!  

AGENDA  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   92  

NB:  In  verità,  una  Map<Integer,  Queue<Ac(va(on>>  ordinata  per  chiavi  decrescen(!  

Page 93: Introducing PRSs and Drools (in Italian)

Risoluzione  dei  ConfliC  &  Esecuzione  

ai  

ai   ai   ai   ai   ai   ai   ai   ai   ai   ai  

E  X  E  C      

ai  •  oggeC  filtraF  •  rif.  regola              -­‐  salience              -­‐  codice  

FIFO  

ai  ai  

a i  

Codice:      -­‐  Azioni  logiche      (pot.  distruave)  -­‐  Effea  collaterali        (non  rever(bili!)  

!  

AGENDA  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   93  

Page 94: Introducing PRSs and Drools (in Italian)

Risoluzione  dei  ConfliC  &  Esecuzione  

PM

r1 r2

WM

f

Agenda a1 a2

rule  "r1"  when      F()  then      assert(new  G());  end  

rule  "r2"  when      $f:  F()  then      retract($f);  end   ?!?

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   94  

Page 95: Introducing PRSs and Drools (in Italian)

Risoluzione  dei  ConfliC  &  Esecuzione  

PM

r1 r2

WM

f

Agenda a1 a2

rule  "r1"  when      F()  then      assert(new  G());  end  

rule  "r2"  when      $f:  F()  then      retract($f);  end   ?!?

a1 < a2

PM

Agenda WM

PM

Agenda WM

a2 < a1 r1 < r2

rule  "r1"  salience  10  ...  

rule  "r2"  salience  5  ...  

Prima  inserisco  G,  poi  elimino  F.  

Prima  elimino  F,  a1  non  sussiste  più,  G  mai  asserito.  

Stabilisco  un  ordine  di  precedenza  tra    r1  e  r2  (fisso).  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   95  

Page 96: Introducing PRSs and Drools (in Italian)

RIFERIMENTI  FondamenF  di  Intelligenza  ArFficiale  M  

Page 97: Introducing PRSs and Drools (in Italian)

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  

Page 98: Introducing PRSs and Drools (in Italian)

INFORMAZIONI  FondamenF  di  Intelligenza  ArFficiale  M  

Page 99: Introducing PRSs and Drools (in Italian)

Informazioni  

•  Domani  esercitazione  in  laboratorio  

•  Possibilità  di  svolgere  aCvità  proge9uali  o  tesi  – Drools,  Event  Calculus,  Expecta(ons,  MS-­‐Kinect,  Android  SDK,  SOA/Cloud,  …  

•  Per  domande,  dubbi,  richieste:  [email protected]  

 4  Giugno  2013   Sistemi  a  Regole  di  Produzione   99  

Page 100: Introducing PRSs and Drools (in Italian)

Introduzione    a  Drools  

Stefano  Bragaglia    

Fondamen(  di  Intelligenza  Ar(ficiale  M  5  Giugno  2013    

Page 101: Introducing PRSs and Drools (in Italian)

RingraziamenF  

•  Si  ringrazia  l’Ing.  So9ara  per  aver  fornito  la  versione  iniziale  di  questa  esercitazione.  

5  Giugno  2013   Introduzione  a  Drools   101  

Page 102: Introducing PRSs and Drools (in Italian)

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  

Page 103: Introducing PRSs and Drools (in Italian)

GUIDA  INTRODUTTIVA  FondamenF  di  Intelligenza  ArFficiale  M  

Page 104: Introducing PRSs and Drools (in Italian)

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  

Page 105: Introducing PRSs and Drools (in Italian)

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  

Page 106: Introducing PRSs and Drools (in Italian)

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  

Page 107: Introducing PRSs and Drools (in Italian)

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  

Page 108: Introducing PRSs and Drools (in Italian)

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  

Page 109: Introducing PRSs and Drools (in Italian)

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  

Page 110: Introducing PRSs and Drools (in Italian)

DroolsTest.java:    caricamento  della  base  di  conoscenza  

1.  package  com.sample  2.     3.  public  class  DroolsTest  {  4.     5.     public  static  final  void  main(String[]  args)  {..}  6.     7.     private  static  KnowledgeBase  readKnowledgeBase()  throws  Exception  {  8.         KnowledgeBuilder  kbuilder  =  KnowledgeBuilderFactory.newKnowledgeBuilder();  9.         kbuilder.add(ResourceFactory.newClassPathResource("Sample.drl"),  ResourceType.DRL);  10.         KnowledgeBuilderErrors  errors  =  kbuilder.getErrors();  11.         if  (errors.size()  >  0)  {  12.             for  (KnowledgeBuilderError  error:  errors)  {  13.                 System.err.println(error);  14.             }  15.             throw  new  IllegalArgumentException("Could  not  parse  knowledge.");  16.         }  17.         KnowledgeBase  kbase  =  KnowledgeBaseFactory.newKnowledgeBase();  18.         kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());  19.         return  kbase;  20.     }  21.     ..  22.  }  

5  Giugno  2013   Introduzione  a  Drools   110  

Page 111: Introducing PRSs and Drools (in Italian)

Sample.drl:    file  di  regole  

1.  package  com.sample  2.     3.  import  com.sample.DroolsTest.Message;  4.     5.  rule  "Hello  World"  6.  when  7.     m  :  Message(  status  ==  Message.HELLO,  myMessage  :  message  )  8.  then  9.     System.out.println(myMessage);  10.     m.setMessage("Goodbye  cruel  world");  11.     m.setStatus(Message.GOODBYE);  12.     update(m);  13.  end  14.     15.  rule  "GoodBye"  16.  when  17.     Message(  status  ==  Message.GOODBYE,  myMessage  :  message  )  18.  then  19.     System.out.println(myMessage);  20.  end  

5  Giugno  2013   Introduzione  a  Drools   111  

Page 112: Introducing PRSs and Drools (in Italian)

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  

Page 113: Introducing PRSs and Drools (in Italian)

ESERCIZI  FondamenF  di  Intelligenza  ArFficiale  M  

Page 114: Introducing PRSs and Drools (in Italian)

PATTERN  SEMPLICI  Esercizi  

5  Giugno  2013   Introduzione  a  Drools   114  

Page 115: Introducing PRSs and Drools (in Italian)

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  

Page 116: Introducing PRSs and Drools (in Italian)

Pa9ern  Semplici  

•  Creare  un  nuovo  proge9o  come  HelloWorld  

•  Rimuovere  ogni  riferimento  a  Message  da  DroolsTest.java  

•  Creare  I  POJO/BEAN  rappresentaF  nella  figura  di  destra  

5  Giugno  2013   Introduzione  a  Drools   116  

com.sample  

Person  -­‐  age:  Integer  -­‐  name:  String  -­‐  ...  

+  ...  

Mail  -­‐  sender:  Person  -­‐  recipient:  Person  -­‐  body:  String  

+  ...   *  *  Aggiungere  i  campi  costru9ore,  geFer,  seFer,  equals(…),  hashcode()  e  toString().      

N.B.:  Eclipse  consente  di  generare  tuC  quesF  metodi  automaFcamente.  

Page 117: Introducing PRSs and Drools (in Italian)

Pa9ern  Semplici  •  Creare  un  nuovo  file  di  regole  (es.:  exercise.drl)  

•  Indicare  questa  nuova  risorsa  (ancora  vuota)  come  risorsa  da  caricare  in  DroolsTest.java  

•  Asserire  (almeno)  le  istanze  a  destra  prima  di  far  sca9are  la  valutazione  delle  regole  nella  sessione  a9uale  

Person  p1  =  new  Person("Andrew",  35);  Person  p2  =  new  Person("Barbara",  22);  Person  p3  =  new  Person("Cal",  8);  Person  p4  =  new  Person("Cal",  15);  Person  p5  =  new  Person("Daisy",  25);  Person  p6  =  new  Person("Cal",  40);  ksession.insert(p1);  ksession.insert(p2);  ksession.insert(p3);  ksession.insert(p4);  ksession.insert(p5);  ksession.insert(p6);  ksession.insert(new  Mail(p1,  p4,        "Do  your  homeworks!"));  ksession.insert(new  Mail(p5,  p5,      "Remember  to  do  the  homeworks!"));  ...  ksession.fireAllRules();  

5  Giugno  2013   Introduzione  a  Drools   117  

Page 118: Introducing PRSs and Drools (in Italian)

Pa9ern  Semplici  

•  Scrivere  una  regola  che  stampi  a  video  il  contenuto  di  ogni  Mail  

•  Scrivere  una  regola  che  stampi  a  video  il  contenuto  di  ogni  Person  

package  com.sample    import  com.sample.Mail;  import  com.sample.Person;    rule  "Regola:  Simple  1"  when      //  pattern  della  premessa  then      //  action  della  conseguenza  end    rule  "Regola:  Simple  2"  when    //  pattern  della  premessa  then      //  action  della  conseguenza  end    //  NB:  Le  regole  scattano  per  ogni  fatto    //  appartenente  al  tipo  indicato      

5  Giugno  2013   Introduzione  a  Drools   118  

Page 119: Introducing PRSs and Drools (in Italian)

Pa9ern  Semplici  

•  Scrivere  una  regola  che  stampi  a  video  il  contenuto  di  ogni  Mail  

•  Scrivere  una  regola  che  stampi  a  video  il  contenuto  di  ogni  Person  

package  com.sample    import  com.sample.Mail;  import  com.sample.Person;    rule  "Regola:  Simple  1"  when      $m:  Mail()  then      System.out.println("S1-­‐Mail:  "  +  $m);  end    rule  "Regola:  Simple  2"  when      $p:  Person()  then      System.out.println("S2-­‐Person:  "  +  $p);  end    //  NB:  Le  regole  scattano  per  ogni  fatto    //  appartenente  al  tipo  indicato      

5  Giugno  2013   Introduzione  a  Drools   119  

Page 120: Introducing PRSs and Drools (in Italian)

Pa9ern  Semplici  •  Trovare  tu9e  le  Person  che  si  

chiamano  "Cal"  e  hanno  meno  di  10  anni  o  età  compresa  tra  i  18  e  i  35  anni  

package  com.sample    import  com.sample.Mail;  import  com.sample.Person;    rule  "Regola:  Simple  3"  when      ...  then      ...  end    //  NB:  Uso  di  operatori  di  precedenza    //  [()],  and  [&&]  e  or  [||]...      

5  Giugno  2013   Introduzione  a  Drools   120  

Page 121: Introducing PRSs and Drools (in Italian)

Pa9ern  Semplici  •  Trovare  tu9e  le  Person  che  si  

chiamano  "Cal"  e  hanno  meno  di  10  anni  o  età  compresa  tra  i  18  e  i  35  anni  

package  com.sample    import  com.sample.Mail;  import  com.sample.Person;    rule  "Regola:  Simple  3"  when      $p:  Person(  name  ==  "Cal",                  age  <  10  ||                  (age  >=  18  &&  age  <=  35)        )  then      System.out.println("S3-­‐Person:  "  +  $p);  end    //  NB:  Uso  di  operatori  di  precedenza    //  [()],  and  [&&]  e  or  [||]...      

5  Giugno  2013   Introduzione  a  Drools   121  

Page 122: Introducing PRSs and Drools (in Italian)

PATTERN  COMPOSITI  Esercizi  

5  Giugno  2013   Introduzione  a  Drools   122  

Page 123: Introducing PRSs and Drools (in Italian)

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  

Page 124: Introducing PRSs and Drools (in Italian)

Pa9ern  ComposiF:  Join  

•  Scrivere  una  regola  per  trovare  tu9e  le  coppie  di  persone  

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

5  Giugno  2013   Introduzione  a  Drools   124  

Page 125: Introducing PRSs and Drools (in Italian)

Pa9ern  ComposiF:  Join  

•  Scrivere  una  regola  per  trovare  tu9e  le  coppie  di  persone  

rule  "Regola:  Join  1"  when      $p1:  Person()      $p2:  Person()  then      System.out.println("J1:  "  +  $p1  +  "  vs.  "  +  $p2);  end    

5  Giugno  2013   Introduzione  a  Drools   125  

Page 126: Introducing PRSs and Drools (in Italian)

Pa9ern  ComposiF:  Join  

•  Scrivere  una  regola  per  trovare  tu9e  le  coppie  di  persone  

•  Evitare  di  accoppiare  una  persona  con  se  stessa  poichè  non  ha  senso…  

rule  "Regola:  Join  1"  when      $p1:  Person()      $p2:  Person()  then      System.out.println("J1:  "  +  $p1  +  "  vs.  "  +  $p2);  end  

5  Giugno  2013   Introduzione  a  Drools   126  

Page 127: Introducing PRSs and Drools (in Italian)

Pa9ern  ComposiF:  Join  

•  Scrivere  una  regola  per  trovare  tu9e  le  coppie  di  persone  

•  Evitare  di  accoppiare  una  persona  con  se  stessa  poichè  non  ha  senso…  

rule  "Regola:  Join  1"  when      $p1:  Person()      $p2:  Person()  then      System.out.println("J1:  "  +  $p1  +  "  vs.  "  +  $p2);  end    rule  "Regola:  Join  2"  when      $p1:  Person()      $p2:  Person(  this  !=  $p1  )  then      System.out.println("J2:  "  +  $p1  +  "  vs.  "  +  $p2);  end    

5  Giugno  2013   Introduzione  a  Drools   127  

Page 128: Introducing PRSs and Drools (in Italian)

Pa9ern  ComposiF:  Join  

•  Trovare  le  coppie  (non  degeneri)  di  omonimi  

rule  "Regola:  Join  3"  when      ...  then      ...  end      

5  Giugno  2013   Introduzione  a  Drools   128  

“Dummy”  nodes!  

Page 129: Introducing PRSs and Drools (in Italian)

Pa9ern  ComposiF:  Join  

•  Trovare  le  coppie  (non  degeneri)  di  omonimi  

rule  "Regola:  Join  3"  when      $p1:  Person(  $n:  name  )      $p2:  Person(  this  !=  $p1,                                  name  ==  $n  )  then      System.out.println("J3:  "  +  $p1  +  "  vs.  "  +  $p2);  end      

5  Giugno  2013   Introduzione  a  Drools   129  

“Dummy”  nodes!  

Page 130: Introducing PRSs and Drools (in Italian)

Pa9ern  ComposiF:  Join  

•  Trovare  le  coppie  (non  degeneri)  di  omonimi  

•  Evitare  le  coppie  inverse:  (a,b)  e  non  (b,a)  

rule  "Regola:  Join  3"  when      $p1:  Person(  $n:  name  )      $p2:  Person(  this  !=  $p1,                                  name  ==  $n  )  then      System.out.println("J3:  "  +  $p1  +  "  vs.  "  +  $p2);  end    rule  "Regola:  Join  4"  when      $p1:  Person(  $n:  name  )      $p2:  Person(  this  !=  $p1,  $p1  <  $p2,                                name  ==  $n  )  then      System.out.println("J4:  "  +  $p1  +  "  vs.  "  +  $p2);  end  

5  Giugno  2013   Introduzione  a  Drools   130  

“Dummy”  nodes!  

Page 131: Introducing PRSs and Drools (in Italian)

Pa9ern  ComposiF:  Join  

•  Trovare  le  coppie  (non  degeneri)  composte  da  un  uomo  ed  una  donna*  in  cui  lei  è  più  giovane  

             *  Estendere  opportunamente  il  BEAN  

rule  "Regola:  Join  5"  when      ...  then      ...  end    

5  Giugno  2013   Introduzione  a  Drools   131  

Page 132: Introducing PRSs and Drools (in Italian)

Pa9ern  ComposiF:  Join  

•  Trovare  le  coppie  (non  degeneri)  composte  da  un  uomo  ed  una  donna*  in  cui  lei  è  più  giovane  

             *  Estendere  opportunamente  il  BEAN  

rule  "Regola:  Join  5"  when      $p1:  Person(  gender  ==  "male",                                  $e  :  age  )      $p2:  Person(  gender  ==  "female",                                age  <  $e  )  then      System.out.println("J5:  "  +  $p1  +  "  vs.  "  +  $p2);  end    //  Sufficiente?  Inversioni?  //  Unica  soluzione  possibile?    

5  Giugno  2013   Introduzione  a  Drools   132  

Page 133: Introducing PRSs and Drools (in Italian)

Pa9ern  ComposiF:  Join  

•  Stampare  il  testo  del  messaggio  di  una  Mail,  a  pa9o  che  il  mi9ente  sia  una  persona  di  almeno  20  anni  di  nome  Daisy  che  ha  mandato  la  mail  a  se  stessa  

rule  "Regola:  Join  Multipli"  when      ...  then      ...  end    

5  Giugno  2013   Introduzione  a  Drools   133  

Page 134: Introducing PRSs and Drools (in Italian)

Pa9ern  ComposiF:  Join  

•  Stampare  il  testo  del  messaggio  di  una  Mail,  a  pa9o  che  il  mi9ente  sia  una  persona  di  almeno  20  anni  di  nome  Daisy  che  ha  mandato  la  mail  a  se  stessa  

rule  "Regola:  Join  Multipli"  when      $p:    Person(  age  >=  20,                    name  ==  "Daisy"  )      $pp:  Person(  this  ==  $p  )      //  $pp  serve  davvero?      $m:    Mail  (  sender  ==  $p,                    recipient  ==  $pp,                    $b:  body  )  then      System.out.println("J5.body:  "  +  $b);  end    

5  Giugno  2013   Introduzione  a  Drools   134  

Page 135: Introducing PRSs and Drools (in Italian)

Pa9ern  ComposiF:  Join  

•  Stampare  il  testo  del  messaggio  di  una  Mail,  a  pa9o  che  il  mi9ente  sia  una  persona  di  almeno  20  anni  di  nome  Daisy  che  ha  mandato  la  mail  a  se  stessa  

NB:  La  Dot  NotaFon  rende  i  pa9ern  più  compaC  

rule  "Regola:  Join  Multipli"  when      Mail  (  $p:  sender,                    sender.name  ==  "Daisy",                    sender.age  >=  20,                    recipient  ==  $p,                    $t:  body.toString()  )                    //  Possibile,  ma  sconsigliato  then      System.out.println("J5.body:  "  +  $t);  end    

5  Giugno  2013   Introduzione  a  Drools   135  

Page 136: Introducing PRSs and Drools (in Italian)

QUANTIFICATORI  ESISTENZIALI  Esercizi  

5  Giugno  2013   Introduzione  a  Drools   136  

Page 137: Introducing PRSs and Drools (in Italian)

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  

Page 138: Introducing PRSs and Drools (in Italian)

QuanFficatori  Esistenziali  

•  Stampare  il  nome  delle  persone  –  Che  anno  ricevuto  almeno  una  mail  

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

5  Giugno  2013   Introduzione  a  Drools   138  

Page 139: Introducing PRSs and Drools (in Italian)

QuanFficatori  Esistenziali  

•  Stampare  il  nome  delle  persone  –  Che  anno  ricevuto  almeno  una  mail  

rule  "Regola  QE1"  when      $p:  Person(  $n:  name  )      exists  Mail(  receiver  ==  $p  )  then      System.out.println("QE1:  "  +  $n            +  "  ha  ricevuto  mail");  end  

5  Giugno  2013   Introduzione  a  Drools   139  

NB:  le  regole  sca9ano  0  o  1  volte  per  persona  

Page 140: Introducing PRSs and Drools (in Italian)

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  

Page 141: Introducing PRSs and Drools (in Italian)

QuanFficatori  Esistenziali  

•  Stampare  il  nome  delle  persone  –  Che  anno  ricevuto  almeno  una  mail  

–  Che  non  hanno  ricevuto  alcuna  mail  

rule  "Regola  QE1"  when      $p:  Person(  $n:  name  )      exists  Mail(  receiver  ==  $p  )  then      System.out.println("QE1:  "  +  $n            +  "  ha  ricevuto  mail");  end    rule  "Regola  QE2"  when      $p:  Person(  $n:  name  )      not  Mail(  receiver  ==  $p  )  then    System.out.println("QE2:  "  +  $n            +  "  non  ha  ricevuto  mail");  end        

5  Giugno  2013   Introduzione  a  Drools   141  

NB:  le  regole  sca9ano  0  o  1  volte  per  persona  

Page 142: Introducing PRSs and Drools (in Italian)

QuanFficatori  Esistenziali  

•  Stampare  il  nome  delle  persone  –  Che  anno  ricevuto  almeno  una  mail  

–  Che  non  hanno  ricevuto  alcuna  mail  

–  Per  cui  tu9e  le  mail  ricevute  provengono  da  un  mi9ente  di  nome  Cal  

rule  "Regola  QE3"  when      ...  then      ...  end  

5  Giugno  2013   Introduzione  a  Drools   142  

Page 143: Introducing PRSs and Drools (in Italian)

QuanFficatori  Esistenziali  

•  Stampare  il  nome  delle  persone  –  Che  anno  ricevuto  almeno  una  mail  

–  Che  non  hanno  ricevuto  alcuna  mail  

–  Per  cui  tu9e  le  mail  ricevute  provengono  da  un  mi9ente  di  nome  Cal  

rule  "Regola  QE3"  when      $p:  Person(  $n:  name  )      forall  (          Mail(  $s:  sender,  receiver  ==  $p  )          Person(  this  ==  $s,  name  ==  "Cal"  )      )  then      System.out.println("QE3:  "  +  $n            +  "  ha  ricevuto  solo  mail  da  Cal");  end  

5  Giugno  2013   Introduzione  a  Drools   143  

NB:  le  regole  sca9ano  0  o  1  volte  per  persona  

Page 144: Introducing PRSs and Drools (in Italian)

CONCATENAZIONE  DI  REGOLE  Esercizi  

5  Giugno  2013   Introduzione  a  Drools   144  

Page 145: Introducing PRSs and Drools (in Italian)

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  

Page 146: Introducing PRSs and Drools (in Italian)

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  

Page 147: Introducing PRSs and Drools (in Italian)

Concatenazione  di  Regole  

•  Scrivere  una  regola  per  stampare  un  messaggio  a  video  per  ogni  Pair  presente  in  WM  

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

5  Giugno  2013   Introduzione  a  Drools   147  

Page 148: Introducing PRSs and Drools (in Italian)

Concatenazione  di  Regole  

•  Scrivere  una  regola  per  stampare  un  messaggio  a  video  per  ogni  Pair  presente  in  WM  

rule  "Regola  CdR  1"  when      $p:  Pair()  then      System.out.println("CdR1  –  Pair:  "  +  $p);  end  

5  Giugno  2013   Introduzione  a  Drools   148  

Page 149: Introducing PRSs and Drools (in Italian)

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  

Page 150: Introducing PRSs and Drools (in Italian)

Concatenazione  di  Regole  

•  Scrivere  una  regola  per  stampare  un  messaggio  a  video  per  ogni  Pair  presente  in  WM  

•  Scrivere  una  regola  per  generare  e  inserire  in  WM  un  ogge9o  Pair  per  ogni  coppia  di  persone  disFnte  senza  ripeFzioni  

rule  "Regola  CdR  1"  when      $p:  Pair()  then      System.out.println("CdR1  –  Pair:  "  +  $p);  end    rule  "Regola  CdR  2"  when      $p1:  Person()      $p2:  Person()  then      Pair  p  =  new  Pair();      p.setFirst($p1);      p.setSecond($p2);      insert(p);      //  oppure      insert(new  Pair($p1,  $p2));  end    

5  Giugno  2013   Introduzione  a  Drools   150  

NB:  L’ordine  delle  regole  è  ininfluente  

Page 151: Introducing PRSs and Drools (in Italian)

Concatenazione  di  Regole  

•  Generare  tu9e  le  coppie  di  Person  ordinate  e  disFnte,  inserendole  in  WM  come  Pair  

rule  "Regola  CdR  3"  when      ...  then      Pair  p  =  new  Pair();      p.setFirst($p1);      p.setSecond($p2);      insert(p);      //  oppure      insert(new  Pair($p1,  $p2));  end    

5  Giugno  2013   Introduzione  a  Drools   151  

Page 152: Introducing PRSs and Drools (in Italian)

Concatenazione  di  Regole  

•  Generare  tu9e  le  coppie  di  Person  ordinate  e  disFnte,  inserendole  in  WM  come  Pair  

rule  "Regola  CdR  3"  when      $p1:  Person()      $p2:  Person(  this  !=  $p1  )      //  Verifico  che  non  ci  sia  la  coppia  simm.      not  Pair(  first  ==  $p2,  second  ==  $p1  )  then      Pair  p  =  new  Pair();      p.setFirst($p1);      p.setSecond($p2);      insert(p);      //  oppure      insert(new  Pair($p1,  $p2));  end    

5  Giugno  2013   Introduzione  a  Drools   152  

Page 153: Introducing PRSs and Drools (in Italian)

Concatenazione  di  Regole  

Mondo  di  Java   Mondo  delle  regole  

5  Giugno  2013   Introduzione  a  Drools   153  

Person   Person  

La  classe  Person,  definita  in  Java,  diventa  disponibile  nel  mondo  delle  regole  mediante:    import  com.sample.Person;    

L’operazione  opposta  non  è  generalmente  possibile.  

Pair   Pair  

Diventa  possibile  grazie  alla  reflecFon/introspecFon  di  Java:    

FactType  pairClass  =  ksession.getKnowledgeBase().getFactType("com.sample",  "Pair");  Object  pairObject  =  pairClass.newInstance();  pairClass.set(pairObject,  "first",  p1);  pairClass.set(pairObject,  "second",  p2);  ksession.insert(pairObject);  

Page 154: Introducing PRSs and Drools (in Italian)

FEATURES  AVANZATE:    FORM,  COLLECT,  ACCUMULATE  

Esercizi  

5  Giugno  2013   Introduzione  a  Drools   154  

Page 155: Introducing PRSs and Drools (in Italian)

Features  Avanzate:  FROM  

•  Il  costru9o  from  consente  di  accedere  agli  oggeC  di  una  Collection,  anche  se  quesF  non  sono  esplicitamente  presenF  nella  WM    

rule  "Esempio  di  FROM"  when      $l:  List()      //  inserita  come  List<?  extends  Person>      $p:  Person()  from  $l                //  come  un  join  classico  then      System.out.println($l  +  "/"  +  $p);    end    

5  Giugno  2013   Introduzione  a  Drools   155  

NB:  Sca9a  (fino  a)  $l.size()  volte!  

Page 156: Introducing PRSs and Drools (in Italian)

Features  Avanzate:  FROM  

•  Aggiungere  a  Person  un  campo  children  di  Fpo  Collection<?  extends  Person>  

•  Scrivere  una  regola  che  stampi  i  figli  di  ogni  persona  

rule  "Regola  FA:FROM  1"  when      ...  then      ...  end  

5  Giugno  2013   Introduzione  a  Drools   156  

Page 157: Introducing PRSs and Drools (in Italian)

Features  Avanzate:  FROM  

•  Aggiungere  a  Person  un  campo  children  di  Fpo  Collection<?  extends  Person>  

•  Scrivere  una  regola  che  stampi  i  figli  di  ogni  persona  

rule  "Regola  FA:FROM  1"  when      $parent:  Person(  $children:  children  )      $child:    Person()  from  $children  then      System.out.println("FA:FROM1  "  +  $parent                          +  "  è  genitore  di  "  +  $child);  end  

5  Giugno  2013   Introduzione  a  Drools   157  

Page 158: Introducing PRSs and Drools (in Italian)

Features  Avanzate:  FROM  

•  Definire  un  POJO/BEAN  che  ca9uri  l’astrazione  di  nodo  di  un  albero  

•  Solo  il  nodo  radice  è  asserito  nella  WM  

5  Giugno  2013   Introduzione  a  Drools   158  

CollecFon                                                                          .  

CollecFon                                                                          .  

...  

N  

N   N   N  

N   N   N  

...  ...  

Page 159: Introducing PRSs and Drools (in Italian)

Features  Avanzate:  FROM  

•  Definire  un  POJO/BEAN  che  ca9uri  l’astrazione  di  nodo  di  un  albero  

•  Solo  il  nodo  radice  è  asserito  nella  WM  

•  Implementare  un  Visitor  mediante  un  set  di  regole  che  a9raversi  l’albero  visitando  tuC  i  nodi  in  ordine  qualsiasi  

5  Giugno  2013   Introduzione  a  Drools   159  

CollecFon                                                                          .  

CollecFon                                                                          .  

...  

N  

N   N   N  

N   N   N  

...  ...  

Page 160: Introducing PRSs and Drools (in Italian)

rule  "Regola  FA:FROM  2"  when      $n:  Node()  then      System.out.println("FA:FROM2  "                              +  $n  +  "  visitato");  end    rule  "Regola  FA:FROM  3"  when      Node(  $children:  children  )      $child:  Node()  from  $children  then      insert($child);  end  

Features  Avanzate:  FROM  

•  Definire  un  POJO/BEAN  che  ca9uri  l’astrazione  di  nodo  di  un  albero  

•  Solo  il  nodo  radice  è  asserito  nella  WM  

•  Implementare  un  Visitor  mediante  un  set  di  regole  che  a9raversi  l’albero  visitando  tuC  i  nodi  in  ordine  qualsiasi  

5  Giugno  2013   Introduzione  a  Drools   160  

Page 161: Introducing PRSs and Drools (in Italian)

rule  "Regola  FA:FROM  2"  when      $n:  Node()  then      System.out.println("FA:FROM2  "                              +  $n  +  "  visitato");  end    rule  "Regola  FA:FROM  3"  when      Node(  $children:  children  )      $child:  Node()  from  $children  then      insert($child);  end  

Features  Avanzate:  FROM  

•  In  quale  ordine  sono  visitaF  i  nodi?  

•  Del  tu9o  casuale:  alcuni  visitaF  in  ampiezza,  altri  in  profondità…  

5  Giugno  2013   Introduzione  a  Drools   161  

Page 162: Introducing PRSs and Drools (in Italian)

rule  "Regola  FA:FROM  2"  when      $n:  Node()  then      System.out.println("FA:FROM2  "                              +  $n  +  "  visitato");  end    rule  "Regola  FA:FROM  3"  when      Node(  $children:  children  )      $child:  Node()  from  $children  then      insert($child);  end  

Features  Avanzate:  FROM  

•  In  quale  ordine  sono  visitaF  i  nodi?  

•  Del  tu9o  casuale:  alcuni  visitaF  in  ampiezza,  altri  in  profondità…  

•  La  salience  fissa  la  priorità  delle  regole  e  impone  il  strategia  di  a9raversamento  dell’albero  

5  Giugno  2013   Introduzione  a  Drools   162  

Page 163: Introducing PRSs and Drools (in Italian)

rule  "Regola  FA:FROM  2"  when      $n:  Node()  then      System.out.println("FA:FROM2  "                              +  $n  +  "  visitato");  end    rule  "Regola  FA:FROM  3"  when      Node(  $children:  children  )      $child:  Node()  from  $children  then      insert($child);  end  

Features  Avanzate:  FROM  

•  Strategia  di  ricerca:  –  Breadth-­‐first  –  Depth-­‐first  

5  Giugno  2013   Introduzione  a  Drools   163  

NB:  Le  aCvazioni  delle  due  regole  vengono  comunque  inframmezzate.    È  possibile  implementare  corre9amente  queste  strategia  di  ricerca  complicando  un  po’  i  pa9ern.  

Page 164: Introducing PRSs and Drools (in Italian)

rule  "Regola  FA:FROM  2”  salience  10  when      $n:  Node()  then      System.out.println("FA:FROM2  "                              +  $n  +  "  visitato");  end    rule  "Regola  FA:FROM  3"  salience  5  when      Node(  $children:  children  )      $child:  Node()  from  $children  then      insert($child);  end  

Features  Avanzate:  FROM  

•  Strategia  di  ricerca:  –  Breadth-­‐first  –  Depth-­‐first  

5  Giugno  2013   Introduzione  a  Drools   164  

NB:  Le  aCvazioni  delle  due  regole  vengono  comunque  inframmezzate.    È  possibile  implementare  corre9amente  queste  strategia  di  ricerca  complicando  un  po’  i  pa9ern.  

Page 165: Introducing PRSs and Drools (in Italian)

rule  "Regola  FA:FROM  2"  salience  5  when      $n:  Node()  then      System.out.println("FA:FROM2  "                              +  $n  +  "  visitato");  end    rule  "Regola  FA:FROM  3"  salience  10  when      Node(  $children:  children  )      $child:  Node()  from  $children  then      insert($child);  end  

Features  Avanzate:  FROM  

•  Strategia  di  ricerca:  –  Breadth-­‐first  –  Depth-­‐first  

5  Giugno  2013   Introduzione  a  Drools   165  

NB:  Le  aCvazioni  delle  due  regole  vengono  comunque  inframmezzate.    È  possibile  implementare  corre9amente  queste  strategia  di  ricerca  complicando  un  po’  i  pa9ern.  

Page 166: Introducing PRSs and Drools (in Italian)

Features  Avanzate:  COLLECT  

•  Il  costru9o  collect  è  duale  di  form  e  produce  una  Collection  accorpando  gli  oggeC  presenF  nella  WM  che  corrispondono  ad  un  certo  pa9ern  

 

rule  "Esempio  di  COLLECT"  when      $c:  collect  (                    Person()                )  //  costruita  come  Collection<?  extends  Person>      $p:  Person()  from  $c                //  come  un  join  classico  then      System.out.println($c  +  "/"  +  $p);    end    

5  Giugno  2013   Introduzione  a  Drools   166  

NB:  Sca9a  esa9amente  $c.size()  volte!  

Page 167: Introducing PRSs and Drools (in Italian)

Features  Avanzate:  ACCUMULATE  

•  Il  costru9o  accumulate  è  conce9ualmente  simile  a  collect    

•  Effe9ua  operazioni  generiche  su  Collection  di  oggeC  costruite  implicitamente  a  parFre  da  un  pa9ern  

•  Si  compone  di  più  parF  (opzionali)  •  Esistono  abbreviazioni  per  le  funzioni  notevoli:  min,  max,  count,  ecc.    

5  Giugno  2013   Introduzione  a  Drools   167  

Page 168: Introducing PRSs and Drools (in Italian)

Features  Avanzate:  ACCUMULATE  

•  Sintassi  generale:  …  $y:  Y(…)  from  accumulate  (      $p:  P(…)      init(      x  =  new  X();  )  //  inizializza…  

   action(  x  =  f(x, $p)      )  //  accumula/esegui…      return(  new  Y(x)          )  //  restituisce…  )                //  qualcosa  filtrabile  come  Y(…)  …  

5  Giugno  2013   Introduzione  a  Drools   168  

Page 169: Introducing PRSs and Drools (in Italian)

Features  Avanzate:  ACCUMULATE  •  Funzioni  notevoli:  

 

rule  "Esempio  di  Funzioni  notevoli"  when      accumulate(  Person(  $a:  age  ),          $max:  max(  $a  ),            $min:  min(  $a  ),          $avg:  average(  $a  )      )  then      System.out.println(              "M:"  +  $max  +  "  m:"  +  $min  +  "  a:"  +  $avg);  end  

5  Giugno  2013   Introduzione  a  Drools   169  

Page 170: Introducing PRSs and Drools (in Italian)

Features  Avanzate:  ACCUMULATE  

•  Scrivere  una  regola  per  trovare  tu9e  le  persone  più  giovani  della  somma  dell’età  dei  loro  figli  

rule  "Regola  FA:ACCUMULATE  1"  when      ...  then      System.out.println("FA:ACCUMULATE1  "  +  $p);  end      

5  Giugno  2013   Introduzione  a  Drools   170  

Page 171: Introducing PRSs and Drools (in Italian)

Features  Avanzate:  ACCUMULATE  

•  Scrivere  una  regola  per  trovare  tu9e  le  persone  più  giovani  della  somma  dell’età  dei  loro  figli  

rule  "Regola  FA:ACCUMULATE  1"  when      $p:  Person(  $age:  age,                                $children:  children  )      Number(  this.intValue()  >  $age  )          from  accumulate  (              Person(  $a:  age  )  from  $children,              init(      int  total  =  0;  ),              action(  total  +=  $a;  ),              result(  new  Integer(total)  )          )  then      System.out.println("FA:ACCUMULATE1  "  +  $p);  end      

5  Giugno  2013   Introduzione  a  Drools   171  

Page 172: Introducing PRSs and Drools (in Italian)

Features  Avanzate:  ACCUMULATE  

•  Scrivere  una  regola  per  trovare  tu9e  le  persone  più  giovani  della  somma  dell’età  dei  loro  figli  

//  Formulazione  alternativa,  più  semplice  rule  "Regola  FA:ACCUMULATE  1"  when  $p:  Person(  $children:  children  )      accumulate(            Person(  $a:  age  )  from  $children,          $sum:  sum($a)  )      Person(  this  ==  $p,  age  <  $sum  )  then      System.out.println("FA:ACCUMULATE1  "  +  $p);  end      

5  Giugno  2013   Introduzione  a  Drools   172  

Page 173: Introducing PRSs and Drools (in Italian)

QUERIES  Esercizi  

5  Giugno  2013   Introduzione  a  Drools   173  

Page 174: Introducing PRSs and Drools (in Italian)

Queries  

•  Consentono  di  individuare  insiemi  di  oggeC  presenF  nella  WM  che  rispondono  a  certe  cara9erisFche  

•  Sfru9ano  le  capacità  di  filtraggio  di  RETE    (sono  come  regole  senza  conseguente)  

•  Amme9ono  l’uso  di  parametri  con  cui  è  anche  possibile  accedere  ai  risultaF  

5  Giugno  2013   Introduzione  a  Drools   174  

Page 175: Introducing PRSs and Drools (in Italian)

Queries  

•  Individuare  le  persone  maggiorenni  

query  "Query:  Q1"      ...  end  

5  Giugno  2013   Introduzione  a  Drools   175  

Page 176: Introducing PRSs and Drools (in Italian)

Queries  

•  Individuare  le  persone  maggiorenni  

query  "Query:  Q1"      $p:  Person(  age  >  18  )  end  

5  Giugno  2013   Introduzione  a  Drools   176  

Page 177: Introducing PRSs and Drools (in Italian)

Queries  

•  Individuare  le  persone  maggiorenni  

•  Individuare  le  persone  che  hanno  una  data  età  

query  "Query:  Q1"      $p:  Person(  age  >  18  )  end    query  "Query:  Q2"  (  int  $a  )      ...  end  

5  Giugno  2013   Introduzione  a  Drools   177  

Page 178: Introducing PRSs and Drools (in Italian)

Queries  

•  Individuare  le  persone  maggiorenni  

•  Individuare  le  persone  che  hanno  una  data  età  

query  "Query:  Q1"      $p:  Person(  age  >  18  )  end    query  "Query:  Q2"  (  int  $a  )      Person(  $n:  name,  age  ==  $a  )  end      

5  Giugno  2013   Introduzione  a  Drools   178  

Page 179: Introducing PRSs and Drools (in Italian)

Queries  

•  Individuare  le  persone  maggiorenni  

•  Individuare  le  persone  che  hanno  una  data  età  

•  Individuare  le  persone  che  hanno  una  data  età  o  viceversa,  o  entrambe  

query  "Query:  Q1"      $p:  Person(  age  >  18  )  end    query  "Query:  Q2"  (  int  $a  )      Person(  $n:  name,  age  ==  $a  )  end    query  "Query:  Q3"  (  String  $n,  int  $a  )      ...  end    

5  Giugno  2013   Introduzione  a  Drools   179  

Page 180: Introducing PRSs and Drools (in Italian)

Queries  

•  Individuare  le  persone  maggiorenni  

•  Individuare  le  persone  che  hanno  una  data  età  

•  Individuare  le  persone  che  hanno  una  data  età  o  viceversa,  o  entrambe  

query  "Query:  Q1"      $p:  Person(  age  >  18  )  end    query  "Query:  Q2"  (  int  $a  )      Person(  $n:  name,  age  ==  $a  )  end    query  "Query:  Q3"  (  String  $n,  int  $a  )      Person(  $n  :=  name,  $a  :=  age  )  end    

5  Giugno  2013   Introduzione  a  Drools   180  

Page 181: Introducing PRSs and Drools (in Italian)

Queries  

•  Mondo  di  Java    

ksession.fireAllRules();  QueryResults  qr  =  ksession.      getQueryResults("Q1");  for  (QueryResultsRow  qrr:  qr)      System.out.println(qrr);    

•  Mondo  delle  regole  $c:  collect  ?"Q3"(  $n,  18  )    

5  Giugno  2013   Introduzione  a  Drools   181  

Page 182: Introducing PRSs and Drools (in Italian)

TRUTH  MAINTENANCE  Esercizi  

5  Giugno  2013   Introduzione  a  Drools   182  

Page 183: Introducing PRSs and Drools (in Italian)

Truth  Maintenance  

•  Oltre  ad  asserire  e  ritrarre  faC  *  (costruC  insert  e  retract)  è  possibile  farlo  logicamente  

•  Ovvero  i  faC,  che  vengono  asseri(  (ritraa)  al  verificarsi  di  una  condizione  (il  matching  di  un  pa9ern),  vengono  automa&camente  ritraa  (asseri()  quando  la  condizione  non  sussiste  più  

•  I  nuovi  costruC  sono  insertLogical  e  retractLogical  

*  Esiste  anche  modify  che  fa  in  sequenza  retract  e  insert  

5  Giugno  2013   Introduzione  a  Drools   183  

Page 184: Introducing PRSs and Drools (in Italian)

Truth  Maintenance  

•  Partendo  dal  solito  proge9o  di  partenza  (Person  e  Mail  e  relaFve  istanze  da  Java),  scrivere  un  insieme  di  regole  che  realizza  un  semplice  servizio  pubblicitario  che  ada9a  la  pubblicità  all’età  delle  persone  

5  Giugno  2013   Introduzione  a  Drools   184  

Page 185: Introducing PRSs and Drools (in Italian)

Truth  Maintenance  

•  Dichiarare  un  fa9o  Ad  che  conFene  un  riferimento  a  Person  e  un  message  (String)  e  un  fa9o  Birthday  con  un  riferimento  a  Person  

•  Definire  una  query  con  cui  individuare  i  message  di  Ad  

...  

5  Giugno  2013   Introduzione  a  Drools   185  

Page 186: Introducing PRSs and Drools (in Italian)

Truth  Maintenance  

•  Dichiarare  un  fa9o  Ad  che  conFene  un  riferimento  a  Person  e  un  message  (String)  e  un  fa9o  Birthday  con  un  riferimento  a  Person  

•  Definire  una  query  con  cui  individuare  i  message  di  Ad  

declare  Ad      target:  Person      message:  String  end    declare  Birthday      person:  Person  end    query  "advertisement"  (  Person  $p  )      Ad(  target  ==  $p,  $m:  message  )  end  

5  Giugno  2013   Introduzione  a  Drools   186  

Page 187: Introducing PRSs and Drools (in Italian)

Truth  Maintenance  

•  Scrivere  una  regola  che  suggerisca  l’acquisto  di  un  gioca9olo  ad  ogni  persona  minorenne  

•  Scrivere  una  regola  che  suggerisca  l’acquisto  di  una  automobile  ad  ogni  persona  maggiorenne  

NB:  operazioni  logiche!  

...  

5  Giugno  2013   Introduzione  a  Drools   187  

Page 188: Introducing PRSs and Drools (in Italian)

Truth  Maintenance  

•  Scrivere  una  regola  che  suggerisca  l’acquisto  di  un  gioca9olo  ad  ogni  persona  minorenne  

•  Scrivere  una  regola  che  suggerisca  l’acquisto  di  una  automobile  ad  ogni  persona  maggiorenne  

NB:  operazioni  logiche!  

rule  "Toy  to  Kids"  when      $p:  Person(  age  <  18  )  then      insertLogical(new  Ad($p,  $p.name  +          ",  compra  un’automobilina!"));  end    rule  "Car  to  Men"  when      $p:  Person(  age  >=  18  )  then      insertLogical(new  Ad($p,  $p.name  +          ",  compra  una  spider!"));  end    

5  Giugno  2013   Introduzione  a  Drools   188  

Page 189: Introducing PRSs and Drools (in Italian)

Truth  Maintenance  •  Scrivere  una  regola  che,  per  ogni  Ad,  mandi  una  mail  (crei  un  ogge9o  Mail)  usando  i  campi  dell’Ad  (sender  ==  recipient)  

•  Scrivere  una  regola  che,  ogni  volta  che  viene  noFficato  un  Birthday,  aggiorna  l’età  della  relaFva  Person  

...  

5  Giugno  2013   Introduzione  a  Drools   189  

Page 190: Introducing PRSs and Drools (in Italian)

Truth  Maintenance  •  Scrivere  una  regola  che,  per  ogni  Ad,  mandi  una  mail  (crei  un  ogge9o  Mail)  usando  i  campi  dell’Ad  (sender  ==  recipient)  

•  Scrivere  una  regola  che,  ogni  volta  che  viene  noFficato  un  Birthday,  aggiorna  l’età  della  relaFva  Person  

rule  "Send  a  Mail"  when      Ad(  $t:  target,  $m:  message  )  then      insert(new  Mail($t,  $t,  $m));  end    rule  "Grow  older!"  when      $p:  Person(  $a:  age  )      $b:  Birthday(  person  ==  $p  )  then      System.out.println(        "Buon  compleanno,  "  +  $p.getName());      modify($p)  {          age  =  $a  +  1;          //  $p.setAge($a  +  1);      }      retract($b);  end    

5  Giugno  2013   Introduzione  a  Drools   190  

Page 191: Introducing PRSs and Drools (in Italian)

Truth  Maintenance  

1.  Da  Java:  inserire  un  Birthday  per  una  Person  2.  Far  sca9are  le  regole  sulla  sessione  3.  Verificare  che  quali  Ad  sono  in  WM  mediante  

l’apposita  query  •  Ripetere  i  passi  precedenF  finchè  una  Person  diventa  maggiorenne  

•  Cosa  succede?  Perchè?  5  Giugno  2013   Introduzione  a  Drools   191  

Page 192: Introducing PRSs and Drools (in Italian)

INFORMAZIONI  FondamenF  di  Intelligenza  ArFficiale  M  

Page 193: Introducing PRSs and Drools (in Italian)

Informazioni  

•  Possibilità  di  svolgere  aCvità  proge9uali  o  tesi  – Drools,  Event  Calculus,  Expecta(ons,  MS-­‐Kinect,  Android  SDK,  SOA/Cloud,  …  

•  Per  domande,  dubbi,  richieste:  [email protected]  

 

5  Giugno  2013   Introduzione  a  Drools   193