Introducing PRSs and Drools (in Italian)
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Introducing PRSs and Drools (in Italian)

on

  • 460 views

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

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.

Statistics

Views

Total Views
460
Views on SlideShare
439
Embed Views
21

Actions

Likes
1
Downloads
7
Comments
0

6 Embeds 21

http://www.linkedin.com 10
https://www.linkedin.com 5
http://localhost 3
http://www.google.com 1
http://sbreighs.no-ip.biz 1
http://goo.gl 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Introducing PRSs and Drools (in Italian) Presentation Transcript

  • 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  Map<Integer,  Queue<Ac(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  
  • 151. Concatenazione  di  Regole   •  Generare  tu9e  le  coppie   di  Person  ordinate  e   disFnte,  inserendole  in   WM  come  Pair   5  Giugno  2013   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     Introduzione  a  Drools   151  
  • 152. Concatenazione  di  Regole   •  Generare  tu9e  le  coppie   di  Person  ordinate  e   disFnte,  inserendole  in   WM  come  Pair   5  Giugno  2013   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     Introduzione  a  Drools   152  
  • 153. Concatenazione  di  Regole   Mondo  di  Java   Mondo  delle  regole   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);   5  Giugno  2013   Introduzione  a  Drools   153  
  • 154. Esercizi   FEATURES  AVANZATE:     FORM,  COLLECT,  ACCUMULATE   5  Giugno  2013   Introduzione  a  Drools   154  
  • 155. 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   NB:  Sca9a  (fino  a)  $l.size()  volte!     5  Giugno  2013   Introduzione  a  Drools   155  
  • 156. Features  Avanzate:  FROM   •  Aggiungere  a  Person  un   campo  children  di  Fpo   Collection<?  extends   Person>   rule  "Regola  FA:FROM  1"   when      ...   then      ...   end   •  Scrivere  una  regola  che   stampi  i  figli  di  ogni   persona   5  Giugno  2013   Introduzione  a  Drools   156  
  • 157. Features  Avanzate:  FROM   •  Aggiungere  a  Person  un   campo  children  di  Fpo   Collection<?  extends   Person>   •  Scrivere  una  regola  che   stampi  i  figli  di  ogni   persona   5  Giugno  2013   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   Introduzione  a  Drools   157  
  • 158. Features  Avanzate:  FROM   •  Definire  un  POJO/BEAN   che  ca9uri  l’astrazione   di  nodo  di  un  albero   •  Solo  il  nodo  radice  è   asserito  nella  WM   N   N   CollecFon                                                N                      N         .   ...   ...   ...   N   CollecFon                                                N                      N         .   5  Giugno  2013   Introduzione  a  Drools   158  
  • 159. 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   N   N   CollecFon                                                N                      N         .   ...   ...   ...   N   CollecFon                                                N                      N         .   Introduzione  a  Drools   159  
  • 160. 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   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   Introduzione  a  Drools   160  
  • 161. Features  Avanzate:  FROM   •  In  quale  ordine  sono   visitaF  i  nodi?   •  Del  tu9o  casuale:  alcuni   visitaF  in  ampiezza,  altri   in  profondità…   5  Giugno  2013   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   Introduzione  a  Drools   161  
  • 162. 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   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   Introduzione  a  Drools   162  
  • 163. Features  Avanzate:  FROM   •  Strategia  di  ricerca:   –  Breadth-­‐first   –  Depth-­‐first   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   NB:  Le  aCvazioni  delle  due  regole  vengono  comunque  inframmezzate.     È  possibile  implementare  corre9amente  queste  strategia  di  ricerca  complicando  un  po’  i  pa9ern.   5  Giugno  2013   Introduzione  a  Drools   163  
  • 164. Features  Avanzate:  FROM   •  Strategia  di  ricerca:   rule  "Regola  FA:FROM  2”   salience  10   when   –  Breadth-­‐first      $n:  Node()   then   –  Depth-­‐first      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   NB:  Le  aCvazioni  delle  due  regole  vengono  comunque  inframmezzate.     È  possibile  implementare  corre9amente  queste  strategia  di  ricerca  complicando  un  po’  i  pa9ern.   5  Giugno  2013   Introduzione  a  Drools   164  
  • 165. Features  Avanzate:  FROM   •  Strategia  di  ricerca:   rule  "Regola  FA:FROM  2"   salience  5   when   –  Breadth-­‐first      $n:  Node()   then   –  Depth-­‐first      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   NB:  Le  aCvazioni  delle  due  regole  vengono  comunque  inframmezzate.     È  possibile  implementare  corre9amente  queste  strategia  di  ricerca  complicando  un  po’  i  pa9ern.   5  Giugno  2013   Introduzione  a  Drools   165  
  • 166. 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   NB:  Sca9a  esa9amente  $c.size()  volte!     5  Giugno  2013   Introduzione  a  Drools   166  
  • 167. 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  
  • 168. 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  
  • 169. 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  
  • 170. Features  Avanzate:  ACCUMULATE   •  Scrivere  una  regola  per   trovare  tu9e  le  persone   più  giovani  della  somma   dell’età  dei  loro  figli   5  Giugno  2013   rule  "Regola  FA:ACCUMULATE  1"   when      ...   then      System.out.println("FA:ACCUMULATE1  "  +  $p);   end       Introduzione  a  Drools   170  
  • 171. Features  Avanzate:  ACCUMULATE   •  Scrivere  una  regola  per   trovare  tu9e  le  persone   più  giovani  della  somma   dell’età  dei  loro  figli   5  Giugno  2013   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       Introduzione  a  Drools   171  
  • 172. Features  Avanzate:  ACCUMULATE   •  Scrivere  una  regola  per   trovare  tu9e  le  persone   più  giovani  della  somma   dell’età  dei  loro  figli   5  Giugno  2013   //  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       Introduzione  a  Drools   172  
  • 173. Esercizi   QUERIES   5  Giugno  2013   Introduzione  a  Drools   173  
  • 174. 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  
  • 175. Queries   •  Individuare  le  persone   maggiorenni   5  Giugno  2013   query  "Query:  Q1"      ...   end   Introduzione  a  Drools   175  
  • 176. Queries   •  Individuare  le  persone   maggiorenni   5  Giugno  2013   query  "Query:  Q1"      $p:  Person(  age  >  18  )   end   Introduzione  a  Drools   176  
  • 177. Queries   •  Individuare  le  persone   maggiorenni   •  Individuare  le  persone   che  hanno  una  data  età   5  Giugno  2013   query  "Query:  Q1"      $p:  Person(  age  >  18  )   end     query  "Query:  Q2"  (  int  $a  )      ...   end   Introduzione  a  Drools   177  
  • 178. Queries   •  Individuare  le  persone   maggiorenni   •  Individuare  le  persone   che  hanno  una  data  età   5  Giugno  2013   query  "Query:  Q1"      $p:  Person(  age  >  18  )   end     query  "Query:  Q2"  (  int  $a  )      Person(  $n:  name,  age  ==  $a  )   end       Introduzione  a  Drools   178  
  • 179. Queries   •  Individuare  le  persone   maggiorenni   •  Individuare  le  persone   che  hanno  una  data  età   •  Individuare  le  persone   che  hanno  una  data  età   o  viceversa,  o  entrambe   5  Giugno  2013   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     Introduzione  a  Drools   179  
  • 180. 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   5  Giugno  2013   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     Introduzione  a  Drools   180  
  • 181. Queries   •  Mondo  di  Java   •  Mondo  delle  regole     ksession.fireAllRules();   QueryResults  qr  =  ksession.      getQueryResults("Q1");   for  (QueryResultsRow  qrr:  qr)      System.out.println(qrr);     5  Giugno  2013   $c:  collect  ?"Q3"(  $n,  18  )     Introduzione  a  Drools   181  
  • 182. Esercizi   TRUTH  MAINTENANCE   5  Giugno  2013   Introduzione  a  Drools   182  
  • 183. 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  
  • 184. 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  
  • 185. Truth  Maintenance   •  Dichiarare  un  fa9o  Ad   che  conFene  un   riferimento  a  Person  e   un  message  (String)  e  un   fa9o  Birthday  con  un   riferimento  a  Person   •  Definire  una  query  con   cui  individuare  i  message   di  Ad   5  Giugno  2013   ...   Introduzione  a  Drools   185  
  • 186. 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   declare  Ad      target:  Person      message:  String   end     declare  Birthday      person:  Person   end     query  "advertisement"  (  Person  $p  )      Ad(  target  ==  $p,  $m:  message  )   end   Introduzione  a  Drools   186  
  • 187. Truth  Maintenance   •  Scrivere  una  regola  che   suggerisca  l’acquisto  di   un  gioca9olo  ad  ogni   persona  minorenne   •  Scrivere  una  regola  che   suggerisca  l’acquisto  di   una  automobile  ad  ogni   persona  maggiorenne   ...   NB:  operazioni  logiche!   5  Giugno  2013   Introduzione  a  Drools   187  
  • 188. 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   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     Introduzione  a  Drools   188  
  • 189. Truth  Maintenance   •  Scrivere  una  regola  che,   per  ogni  Ad,  mandi  una   mail  (crei  un  ogge9o  Mail)   usando  i  campi  dell’Ad   (sender  ==  recipient)   •  Scrivere  una  regola  che,   ogni  volta  che  viene   noFficato  un  Birthday,   aggiorna  l’età  della   relaFva  Person   5  Giugno  2013   ...   Introduzione  a  Drools   189  
  • 190. 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   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   Introduzione  a  Drools   190    
  • 191. 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  
  • 192. FondamenF  di  Intelligenza  ArFficiale  M   INFORMAZIONI  
  • 193. Informazioni   •  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     5  Giugno  2013   Introduzione  a  Drools   193