\documentclass[a4paper]{article}
\usepackage{amsmath, amssymb, amsfonts}
\usepackage[italian]{babel}
\usepackage[utf8]{inputenc}
\usepackage{graphicx}
\usepackage{hyperref}
\usepackage[a4paper, total={6in, 8in}]{geometry}
\usepackage{minted}
\usepackage{mathpazo}
\usepackage{fancyhdr}
\usepackage{amsthm}
\usepackage{tikz}
\usetikzlibrary{automata,positioning,calc,graphs,graphdrawing}
\usetikzlibrary{quotes,arrows.meta}
\usepackage{subcaption}
\usepackage{float} % Per H option con figure

% Definizione degli ambienti
\newtheorem{theorem}{Teorema}
\newtheorem{definition}{Definizione}
\newtheorem{example}{Esempio}
\newtheorem{lemma}{Lemma}
\newtheorem{proposition}{Proposizione}

\hypersetup{
    pdftitle={Lezione di Informatica Teorica},
    pdfauthor={Appunti da Trascrizione AI}
}

\pagestyle{fancy}
\fancyhf{}
\fancyhead[L]{\textit{Lezione di Informatica Teorica}}
\fancyfoot[C]{\thepage}

\title{Lezione di Informatica Teorica: Nuove Definizioni di NP e NP-Completezza della Colorabilità dei Grafi}
\author{Appunti da Trascrizione Automatica}
\date{\today}

\begin{document}
\maketitle
\tableofcontents
\newpage

\section{Introduzione e Ripasso}
Nella lezione precedente sono stati introdotti i concetti di classi di complessità P e NP, e le riduzioni polinomiali.
Il professor Malizia ha ripassato la struttura delle dimostrazioni di riduzione:
\begin{itemize}
    \item Si vuole dimostrare una riduzione da un problema A a un problema B ($A \le_p B$).
    \item Si deve costruire una funzione $f$ (algoritmo) che trasforma un'istanza $w$ di A in un'istanza $f(w)$ di B.
    \item Questa funzione $f$ deve essere calcolabile in tempo polinomiale.
    \item Si deve dimostrare l'equivalenza: $w \in A \iff f(w) \in B$. Questo richiede una dimostrazione in due direzioni (doppia implicazione logica).
    \item È fondamentale definire con precisione cosa sia un'istanza "sì" e un'istanza "no" per entrambi i problemi A e B. L'interpretazione vaga di questi termini può portare a confusioni.
\end{itemize}

\section{Una Nuova Caratterizzazione della Classe NP}

\subsection{Critica alla Definizione Classica di NP}
La definizione classica della classe NP è:
\[ NP = \bigcup_{c \ge 1} NTIME(n^c) \]
dove $NTIME(n^c)$ è l'insieme dei linguaggi decidibili da Macchine di Turing non deterministiche in tempo $O(n^c)$.

La critica a questa definizione risiede nel fatto che essa si basa su un modello di calcolo, la Macchina di Turing non deterministica, che non è realizzabile. Inoltre, il non determinismo, in base a questa definizione, può essere utilizzato in qualsiasi punto della computazione, non necessariamente all'inizio. Tuttavia, negli esempi pratici di problemi in NP (es. SAT, Independent Set, ecc.), si osserva un pattern comune: si "indovina" una soluzione (un "certificato") e poi la si "verifica" deterministicamente in tempo polinomiale.

\subsection{Il Concetto di Certificato}
L'intuizione alla base della nuova caratterizzazione di NP è che i problemi in NP sono quelli per i quali una soluzione (se esiste) può essere verificata efficientemente. La "soluzione indovinata" viene chiamata \textbf{certificato} o \textbf{testimone}.
Un certificato deve possedere due proprietà fondamentali:
\begin{itemize}
    \item \textbf{Conciso}: la sua lunghezza non deve essere troppo grande rispetto all'input, tipicamente polinomiale nella lunghezza dell'input.
    \item \textbf{Polinomialmente Verificabile}: la sua correttezza può essere controllata da un algoritmo deterministico in tempo polinomiale.
\end{itemize}

\subsection{Definizione di NP tramite Relazioni Binarie}

