Introducing PRSs and Drools (in Italian)

Post on 07-May-2015

411 views 2 download

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)

Sistemi  a    Regole  di  Produzione  

Stefano  Bragaglia    

Fondamen(  di  Intelligenza  Ar(ficiale  M  4  Giugno  2013    

Sommario  

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

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

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   2  

SISTEMI  A  REGOLE  FondamenF  di  Intelligenza  ArFficiale  M  

Sistemi  a  Regole  

•  Le  regole  sono  il  principale  modo  di  esprimere  la  conoscenza  in  molF  campi  dell’I.A.  

•  I  Fpi  di  regole  più  comuni  sono:  –  i  programmi  logici  (es.:  Prolog)  –  le  regole  di  produzione  (es.:  Drools)  

•  Entrambi  i  Fpi  sono  molto  comuni,  basate  su  principi  simili  ma  realizzate  in  modo  duale  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   4  

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

Affermazione  dell’antecedente  o  Ragionamento  direFo,  prevede  che:  

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

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

q(y)  

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

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   5  

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

Affermazione  dell’antecedente  o  Ragionamento  direFo,  prevede  che:  

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

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

implicazione  premessa  

conseguenza  q(y)  

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

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   6  

Sistemi  a  Regole  

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

•  Generalmente  conservaFvi  

•  Unificazione  •  Backtracking  

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

•  Potenzialmente  distruCve  

•  Pa9ern  matching  •  Parallelismo  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   7  

Sistemi  a  Regole  

Programmi  logici   Regole  di  produzione  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   8  

Sistemi  a  Regole  

Programmi  logici   Regole  di  produzione  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   9  

Sistemi  a  Regole  

Programmi  logici   Regole  di  produzione  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   10  

Sistemi  a  Regole  

Programmi  logici   Regole  di  produzione  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   11  

Sistemi  a  Regole  

Programmi  logici   Regole  di  produzione  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   12  

Sistemi  a  Regole  

Programmi  logici   Regole  di  produzione  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   13  

Sistemi  a  Regole  

Programmi  logici   Regole  di  produzione  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   14  

SISTEMI  A  REGOLE  DI  PRODUZIONE  FondamenF  di  Intelligenza  ArFficiale  M  

Sistemi  a  Regole  di  Produzione  

•  I  sistemi  a  regole  di  produzione,  o  ProducCon  Rule  Systems  (PRS):  – sono  sistemi  a  regole,  Rule  Based  Systems  (RBS),  – basaF  sul  principio  deduCvo  del  Modus  Ponens,    – che  ado9ano  un  approccio  reaHvo/generaCvo.  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   16  

Sistemi  a  Regole  di  Produzione  

Agenda

PM

WM

Pattern Matching!

Conflict Resolution! Execution!

Patterns "+ Actions!

triples "(now beans)!

Output!

Productions:!a  

1 2 3

Facts:!

Schema  archite9urale  e  principio  di  funzionamento  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   17  

Sistemi  a  Regole  di  Produzione  

Agenda

PM

WM

Pattern Matching!

Conflict Resolution! Execution!

Patterns "+ Actions!

triples "(now beans)!

Output!

Productions:!a  

1 2 3

Facts:!

ELABORAZIONE  SUDDIVISA  IN  3  STADI  

Schema  archite9urale  e  principio  di  funzionamento  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   18  

Sistemi  a  Regole  di  Produzione  

Agenda

PM

WM

Pattern Matching!

Conflict Resolution! Execution!

Patterns "+ Actions!

triples "(now beans)!

Output!

Productions:!a  

1 2 3

Facts:!

ELABORAZIONE  SUDDIVISA  IN  3  STADI  

3  MEMORIE  

Schema  archite9urale  e  principio  di  funzionamento  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   19  

JBOSS  DROOLS  FondamenF  di  Intelligenza  ArFficiale  M  

JBoss  Drools  

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

Planner  (constraints)  

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

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

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

•  Parte  di  una  piaRaforma  integrata  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   21  

JBoss  Drools  

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

Planner  (constraints)  

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

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

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

•  Parte  di  una  piaRaforma  integrata  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   22  

JBoss  Drools  •  Sintassi  del  linguaggio  Drools:  regole    rule  "ID_regola"                            /*  IMPLICAZIONE  */  //  attributi  when                                                            /*  premessa  */      //  pattern  (composito)  then                                                      /*  conseguenza  */      //  azioni  logiche      //  effetti  collaterali  end  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   23  

JBoss  Drools  •  Sintassi  del  linguaggio  Drools:  regole    rule  "Cancella  gli  Stefano"      /*  IMPLICAZIONE  */  salience  5  when                                                            /*  premessa  */      $p:  Person  (  name  ==  "Stefano"  )  then                                                      /*  conseguenza  */      retract($p);        System.out.println($p);  end  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   24  

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

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   25  

JBoss  Drools  •  Sintassi  del  linguaggio  Drools:  queries    query  "Trova  gli  Stefano"                  /*  premessa  */      $p:  Person  (  name  ==  "Stefano"  )  end    

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   26  

JBoss  Drools  •  Sintassi  del  linguaggio  Drools:  oggeH    declare  ID_Class                          /*  dichiarazione  */      //  dichiarazione  di  campo      //  dichiarazione  di  campo  end  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   27  

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

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

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

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   28  

JBoss  Drools  •  Sintassi  del  linguaggio  Drools:  evenC    declare  ID_Event                          /*  dichiarazione  */      //  annotazioni      //  annotazioni      //  dichiarazioni  di  campo          //  dichiarazioni  di  campo  end  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   29  

JBoss  Drools  •  Sintassi  del  linguaggio  Drools:  evenC    declare  Alarm                                /*  dichiarazione  */      @role(  event  )      @timestamp(  time  )      message:  String          time:  long  end  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   30  

JBoss  Drools  

•  Sintassi  del  linguaggio  Drools:  – Operatori  relazionali:  ==  !=  >=  >  <=  <  – Operatori  logici:  &&  ,  ||  – Negazione:  not  – Operatori  funzionali:  min,  max,  count,  accumulate  – Dot  notaCon:  name  ==  "…"  o  $p.getName().equals("…")  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   31  

JBoss  Drools  •  Caso  d’uso:  sistema  marcatempo  aziendale  – Ogni  dipendente  ha  un  badge  con  RFID  – Quando  passa  a9raverso  un  gate,  la  WM  riceve  un  evento  “passed”  (marcato  temporalmente)  a9raverso  l’entry-­‐point  corrispondente  al  dipendente  •  Filtrando  il  primo  e  l’ulFmo  evento  “passed”  di  ogni  giorno  per  ogni  dipendente,  si  determina  quante  ore  ha  lavorato  

•  Se  non  ci  sono  evenF  “passed”  per  un  dato  dipendente  in  un  dato  giorno  e  non  è  in  vacanza/malato,  allora  è  assente  

•  Accumulando  il  numero  di  ore  lavorate  in  un  mese  da  un  dipendente  si  può  calcolare  in  proporzione  la  sua  busta  paga  

•  Sapendo  che  un  dipendente  è  assegnato  a  un  proge9o,  l’azienda  può  calcolare  i  mesi/uomo  dedicaF  a  quel  proge9o  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   32  

PATTERN  MATCHING:    L’ALGORITMO  RETE  

FondamenF  di  Intelligenza  ArFficiale  M  

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

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   34  

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

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   35  

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

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

Object  Type  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   36  

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

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   37  

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

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   38  

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

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

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

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   39  

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   40  

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

ALFA

 NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   41  

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

ALFA

 NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   42  

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

ALFA

 NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

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

WM

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

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

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   43  

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

ALFA

 NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes   p1

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

WM

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

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

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   44  

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

ALFA

 NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes   p1

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

WM

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

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

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   45  

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

ALFA

 NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  p1, p2

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

WM

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

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

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   46  

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

ALFA

 NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

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

WM Memory  nodes  

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

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

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   47  

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

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   48  

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

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   49  

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

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

Object  Type  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   50  

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

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Memory  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   51  

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

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Memory  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   52  

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

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   53  

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

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   54  

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

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   55  

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

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

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

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   56  

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

Pa9ern  matching:  l’algoritmo  RETE  

Memory  nodes  

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   57  

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

Pa9ern  matching:  l’algoritmo  RETE  

Memory  nodes  

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

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

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   58  

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   59  

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   60  

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

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

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   62  

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   63  

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  

NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   64  

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  

NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   65  

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  

NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

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

WM

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   66  

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  

NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

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

WM

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

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

a1���

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   67  

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  

NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

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

WM

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

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

a1

p1

p1-a1

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

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  

NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

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

WM

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

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

a1���a2

p1

p1-a1 p1-a2���

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

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  

NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

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

WM

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

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

a1���a2

p1���p2

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

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

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  

NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

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

WM

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

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

a1���a2

p1���p2

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

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

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  

NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Memory  nodes  

Beta  nodes  

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

WM

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

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

a1���a2

p1���p2

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

NB:  Stampa  semplificata  e  output  prima  regola  omesso!  

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

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

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   73  

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

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Dummy  nodes  

Memory  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   74  

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

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Dummy  nodes  

Memory  nodes  

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

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   75  

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

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Dummy  nodes  

Memory  nodes  

Beta  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   76  

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

Pa9ern  matching:  l’algoritmo  RETE  Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Dummy  nodes  

Memory  nodes  

Beta  nodes  

Delayed  nodes  

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

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   77  

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Dummy  nodes  

Memory  nodes  

Beta  nodes  

Delayed  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   78  

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Dummy  nodes  

Memory  nodes  

Beta  nodes  

Delayed  nodes  

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

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Dummy  nodes  

Memory  nodes  

Beta  nodes  

Delayed  nodes  

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

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Dummy  nodes  

Memory  nodes  

Beta  nodes  

Delayed  nodes  

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

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Dummy  nodes  

Memory  nodes  

Beta  nodes  

Delayed  nodes  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   82  

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Dummy  nodes  

Memory  nodes  

Beta  nodes  

Delayed  nodes  

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

WM

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   83  

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Dummy  nodes  

Memory  nodes  

Beta  nodes  

Delayed  nodes  WM

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

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

a1

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

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   84  

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Dummy  nodes  

Memory  nodes  

Beta  nodes  

Delayed  nodes  WM

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

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

a1���

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

p1���

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

p1,a1���

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   85  

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Dummy  nodes  

Memory  nodes  

Beta  nodes  

Delayed  nodes  WM

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

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

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

a1���a2

p1���

p1,a1���p1,a2 _  

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

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   86  

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Dummy  nodes  

Memory  nodes  

Beta  nodes  

Delayed  nodes  

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

WM

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

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

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

a1���a2

p1���p2

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

p1,a1���

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   87  

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

Pa9ern  matching:  l’algoritmo  RETE  

Terminal  nodes  

Memory  nodes  

ALFA

 NETWORK

 BE

TA  NETWORK

 

Root  node  

Entry  Point  nodes  

Object  Type  nodes  

Alfa  nodes  

Dummy  nodes  

Memory  nodes  

Beta  nodes  

Delayed  nodes  

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

WM

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

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

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

a1���a2

p1���p2

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

p1,a1���

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   88  

RISOLUZIONE  DEI  CONFLITTI  ED  ESECUZIONE  

FondamenF  di  Intelligenza  ArFficiale  M  

Risoluzione  dei  ConfliC  &  Esecuzione  

ai  

ai   ai   ai   ai   ai   ai   ai   ai   ai   ai  

E  X  E  C      

FIFO  

ai  ai  

a i  

!  

AGENDA  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   90  

Risoluzione  dei  ConfliC  &  Esecuzione  

ai  

ai   ai   ai   ai   ai   ai   ai   ai   ai   ai  

E  X  E  C      

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

FIFO  

ai  ai  

a i  

!  

AGENDA  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   91  

Risoluzione  dei  ConfliC  &  Esecuzione  

ai  

ai   ai   ai   ai   ai   ai   ai   ai   ai   ai  

E  X  E  C      

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

FIFO  

ai  ai  

a i  

!  

AGENDA  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   92  

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

Risoluzione  dei  ConfliC  &  Esecuzione  

ai  

ai   ai   ai   ai   ai   ai   ai   ai   ai   ai  

E  X  E  C      

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

FIFO  

ai  ai  

a i  

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

!  

AGENDA  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   93  

Risoluzione  dei  ConfliC  &  Esecuzione  

PM

r1 r2

WM

f

Agenda a1 a2

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

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

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   94  

Risoluzione  dei  ConfliC  &  Esecuzione  

PM

r1 r2

WM

f

Agenda a1 a2

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

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

a1 < a2

PM

Agenda WM

PM

Agenda WM

a2 < a1 r1 < r2

rule  "r1"  salience  10  ...  

rule  "r2"  salience  5  ...  

Prima  inserisco  G,  poi  elimino  F.  

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

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

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   95  

RIFERIMENTI  FondamenF  di  Intelligenza  ArFficiale  M  

RiferimenF  •  Charles  L.  Forgy,  “RETE:  A  Fast  Algorithm  for  the  Many  PaFer/

Many  Object  Match  Problem”,  ArFficial  Intelligence,  19,  pp.  17-­‐37,  1982  

•  R.B.  Doorenbos,  “Produc(on  Matching  for  Large  Learning  Systems”,  Ph.D.  Thesis,  1995  

•  Schmit,  Struhmer  and  Stojanovic,  “Blending  Complex  Event  Processing  with  the  RETE  algorithm”,  in  Proceedings  of  iCEP2008,  2008  

•  h9p://en.wikipedia.org/wiki/Rete_algorithm  •  h9p://en.wikipedia.org/wiki/Complex_event_processing  

4  Giugno  2013   Sistemi  a  Regole  di  Produzione   97  

INFORMAZIONI  FondamenF  di  Intelligenza  ArFficiale  M  

Informazioni  

•  Domani  esercitazione  in  laboratorio  

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

•  Per  domande,  dubbi,  richieste:  stefano.bragaglia@unibo.it  

 4  Giugno  2013   Sistemi  a  Regole  di  Produzione   99  

Introduzione    a  Drools  

Stefano  Bragaglia    

Fondamen(  di  Intelligenza  Ar(ficiale  M  5  Giugno  2013    

RingraziamenF  

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

5  Giugno  2013   Introduzione  a  Drools   101  

Sommario  1.  Guida  IntroduCva  2.  Esercizi  •  PaFern  Semplici  •  PaFern  Composi(  •  Quan(ficatori  Esistenziali  •  Concatenazione  di  Regole  •  Features  Avanzate:  FROM,  COLLECT,  ACCUMULATE  •  Query  •  Truth  Maintenance    

3.  Informazioni  

5  Giugno  2013   Introduzione  a  Drools   102  

GUIDA  INTRODUTTIVA  FondamenF  di  Intelligenza  ArFficiale  M  

0.  Documentazione  Disponibile  gratuitamente  sul  sito  h9p://www.jboss.org/drools/documentaFon    •  Installazione:  

Drools  IntroducCon  (Cap.  2)  •  Esempi  di  base:  

Drools  Expert  (Cap.  7)  •  Ragionamento  temporale:    

Drools  Fusion  (Cap.  2)    

5  Giugno  2013   Introduzione  a  Drools   104  

1.  Eclipse  Scaricare  la  versione  di  Eclipse  più  approrpiata  al  proprio  sistema  dal  sito  h9p://www.eclipse.org/downloads/    

5  Giugno  2013   Introduzione  a  Drools   105  

2.  Drools  Plugin  Installare  il  plugin  di  Drools  per  Eclipse    •  Help  >  Install  New  Sokware…  •  Add…  •  Name:    

Drools  Update  Site  –  5.5.0  Final  •  LocaFon:  

h9p://download.jboss.org/drools/release/5.5.0.Final/org.drools.updatesite/  

•  Ok  •  Drools  and  jBPM  >  Jboss  Drools  

Core  •  Finish  •  …  •  Riavviare  Eclipse  

5  Giugno  2013   Introduzione  a  Drools   106  

3.  Creare  un  RunCme  I  file  per  eseguire  Drools  sono  staF  già  scaricaF  assieme  al  plugin,  occorre  solo  indicare  al  sistema  dove  trovarli    •  Eclipse  >  Preferences…  •  Drools  >  Installed  Drools  Run(me  •  Add…  •  Create  a  new  Drools  5  Run(me…  •  Selezionare  la  cartella  in  cui  salvare  

il  runFme  (in  laboratorio    /usr/share/eclipse/library/drools-­‐5.5.0  )  

•  Ok  •  …  •  Selezionare  il  runFme  appena  

creato  •  Ok  

5  Giugno  2013   Introduzione  a  Drools   107  

4.  Creare  un  progeRo  Ora  che  la  pia9aforma  è  propriamente  installata  e  configurata,  creare  un  proge9o  Drools    “Hello  World!”    •  File  >  New  >  Project…  •  Drools  >  Drools  Project  •  Next  •  Project  name:  HelloWorld  •  Next  •  Verificare  che  siano  selezionaF  

•  Add  a  sample  HelloWorld  rule  fine  to  this  project.  

•  Add  a  sample  Java  class  for  loading  and  execu(ng  the  HelloWorld  rules.  

•  Next  •  Verificare  che  sia  selezionato  il  

runFme  precedentemente  creato  •  Finish  

5  Giugno  2013   Introduzione  a  Drools   108  

DroolsTest.java:    main  Java  

1.  package  com.sample  2.     3.  public  class  DroolsTest  {  4.     5.     public  static  final  void  main(String[]  args)  {  6.         try  {  7.             //  load  up  the  knowledge  base  8.             KnowledgeBase  kbase  =  readKnowledgeBase();  9.             StatefulKnowledgeSession  ksession  =  kbase.newStatefulKnowledgeSession();  10.             KnowledgeRuntimeLogger  logger  =  KnowledgeRuntimeLoggerFactory.newFileLogger(ksession,  "test");  11.             //  go  !  12.             Message  message  =  new  Message();  13.             message.setMessage("Hello  World");  14.             message.setStatus(Message.HELLO);  15.             ksession.insert(message);  16.             ksession.fireAllRules();  17.             logger.close();  18.         }  catch  (Throwable  t)  {  19.             t.printStackTrace();  20.         }  21.     }  22.     23.     private  static  KnowledgeBase  readKnowledgeBase()  throws  Exception  {..}    24.     ..  25.  }  

5  Giugno  2013   Introduzione  a  Drools   109  

DroolsTest.java:    caricamento  della  base  di  conoscenza  

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

5  Giugno  2013   Introduzione  a  Drools   110  

Sample.drl:    file  di  regole  

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

5  Giugno  2013   Introduzione  a  Drools   111  

5.  Debug  del  progeRo  Maggiori  de9agli  nel  Cap.  7.6  della  documentazione  di  Drools  Expert  h9p://www.jboss.org/drools/documentaFon    •  Impostare  un  breakpoint  su  

ksession.fireAllRules();  

•  Passare  alla  Drools  PerspecFve  •  Window  >  Open  Perspec(ve  >  

Other…  •  Selezionare  Drools  •  Ok  •  Cliccare  su  Drools  

•  Lanciare  una  sessione  di  debug  •  Selezionare  la  sessione  tra  le  

variabili  di  debug  •  Aggiungere  view:  

•  Window  >  Show  View  >  Other…  •  Agenda,  Audit,  WM,  ecc.  •  Ok  

5  Giugno  2013   Introduzione  a  Drools   112  

ESERCIZI  FondamenF  di  Intelligenza  ArFficiale  M  

PATTERN  SEMPLICI  Esercizi  

5  Giugno  2013   Introduzione  a  Drools   114  

Pa9ern  Semplici  

•  Un  pa9ern  semplice  è  un  insieme  di  vincoli  da  rispe9are  su  faC  di  uno  stesso  Fpo  in  WM  

•  Per  poterli  applicare,  occorre  che  Drools  sappia  come  sono  faC  quesF  oggeC    

•  I  faC  sono  definiF  come  POJO  o  BEAN  e  poi  importaF  nel  file  .drl  di  Drools  col  comando  

 

import  com.sample.DroolsTest.Message;  

5  Giugno  2013   Introduzione  a  Drools   115  

Pa9ern  Semplici  

•  Creare  un  nuovo  proge9o  come  HelloWorld  

•  Rimuovere  ogni  riferimento  a  Message  da  DroolsTest.java  

•  Creare  I  POJO/BEAN  rappresentaF  nella  figura  di  destra  

5  Giugno  2013   Introduzione  a  Drools   116  

com.sample  

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

+  ...  

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

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

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

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

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

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

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

5  Giugno  2013   Introduzione  a  Drools   117  

Pa9ern  Semplici  

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

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

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

5  Giugno  2013   Introduzione  a  Drools   118  

Pa9ern  Semplici  

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

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

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

5  Giugno  2013   Introduzione  a  Drools   119  

Pa9ern  Semplici  •  Trovare  tu9e  le  Person  che  si  

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

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

5  Giugno  2013   Introduzione  a  Drools   120  

Pa9ern  Semplici  •  Trovare  tu9e  le  Person  che  si  

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

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

5  Giugno  2013   Introduzione  a  Drools   121  

PATTERN  COMPOSITI  Esercizi  

5  Giugno  2013   Introduzione  a  Drools   122  

Pa9ern  ComposiF:  Join  

•  Più  pa9ern  in  una  stessa  regola    selezionano  oggeC  di  più  Fpi  

•  La  regola  abbina  automaFcamente  quesF  oggeC,  costruendo  tu9e  le  loro  possibili  combinazioni  

•  I  nodi  di  Join  (Beta  nodes)  fanno  il  “prodo9o  cartesiano”  degli  oggeC  che  ricevono  in  ingresso  

5  Giugno  2013   Introduzione  a  Drools   123  

Pa9ern  ComposiF:  Join  

•  Scrivere  una  regola  per  trovare  tu9e  le  coppie  di  persone  

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

5  Giugno  2013   Introduzione  a  Drools   124  

Pa9ern  ComposiF:  Join  

•  Scrivere  una  regola  per  trovare  tu9e  le  coppie  di  persone  

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

5  Giugno  2013   Introduzione  a  Drools   125  

Pa9ern  ComposiF:  Join  

•  Scrivere  una  regola  per  trovare  tu9e  le  coppie  di  persone  

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

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

5  Giugno  2013   Introduzione  a  Drools   126  

Pa9ern  ComposiF:  Join  

•  Scrivere  una  regola  per  trovare  tu9e  le  coppie  di  persone  

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

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

5  Giugno  2013   Introduzione  a  Drools   127  

Pa9ern  ComposiF:  Join  

•  Trovare  le  coppie  (non  degeneri)  di  omonimi  

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

5  Giugno  2013   Introduzione  a  Drools   128  

“Dummy”  nodes!  

Pa9ern  ComposiF:  Join  

•  Trovare  le  coppie  (non  degeneri)  di  omonimi  

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

5  Giugno  2013   Introduzione  a  Drools   129  

“Dummy”  nodes!  

Pa9ern  ComposiF:  Join  

•  Trovare  le  coppie  (non  degeneri)  di  omonimi  

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

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

5  Giugno  2013   Introduzione  a  Drools   130  

“Dummy”  nodes!  

Pa9ern  ComposiF:  Join  

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

             *  Estendere  opportunamente  il  BEAN  

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

5  Giugno  2013   Introduzione  a  Drools   131  

Pa9ern  ComposiF:  Join  

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

             *  Estendere  opportunamente  il  BEAN  

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

5  Giugno  2013   Introduzione  a  Drools   132  

Pa9ern  ComposiF:  Join  

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

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

5  Giugno  2013   Introduzione  a  Drools   133  

Pa9ern  ComposiF:  Join  

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

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

5  Giugno  2013   Introduzione  a  Drools   134  

Pa9ern  ComposiF:  Join  

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

NB:  La  Dot  NotaFon  rende  i  pa9ern  più  compaC  

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

5  Giugno  2013   Introduzione  a  Drools   135  

QUANTIFICATORI  ESISTENZIALI  Esercizi  

5  Giugno  2013   Introduzione  a  Drools   136  

QuanFficatori  Esistenziali  

•  Drools  supporta  naFvamente  i  quanFficatori  esistanziali  ∃  e  ∀  mediante  le  parole  chiave  exists  e  forall  il  cui  scope  è  un  pa9ern  –  exists  P(…)    la  WM  conFene  almeno  un  fa9o  fa  match  

–  not  P(…)  (so9ointeso  exists)  la  WM  non  conFene  alcun  fa9o  che  fa  match  

–  forall  P(…)  tuC  gli  oggeC  di  Fpo  P  in  WM  fanno  match  

5  Giugno  2013   Introduzione  a  Drools   137  

QuanFficatori  Esistenziali  

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

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

5  Giugno  2013   Introduzione  a  Drools   138  

QuanFficatori  Esistenziali  

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

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

5  Giugno  2013   Introduzione  a  Drools   139  

NB:  le  regole  sca9ano  0  o  1  volte  per  persona  

QuanFficatori  Esistenziali  

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

–  Che  non  hanno  ricevuto  alcuna  mail  

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

5  Giugno  2013   Introduzione  a  Drools   140  

QuanFficatori  Esistenziali  

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

–  Che  non  hanno  ricevuto  alcuna  mail  

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

5  Giugno  2013   Introduzione  a  Drools   141  

NB:  le  regole  sca9ano  0  o  1  volte  per  persona  

QuanFficatori  Esistenziali  

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

–  Che  non  hanno  ricevuto  alcuna  mail  

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

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

5  Giugno  2013   Introduzione  a  Drools   142  

QuanFficatori  Esistenziali  

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

–  Che  non  hanno  ricevuto  alcuna  mail  

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

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

5  Giugno  2013   Introduzione  a  Drools   143  

NB:  le  regole  sca9ano  0  o  1  volte  per  persona  

CONCATENAZIONE  DI  REGOLE  Esercizi  

5  Giugno  2013   Introduzione  a  Drools   144  

Concatenazione  di  Regole  

•  Drools  supporta  la  generazione  di  classi  all’interno  dei  file  .drl  

•  Con  opportune  dichiarazioni  (Fpicamente  incluse  prima  delle  regole)  si  possono  introdurre  BEAN  al  volo  da  usare  nelle  regole:    

declare  Pair      first:  Person      second:  Person  end  

5  Giugno  2013   Introduzione  a  Drools   145  

Concatenazione  di  Regole  

•  Oltre  ad  eseguire  codice  Java  generico,  il  conseguente  di  una  regola  può  eseguire  “operazioni  logiche”:  –  Inserimento  di  nuovi  faC  nella  WM  – Rimozione  di  faC  dalla  WM  – Aggiornamento  di  faC  nella  WM    

•  Queste  operazioni,  a  loro  volta,  possono  aCvare  le  regole  in  cascata  

5  Giugno  2013   Introduzione  a  Drools   146  

Concatenazione  di  Regole  

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

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

5  Giugno  2013   Introduzione  a  Drools   147  

Concatenazione  di  Regole  

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

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

5  Giugno  2013   Introduzione  a  Drools   148  

Concatenazione  di  Regole  

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

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

 

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

5  Giugno  2013   Introduzione  a  Drools   149  

Concatenazione  di  Regole  

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

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

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

5  Giugno  2013   Introduzione  a  Drools   150  

NB:  L’ordine  delle  regole  è  ininfluente  

Concatenazione  di  Regole  

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

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

5  Giugno  2013   Introduzione  a  Drools   151  

Concatenazione  di  Regole  

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

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

5  Giugno  2013   Introduzione  a  Drools   152  

Concatenazione  di  Regole  

Mondo  di  Java   Mondo  delle  regole  

5  Giugno  2013   Introduzione  a  Drools   153  

Person   Person  

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

L’operazione  opposta  non  è  generalmente  possibile.  

Pair   Pair  

Diventa  possibile  grazie  alla  reflecFon/introspecFon  di  Java:    

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

FEATURES  AVANZATE:    FORM,  COLLECT,  ACCUMULATE  

Esercizi  

5  Giugno  2013   Introduzione  a  Drools   154  

Features  Avanzate:  FROM  

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

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

5  Giugno  2013   Introduzione  a  Drools   155  

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

Features  Avanzate:  FROM  

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

•  Scrivere  una  regola  che  stampi  i  figli  di  ogni  persona  

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

5  Giugno  2013   Introduzione  a  Drools   156  

Features  Avanzate:  FROM  

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

•  Scrivere  una  regola  che  stampi  i  figli  di  ogni  persona  

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

5  Giugno  2013   Introduzione  a  Drools   157  

Features  Avanzate:  FROM  

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

•  Solo  il  nodo  radice  è  asserito  nella  WM  

5  Giugno  2013   Introduzione  a  Drools   158  

CollecFon                                                                          .  

CollecFon                                                                          .  

...  

N  

N   N   N  

N   N   N  

...  ...  

Features  Avanzate:  FROM  

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

•  Solo  il  nodo  radice  è  asserito  nella  WM  

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

5  Giugno  2013   Introduzione  a  Drools   159  

CollecFon                                                                          .  

CollecFon                                                                          .  

...  

N  

N   N   N  

N   N   N  

...  ...  

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

Features  Avanzate:  FROM  

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

•  Solo  il  nodo  radice  è  asserito  nella  WM  

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

5  Giugno  2013   Introduzione  a  Drools   160  

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

Features  Avanzate:  FROM  

•  In  quale  ordine  sono  visitaF  i  nodi?  

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

5  Giugno  2013   Introduzione  a  Drools   161  

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

Features  Avanzate:  FROM  

•  In  quale  ordine  sono  visitaF  i  nodi?  

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

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

5  Giugno  2013   Introduzione  a  Drools   162  

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

Features  Avanzate:  FROM  

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

5  Giugno  2013   Introduzione  a  Drools   163  

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

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

Features  Avanzate:  FROM  

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

5  Giugno  2013   Introduzione  a  Drools   164  

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

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

Features  Avanzate:  FROM  

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

5  Giugno  2013   Introduzione  a  Drools   165  

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

Features  Avanzate:  COLLECT  

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

 

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

5  Giugno  2013   Introduzione  a  Drools   166  

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

Features  Avanzate:  ACCUMULATE  

•  Il  costru9o  accumulate  è  conce9ualmente  simile  a  collect    

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

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

5  Giugno  2013   Introduzione  a  Drools   167  

Features  Avanzate:  ACCUMULATE  

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

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

5  Giugno  2013   Introduzione  a  Drools   168  

Features  Avanzate:  ACCUMULATE  •  Funzioni  notevoli:  

 

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

5  Giugno  2013   Introduzione  a  Drools   169  

Features  Avanzate:  ACCUMULATE  

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

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

5  Giugno  2013   Introduzione  a  Drools   170  

Features  Avanzate:  ACCUMULATE  

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

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

5  Giugno  2013   Introduzione  a  Drools   171  

Features  Avanzate:  ACCUMULATE  

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

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

5  Giugno  2013   Introduzione  a  Drools   172  

QUERIES  Esercizi  

5  Giugno  2013   Introduzione  a  Drools   173  

Queries  

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

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

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

5  Giugno  2013   Introduzione  a  Drools   174  

Queries  

•  Individuare  le  persone  maggiorenni  

query  "Query:  Q1"      ...  end  

5  Giugno  2013   Introduzione  a  Drools   175  

Queries  

•  Individuare  le  persone  maggiorenni  

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

5  Giugno  2013   Introduzione  a  Drools   176  

Queries  

•  Individuare  le  persone  maggiorenni  

•  Individuare  le  persone  che  hanno  una  data  età  

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

5  Giugno  2013   Introduzione  a  Drools   177  

Queries  

•  Individuare  le  persone  maggiorenni  

•  Individuare  le  persone  che  hanno  una  data  età  

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

5  Giugno  2013   Introduzione  a  Drools   178  

Queries  

•  Individuare  le  persone  maggiorenni  

•  Individuare  le  persone  che  hanno  una  data  età  

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

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

5  Giugno  2013   Introduzione  a  Drools   179  

Queries  

•  Individuare  le  persone  maggiorenni  

•  Individuare  le  persone  che  hanno  una  data  età  

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

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

5  Giugno  2013   Introduzione  a  Drools   180  

Queries  

•  Mondo  di  Java    

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

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

5  Giugno  2013   Introduzione  a  Drools   181  

TRUTH  MAINTENANCE  Esercizi  

5  Giugno  2013   Introduzione  a  Drools   182  

Truth  Maintenance  

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

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

•  I  nuovi  costruC  sono  insertLogical  e  retractLogical  

*  Esiste  anche  modify  che  fa  in  sequenza  retract  e  insert  

5  Giugno  2013   Introduzione  a  Drools   183  

Truth  Maintenance  

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

5  Giugno  2013   Introduzione  a  Drools   184  

Truth  Maintenance  

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

•  Definire  una  query  con  cui  individuare  i  message  di  Ad  

...  

5  Giugno  2013   Introduzione  a  Drools   185  

Truth  Maintenance  

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

•  Definire  una  query  con  cui  individuare  i  message  di  Ad  

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

5  Giugno  2013   Introduzione  a  Drools   186  

Truth  Maintenance  

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

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

NB:  operazioni  logiche!  

...  

5  Giugno  2013   Introduzione  a  Drools   187  

Truth  Maintenance  

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

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

NB:  operazioni  logiche!  

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

5  Giugno  2013   Introduzione  a  Drools   188  

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

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

...  

5  Giugno  2013   Introduzione  a  Drools   189  

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

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

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

5  Giugno  2013   Introduzione  a  Drools   190  

Truth  Maintenance  

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

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

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

INFORMAZIONI  FondamenF  di  Intelligenza  ArFficiale  M  

Informazioni  

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

•  Per  domande,  dubbi,  richieste:  stefano.bragaglia@unibo.it  

 

5  Giugno  2013   Introduzione  a  Drools   193