Salta al contenuto
Note per Studenti Agenti logici e logica proposizionale - inferenza e risoluzione

Agenti logici e logica proposizionale - inferenza e risoluzione

In questa pagina 9

Argomento del corso da 9 CFU. Fonte: slide del corso di Intelligenza Artificiale, Ing. dell'Informazione UniPD.

Agenti basati sulla conoscenza

Un agente basato sulla conoscenza (knowledge-based agent) ha una base di conoscenza (KBKnowledge Base: insieme di enunciati scritti in un linguaggio formale, con cui l'agente rappresenta ciò che sa del mondo.) e un motore di inferenza che ne ricava conseguenze.

  • La KB contiene i contenuti specifici del dominio; il motore usa algoritmi indipendenti dal dominio.
  • Approccio dichiarativo: si dice all'agente cosa sa (Tell), poi gli si chiede cosa fare (Ask): la risposta deve seguire dalla KB. Non si programma "come" decidere.
  • Due livelli di lettura: livello della conoscenza (cosa sa l'agente, a prescindere da come è realizzato) e livello di implementazione (strutture dati della KB e algoritmi che le manipolano).

L'agente deve saper rappresentare stati e azioni, incorporare nuove percezioni, aggiornare la rappresentazione del mondo, dedurre proprietà nascoste e azioni appropriate. Lo schema è un agente come quelli di Agenti intelligenti - ambienti, PEAS e tipi di agenteUn agente è una funzione dalle sequenze di percezioni alle azioni; è razionale se per ogni sequenza sceglie l'azione che massimizza il valore atteso della misura di prestazione, date le percezioni e la conoscenza incorporata. L'ambiente di lavoro si descrive con PEAS (Performance, Environment, Actuators, Sensors) e si classifica con sette coppie di proprietà (osservabile, deterministico, episodico, statico, discreto, singolo/multi-agente, noto). Le architetture crescono in complessità: reattivo semplice, reattivo basato su modello, basato su obiettivi, basato su utilità, più l'agente che apprende (elemento esecutivo, di apprendimento, critico, generatore di problemi).Agenti intelligenti - ambienti, PEAS e tipi di agente →, con la KB al posto della tabella o delle regole fisse:

python
def kb_agent(kb, percept, t):          # t = contatore del tempo
    kb.tell(make_percept_sentence(percept, t))
    action = kb.ask(make_action_query(t))
    kb.tell(make_action_sentence(action, t))
    return action                      # il chiamante incrementa t

Il mondo del Wumpus

Mondo giocattolo per provare il ragionamento logico: griglia 4×44 \times 4 con un mostro (Wumpus), pozzi, un tesoro.

PEAS (vedi Agenti intelligenti - ambienti, PEAS e tipi di agenteUn agente è una funzione dalle sequenze di percezioni alle azioni; è razionale se per ogni sequenza sceglie l'azione che massimizza il valore atteso della misura di prestazione, date le percezioni e la conoscenza incorporata. L'ambiente di lavoro si descrive con PEAS (Performance, Environment, Actuators, Sensors) e si classifica con sette coppie di proprietà (osservabile, deterministico, episodico, statico, discreto, singolo/multi-agente, noto). Le architetture crescono in complessità: reattivo semplice, reattivo basato su modello, basato su obiettivi, basato su utilità, più l'agente che apprende (elemento esecutivo, di apprendimento, critico, generatore di problemi).Agenti intelligenti - ambienti, PEAS e tipi di agente →):

Misura di prestazione oro +1000+1000, morte −1000-1000, −1-1 per passo, −10-10 per usare la freccia
Ambiente caselle adiacenti al Wumpus puzzano (stench); adiacenti a un pozzo hanno brezza (breeze); luccichio (glitter) se e solo se l'oro è nella casella; sparare uccide il Wumpus se è davanti (una sola freccia); grab raccoglie l'oro se è nella casella
Attuatori gira a sinistra, gira a destra, avanti, grab, release, shoot
Sensori brezza, luccichio, puzza

Caratterizzazione: parzialmente osservabile (solo percezioni locali), deterministico, sequenziale, statico (Wumpus e pozzi non si muovono), discreto, a singolo agente (il Wumpus è una caratteristica del mondo, non insegue l'agente).

Esplorazione. L'agente parte da [1,1][1,1], sicuro, senza percezioni: quindi [1,2][1,2] e [2,1][2,1] sono sicure. Va in [2,1][2,1] e sente brezza: c'è un pozzo in [1,1][1,1] (escluso), [2,2][2,2] o [3,1][3,1]. Torna e va in [1,2][1,2]: sente puzza ma non brezza. Allora:

  • niente brezza in [1,2][1,2]: nessun pozzo in [2,2][2,2] (né in [1,3][1,3]), quindi la brezza di [2,1][2,1] viene da un pozzo in [3,1][3,1];
  • niente puzza in [2,1][2,1]: il Wumpus non è in [2,2][2,2], quindi la puzza di [1,2][1,2] viene da un Wumpus in [1,3][1,3].

Sono deduzioni che nessuna singola percezione dà: servono più percezioni combinate con le regole del mondo. (Nelle slide un indice è scritto "[3.1][3.1]": è un refuso di [3,1][3,1].)

Logica, sintassi e semantica

Una logica è un linguaggio formale per rappresentare informazione in modo da trarne conclusioni corrette se l'informazione è corretta.

  • Sintassi: quali sequenze di simboli sono enunciati. Esempio aritmetico: x+2≥yx + 2 \ge y è un enunciato, x2+y>x2 + y > no.
  • Semantica: il significato, cioè la verità di un enunciato in un mondo. x+2≥yx + 2 \ge y è vero se il numero x+2x + 2 non è minore di yy: vero in un mondo con x=7,y=1x=7, y=1, falso con x=0,y=6x=0, y=6.
  • Un modello è un assegnamento di valori a tutti i simboli, cioè un "mondo possibile". Se α\alpha è vero nel modello mm si dice che mm soddisfa α\alpha.

Definizione (conseguenza logica, entailment). La KB implica logicamente α\alpha, e si scrive KB⊨αKB \models \alpha, se e solo se α\alpha è vero in tutti i modelli in cui la KB è vera.

Esempi. La KB con "Giovanni ha vinto" e "Maria ha vinto" implica "o Giovanni o Maria ha vinto". L'enunciato x+y=4x + y = 4 implica 4=x+y4 = x + y. È una relazione tra enunciati, definita attraverso i modelli. È ciò che serve all'agente: dedurre solo ciò che è vero in ogni mondo compatibile con la KB.

Logica proposizionale

È la logica più semplice. I simboli proposizionali P1,P2,…P_1, P_2, \dots sono enunciati atomici, veri o falsi. Se S,S1,S2S, S_1, S_2 sono enunciati lo sono anche:

  • ¬S\neg S (negazione);
  • S1∧S2S_1 \land S_2 (congiunzione);
  • S1∨S2S_1 \lor S_2 (disgiunzione);
  • S1⇒S2S_1 \Rightarrow S_2 (implicazione);
  • S1⇔S2S_1 \Leftrightarrow S_2 (doppia implicazione, biconditional).

La semantica è composizionale: la verità di un enunciato complesso in un modello si calcola da quella dei componenti con le tavole dei connettivi (verificate con Python).

PP QQ ¬P\neg P P∧QP \land Q P∨QP \lor Q P⇒QP \Rightarrow Q P⇔QP \Leftrightarrow Q
V V F V V V V
V F F F V F F
F V V F V V F
F F V F F V V

Attenzione a ⇒\Rightarrow: P⇒QP \Rightarrow Q è falso solo se PP è vero e QQ falso. Dire Pioggia⇒PavimentoBagnatoPioggia \Rightarrow PavimentoBagnato vieta "piove e il pavimento è asciutto", ma ammette il pavimento bagnato senza pioggia (per un'altra causa). Se PP è falso l'implicazione è vera "a vuoto".

Equivalenze logiche. Due enunciati sono equivalenti (α≡β\alpha \equiv \beta) se hanno gli stessi modelli. Servono per trasformare le formule (tabella verificata con Python su tutte le righe):

Equivalenza Nome
α∧β≡β∧α\alpha \land \beta \equiv \beta \land \alpha,  α∨β≡β∨α\ \alpha \lor \beta \equiv \beta \lor \alpha commutatività
(α∧β)∧γ≡α∧(β∧γ)(\alpha \land \beta) \land \gamma \equiv \alpha \land (\beta \land \gamma) (idem per ∨\lor) associatività
¬(¬α)≡α\neg(\neg\alpha) \equiv \alpha doppia negazione
α⇒β≡¬β⇒¬α\alpha \Rightarrow \beta \equiv \neg\beta \Rightarrow \neg\alpha contrapposizione
α⇒β≡¬α∨β\alpha \Rightarrow \beta \equiv \neg\alpha \lor \beta eliminazione dell'implicazione
α⇔β≡(α⇒β)∧(β⇒α)\alpha \Leftrightarrow \beta \equiv (\alpha \Rightarrow \beta) \land (\beta \Rightarrow \alpha) eliminazione della doppia implicazione
¬(α∧β)≡¬α∨¬β\neg(\alpha \land \beta) \equiv \neg\alpha \lor \neg\beta,  ¬(α∨β)≡¬α∧¬β\ \neg(\alpha \lor \beta) \equiv \neg\alpha \land \neg\beta De Morgan
α∧(β∨γ)≡(α∧β)∨(α∧γ)\alpha \land (\beta \lor \gamma) \equiv (\alpha \land \beta) \lor (\alpha \land \gamma) distributività di ∧\land su ∨\lor
α∨(β∧γ)≡(α∨β)∧(α∨γ)\alpha \lor (\beta \land \gamma) \equiv (\alpha \lor \beta) \land (\alpha \lor \gamma) distributività di ∨\lor su ∧\land

Un enunciato è valido (tautologia) se è vero in tutti i modelli, soddisfacibile se è vero in almeno uno, insoddisfacibile se in nessuno. Legame fondamentale, usato dalla risoluzione:

KB⊨α  ⟺  (KB⇒α) eˋ valida  ⟺  KB∧¬α eˋ insoddisfacibile.KB \models \alpha \iff (KB \Rightarrow \alpha) \text{ è valida} \iff KB \land \neg\alpha \text{ è insoddisfacibile.}

(Se KB∧¬αKB \land \neg\alpha avesse un modello, quel modello renderebbe vera la KB e falsa α\alpha, contro la definizione di ⊨\models.)

Enunciati del mondo del Wumpus

Siano Pi,jP_{i,j} "c'è un pozzo in [i,j][i,j]" e Bi,jB_{i,j} "c'è brezza in [i,j][i,j]". Sempre vero:

  • R1: ¬P1,1R_1:\ \neg P_{1,1} (nessun pozzo nella casella di partenza);
  • R2: B1,1⇔(P1,2∨P2,1)R_2:\ B_{1,1} \Leftrightarrow (P_{1,2} \lor P_{2,1}) (brezza se e solo se c'è un pozzo adiacente);
  • R3: B2,1⇔(P1,1∨P2,2∨P3,1)R_3:\ B_{2,1} \Leftrightarrow (P_{1,1} \lor P_{2,2} \lor P_{3,1});
  • e così via per ogni casella: una frase per casella.

Dalle percezioni, con l'agente in [1,1][1,1] (nessuna brezza) e poi in [2,1][2,1] (brezza):

  • R4: ¬B1,1R_4:\ \neg B_{1,1};
  • R5: B2,1R_5:\ B_{2,1}.

La KB è R1∧R2∧R3∧R4∧R5R_1 \land R_2 \land R_3 \land R_4 \land R_5. Domanda: KB⊨¬P1,2KB \models \neg P_{1,2}?

Inferenza per model checking

Dalla definizione di ⊨\models discende un algoritmo: (1) enumerare tutte le righe (assegnamenti ai simboli); (2) dove la KB è vera, controllare che anche α\alpha lo sia.

Esempio. I simboli sono B1,1,B2,1,P1,1,P1,2,P2,1,P2,2,P3,1B_{1,1}, B_{2,1}, P_{1,1}, P_{1,2}, P_{2,1}, P_{2,2}, P_{3,1}: 77 simboli, 27=1282^7 = 128 modelli. La KB è vera solo in 33:

  1. R1R_1 impone P1,1P_{1,1} falso; R4R_4 impone B1,1B_{1,1} falso.
  2. R2R_2 con B1,1B_{1,1} falso: P1,2∨P2,1P_{1,2} \lor P_{2,1} deve essere falso, quindi P1,2=P2,1=P_{1,2} = P_{2,1} = F.
  3. R5R_5 impone B2,1B_{2,1} vero; R3R_3 allora richiede P1,1∨P2,2∨P3,1P_{1,1} \lor P_{2,2} \lor P_{3,1} vero. Con P1,1P_{1,1} falso resta P2,2∨P3,1P_{2,2} \lor P_{3,1}: le coppie (P2,2,P3,1)(P_{2,2}, P_{3,1}) possibili sono (0,1),(1,0),(1,1)(0,1), (1,0), (1,1).
B1,1B_{1,1} B2,1B_{2,1} P1,1P_{1,1} P1,2P_{1,2} P2,1P_{2,1} P2,2P_{2,2} P3,1P_{3,1}
F V F F F F V
F V F F F V F
F V F F F V V

In tutti e 33 i modelli P1,2P_{1,2} è falso: KB⊨¬P1,2KB \models \neg P_{1,2} sì (e anche ¬P2,1\neg P_{2,1}, ¬P1,1\neg P_{1,1}). Invece ¬P2,2\neg P_{2,2} non è conseguenza (è falso nel secondo e nel terzo modello), e neppure P3,1P_{3,1} (falso nel secondo): l'agente non può concludere nulla di sicuro su quelle caselle, ed è giusto non entrarci.

python
from itertools import product
syms = ["B11", "B21", "P11", "P12", "P21", "P22", "P31"]

def kb(m):
    return (not m["P11"]                                   # R1
            and m["B11"] == (m["P12"] or m["P21"])         # R2
            and m["B21"] == (m["P11"] or m["P22"] or m["P31"])  # R3
            and not m["B11"] and m["B21"])                 # R4, R5

modelli = [dict(zip(syms, v)) for v in product([False, True], repeat=7)]
buoni = [m for m in modelli if kb(m)]
print(len(modelli), len(buoni))                  # 128 3
print(all(not m["P12"] for m in buoni))          # True

Il model checking è corretto e completo ma costa O(2n)O(2^n) con nn simboli: inutilizzabile appena la KB cresce.

Inferenza per risoluzione

Idea: dimostrazione per assurdo. Per mostrare KB⊨αKB \models \alpha si mostra che KB∧¬αKB \land \neg\alpha è insoddisfacibile (nessun mondo la rende vera): allora α\alpha è vera.

Forma normale congiuntiva (CNF)

Un letterale è un simbolo o la sua negazione; una clausola è una disgiunzione di letterali; la CNF (conjunctive normal form) è una congiunzione di clausole, per esempio (A∨¬B)∧(B∨¬C∨¬D)(A \lor \neg B) \land (B \lor \neg C \lor \neg D). Ogni enunciato proposizionale si converte in CNF con quattro passi.

Esempio sulla regola R2R_2: B1,1⇔(P1,2∨P2,1)B_{1,1} \Leftrightarrow (P_{1,2} \lor P_{2,1}).

  1. Eliminare ⇔\Leftrightarrow, sostituendo α⇔β\alpha \Leftrightarrow \beta con (α⇒β)∧(β⇒α)(\alpha \Rightarrow \beta) \land (\beta \Rightarrow \alpha): (B1,1⇒(P1,2∨P2,1))∧((P1,2∨P2,1)⇒B1,1).(B_{1,1} \Rightarrow (P_{1,2} \lor P_{2,1})) \land ((P_{1,2} \lor P_{2,1}) \Rightarrow B_{1,1}).
  2. Eliminare ⇒\Rightarrow, sostituendo α⇒β\alpha \Rightarrow \beta con ¬α∨β\neg\alpha \lor \beta: (¬B1,1∨P1,2∨P2,1)∧(¬(P1,2∨P2,1)∨B1,1).(\neg B_{1,1} \lor P_{1,2} \lor P_{2,1}) \land (\neg(P_{1,2} \lor P_{2,1}) \lor B_{1,1}).
  3. Portare ¬\neg all'interno con De Morgan e doppia negazione: ¬(P1,2∨P2,1)=¬P1,2∧¬P2,1\neg(P_{1,2} \lor P_{2,1}) = \neg P_{1,2} \land \neg P_{2,1}: (¬B1,1∨P1,2∨P2,1)∧((¬P1,2∧¬P2,1)∨B1,1).(\neg B_{1,1} \lor P_{1,2} \lor P_{2,1}) \land ((\neg P_{1,2} \land \neg P_{2,1}) \lor B_{1,1}).
  4. Distribuire ∨\lor su ∧\land e appiattire: (¬P1,2∧¬P2,1)∨B1,1=(¬P1,2∨B1,1)∧(¬P2,1∨B1,1)(\neg P_{1,2} \land \neg P_{2,1}) \lor B_{1,1} = (\neg P_{1,2} \lor B_{1,1}) \land (\neg P_{2,1} \lor B_{1,1}), quindi (¬B1,1∨P1,2∨P2,1)∧(¬P1,2∨B1,1)∧(¬P2,1∨B1,1).(\neg B_{1,1} \lor P_{1,2} \lor P_{2,1}) \land (\neg P_{1,2} \lor B_{1,1}) \land (\neg P_{2,1} \lor B_{1,1}).

Tre clausole. Con R3R_3, che ha tre simboli a destra, ne escono quattro: (B2,1∨¬P1,1)∧(B2,1∨¬P2,2)∧(B2,1∨¬P3,1)∧(¬B2,1∨P1,1∨P2,2∨P3,1)(B_{2,1} \lor \neg P_{1,1}) \land (B_{2,1} \lor \neg P_{2,2}) \land (B_{2,1} \lor \neg P_{3,1}) \land (\neg B_{2,1} \lor P_{1,1} \lor P_{2,2} \lor P_{3,1}) (controllato con sympy).

Regola di risoluzione

Regola di risoluzione. Date due clausole con letterali complementari lil_i e mj=¬lim_j = \neg l_i: l1∨⋯∨li∨⋯∨lkm1∨⋯∨mj∨⋯∨mnl1∨⋯∨li−1∨li+1∨⋯∨lk∨m1∨⋯∨mj−1∨mj+1∨⋯∨mn\frac{l_1 \lor \dots \lor l_i \lor \dots \lor l_k \qquad m_1 \lor \dots \lor m_j \lor \dots \lor m_n}{l_1 \lor \dots \lor l_{i-1} \lor l_{i+1} \lor \dots \lor l_k \lor m_1 \lor \dots \lor m_{j-1} \lor m_{j+1} \lor \dots \lor m_n} la risolvente contiene tutti i letterali tranne la coppia complementare.

Esempio: da P1,3∨P2,2P_{1,3} \lor P_{2,2} e ¬P2,2\neg P_{2,2} si ottiene P1,3P_{1,3}. La regola è corretta: in ogni modello che rende vere le due clausole, lil_i e ¬li\neg l_i non possono esserlo entrambi, quindi una delle due clausole deve essere vera grazie a un altro letterale, che compare nella risolvente.

Casi particolari: risolvendo PP e ¬P\neg P si ottiene la clausola vuota □\square, che è sempre falsa e quindi segnala una contraddizione. Una risolvente con una coppia complementare (A∨¬A∨…A \lor \neg A \lor \dots) è una tautologia e si scarta.

Algoritmo

python
def risoluzione(kb_clausole, alfa_negata):
    clausole = set(kb_clausole) | {alfa_negata}   # clausole = frozenset di letterali
    while True:
        nuove = set()
        for ci, cj in coppie(clausole):
            for r in risolventi(ci, cj):          # una per ogni coppia complementare
                if not r:                         # clausola vuota
                    return True                   # KB |= alfa
                nuove.add(r)
        if nuove <= clausole:                     # niente di nuovo
            return False                          # KB non implica alfa
        clausole |= nuove

Termina perché i simboli sono finiti, quindi le clausole distinte sono finite. È corretta e completa per refutazione: se KB∧¬αKB \land \neg\alpha è insoddisfacibile, la clausola vuota viene prima o poi derivata.

Esempio: nessun pozzo in [1,2][1,2]

L'agente è in [1,1][1,1] e non sente brezza. Si può inferire che non c'è un pozzo in [1,2][1,2]?

KB=(B1,1⇔(P1,2∨P2,1))∧¬B1,1,α=¬P1,2.KB = (B_{1,1} \Leftrightarrow (P_{1,2} \lor P_{2,1})) \land \neg B_{1,1}, \qquad \alpha = \neg P_{1,2}.

Si deve mostrare che KB∧¬αKB \land \neg\alpha è insoddisfacibile. Clausole in CNF:

clausola origine
C1C_1 ¬P2,1∨B1,1\neg P_{2,1} \lor B_{1,1} R2R_2
C2C_2 ¬B1,1∨P1,2∨P2,1\neg B_{1,1} \lor P_{1,2} \lor P_{2,1} R2R_2
C3C_3 ¬P1,2∨B1,1\neg P_{1,2} \lor B_{1,1} R2R_2
C4C_4 ¬B1,1\neg B_{1,1} percezione
C5C_5 P1,2P_{1,2} ¬α=¬¬P1,2\neg\alpha = \neg\neg P_{1,2}
  1. C3C_3 e C4C_4 (complementari B1,1B_{1,1} e ¬B1,1\neg B_{1,1}) danno C6=¬P1,2C_6 = \neg P_{1,2}.
  2. C6C_6 e C5C_5 (complementari ¬P1,2\neg P_{1,2} e P1,2P_{1,2}) danno □\square.

Quindi KB∧¬αKB \land \neg\alpha è insoddisfacibile e KB⊨¬P1,2KB \models \neg P_{1,2}, come col model checking. (Le altre coppie danno clausole sempre vere, per esempio C2C_2 con C1C_1 su P2,1P_{2,1} dà ¬B1,1∨P1,2∨B1,1\neg B_{1,1} \lor P_{1,2} \lor B_{1,1}, che si scarta.) Il vantaggio rispetto al model checking: si lavora solo sulle clausole rilevanti, senza enumerare 2n2^n modelli.

Pregi e limiti

Per ragionare con incertezza (se non si sa se il pozzo c'è, ma con quale probabilità) si passa a Incertezza - probabilità, regola di Bayes e indipendenza condizionataUn agente con osservazioni parziali non può usare regole logiche rigide ("mal di denti implica carie" è falso): usa la probabilità come grado di credenza e, con la teoria dell'utilità, sceglie l'azione con utilità attesa massima. Strumenti: distribuzione congiunta completa (tabella di $2^n$ valori), marginalizzazione $P(Y\mid e)=\alpha\sum_h P(Y,e,h)$ con costante di normalizzazione $\alpha=1/P(e)$, regola del prodotto $P(a,b)=P(a\mid b)P(b)$, regola di Bayes $P(\text{causa}\mid\text{effetto})=\frac{P(\text{effetto}\mid\text{causa})P(\text{causa})}{P(\text{effetto})}$ e indipendenza condizionata $P(a,b\mid c)=P(a\mid c)P(b\mid c)$, che permette di scomporre la congiunta in tabelle più piccole. Un test con sensibilità 73% e falsi positivi 12% su una malattia con prior 1/700 dà una probabilità a posteriori di appena 0,9%.Incertezza - probabilità, regola di Bayes e indipendenza condizionata →. I connettivi e le tavole di verità sono gli stessi dell'algebra booleana (Algebra di Boole - assiomi, teoremi e complemento di una funzioneL'algebra di Boole opera su variabili a due valori con AND, OR, NOT. Identità fondamentali (neutro, idempotenza, complemento, commutativa, associativa, distributiva in entrambe le forme), dualità (si scambiano AND/OR e 0/1), De Morgan $\overline{X+Y}=\overline X,\overline Y$, assorbimento $X+XY=X$, $X+\overline XY=X+Y$, adiacenza $XY+X\overline Y=X$, consenso $XY+\overline XZ+YZ=XY+\overline XZ$. Si dimostrano per induzione perfetta (tabella) o algebricamente. Il complemento di una funzione si ottiene con De Morgan o con duale + negazione dei letterali. Costo: numero di letterali o di ingressi delle porte.Algebra di Boole - assiomi, teoremi e complemento di una funzione →) e dei quantificatori in Logica e quantificatoriProposizioni, connettivi, predicati e quantificatori (per ogni, esiste), con le regole per negarli.Logica e quantificatori →.

Domande d'esame

  1. La KB è {A⇒B, B⇒C, A}\{A \Rightarrow B,\ B \Rightarrow C,\ A\}. Vale KB⊨CKB \models C? Sì: la KB è vera solo con AA vero, quindi BB vero, quindi CC vero, e in quell'unico modello CC è vera. Con la risoluzione: CNF ¬A∨B\neg A \lor B, ¬B∨C\neg B \lor C, AA, più ¬C\neg C; AA con ¬A∨B\neg A \lor B dà BB, con ¬B∨C\neg B \lor C dà CC, con ¬C\neg C dà □\square.
  2. Quanti modelli su P,Q,RP, Q, R ha (P∨Q)∧(¬P∨R)(P \lor Q) \land (\neg P \lor R)? 44: con PP vero serve RR vero (QQ libero, 22 modelli); con PP falso serve QQ vero (RR libero, 22 modelli). Totale 2+2=42+2 = 4 su 88.
  3. Risolvere P∨QP \lor Q e ¬P∨R\neg P \lor R. La risolvente è Q∨RQ \lor R (si elimina la coppia complementare PP e ¬P\neg P e si uniscono i letterali restanti). Non è la clausola vuota, quindi qui non c'è contraddizione.
  4. (P⇒Q)⇒(Q⇒P)(P \Rightarrow Q) \Rightarrow (Q \Rightarrow P) è valida? No: con PP falso e QQ vero l'antecedente P⇒QP \Rightarrow Q è vero e il conseguente Q⇒PQ \Rightarrow P è falso, quindi l'intera formula è falsa. (Scambiare un'implicazione con il suo inverso è l'errore di "affermare il conseguente".)

Versione ripasso

Esercizi su questo argomento

Teoria collegata