Sia $\Sigma^*$ l'insieme di tutte le stringhe sull'alfabeto $\Sigma$. Una \textbf{relazione binaria} $R$ su $\Sigma^*$ è semplicemente un sottoinsieme del prodotto cartesiano $\Sigma^* \times \Sigma^*$. Ovvero, $R$ è un insieme di coppie $(x, y)$ di stringhe.

\begin{definition}[Relazione Polinomialmente Bilanciata]
Una relazione binaria $R \subseteq \Sigma^* \times \Sigma^*$ si dice \textbf{polinomialmente bilanciata} se esiste una costante $c > 0$ tale che per ogni $(x, y) \in R$, la lunghezza di $y$ è limitata da un polinomio della lunghezza di $x$:
\[ |y| \le |x|^c \]
Questa proprietà assicura che il "certificato" $y$ (la seconda componente della coppia) non sia eccessivamente lungo rispetto all'istanza $x$ (la prima componente).
\end{definition}

\begin{definition}[Relazione Polinomialmente Decidibile]
Una relazione binaria $R \subseteq \Sigma^* \times \Sigma^*$ si dice \textbf{polinomialmente decidibile} se esiste una Macchina di Turing deterministica che, su input $(x, y)$ (codificato opportunamente come una singola stringa), decide in tempo polinomiale se $(x, y) \in R$ oppure no.
Questa proprietà assicura che la "verifica" del certificato sia efficiente.
\end{definition}

\begin{theorem}[Caratterizzazione di NP]
Un linguaggio $L$ appartiene alla classe NP se e solo se esiste una relazione binaria $R_L \subseteq \Sigma^* \times \Sigma^*$ che è sia \textbf{polinomialmente bilanciata} che \textbf{polinomialmente decidibile}, tale che:
\[ L = \{x \in \Sigma^* \mid \exists y \in \Sigma^* \text{ tale che } (x, y) \in R_L \} \]
In altre parole, un linguaggio $L$ è in NP se le sue istanze "sì" sono esattamente quelle $x$ per cui esiste un "certificato" $y$ (cioè la seconda componente della coppia $(x, y)$ nella relazione $R_L$) che è conciso e verificabile deterministicamente in tempo polinomiale.
\end{theorem}

\begin{proof}
\textbf{Parte 1: ($\impliedby$) Se esiste $R_L$ che è polinomialmente bilanciata e decidibile, allora $L \in NP$.}

Sia $L = \{x \mid \exists y \text{ t.c. } (x, y) \in R_L\}$, dove $R_L$ è polinomialmente bilanciata e polinomialmente decidibile.
Dobbiamo mostrare che $L$ può essere deciso da una Macchina di Turing non deterministica (NTM) $M'$ in tempo polinomiale.

L'NTM $M'$ per decidere $L$ funziona come segue:
\begin{enumerate}
    \item Su input $x$:
    \item $M'$ indovina non deterministicamente una stringa $y$. Poiché $R_L$ è polinomialmente bilanciata, sappiamo che la lunghezza di $y$ non eccede $|x|^c$ per una qualche costante $c$. Quindi, $M'$ può "scrivere" (ovvero indovinare i bit e scriverli sul nastro) $y$ in tempo polinomiale rispetto a $|x|$.
    \item $M'$ quindi controlla se la coppia $(x, y)$ appartiene a $R_L$. Poiché $R_L$ è polinomialmente decidibile, esiste una Macchina di Turing deterministica che esegue questo controllo in tempo polinomiale. $M'$ simula questa MT deterministica.
    \item Se il controllo restituisce "sì" (cioè $(x, y) \in R_L$), $M'$ accetta l'input $x$. Altrimenti, $M'$ rifiuta.
\end{enumerate}
Poiché sia la fase di indovinamento (scrittura di $y$) che la fase di verifica (decisione di $R_L$) avvengono in tempo polinomiale, l'intera computazione di $M'$ è in tempo polinomiale. Dunque, $L \in NP$.

\textbf{Parte 2: ($\implies$) Se $L \in NP$, allora esiste $R_L$ che è polinomialmente bilanciata e decidibile.}

