CNF Satisfiability Problem is NP-Complete

Theorem
The Conjunctive Normal Form Boolean Satisfiability Problem (Abbreviated as CNF SAT) is NP-complete.

CNF SAT is NP
Given a CNF SAT problem a potential solution can be verified in polynomial  time by checking every clause in $L$ to see if they all have at least  one true un-negated variable or one false negated variable.

Because a solution can be verified or rejected in polynomial time the problem is NP

CNF SAT is NP-hard
We will show this by reducing the Boolean Satisfiability(SAT) problem to CNF SAT.

The algorithm to convert the SAT problem to CNF SAT is recursive. Wherever $A$, $B$,and $C$ are seen in the output it is understood that the  algorithm would call itself on those formulas and convert them into CNF.

Given a logical expression it will either be a variable, a unary function, or a binary function.

Single Variable
If $A$ it is a single variable then it is in CNF form and we are done

Unary functions
With the two constant functions can simply replace the replace $f_F \left( A  \right)$ and $f_T \left( A \right)$ with $F$ and $T$ respectively. These can be removed from the final expression rather easily.

The identity function is also fairly trivial. Simply replace $f_I \left( A \right)$ with the CNF conversion of $A$.

With the $\neg$ function the replacement will depend on the argument. If the argument is a single variable ($x$) then the output $\neg x$ is in  CNF. If the argument is one of the constant functions then replace $\neg f_F \left( A \right)$ and $\neg f_T \left( A \right)$ with $T$  and $F$ respectively. If the argument is a binary function of the form $f \left({A, B}\right)$ then replace the function with the appropriate  one, following the list below.


 * $\neg f_F \left({A, B}\right) \to f_T \left({A, B}\right)$
 * $\neg f_T \left({A, B}\right) \to f_F \left({A, B}\right)$


 * $\neg A \land B \to A \uparrow B$
 * $\neg A \uparrow B \to A \land B$


 * $\neg (A \implies B) \to \neg (A \implies B)$
 * $\neg \neg (A \implies B) \to (A \implies B)$


 * $\neg \operatorname{pr}_1 \left({A, B}\right) \to \overline {\operatorname{pr}_1} \left({A, B}\right)$
 * $\neg \overline {\operatorname{pr}_1} \left({A, B}\right) \to \operatorname{pr}_1 \left({A, B}\right)$


 * $\neg (B \implies A) \to \neg (B \implies A)$
 * $\neg \neg (B \implies A) \to (B \implies A)$


 * $\neg \operatorname{pr}_2 \to \overline {\operatorname{pr}_2}$
 * $\neg \overline {\operatorname{pr}_2} \to \operatorname{pr}_2$


 * $\neg (A \iff B) \to \neg (A \iff B)$
 * $\neg \neg (A \iff B) \to (A \iff B)$


 * $\neg A \lor B \to A \downarrow B$
 * $\neg A \downarrow B \to A \lor B$

Binary Functions
Replace $\neg f_T \left({A, B}\right)$ with $T$.

$A \lor B$ is already in CNF.

Replace $A \implies B$ with $\neg A \lor B$.

Replace $\operatorname{pr}_1 \left({A, B}\right)$ with $A$.

Replace $B \implies A$ with $A \lor \neg B$.

Replace $\operatorname{pr}_2 \left({A, B}\right)$ with $B$.

In the case of $A \land B$ the clause either takes the form $A \land B$ or  $(A \land B) \lor C$. In the first case simply replace the clause with the two clauses $A$ and $B$. In the second case introduce the new variable $x$ and replace the clause with the three clauses
 * $x \lor C$
 * $\neg x \lor A$
 * $\neg x \lor B$

A simple case analysis will show that the above clauses have a solution iff $(A \land B) \lor C$.

Replace $A \uparrow B$ with $\neg A \lor \neg B$

Replace $\overline {\operatorname{pr}_2} \left( {A, B} \right)$ with $\neg B$.

Replace $\neg (A \implies B)$ with $A \land \neg B$ and use the rule for $A \land B$.

Replace $\overline {\operatorname{pr}_2} \left( {A, B} \right)$ with $\neg A$.

Replace $\neg (B \implies A)$ with $\neg A \land B$ and use the rule for $A \land B$.

Replace $A \downarrow B$ with $\neg A \land \neg B$ and use the rule for $A \land B$.

Replace $f_F \left({A, B}\right)$ with $F$.