Salta al contenuto
Note per Studenti Esercizio - Risoluzione, forward e backward chaining sul caso Criminal West (slide del corso)

Esercizio - Risoluzione, forward e backward chaining sul caso Criminal West (slide del corso)

In questa pagina 5

Testo (dalle slide "Inference in first-order logic" del corso di Intelligenza Artificiale, Ing. dell'Informazione UniPD; teoria in Logica del primo ordine - unificazione, forward e backward chainingLogica del primo ordine (oggetti, relazioni, funzioni, quantificatori e errori tipici), sostituzioni, istanziazione universale ed esistenziale (Skolem), proposizionalizzazione e suoi limiti, unificazione con occur check, risoluzione nel primo ordine con conversione in CNF, esempio Criminal(West), clausole definite, forward e backward chaining, ingegneria della conoscenza.Logica del primo ordine - unificazione, forward e backward chaining →). La legge dice che è un reato per un americano vendere armi a nazioni ostili. Il paese Nono, nemico dell'America, ha dei missili, e tutti i suoi missili gli sono stati venduti dal colonnello West, che è americano.

  1. Tradurre il testo in logica del primo ordine, con le convenzioni che un nemico dell'America è ostile e che un missile è un'arma.
  2. Dimostrare Criminal(West)Criminal(West) per risoluzione, per backward chaining e per forward chaining.
  3. Cosa succede se si toglie un fatto alla volta? Quale risposta dà la domanda Criminal(x)Criminal(x)?

Punto 1: formalizzazione

Frase Logica
reato vendere armi a nazioni ostili American(x)∧Weapon(y)∧Sells(x,y,z)∧Hostile(z)⇒Criminal(x)American(x) \land Weapon(y) \land Sells(x,y,z) \land Hostile(z) \Rightarrow Criminal(x)
Nono è nemica dell'America Enemy(Nono,America)Enemy(Nono, America)
un nemico dell'America è ostile Enemy(x,America)⇒Hostile(x)Enemy(x, America) \Rightarrow Hostile(x)
Nono ha dei missili ∃x Owns(Nono,x)∧Missile(x)\exists x\ Owns(Nono,x) \land Missile(x), con EI: Owns(Nono,M1)Owns(Nono,M_1) e Missile(M1)Missile(M_1)
i missili sono armi Missile(x)⇒Weapon(x)Missile(x) \Rightarrow Weapon(x)
West ha venduto a Nono tutti i missili di Nono Missile(x)∧Owns(Nono,x)⇒Sells(West,x,Nono)Missile(x) \land Owns(Nono,x) \Rightarrow Sells(West,x,Nono)
West è americano American(West)American(West)

L'esistenziale è eliminato con la costante di Skolem M1M_1 (nome nuovo). Le variabili sono quantificate universalmente. Sono tutte clausole definite: un solo letterale positivo per clausola, quindi vanno bene sia forward sia backward chaining.

Punto 2a: risoluzione

Negazione della tesi: ¬Criminal(West)\neg Criminal(West). Nove passi, riportati con le sostituzioni, nella nota; in sintesi: ¬Criminal(West)\neg Criminal(West) con la regola del reato (x/Westx/West), poi American(West)American(West), la regola Missile⇒WeaponMissile \Rightarrow Weapon (x/yx/y), Missile(M1)Missile(M_1) (y/M1y/M_1), la regola delle vendite (x/M1x/M_1, z/Nonoz/Nono), ancora Missile(M1)Missile(M_1), Owns(Nono,M1)Owns(Nono,M_1), la regola dei nemici (x/Nonox/Nono) e Enemy(Nono,America)Enemy(Nono,America), che dà □\square. La clausola vuota prova Criminal(West)Criminal(West).

Punto 2b: backward chaining

Si parte da Criminal(West)Criminal(West) e si cercano clausole la cui conseguenza si unifica con l'obiettivo. Le variabili della regola sono rinominate a ogni uso (apice). In profondità, da sinistra a destra:

  1. Obiettivo Criminal(West)Criminal(West): la regola del reato ha conseguenza Criminal(x)Criminal(x), con {x/West}\{x/West\}. Nuovi obiettivi (premesse): American(West)American(West), Weapon(y)Weapon(y), Sells(West,y,z)Sells(West,y,z), Hostile(z)Hostile(z).
  2. American(West)American(West): è un fatto. {}\{\}.
  3. Weapon(y)Weapon(y): la regola Missile(x′)⇒Weapon(x′)Missile(x') \Rightarrow Weapon(x') dà {y/x′}\{y/x'\} e obiettivo Missile(x′)Missile(x'); il fatto Missile(M1)Missile(M_1) dà {x′/M1}\{x'/M_1\}, cioè y=M1y = M_1.
  4. Sells(West,M1,z)Sells(West,M_1,z): la regola Missile(x′′)∧Owns(Nono,x′′)⇒Sells(West,x′′,Nono)Missile(x'') \land Owns(Nono,x'') \Rightarrow Sells(West,x'',Nono) si unifica con {z/Nono, x′′/M1}\{z/Nono,\ x''/M_1\}. Obiettivi: Missile(M1)Missile(M_1) (fatto) e Owns(Nono,M1)Owns(Nono,M_1) (fatto).
  5. Hostile(Nono)Hostile(Nono) (con z=Nonoz = Nono): la regola Enemy(x′′′,America)⇒Hostile(x′′′)Enemy(x''', America) \Rightarrow Hostile(x''') dà {x′′′/Nono}\{x'''/Nono\}; obiettivo Enemy(Nono,America)Enemy(Nono, America), fatto.

Tutte le foglie sono fatti: Criminal(West)Criminal(West) è dimostrato con {x/West,y/M1,z/Nono}\{x/West, y/M_1, z/Nono\}. Un solo ramo, nessun vicolo cieco: ogni obiettivo ha una sola clausola che si unifica (il programma Python di verifica trova la risposta senza tornare indietro su nessuna scelta).

Punto 2c: forward chaining

Si applicano le regole le cui premesse sono già tutte fatti, finché non compare nulla di nuovo.

Giro Regola Sostituzione Fatto nuovo
1 Missile(x)⇒Weapon(x)Missile(x) \Rightarrow Weapon(x) {x/M1}\{x/M_1\} Weapon(M1)Weapon(M_1)
1 Missile(x)∧Owns(Nono,x)⇒Sells(West,x,Nono)Missile(x) \land Owns(Nono,x) \Rightarrow Sells(West,x,Nono) {x/M1}\{x/M_1\} Sells(West,M1,Nono)Sells(West,M_1,Nono)
1 Enemy(x,America)⇒Hostile(x)Enemy(x,America) \Rightarrow Hostile(x) {x/Nono}\{x/Nono\} Hostile(Nono)Hostile(Nono)
2 American(x)∧Weapon(y)∧Sells(x,y,z)∧Hostile(z)⇒Criminal(x)American(x) \land Weapon(y) \land Sells(x,y,z) \land Hostile(z) \Rightarrow Criminal(x) {x/West,y/M1,z/Nono}\{x/West, y/M_1, z/Nono\} Criminal(West)Criminal(West)
3 nessuna regola dà qualcosa di nuovo punto fisso

La regola del reato non poteva scattare al giro 1: mancavano WeaponWeapon, SellsSells e HostileHostile. Per questo servono due giri. Al punto fisso i fatti sono 88 (i 44 iniziali più 44 derivati).

Punto 3: togliere un fatto, domanda Criminal(x)Criminal(x)

Si rifanno forward e backward chaining togliendo un fatto alla volta (controllo con Python). In ogni caso Criminal(West)Criminal(West) non si deriva, sia con forward sia con backward chaining:

Fatto tolto Cosa manca Fatti derivati dal forward
Owns(Nono,M1)Owns(Nono,M_1) non si può provare Sells(West,M1,Nono)Sells(West,M_1,Nono) Weapon(M1)Weapon(M_1), Hostile(Nono)Hostile(Nono)
Enemy(Nono,America)Enemy(Nono,America) non si può provare Hostile(Nono)Hostile(Nono) Weapon(M1)Weapon(M_1), Sells(West,M1,Nono)Sells(West,M_1,Nono)
American(West)American(West) manca la prima premessa Weapon(M1)Weapon(M_1), Sells(West,M1,Nono)Sells(West,M_1,Nono), Hostile(Nono)Hostile(Nono)
Missile(M1)Missile(M_1) manca l'arma, e anche la vendita solo Hostile(Nono)Hostile(Nono)

È il debug della KB: togliere o cambiare un enunciato e vedere quale conclusione cade. Se la KB è completa per il problema, ogni fatto è necessario.

Domanda con variabile. Ask(KB, Criminal(x)): il backward chaining, con la stessa catena di prima, restituisce la sostituzione {x/West}\{x/West\} (e le altre variabili legate, y=M1y = M_1 e z=Nonoz = Nono, non fanno parte della risposta). È l'unico criminale derivabile.

Versione ripasso

  • Formalizzazione (clausole definite): American(x)∧Weapon(y)∧Sells(x,y,z)∧Hostile(z)⇒Criminal(x)American(x) \land Weapon(y) \land Sells(x,y,z) \land Hostile(z) \Rightarrow Criminal(x); Enemy(Nono,America)Enemy(Nono,America); Enemy(x,America)⇒Hostile(x)Enemy(x,America) \Rightarrow Hostile(x); EI su "ha missili": Owns(Nono,M1)Owns(Nono,M_1), Missile(M1)Missile(M_1); Missile(x)⇒Weapon(x)Missile(x) \Rightarrow Weapon(x); Missile(x)∧Owns(Nono,x)⇒Sells(West,x,Nono)Missile(x) \land Owns(Nono,x) \Rightarrow Sells(West,x,Nono); American(West)American(West).
  • Risoluzione: negare la tesi, ¬Criminal(West)\neg Criminal(West); sequenza regola del reato (x/Westx/West), American(West)American(West), Missile⇒WeaponMissile \Rightarrow Weapon (x/yx/y), Missile(M1)Missile(M_1) (y/M1y/M_1), regola vendite (x/M1x/M_1, z/Nonoz/Nono), Missile(M1)Missile(M_1), Owns(Nono,M1)Owns(Nono,M_1), regola nemici (x/Nonox/Nono), Enemy(Nono,America)Enemy(Nono,America): □\square in 99 passi.
  • Backward chaining (in profondità): Criminal(West)Criminal(West) con {x/West}\{x/West\}; premesse American(West)American(West) (fatto), Weapon(y)Weapon(y) via MissileMissile con y/M1y/M_1, Sells(West,M1,z)Sells(West,M_1,z) con {z/Nono}\{z/Nono\} (premesse Missile(M1)Missile(M_1), Owns(Nono,M1)Owns(Nono,M_1)), Hostile(Nono)Hostile(Nono) via Enemy(Nono,America)Enemy(Nono,America). Risultato {x/West,y/M1,z/Nono}\{x/West, y/M_1, z/Nono\}, nessun ritorno indietro.
  • Forward chaining: giro 1 Weapon(M1)Weapon(M_1), Sells(West,M1,Nono)Sells(West,M_1,Nono), Hostile(Nono)Hostile(Nono); giro 2 Criminal(West)Criminal(West); giro 3 punto fisso; 88 fatti in tutto.
  • Debug: senza Owns(Nono,M1)Owns(Nono,M_1), Enemy(Nono,America)Enemy(Nono,America), American(West)American(West) o Missile(M1)Missile(M_1), Criminal(West)Criminal(West) non si deriva. Ask(KB, Criminal(x)) dà {x/West}\{x/West\}.
  • Errore tipico: dimenticare di rinominare le variabili a ogni uso della regola, o di propagare la sostituzione (es. z/Nonoz/Nono) alle premesse successive.

Teoria collegata