Sia $L \in NP$. Per definizione, esiste una Macchina di Turing non deterministica $M$ che decide $L$ in tempo polinomiale. Sia $p(n)$ un polinomio tale che $M$ decide $L$ in tempo $p(n)$ (dove $n$ è la lunghezza dell'input).

Definiamo la relazione $R_L$ come segue:
\[ R_L = \{(x, y) \mid y \text{ è una sequenza accettante di configurazioni di } M \text{ su input } x \} \]
In altre parole, $(x, y) \in R_L$ se $x$ è l'input, e $y$ è una stringa che codifica una sequenza valida di descrizioni istantanee (ID) di $M$ che porta $M$ ad accettare $x$. Una sequenza accettante di configurazioni è del tipo $ID_0 \to ID_1 \to \dots \to ID_k$, dove $ID_0$ è la configurazione iniziale su $x$, $ID_k$ è una configurazione accettante, e ogni $ID_{i+1}$ è raggiungibile da $ID_i$ con una mossa legale di $M$.

Dobbiamo dimostrare che $R_L$ è polinomialmente bilanciata e polinomialmente decidibile.

\begin{itemize}
    \item \textbf{$R_L$ è polinomialmente bilanciata}:
    Poiché $M$ lavora in tempo $p(n)$, il numero di passi in una computazione accettante è al massimo $p(n)$. Questo significa che la sequenza $y$ contiene al massimo $p(n)$ descrizioni istantanee ($ID_0, \dots, ID_{p(n)-1}$).
    Ogni descrizione istantanea (ID) ha una lunghezza che dipende dalla lunghezza del nastro della macchina. Poiché $M$ esegue al più $p(n)$ passi, la sua testina può visitare al più $p(n)$ celle del nastro. Quindi, la lunghezza di ciascun $ID_i$ è $O(p(n))$.
    La lunghezza totale di $y$ (la sequenza di ID concatenati, opportunamente delimitati) sarà al più $p(n) \times O(p(n)) = O(p(n)^2)$. Poiché $p(n)$ è un polinomio, $p(n)^2$ è anch'esso un polinomio. Quindi, la lunghezza di $y$ è polinomiale nella lunghezza di $x$. Dunque, $R_L$ è polinomialmente bilanciata.

    \item \textbf{$R_L$ è polinomialmente decidibile}:
    Per decidere se $(x, y) \in R_L$ con una Macchina di Turing deterministica, dobbiamo verificare la validità della sequenza di configurazioni $y$. Questo può essere fatto come segue:
    \begin{enumerate}
        \item Verificare che $ID_0$ sia la configurazione iniziale corretta di $M$ su input $x$. (Tempo polinomiale).
        \item Verificare che $ID_k$ (l'ultima configurazione in $y$) sia uno stato accettante di $M$. (Tempo polinomiale).
        \item Per ogni $i$ da $0$ a $k-1$, verificare che $ID_{i+1}$ sia raggiungibile da $ID_i$ con una mossa legale di $M$. Questo implica controllare che la funzione di transizione di $M$ permetta il passaggio da $ID_i$ a $ID_{i+1}$. Questo controllo è una costante per ogni coppia di ID. Poiché ci sono al più $p(n)$ coppie di ID da controllare, il tempo totale per questa verifica è polinomiale.
    \end{enumerate}
    Tutte queste verifiche possono essere eseguite da una Macchina di Turing deterministica in tempo polinomiale. Dunque, $R_L$ è polinomialmente decidibile.
\end{itemize}
Abbiamo dimostrato entrambi i versi del teorema.
\end{proof}

\subsection{Implicazione della Nuova Caratterizzazione}
Questo teorema fornisce una prospettiva alternativa e molto intuitiva sulla classe NP:
\begin{quote}
    I linguaggi in \textbf{P} sono quelli per cui una soluzione può essere \emph{calcolata} in tempo polinomiale. \\
    I linguaggi in \textbf{NP} sono quelli per cui una soluzione può essere \emph{verificata} in tempo polinomiale (una volta fornito un certificato).
\end{quote}
La domanda P vs NP si riduce quindi a chiedersi se ogni problema la cui soluzione può essere facilmente verificata è anche un problema la cui soluzione può essere facilmente calcolata. La comune convinzione è che P $\ne$ NP.

\section{Problema della Colorabilità dei Grafi}
Il problema della colorabilità dei grafi è un altro esempio classico di problema NP-completo.

\begin{definition}[Colorazione di un Grafo]
Una \textbf{colorazione} di un grafo $G=(V, E)$ è una funzione $c: V \to \{1, \dots, k\}$ (dove $k$ è il numero di colori) tale che per ogni arco $(u, v) \in E$, si ha $c(u) \ne c(v)$.
\end{definition}

\begin{definition}[Problema della Colorabilità (GRAPH COLORING)]
Il problema della \textbf{Colorabilità dei Grafi} prende come input una coppia $(G, k)$, dove $G$ è un grafo e $k$ è un intero.
La domanda è: "È possibile colorare i nodi di $G$ con \emph{al più} $k$ colori tale che nessun nodo adiacente abbia lo stesso colore?"
\end{definition}

\subsection{Membership di GRAPH COLORING in NP}
Per dimostrare che GRAPH COLORING $\in NP$:
\begin{itemize}
    \item \textbf{Certificato}: Un certificato per un'istanza "sì" $(G, k)$ è una colorazione valida $c: V \to \{1, \dots, k\}$.
    \item \textbf{Concisezza del Certificato}: La colorazione è specificata assegnando un colore a ciascun nodo. Ci sono $|V|$ nodi, e ogni colore può essere rappresentato in $O(\log k)$ bit. La lunghezza del certificato è quindi $O(|V| \log k)$, che è polinomiale nella dimensione dell'input (che include $|V|$, $|E|$ e $k$).
    \item \textbf{Verificabilità Polinomiale}: Per verificare la correttezza di una data colorazione $c$:
        \begin{enumerate}
            \item Controllare che tutti i colori usati siano $\le k$.
            \item Per ogni arco $(u, v) \in E$, controllare che $c(u) \ne c(v)$.
        \end{enumerate}
    Entrambi i passi possono essere eseguiti in tempo polinomiale. Il secondo passo richiede di iterare su tutti gli archi, prendendo $O(|E|)$ tempo. Poiché $|E|$ è al più $O(|V|^2)$, la verifica è polinomiale.
\end{itemize}
Pertanto, GRAPH COLORING $\in NP$.

\subsection{NP-Hardness di GRAPH COLORING (Riduzione da 3SAT)}
Dimostriamo che GRAPH COLORING è NP-Hard riducendo 3SAT a GRAPH COLORING ($3SAT \le_p GRAPH\ COLORING$).

\subsubsection{Definizione dei Problemi per la Riduzione}
\begin{itemize}
    \item \textbf{Problema di Partenza (3SAT)}:
        \begin{itemize}
            \item \textbf{Input}: Una formula booleana $\phi$ in 3-CNF (congiunzione di clausole, ogni clausola è una disgiunzione di esattamente 3 letterali).
            \item \textbf{Istanza "Sì"}: Esiste un assegnamento di verità alle variabili di $\phi$ che rende la formula vera (cioè $\phi$ è soddisfacibile).
            \item \textbf{Istanza "No"}: Nessun assegnamento di verità rende $\phi$ vera (cioè $\phi$ è insoddisfacibile).
        \end{itemize}
    \item \textbf{Problema di Arrivo (GRAPH COLORING)}:
        \begin{itemize}
            \item \textbf{Input}: Una coppia $(G, k)$ dove $G$ è un grafo e $k$ è un intero.
            \item \textbf{Istanza "Sì"}: $G$ può essere colorato con al più $k$ colori in modo che nodi adiacenti abbiano colori diversi.
            \item \textbf{Istanza "No"}: $G$ non può essere colorato con al più $k$ colori senza violare la condizione.
        \end{itemize}
\end{itemize}

L'obiettivo è costruire una funzione polinomiale $f$ che prende una formula $\phi$ in 3-CNF e produce una coppia $(G, 3)$ (il valore $k$ sarà fissato a 3) tale che $\phi$ è soddisfacibile se e solo se $G$ è 3-colorabile.

\subsubsection{Costruzione del Grafo $G$}
Sia $\phi = C_1 \land C_2 \land \dots \land C_m$ una formula con $n$ variabili $x_1, \dots, x_n$ e $m$ clausole $C_1, \dots, C_m$.

Il grafo $G$ sarà costruito utilizzando diversi "gadget" (sottografi) che simulano la logica booleana. Il numero di colori $k$ sarà fissato a 3. I colori saranno identificati come "Vero" (verde), "Falso" (rosso) e "Base/Neutro" (blu).

\begin{figure}[H]
    \centering
    \begin{tikzpicture}[node distance=1.5cm, thick]
        % Truth Gadget
        \node[circle, draw, fill=green!50!black] (T) {T};
        \node[circle, draw, fill=red!50!black, below right of=T] (F) {F};
        \node[circle, draw, fill=blue!50!black, below left of=F] (B) {B};

        \draw (T) -- (F);
        \draw (T) -- (B);
        \draw (F) -- (B);

        % Variable Gadgets
        \node[circle, draw, right=2cm of T] (x1) {$x_{1}$};
        \node[circle, draw, below=0.5cm of x1] (nx1) {$\neg x_{1}$};
        \draw (x1) -- (nx1);
        \draw (x1) -- (B);
        \draw (nx1) -- (B);
        
        \node[circle, draw, right=1.5cm of x1] (x2) {$x_{2}$};
        \node[circle, draw, below=0.5cm of x2] (nx2) {$\neg x_{2}$};
        \draw (x2) -- (nx2);
        \draw (x2) -- (B);
        \draw (nx2) -- (B);
        
        \node[circle, draw, right=1.5cm of x2] (x3) {$x_{3}$};
        \node[circle, draw, below=0.5cm of x3] (nx3) {$\neg x_{3}$};
        \draw (x3) -- (nx3);
        \draw (x3) -- (B);
        \draw (nx3) -- (B);
        
        \node[circle, draw, right=1.5cm of x3] (x4) {$x_{4}$};
        \node[circle, draw, below=0.5cm of x4] (nx4) {$\neg x_{4}$};
        \draw (x4) -- (nx4);
        \draw (x4) -- (B);
        \draw (nx4) -- (B);

        % Clause Gadgets (simplified representation for the diagram)
        % The professor's description of the OR gadget is:
        % A structure such that if two inputs are False, the output is False.
        % If at least one input is True, the output can be True.
        % The description uses 3 nodes in a triangle, with intermediate nodes connected to B.

        % Let's draw a generic OR gadget for a clause (L1 v L2 v L3)
        % L1, L2, L3 are the literal nodes (x_i or nx_i)
        % There's a structure that makes output node "True" if any literal is True,
        % and "False" if all literals are False.
        % The output node is then forced to be True by connecting it to B and F.

        % Assuming a specific structure for the OR gadget
        % This is a common way to draw it, but the professor described it verbally by showing
        % how coloring propagates.
        % Let's draw the abstract clause gadgets and their connection.

        \node[draw, rounded corners, right=2cm of x4] (C1_box) {Clause 1: $X_1 \lor X_2 \lor \neg X_3$};
        \node[draw, rounded corners, below=0.5cm of C1_box] (C2_box) {Clause 2: $\neg X_2 \lor X_3 \lor \neg X_4$};

        % Connections from literals to Clause Gadgets inputs (simplified for clarity)
        \draw[dotted] (x1) -- (C1_box);
        \draw[dotted] (x2) -- (C1_box);
        \draw[dotted] (nx3) -- (C1_box);
        \draw[dotted] (nx2) -- (C2_box);
        \draw[dotted] (x3) -- (C2_box);
        \draw[dotted] (nx4) -- (C2_box);

        % Output nodes of Clause Gadgets (implicitly within C1_box, C2_box)
        % These output nodes are forced to be True (green) by connecting them to B and F.
        % This is drawn from the box itself for simplicity, as the internal structure of the gadget is complex.
        \node[circle, draw, fill=yellow!50] (C1_out) [right=1cm of C1_box] {Output $C_1$};
        \node[circle, draw, fill=yellow!50] (C2_out) [right=1cm of C2_box] {Output $C_2$};

        \draw (C1_out) -- (B);
        \draw (C1_out) -- (F);
        \draw (C2_out) -- (B);
        \draw (C2_out) -- (F);

    \end{tikzpicture}
    \caption{Struttura Generale del Grafo $G$ per la Riduzione 3SAT $\to$ GRAPH COLORING}
    \label{fig:reduction_graph_structure}
\end{figure}

Il grafo $G$ è composto da:
\begin{enumerate}
    \item \textbf{Truth Gadget}: Una cricca di 3 nodi: $T$ (True), $F$ (False), $B$ (Base/Neutral). Questi 3 nodi devono necessariamente avere colori distinti. Assegneremo a $T$ il colore "Vero" (es. verde), a $F$ il colore "Falso" (es. rosso), e a $B$ il colore "Base" (es. blu). Questi colori serviranno da riferimento.

    \item \textbf{Variable Gadgets}: Per ogni variabile booleana $x_i$ nella formula $\phi$, creiamo due nodi: $x_i$ e $\neg x_i$.
    \begin{itemize}
        \item Colleghiamo $x_i$ e $\neg x_i$ con un arco. Questo assicura che debbano avere colori diversi.
        \item Colleghiamo sia $x_i$ che $\neg x_i$ al nodo $B$ del Truth Gadget. Questo implica che $x_i$ e $\neg x_i$ non possono avere il colore "Base". Quindi, possono solo assumere il colore "Vero" o "Falso".
    \end{itemize}
    In questo modo, se $x_i$ riceve il colore di $T$ (Vero), $\neg x_i$ deve ricevere il colore di $F$ (Falso), e viceversa. Questo simula un assegnamento di verità coerente.

    \item \textbf{Clause Gadgets}: Per ogni clausola $C_j = (L_{j1} \lor L_{j2} \lor L_{j3})$ (dove $L_{jk}$ è un letterale, $x_i$ o $\neg x_i$), si costruisce un sottografo che simula la funzione logica OR.
    \begin{itemize}
        \item Questo gadget riceve come "input" i nodi corrispondenti ai letterali $L_{j1}, L_{j2}, L_{j3}$.
        \item Il gadget è progettato in modo che se tutti e tre i nodi input ($L_{j1}, L_{j2}, L_{j3}$) sono colorati con il colore "Falso" (rosso), allora un nodo "output" all'interno del gadget deve essere colorato con il colore "Falso" (rosso).
        \item Se almeno uno dei nodi input è colorato con il colore "Vero" (verde), allora il nodo "output" può essere colorato con il colore "Vero" (verde).
        \item Il nodo "output" di ogni Clause Gadget è poi collegato ai nodi $B$ (Base) e $F$ (False) del Truth Gadget. Questo costringe il nodo "output" ad essere colorato con il colore "Vero" (verde), poiché non può essere "Base" (blu) né "Falso" (rosso) a causa dei suoi collegamenti.
    \end{itemize}
    L'intera costruzione del grafo $G$ è polinomiale nella dimensione della formula $\phi$. Il numero di nodi e archi è proporzionale al numero di variabili e clausole.
\end{enumerate}

\subsubsection{Dimostrazione dell'Equivalenza}

Dobbiamo mostrare che $\phi$ è soddisfacibile $\iff$ $G$ è 3-colorabile.

\textbf{Parte 1: ($\implies$) Se $\phi$ è soddisfacibile, allora $G$ è 3-colorabile.}

Supponiamo che $\phi$ sia soddisfacibile. Sia $\sigma$ un assegnamento di verità che soddisfa $\phi$. Costruiamo una 3-colorazione $C$ di $G$ come segue:
\begin{enumerate}
    \item Coloriamo il Truth Gadget: $C(T) = \text{verde}$, $C(F) = \text{rosso}$, $C(B) = \text{blu}$. Questo è valido in quanto sono una cricca di 3 nodi e usiamo 3 colori distinti.
    \item Coloriamo i Variable Gadgets: Per ogni variabile $x_i$:
    \begin{itemize}
        \item Se $\sigma(x_i) = \text{TRUE}$, allora $C(x_i) = \text{verde}$ e $C(\neg x_i) = \text{rosso}$.
        \item Se $\sigma(x_i) = \text{FALSE}$, allora $C(x_i) = \text{rosso}$ e $C(\neg x_i) = \text{verde}$.
    \end{itemize}
    Questa colorazione è valida perché $x_i$ e $\neg x_i$ sono collegati solo tra loro e a $B$. I colori "verde" e "rosso" sono distinti tra loro e distinti dal colore di $B$ ("blu").
    \item Coloriamo i Clause Gadgets: Per ogni clausola $C_j$:
    Poiché $\sigma$ soddisfa $\phi$, ogni clausola $C_j$ è vera sotto $\sigma$. Ciò significa che almeno uno dei suoi letterali $L_{j1}, L_{j2}, L_{j3}$ è vero.
    Per come abbiamo colorato i Variable Gadgets, questo implica che almeno uno dei nodi corrispondenti a $L_{j1}, L_{j2}, L_{j3}$ è colorato "verde".
    La proprietà del Clause Gadget (OR) assicura che se almeno uno dei suoi input è "verde", il suo nodo "output" può essere colorato "verde".
    Siccome il nodo "output" di ogni clausola è collegato ai nodi $B$ e $F$, ed è colorato "verde" (che è diverso da "blu" e "rosso"), la colorazione è valida.
\end{enumerate}
Tutti i nodi sono colorati con 3 colori, e nessuna adiacenza ha lo stesso colore. Quindi, $G$ è 3-colorabile.

\textbf{Parte 2: ($\impliedby$) Se $G$ è 3-colorabile, allora $\phi$ è soddisfacibile.}

Supponiamo che $G$ sia 3-colorabile. Sia $C$ una 3-colorazione valida di $G$.
Definiamo un assegnamento di verità $\sigma$ per le variabili di $\phi$ basandoci sui colori in $C$:
\begin{enumerate}
    \item Per ogni variabile $x_i$:
    \begin{itemize}
        \item Se $C(x_i)$ è lo stesso colore di $C(T)$ (cioè "verde"), poniamo $\sigma(x_i) = \text{TRUE}$.
        \item Se $C(x_i)$ è lo stesso colore di $C(F)$ (cioè "rosso"), poniamo $\sigma(x_i) = \text{FALSE}$.
    \end{itemize}
    (Nota: Per costruzione, $x_i$ e $\neg x_i$ sono collegati a $B$, quindi non possono avere il colore "blu". Essendo collegati tra loro, devono avere colori diversi, quindi se $x_i$ è "verde", $\neg x_i$ deve essere "rosso" e viceversa, garantendo coerenza nell'assegnamento).
\end{enumerate}
Dobbiamo dimostrare che questo assegnamento $\sigma$ soddisfa la formula $\phi$.
Supponiamo per contraddizione che $\sigma$ non soddisfi $\phi$. Questo significa che esiste almeno una clausola $C_j$ che è falsa sotto $\sigma$.
Se $C_j = (L_{j1} \lor L_{j2} \lor L_{j3})$ è falsa sotto $\sigma$, allora tutti i suoi letterali $L_{j1}, L_{j2}, L_{j3}$ sono falsi sotto $\sigma$.
Per come abbiamo definito $\sigma$, questo implica che i nodi corrispondenti a $L_{j1}, L_{j2}, L_{j3}$ nel grafo $G$ sono tutti colorati con il colore di $F$ (cioè "rosso").
Ma per la proprietà del Clause Gadget (OR): se tutti i suoi nodi input sono "rossi", allora il suo nodo "output" deve essere anch'esso "rosso".
Tuttavia, il nodo "output" di $C_j$ è collegato nel grafo ai nodi $B$ e $F$. Poiché $C(F)$ è "rosso", se il nodo "output" è anch'esso "rosso", si avrebbe una violazione della colorazione (due nodi adiacenti con lo stesso colore). Questa è una contraddizione, poiché abbiamo assunto che $C$ fosse una colorazione valida.
Pertanto, la nostra supposizione iniziale (che $\sigma$ non soddisfi $\phi$) deve essere falsa. Dunque, $\sigma$ soddisfa $\phi$.

Poiché la trasformazione è polinomiale e l'equivalenza è dimostrata, $3SAT \le_p GRAPH\ COLORING$.
Dato che 3SAT è NP-completo, e GRAPH COLORING è in NP e NP-hard, concludiamo che GRAPH COLORING è \textbf{NP-completo}.

\end{document}