Skip to content

Instantly share code, notes, and snippets.

@viecode09
Forked from kanak/DiscreteMathComputer06.txt
Created February 6, 2017 09:06
Show Gist options
  • Save viecode09/f130067f0fb072ef0d397af0329ba920 to your computer and use it in GitHub Desktop.
Save viecode09/f130067f0fb072ef0d397af0329ba920 to your computer and use it in GitHub Desktop.

Revisions

  1. @kanak kanak created this gist Mar 17, 2011.
    897 changes: 897 additions & 0 deletions DiscreteMathComputer06.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,897 @@
    #+TITLE: DiscreteMathComputer 06 - Propositional Logic
    #+DATE:
    #+LATEX_HEADER: \usepackage{fullpage}
    #+LATEX_HEADER: \usepackage{tgschola}
    #+OPTIONS: H:3 toc:nil

    * Chapter Outline
    - Difficulties with informal logic
    - Propositional logic (one type of formal logic)
    - Three mathematical systems for reasoning about propositions:
    + Truth Tables: easy to understand but unwieldy for large expressions; "semantic technique"
    + Natural Deduction: "syntactic technique", uses inference rules
    + Boolean Algebra: axiomatic approach

    * Need for Formalism
    - Natural language has ambiguities and subtleties
    + e.g. "and" can sometimes suggest an implication as in "The sun is shining and I am happy"
    - *Proposition*: variable whose value must be either _True_ or _False_
    - *Logical Operators*: _and_, _or_, _not_, _implies_ . Operate on propositions
    - Statements that can't be represented by propositional logic (due to lack of context):
    + e.g. "That cloud looks like a motor bike"
    + context required: which cloud? who thinks that it looks like a motor bike?

    * Basic Logical Operators
    ** Logical And ($\wedge$)
    - aka *Conjunction*
    *** Truth Table
    | $A$ | $B$ | $A \wedge B$ |
    |-------+-------+--------------|
    | False | False | False |
    | False | True | True |
    | True | False | False |
    | True | True | True |
    ** Inclusive Or ($\vee$)
    - aka *Disjunction*
    *** Truth Table
    | $A$ | $B$ | $A \vee B$ |
    |-------+-------+------------|
    | False | False | False |
    | False | True | True |
    | True | False | True |
    | True | True | True |
    ** Exclusive Or ($\oplus$)
    - Either one or the other, but not both
    *** Truth Table
    | $A$ | $B$ | $A \oplus B$ |
    |-------+-------+--------------|
    | False | False | False |
    | False | True | True |
    | True | False | True |
    | True | True | False |
    ** Logical Not ($\neg$)
    *** Truth Table
    | $A$ | $\neg A$ |
    |-------+----------|
    | True | False |
    | False | True |
    ** Logical Implication ($\Rightarrow$)
    - Use to represent conditional phrases
    - e.g. "If it is sunny today, then there will be a picnic."
    - *Implication does not say anything about cause-and-effect*
    *** Truth Table
    | $A$ | $B$ | $A \Rightarrow B$ |
    | False | False | True |
    | False | True | True |
    | True | False | False |
    | True | True | True |
    *** Understanding the truth table
    - Why is an implication true even if $A$ is False?
    - One way to think about is that an implication is a statement that if something happens then something else must also happen
    - So, if the first event happens, but the second doesn't, the implication must have been faulty
    - But the first event doesn't happen at all, then we're indifferent about the implication
    - Rephrasing the above point, "If A then B" is like saying that "A" is sufficient for B to occur
    + So, if we see an A but not a B, clearly A isn't sufficient for B
    + But if we see a B on its own, maybe something other than A caused it.
    + e.g. Matchsticks are sufficient for fire. But just because you use a lighter to make a fire doesn't mean matchsticks can't cause fire. However, if you have a matchstick and still can't produce fire, it clearly isn't sufficient.
    - Book is a little handwavy and just says "this is the way it is"
    ** Logical Equivalence ($\Leftrightarrow$)
    - Use to make a claim that two propositions always have the same value, or are equivalent
    - aka "If and only if", "necessary and sufficient"
    *** Truth Table
    | $A$ | $B$ | $A \Leftrightarrow B$ |
    |-------+-------+-----------------------|
    | False | False | True |
    | False | True | False |
    | True | False | False |
    | True | True | True |
    *** "If and only If"
    - $A \Leftrightarrow B$ can be written as $(A \Rightarrow B) \wedge (B \Rightarrow A)$

    * The Language of Propositional Logic
    ** Well-Formedness
    - Have a grammar for propositional logic
    - If a formula doesn't follow this grammar, it isn't well formed
    - e.g. Well-Formed Formula: $A \Rightarrow (B \wedge (\neg A))$
    - e.g. not Well-Formed Formula: $\wedge A B \neg C$
    - *Well-formedness is only about the syntax and says nothing about the semantics of the formula*
    + e.g. "if it compiles", then it is well-formed. Just because something compiles doesn't mean it'll pass all the tests
    ** Syntax of Well-Formed Formulas
    - *Constants* $False$ and $True$ are WFF.
    - Any propositional *variable* is WFF.
    - *Negation*: If $a$ is WFF, then $\neg a$ is WFF
    - *Conjunction*: If $a$ and $b$ are WFF, then $a \wedge b$ is WFF
    - *Disjunction*: If $a$ and $b$ are WFF, then $a \vee b$ is WFF
    - *Implication*: If $a$ and $b$ are WFF, then $a \Rightarrow b$ is WFF
    - *Equivalence*: If $a$ and $b$ are WFF, then $a \Leftrightarrow b$ is WFF
    *** Example: $P \Rightarrow (Q \wedge R)$ is a WFF
    - $P, Q, R$ are WFF because they're propositional variables
    - So, $Q \wedge R$ is a WFF (conjunction rule)
    - So, $P \Rightarrow (Q \wedge R)$ is a WFF (implication rule)
    ** Order of Precedence
    - Negation ($\neg$) is the most tightly binding operator
    - Conjunction ($\wedge$)
    - Disjunction ($\vee$)
    - Implication ($\Rightarrow$)
    - Equivalence ($\Leftrightarrow$) is the least tightly binding operator
    ** Object Language and Meta Language
    - WFFs of propositional language will be called *object language*
    + They refer to sentences in propositional logic
    - Language of equations, substitutions, and justifications will be called the *meta language*
    + The surround the object language
    + They're used to talk _about_ propositions
    ** Computing with Boolean Expressions
    - $\neg x$ is written \texttt{not x}
    - $a \wedge b$ is written \texttt{a \&\& b}
    - $a \vee b$ is written \texttt{a || b}
    - $a \Rightarrow b$ is written \texttt{a ==> b}
    - $a \Leftrightarrow b$ is written \texttt{a <=> b}
    ** (Exercise 1) : Lying Bus Driver
    *** Scenario
    - Want to go to the airport, are at the bus stop
    - Either this bus or the next is going to the airport, but not both
    - Can only ask one "yes-or-no" question
    - Some drivers will answer "yes" when the correct answer is "no"
    + You don't know if this bus driver is one of those people
    - Ask one "yes or no" question that can help you decide whether to take this bus or the next
    *** Solution 1
    - I first gave names to the situations:
    + $A$: this bus goes to the airport
    + So, $\neg A$ means the next one goes to the airport
    + $L$: this driver is a liar
    + So, $\neg L$ means this driver answers truthfully
    - I want to formulate my question so that if the answer is "True", then $A$.
    - I then made a table of the possible situations:
    | L | A | Desired Answer |
    |-------+-------+----------------|
    | True | True | True |
    | True | False | False |
    | False | True | True |
    | False | False | False |
    - So, clearly just asking $A$ gives me the desired answer regardless of what $L$ is
    ** (Exercise 2) : Evaluating propositional formulas
    - $False \wedge True$
    + $False$
    - $True \vee (\neg True)$
    + $True$
    - $\neg (False \vee True)$
    + $\neg True$
    + $False$
    - $(\neg (False \wedge True)) \vee False$
    + $(\neg False) \vee False$
    + $True \vee False$
    + $True$
    - $(\neg True) \Rightarrow True$
    + $False \Rightarrow True$
    + $True$
    - $True \vee False \Rightarrow True$
    + $True \Rightarrow True$
    + $True$
    - $True \Rightarrow (True \wedge False)$
    - $True \Rightarrow False$
    - $False$
    - $False \Rightarrow False$
    + $True$
    - $\neg False \Leftrightarrow True$
    + $True \Leftrightarrow True$
    + $True$
    - $True \Leftrightarrow (False \Rightarrow False)$
    + $True \Leftrightarrow True$
    + $True$
    - $False \Leftrightarrow (True \wedge (False \Rightarrow True))$
    + $False \Leftrightarrow (True \wedge True)$
    + $False \Leftrightarrow True$
    + $False$
    - $\neg (True \vee False) \Leftrightarrow False \wedge True$
    + $\neg True \Leftrightarrow False$
    + $False \Leftrightarrow False$
    + $True$
    *** Verification using the Book's Stdm Library
    #+begin_src haskell
    *Stdm> False /\ True
    False
    *Stdm> True \/ (not True)
    True
    *Stdm> not (False \/ True)
    False
    *Stdm> (not (False /\ True)) \/ False
    True
    *Stdm> (not True) ==> True
    True
    *Stdm> True \/ False ==> True
    True
    *Stdm> True ==> (True /\ False)
    False
    *Stdm> False ==> False
    True
    *Stdm> (not False) <=> True
    True
    *Stdm> True <=> (False ==> False)
    True
    *Stdm> False <=> (True /\ (False ==> True))
    False
    *Stdm> (not (True \/ False)) <=> False /\ True
    True
    *Stdm>
    #+end_src

    * Truth Tables: Semantic Reasoning
    - Table
    - Column headers are all the variables (and expressions)
    - Add a row for each possible setting of values for variables
    - 3 variables means $2^3 = 8$ rows
    - because 2 possible settings for each of the 3 variables
    ** Example: Calculating using a Truth Table
    - Suppose we want to know when the proposition $((A \Rightarrow B) \wedge \neg B) \Rightarrow \neg A$ is true
    - Make a Truth Table
    | | A | B | $A \Rightarrow B$ | $\neg B$ | $(A \Rightarrow B) \wedge \neg B$ | $\neg A$ | $((A \Rightarrow B) \wedge \neg B) \Rightarrow \neg A$ |
    |---+---+---+-------------------+----------+-----------------------------------+----------+--------------------------------------------------------|
    | / | < | > | < | | | > | <> |
    | # | F | F | T | T | T | T | T |
    | # | F | T | T | F | F | T | T |
    | # | T | F | F | T | F | F | T |
    | # | T | T | T | F | F | F | T |

    ** Definition: Tautology
    - Proposition that is always True, regardless of its variables
    ** Definition: Contradiction
    - Proposition that is always False, regardless of its variables
    ** Definition: Entailment ($\vDash$)
    - $P_1, P_2, \cdots, P_n \vDash Q$ means that if all the propositions $P_1, P_2, \cdots, P_n$ are True, then $Q$ is also True
    *** Discussion
    - $\vDash$ makes a statement about actual meanings of propositions
    - *Model of a logic system*: Set of truth values along with the method for calculating meaning of any well-formed formula
    - Different values of $n$
    - $n = 1$ gives $P \vDash Q$, which has the same semantics as $\Rightarrow$
    - $n = 0$ gives $\vDash Q$, which means that $Q$ is always True, or is a tautology
    ** Limitations of Truth Tables
    - Size is exponential in number of variables
    - Other techniques (natural deduction, Boolean algebra) give much better insight into why a proposition is true
    ** Exercise 3: Determine which formulas are tautologies using truth tables
    *** $(True \wedge P) \vee Q$
    | | P | Q | $True \wedge P$ | $(True \wedge P) \vee Q$ |
    |---+---+---+-----------------+--------------------------|
    | / | < | > | <> | <> |
    | # | T | T | T | T |
    | # | T | F | T | T |
    | # | F | T | F | T |
    | # | F | F | F | F |
    - not a tautology
    - without truth tables: $(True \wedge P) \vee Q$ becomes $P \vee Q$, which is False when both $P$ and $Q$ are False
    *** $(P \vee Q) \Rightarrow (P \wedge Q)$
    | | P | Q | $P \vee Q$ | $P \wedge Q$ | $(P \vee Q) \Rightarrow (P \wedge Q)$ |
    |---+---+---+------------+--------------+---------------------------------------|
    | / | < | > | < | > | <> |
    | # | T | T | T | T | T |
    | # | T | F | T | F | F |
    | # | F | T | T | F | F |
    | # | F | F | F | F | T |
    - not a tautology
    *** $(P \wedge Q) \Rightarrow (P \vee Q)$
    | | P | Q | $P \wedge Q$ | $P \vee Q$ | $(P \vee Q) \Rightarrow (P \wedge Q)$ |
    |---+---+---+--------------+------------+---------------------------------------|
    | / | < | > | < | > | <> |
    | # | T | T | T | T | T |
    | # | T | F | F | T | T |
    | # | F | T | F | T | T |
    | # | F | F | F | F | T |
    - Tautology
    *** $(P \vee Q) \Rightarrow (Q \vee P)$
    | | P | Q | $P \vee Q$ | $Q \vee P$ | $(P \vee Q) \Rightarrow (P \wedge Q)$ |
    |---+---+---+------------+------------+---------------------------------------|
    | / | < | > | < | > | <> |
    | # | T | T | T | T | T |
    | # | T | F | T | T | T |
    | # | F | T | T | T | T |
    | # | F | F | F | F | T |
    - Tautology
    - Without Truth Table: by commutativity of $\vee$
    *** $((P \vee Q) \wedge (P \vee R)) \Leftrightarrow (P \wedge (Q \vee R))$
    | | P | Q | R | $P \vee Q$ | $P \vee R$ | LHS | $Q \vee R$ | RHS | LHS $\Leftrightarrow$ RHS |
    |---+---+---+---+------------+------------+-----+------------+-----+---------------------------|
    | / | < | | > | <> | <> | <> | <> | <> | <> |
    | # | F | F | F | F | F | F | F | F | T |
    | # | F | F | T | F | T | F | T | F | T |
    | # | F | T | F | T | F | F | T | F | T |
    | # | F | T | T | T | T | T | T | F | F |
    |---+---+---+---+------------+------------+-----+------------+-----+---------------------------|
    | # | T | F | F | T | T | T | F | F | F |
    | # | T | F | T | T | T | T | T | T | T |
    | # | T | T | F | T | T | T | T | T | T |
    | # | T | T | T | T | T | T | T | T | T |
    - Not a tautology
    ** Exercise 4: Determine Well-formedness, and build a truth table
    *** $(True \wedge P) \vee Q$
    - Truth table from Ex 3.1
    - See that it is satisfiable, but not a tautology
    *** $((P \vee Q) \wedge (P \vee R)) \Leftrightarrow (P \wedge (Q \vee R))$
    - Truth table from Ex 3.5
    - Satisfiable, but not a tautology
    *** $((P \wedge \neg Q) \vee (Q \wedge \neg P)) \Rightarrow \neg(P \Leftrightarrow Q)$
    | | P | Q | A=$P \wedge \neg Q$ | B=$Q \wedge \neg P$ | A \vee B | C=$(P \Leftrightarrow Q)$ | $\neg C$ | $(A \vee B) \Rightarrow C$ |
    |---+---+---+---------------------+---------------------+----------+---------------------------+----------+----------------------------|
    | / | < | > | <> | <> | <> | <> | <> | <> |
    | # | T | T | F | F | F | T | F | T |
    | # | T | F | T | F | T | F | T | T |
    | # | F | T | F | T | T | F | T | T |
    | # | F | F | F | F | F | T | F | T |
    - Tautology
    *** $(P \Rightarrow Q) \wedge (P \Rightarrow \neg Q)$
    | | P | Q | LHS=$P \Rightarrow Q$ | RHS=$P \Rightarrow \neg Q$ | LHS \wedge RHS |
    |---+---+---+-----------------------+---------------------------+----------------|
    | / | < | > | <> | <> | <> |
    | # | T | T | T | F | F |
    | # | T | F | F | T | F |
    | # | F | T | T | T | T |
    | # | F | F | T | T | T |
    - Satisfiable, but not a tautology
    *** $(P \Rightarrow Q) \wedge (\neg P \Rightarrow Q)$
    | | P | Q | LHS=$P \Rightarrow Q$ | RHS=$\neg P \Rightarrow Q$ | LHS \wedge RHS |
    |---+---+---+-----------------------+----------------------------+----------------|
    | / | < | > | <> | <> | <> |
    | # | T | T | T | T | T |
    | # | T | F | F | T | F |
    | # | F | T | T | T | T |
    | # | F | F | T | F | F |
    - Satisfiable, but not a tautology
    *** $(P \Rightarrow Q) \Leftrightarrow (\neg Q \Rightarrow \neg P)$
    | | P | Q | LHS=$P \Rightarrow Q$ | RHS=$\neg Q \Rightarrow \neg P$ | LHS \Leftrightarrow RHS |
    |---+---+---+-----------------------+---------------------------------+-------------------------|
    | / | < | > | <> | <> | <> |
    | # | T | T | T | T | T |
    | # | T | F | F | F | T |
    | # | F | T | T | T | T |
    | # | F | F | T | T | T |
    - Tautology
    - (This is just the contrapositive)

    * Natural Deduction: Inference Reasoning
    ** Introduction
    - Natural deduction allows us to reason about logical propositions without substituting values for variables
    - *Logical Inference*: reasoning formally about a set of statements. Requires:
    + *Object Language*: to talk about the statements we're reasoning about. e.g. Propositional expressions
    + *Inference Rules*: Rules to infer new facts from information given
    + *Meta Language*: Defines the "form of argument" so that we can determine whether arguments are actually valid
    *** Definition: Sequent ($\vdash$)
    - $P_1, P_2, \cdots, P_n \vdash Q$ is called a *sequent*
    - Means: if all propositions $P_1, \cdots, P_n$ are known, then proposition $Q$ can be inferred formally using the rules of natural deduction
    - e.g. Difference between $P \vDash Q \Rightarrow P$ and $P \vdash Q \Rightarrow P$
    + The $\vDash$ version doesn't say *how* we know that $Q \Rightarrow P$ when we assume $P$. It just says that it is True.
    + The $\vdash$ version says that there is a proof that shows $Q \Rightarrow P$ when we assume $P$
    *** Meta Variables
    - Meta variables can stand for any WFF proposition
    - e.g. we can have $a$ be $P \wedge Q$
    - Convention: meta variables will be written in lower case, propositional variables in upper case
    *** Writing an Inference Rule
    - Assumptions are written above a horizontal line
    - Conclusion written below the line.
    - (For latex simplicity, I'll just use the sequent notation to talk about inference rules)
    - *Inference rule only works in one direction*
    ** Definitions of True, Not and Equivalence
    *** Primitives
    - Only primitive objects are constant False, and $\vee, \wedge, \Rightarrow$
    - All other objects are built using these
    - Below we give definitions for some primitives
    - can be verified using truth tables
    - But we'll only manipulate them using rules of logical deduction
    *** Definition: True
    - $True = False \Rightarrow False$
    - (Verify using truth table, but this particular definition is "trivial" because that's how we defined implication)
    *** Definition: Negation
    - $\neg a = a \Rightarrow False$
    - Proof (via truth tables):
    - Suppose $a$ is $True$, then right side becomes $True \rightarrow False$, which is $False$
    - Suppose $a$ is $False$, then right side becomes $False \rightarrow False$, which we defined to be $True$
    - So in both cases the definition is consistent
    - Consistency (via logical inference only):
    - If $a$ is $True$, then $\neg True$ is $True \Rightarrow False$ which is $(False \Rightarrow False) \Rightarrow False$
    - We have a rule called Reduction Ad Absurdum which allows us to infer $False$ from $(False \Rightarrow False) \Rightarrow False$
    - If $a$ is $False$, then $\neg False$ is $False \Rightarrow False$< which we defined to be $True$
    *** Definition: Equivalence
    - $a \Leftrightarrow b = (a \Rightarrow b) \wedge (b \Rightarrow a)$
    - (Note that's the definition of if and only if)
    - Proof by Truth Table:
    | | a | b | a \Rightarrow b | b \Rightarrow a | LHS | RHS |
    | / | < | > | <> | <> | <> | <> |
    |---+---+---+-----------------+------------------+-----+-----|
    | # | T | T | T | T | T | T |
    | # | T | F | F | T | F | F |
    | # | F | T | T | F | F | F |
    | # | F | F | T | T | T | T |
    - Hence, this formula is also correct
    ** IMPORTANT: Note on Proofs of the Inference Rules
    - I've "proven" each of the inference rules by making references to the Truth Table
    - But it looks like that might be circular atleast based on the discussion in the section on "Inferring the Operator Truth Tables"
    - Assume that you have a system with FALSE, and three operators OR, AND, IMPLIES
    - Pretend that it is just a coincidence that they match the names of Boolean operators
    ** And Introduction
    *** Definition: $a, b \vdash a \wedge b$
    - Proof:
    + We know that $a$ and $b$ are True
    + By definition of $\wedge$, $a \wedge b$ is True
    *** Usage Example 1
    - Statement: $(R \Rightarrow S), \neg P \vdash (R \Rightarrow S) \wedge \neg P$
    - Proof:
    + Use _and introduction_
    *** Usage Example 2
    - Statement: $P, Q, R \vdash (P \wedge Q) \wedge R$
    - Proof:
    + If $P$ and $Q$ are True, $P \wedge Q$ is True by _and introduction_
    + Since, $R$ is True, another usage of _and introduction_ means $(P \wedge Q) \wedge R$ is True as well
    - Note: This can be written in a tree diagram type form (Page 130)
    *** Exercise 10:
    - *Statement*: Prove $P, Q, R \vdash P \wedge (Q \wedge R)$
    - Proof:
    + If $Q$ and $R$ are True, $Q \wedge R$ is true by _and introduction_
    + If, $P$ is true, another application of _and introduction_ means $P \wedge (Q \wedge R)$ is True as well
    - Note, we could have proven this simply by noting the associativity of $\wedge$
    *** Exercise 11
    **** Shape of $x = A \wedge (B \wedge (C \wedge D))$
    - Right-heavy tree
    - If there are $2^n$ variables in $x$, then the height of the proof tree will also be $2^n$
    - (At each level, we can reason about one of the variables in x)
    **** Shape of $y = (A \wedge B) \wedge (C \wedge D))$
    - Balanced tree: height is logarithmic in number of variables
    - (At each level, we can reason about half of the variables in y)
    ** And Elimination
    *** Definition: $(a \wedge b) \vdash a$, $(a \wedge b) \vdash b$
    - Proof:
    + We know that $a \wedge b$ is True
    + But $a \wedge b$ is True exactly when both $a$ and $b$ are True
    + So, if the conjunction is True, they must individually be True as well
    *** Usage Example
    - Statement: $P, Q \wedge R \vdash P \wedge Q$
    - Proof:
    + $P$ is True by assumption
    + $Q \wedge R$ means $Q$ is True by _and elimination_
    + Since both $P$ and $Q$ are true, $P \wedge Q$ is True (by _and introduction_)
    *** Usage Example
    - Statement: $(P \wedge Q) \wedge R \vdash R \wedge Q$
    - Proof:
    + By _and elimination_, both $P \wedge Q$ and $R$ are True
    + Another _and elimination_ on $P \wedge Q$ yields True for $P$ and $Q$
    + So, both $Q$ and $R$ are True, by _and introduction_, $Q \wedge R$ is True
    *** Usage Example
    - Statement: $P \wedge Q \vdash Q \wedge P$
    - Proof:
    + By _and elimination_, both $P$ and $Q$ are True
    + By _and introduction_, $Q \wedge P$ is True
    - This proves the commutativity of And (which we could have also done using Truth Tables)
    *** Usage Example
    - Statement: $a \wedge (b \wedge c) \vdash (a \wedge b) \wedge c$
    - Proof:
    + By _and elimination_ on $a \wedge (b \wedge c)$, both $a$ and $b \wedge c$ are True
    + By _and elimination_ on $b \wedge c$, both $b$ and $c$ are True
    + By _and introduction_, $a \wedge b$ is True
    + By _and introduction_, $(a \wedge b) \wedge c$ is True
    - We've proved the associativity of and
    *** Exercise 12
    - Statement: Prove: $(P \wedge Q) \wedge R \vdash P \wedge (Q \wedge R)$
    - Proof:
    + We proved that "and" is associative for well formed propositions
    + This is a well formed proposition
    ** Imply Elimination
    *** Definition: $a, a \Rightarrow b \vdash b$
    - Also known as *Modus Ponens*
    - Proof:
    + Know $a$ is True
    + Know $a \Rightarrow b$ is True
    + If $b$ is False, we get $True \Rightarrow False$ which would be False
    + But if $b$ is True, we get $True \Rightarrow True$, which is True
    + So, $b$ is True
    *** Usage Example
    - Statement: $Q \wedge P, P \wedge Q \Rightarrow R \vdash R$
    - Proof:
    + $Q \wedge P$ is True which means that $P \wedge Q$ is true by the commutativity of and (proved earlier)
    + By _Modus Ponens_ on $P \wedge Q \Rightarrow R$, we get $R$ is True
    *** Usage Example
    - Statement: $a, a \Rightarrow b, b \Rightarrow c \vdash c$
    - Proof:
    + By _Modus Ponens_ on $a, a \Rightarrow b$, we see that $b$ is True
    + By _Modus Ponens_ on $b, b \Rightarrow c$, we see that $c$ is True
    *** Exercise 13
    - Statement: $P, P \Rightarrow Q, (P \wedge Q) \Rightarrow (R \wedge S) \vdash S$
    - Proof:
    + By _Modus Ponens_ on $P, P \Rightarrow Q$, we see that $Q$ is True
    + By _And Introduction_, $P \wedge Q$ is True
    + By _Modus Ponens_ on $P \wedge Q, P \wedge Q \Rightarrow R \wedge S$, we see that $R \wedge S$ is True
    + By _And Elimination_ on $R \wedge S$, we see that both $R$ and $S$ are True
    *** Exercise 14
    - Statement: $P \Rightarrow Q, R \Rightarrow S, P \wedge R \vdash S \wedge R$
    - Proof:
    + By _And Elimination_ on $P \wedge R$, we see that $P$ and $R$ are True
    + By _Modes Ponens_ on $R, R \Rightarrow S$, we see that $S$ is True
    + By _And Introduction_ on $R$ and $S$, we see that $S \wedge R$ is True

    ** Imply Introduction
    *** Definition: $(a \vdash b) \vdash (a \Rightarrow b)$
    - "In order to imply the logical implication $a \Rightarrow b$, you must have a proof of $b$ using $a$ as an assumption"
    *** Example Usage
    - Statement: $\vdash (P \wedge Q) \Rightarrow Q$
    - Since the $\vdash$ doesn't have anything to the left, it is saying that this is a tautology
    - What proof do we have for this?
    + Consider the sequent $P \wedge Q \vdash Q$, which is just _and elimination_
    + So, we have a proof for $P \wedge Q \vdash Q$, which means we can write $\vdash P \wedge Q \Rightarrow Q$ by Implies introduction
    **** Assumptions Made
    - _And Elimination_ assumed $P \wedge Q$ is True.
    - We can't infer $Q$ without this assumption.
    - So, this appears in the sequent to the left of the $\vdash$ in $P \wedge Q \vdash Q$
    - But the entire sequent $P \wedge Q \vdash Q$ doesn't have any further assumptions
    + Whenever $P \wedge Q$ is true, $Q$ is true.
    - So, this sequent can be put in as an assumption without adding any other assumptions
    - This is why when we do implies introduction, we get $\vdash (P \wedge Q) \Rightarrow Q$
    *** Discharged assumptions
    - Assumptions that are made temporarily to establish a sequent, and which is then thrown away
    - E.g. to establish the sequent $P \wedge Q \vdash Q$, we made an assumption $P \wedge Q$
    - Once we got $P \wedge Q \vdash Q$, we don't need to assumption for any other purpose
    - Indicate discharged assumptions by boxes
    *** Implication Chain Rule
    - Statement: $a \Rightarrow b, b \Rightarrow c \vdash a \Rightarrow c$
    - Proof:
    + Since we are trying to prove $a \Rightarrow c$, we must use _Imply Introduction_ somewhere
    + This means that we need to show $a \vdash c$
    + Assume $a$ is True, then by _Modus Ponens_ on $a \Rightarrow b$, $b$ is True
    + Since $b$ is True, by _Modus Ponens_ on $b \Rightarrow c$, $c$ is True
    + So, we have a sequent $a \vdash c$, and we can discharge the assumption that $a$ is True
    + By _Imply Introduction_ on $a \vdash c$, we get $a \implies c$
    *** Modus Tollens
    - Statement: $a \Rightarrow b, \neg b \vdash \neg a$
    - Proof:
    + $\neg a$ is an abbreviation for $a \Rightarrow False$
    + This means that we need to use _Imply Introduction_
    + Expand $\neg a$ and $\neg b$ to get: $a \Rightarrow b, b \Rightarrow False \vdash a \Rightarrow False$
    + This is just _implication chain rule_
    *** Exercise 15
    - Statement: $P \vdash Q \Rightarrow P \wedge Q$
    - Proof:
    + We are trying to prove an implication $Q \Rightarrow P \wedge Q$, means we have to _Imply Introduction_
    + To _introduce imply_, we need to prove the sequent $Q \vdash P \wedge Q$
    + We know that $P$ is true from what is given
    + Assume that $Q$ is true.
    + By _and introduction_, we have $P, Q \vdash P \wedge Q$
    + This sequent does not have any further assumptions, so we can discharge the assumption that B is True
    + So, we have the sequent $Q \vdash P \wedge Q$, which means we have $Q \Rightarrow P \wedge Q$ by _introduce imply_
    - (Maybe incorrect)
    *** Exercise 16
    - Statement: $\vdash P \wedge Q \Rightarrow Q \wedge P$
    - Proof:
    + We need to use _introduce imply_ on the sequent $P \wedge Q \vdash Q \wedge P$
    + But that's just commutativity of $\wedge$, which we proved earlier, the sequent holds without any further assumptions
    + So, we can _introduce imply_ on the sequent to get the desired answer
    ** Or Introduction
    *** Definition: $a \vdash a \vee b$ and $b \vdash a \vee b$
    - Proof
    + By the definition of $\vdash$, if one of its arguments is true, then the whole expression becomes true
    *** Example Usage
    - Statement: $P \wedge Q \vdash P \vee Q$
    - Proof
    + By _and elimination_ on $P \wedge Q$, we have $P$ is True, $Q$ is True
    + By _or introduction_, we have $P \vee Q$ is True
    *** Exercise 17
    - Statement: $P \Rightarrow False \vee P$
    - Proof
    + To prove this implication, we need to prove the sequent $P \vdash False \vee P$
    + But that sequent is True by _or introduction_
    + So, by _introduce implication_, we have $P \Rightarrow False \vee P$
    *** Exercise 18
    - Statement: $P, Q \vdash (P \wedge Q) \vee (Q \vee R)$
    - Proof:
    + By _and introduction_, we have $P \wedge Q$ is True
    + By _or introduction_, we have $Q \vee R$ is True
    + By _or introduction_, $(P \wedge Q) \vee (Q \vee R)$ is True
    + (Actually, knowing that $P \wedge Q$ is True is sufficient because we can _or introduce_ that to get True)
    ** Or Elimination
    *** Definition (((a \vee b), (a \vdash c), (b \vdash c)) \vdash c)
    - This is *Proof by Case Analysis*
    - Proof:
    + Assumption is that $a \vee b$ is True
    + By the definition of $\vee$ (from Truth Table), atleast one of $a$ and $b$ must be True
    + Suppose $a$ is True
    + We have $a \vdash c$, i.e. a proof that $c$ is True when $a$ holds
    + Otherwise, $b$ is True
    + We have $b \vdash c$, i.e. a proof that $c$ is True when $a$ holds
    + So, $c$ is True whenever the assumptions hold
    - (Did i just prove Proof by Case Analysis by DOING proof of case analysis? Something is weird here...)
    *** Example Usage
    - Statement: $(P \wedge Q) \vee (P \wedge R) \vdash P$
    - Proof:
    + Suppose $P \wedge Q$ is True, then by _and elimination_, $P$ is True
    + Suppose instead that $P \wedge R$ is True, then by _and elimination_, $P$ is True
    + So, we have $((P \wedge Q) \vee (P \wedge R)), (P \wedge Q) \vdash P, (P \wedge R) \vdash P$
    + Use _or elimination_ to get that $P$ is True
    *** Example Usage
    - Statement: $(a \wedge b) \vee (a \wedge c) \vdash (b \vee c)$
    - Proof:
    + Assume $a \wedge b$ by _and elimination_, we get $a \wedge b \vdash b$
    + Discharge the assumption $a \wedge b$ because we have a sequent
    + By _or introduction_, we have $b \vdash b \vee c$
    + Assume $a \wedge c$ by _and elimination_, we get $a \wedge c \vdash c$
    + Discharge the assumption $a \wedge c$
    + By _or introduction_, we have $c \vdash b \vee c$
    + We can no do _or elimination_ on $(a \wedge b) \vee (a \wedge c) \vdash (b \vee c), ((a \wedge b) \vdash b) \vdash b \vee c, ((a \wedge c) \vdash c) \vdash b \vee c$
    + This gives us $b \vee c$
    ** Identity
    *** Definition $a \vdash a$
    - It is necessary because we can't prove $P \vdash P$ without it.
    *** Theorem: $\vdash True$
    - By definition, $True = False \Rightarrow False$
    - So, we need to _introduce imply_ to prove this
    - To introduce imply, we need to prove the sequent $False \vdash False$
    - This is true by _identity_
    - So, we have $False \Rightarrow False$ or equivalently, $True$
    ** Contradiction
    *** Definition: $False \vdash a$
    - Anything can be inferred if the assumption is False
    - (Remember the Truth table for $P \Rightarrow Q$ gave True when $P$ was False?)
    - Expresses the fact that *False is untrue* purely using logical inference
    + Can't just say False is not True, because we defined True that way
    + Also doesn't rely on us making "intuitionistic" statements like "False is Wrong"
    *** Example Usage
    - Statement: $P, \neg P \vdash Q$
    - Proof:
    + $\neg P$ is shorthand for $P \Rightarrow False$
    + So, from $P, P \Rightarrow False$ by _modus ponens_, we have $False$
    + $False \vdash Q$ follows from _contradiction_
    *** Example Usage
    - Statement; $a \vee b, \neg a \vdash b$
    - Proof:
    + $\neg a$ is shorthand for $a \Rightarrow False$
    + Performing _or elimination_ on $a \vee b$,
    + Assume $a$ is True, then we have $a, a \Rightarrow False$, which by _Modus Ponens_ gives us $False$
    + So, by _contradiction_, $b$ is True
    + (Discharge the assumption that $a$ is True)
    + Assume $b$ is True, the by identity, $b$ is True
    + (Discharge the assumption that $b$ is True)
    + Combining, we have $(a \vee b, \neg a), (((a \vee b) \vdash a), a \Rightarrow False) \vdash b, (((a \vee b) \vdash b) \vdash b)$, we can now perform or elimination
    ** Reduction Ad Absurdum
    *** Definition: $(\neg a \vdash False) \vdash a$
    - If you can infer False from an assumption $\neg a$, then you must conclude that a is true
    - This is the Proof by Contradiction strategy
    *** Example Usage
    - Statement: $\neg \neg a \vdash a$
    - Proof:
    + Strategy: Assume $\neg a$ and show that it leads us to infer False (proof by contradiction)
    + Assuming $\neg a$, we have $\neg a, \neg \neg a$
    + Expand out the abbreviations to get: $a \Rightarrow False, (a \Rightarrow False) \Rightarrow False$
    + Since we have $a \Rightarrow False$ and $(a \Rightarrow False) \Rightarrow False$, by _Modus Ponens_, we have $False$
    + So, by reductio ad absurdum, $a$ Must be True if $\neg \neg a$ is True
    ** Inferring the Operator Truth Tables
    - Two fundamental questions:
    + Are inference rules powerful enough?
    + Will they ever allow us to make mistakes?
    - profound and difficult questions, modern research has shown some astonishing results
    - Easy version of first question: Are inference rules powerful enough to infer the truth tables of logical operators?
    *** Example: Deriving the Truth Table value of $True \wedge False$
    - Want to show that it is logically equivalent to False, and not logically equivalent to True
    - To show equivalence with False, we need to show: $False \Rightarrow (True \wedge False)$, $True \wedge False \Rightarrow False$
    + $False \vdash (True \wedge False)$ follows from _contradiction_
    + By _introduce implication_, we have $False \Rightarrow (True \wedge False)$
    + $True \wedge False \vdash False$
    + Expand out $True$ the expression is now $False \wedge (False \Rightarrow False)$
    + By _and elimination_, we get $False \wedge (False \Rightarrow False) \vdash False$, which by identity gives us $False \vdash False$
    + By _introduce implication_, we have $True \wedge False \Rightarrow False$
    *** Exercise: Calculating value of $True \wedge True$
    - Proof that $True \wedge True \Rightarrow True$
    + By _and elimination_, we have $True \wedge True \vdash True$
    + By _identity_, we have $True \vdash True$
    + By _introduce implication_, we have $True \wedge True \Rightarrow True$
    - Proof that $True \Rightarrow (True \wedge True)$
    + Need to prove the sequent $True \vdash True \wedge True$
    + By _and introduction_, we have $True \vdash True \wedge True$
    + By _introduce implication_, we have $True \Rightarrow True \wedge True$
    *** Exercise: Calculating the value of $True \vee False$
    - Proof that $True \vee False \Rightarrow True$
    + We have $True \vdash True$ from _identity_
    + We have $False \vdash True$ from _contradiction_
    + So, we have $(True \vee False), (True \vdash True), (False \vdash True)$
    + By _or elimination_, we have $(True \vee False) \vdash True$
    + By _introduce implication_, we have $True \vee False \Rightarrow True$
    - Proof that $True \Rightarrow (True \vee False)$
    + From _or introduction_, we have $True \vdash (True \vee False)$
    + By _introduce implication_, we have $True \Rightarrow (True \vee False)$
    *** Extra Credit: What happens when we try to say $True \vee False$ is $False$?
    - Need to show equivalence
    - Proof that $False \Rightarrow (True \vee False)$
    + $False \vdash (True \vee False)$ by _contradiction_
    + By _introduce implication_, we have $False \Rightarrow (True \vee False)$
    - Proof that $(True \vee False) \Rightarrow False$
    + Need to do an _or elimination_
    + $False \vdash False$ comes from _identity_
    + $True \vdash False$ needs to be shown
    + Expand out $True$: $False \Rightarrow False \vdash False$ needs to be shown
    + Since $False$ is not $True$, we can't use _Modus Ponens_
    + We have no applicable inference rule to use
    *** Exercise
    - When we computed value of $True \wedge False$, we used _and elimination_ to say that $(False \Rightarrow False) \wedge False \vdash False$
    - But we could have said $(False \Rightarrow False) \vdash False \vdash (False \Rightarrow False)$ which is True
    - What would have happened then?
    + We would have had to show that $True \vdash False$
    + That is, $False \Rightarrow False \vdash False$
    + Same situation as in extra credit: Have no valid inference law to use; so can't deduce.

    * Proof Checking by Computer
    ** Proof Checkers and Theorem Provers
    - *Proof Checker*: reads in a theorem and a proof. Determines if the proof is valid
    - *Theorem Prover*: reads in a theorem and attempts to generate a proof
    ** Example of Proof Checking
    - See 06-proofs.hs

    * Boolean Algebra: Equational Reasoning
    ** Introduction
    *** Approaches to Propositional Logic
    - Truth Tables: semantic approach
    - Natural Deduction: syntactic approach
    - Boolean Algebra: axiomatic approach
    *** Equational Reasoning
    - Show that two values are the same by building chains of equalities
    + e.g. show that $a = b$ and $b = c$, so $a = c$
    - can substitute equals for equals
    + if $x = y$, can substitute in $x$ wherever $y$ is used
    ** Laws of Boolean Algebra
    *** Operations with Constants
    - $a \wedge False = False$
    - $a \wedge True = True$
    - *Identity for or*: $a \vee True = True$
    - *Identity for and*: $a \vee False = a$
    **** Exercise 25: Simplification
    - $(P \wedge False) \vee (Q \wedge True)$
    - $False \vee (Q \wedge True)$
    - $Q \wedge True$
    - $Q$
    **** Exercise 26
    - Prove that: $(P \wedge False) \wedge True) = False$
    - Direct Proof:
    + $(P \wedge False) \wedge True)$
    + $False \wedge True$
    + $False$
    *** Basic Properties of $\wedge$ and $\vee$
    - *Disjunctive Implication*: $a \Rightarrow a \vee b$ (Or Introduction)
    - *Conjunctive Implication*: $a \wedge b \Rightarrow a$ (And Elimination)
    - *Idempotence*: $a \wedge a = a$
    - *Idempotence*: $a \wedge a = a$
    - *Commutative*: $a \wedge b = b \wedge a$
    - *Commutative*: $a \vee b = b \vee a$
    - *Associativity*: $(a \wedge b) \wedge c = a \wedge (b \wedge c)$
    - *Associativity*: $(a \vee b) \vee c = a \wedge (b \vee c)$
    **** Exercise 27
    - Prove: $(P \wedge ((Q \vee R) \vee Q)) \wedge S = S \wedge ((R \vee Q) \wedge P)$
    - Direct Proof starting from LHS
    - $(P \wedge ((Q \vee R) \vee Q)) \wedge S$
    - $(P \wedge ((R \vee Q) \vee Q)) \wedge S$ (by commutativity of or)
    - $(P \wedge (R \vee (Q \vee Q)) \wedge S$ (by associativity of or)
    - $(P \wedge (R \vee Q)) \wedge S$ (by idempotence of or)
    - $((R \vee Q) \wedge P) \wedge S$ (by commutivatiy of and)
    - $S \wedge ((R \vee Q) \wedge P)$ (by commutivatiy of and)
    **** Exercise 28
    - Prove: $P \wedge (Q \wedge (R \wedge S)) = ((P \wedge Q) \wedge R) \wedge S$
    - Direct proof starting from LHS
    - $P \wedge (Q \wedge (R \wedge S))$
    - $((P \wedge Q) \wedge (R \wedge S))$ (by associativity of and)
    - $((P \wedge Q) \wedge R) \wedge S$ (by associativity of and)

    *** Distributive and De Morgan's Laws
    - *And distributes over Or*: $a \wedge (b \vee c) = (a \wedge b) \vee (a \wedge c)$
    - *Or distributes over And*: $a \vee (b \wedge c) = (a \vee b) \wedge (a \vee c)$
    - *De Morgan*: $\neg (a \wedge b) = \neg a \vee \neg b$
    - *De Morgan*: $\neg (a \vee b) = \neg a \wedge \neg b$
    **** Exercise 29
    - Give an intuitive explanation of second De Morgan's laws
    - If none of (a, b) are true, it means that a is not true and b is not true
    *** Laws on Negation
    - $\neg True = False$
    - $\neg False = True$
    - $a \wedge \neg a = False$
    - $a \vee \neg a = True$
    - $\neg (\neg a) = a$
    *** Laws on Implication
    - *Modus Ponens*: $a \wedge (a \Rightarrow b) \Rightarrow b$
    - *Modus Tollens*: $\neg b \wedge (a \Rightarrow b) \Rightarrow \neg a$
    - *Disjunctive Syllogism*: $(a \vee b) \wedge \neg \Rightarrow b$
    - *Implication Chain*: $(a \Rightarrow b) \wedge (b \Rightarrow c) \Rightarrow (a \Rightarrow c)$
    - *Implication Combination*: $(a \Rightarrow b) \wedge (c \Rightarrow d) \Rightarrow ((a \wedge c) \Rightarrow (b \wedge d))$
    - *Currying*: $(a \wedge b) \Rightarrow c = a \Rightarrow b \Rightarrow c$
    - *Implication*: $a \Rightarrow b = \neg a \wedge b$
    - *Contrapositive*: $a \Rightarrow b = \neg b \Rightarrow \neg a$
    - *Absurdity*: $(a \Rightarrow b) \wedge (a \Rightarrow \neg b) = \neg a$
    **** Understanding the currying law
    - Says there are two equivalent ways of establishing that $a$ and $b$ both hold
    - One of them is to say $a \wedge b$
    - The other is to have an implication on $a$ and an implication on $b$
    - If either of $a$ or $b$ is false,
    + $a \wedge b$ is false, so $(a \wedge b) \Rightarrow c$ is vacuous
    + Either $a \wedge b$ or $b \wedge c$ is vacuous (if $a$ is False, then the first one is vacuous, if $b$ is false, the second one)
    **** Understanding the Implication Law
    - allows us to prove $a \Rightarrow b$
    - Note that we don't have an "Introduce Implication" rule like in natural deduction
    - So we use this rule
    *** Logical Equivalence
    - $a \Leftrightarrow b$ is the same as $(a \Rightarrow b) \wedge (b \Rightarrow a)$
    - Subtle difference between $\Leftrightarrow$ and $=$
    + $=$ is an operator in the meta language that says that two sides of an equation have the same value
    + $\Leftrightarrow$ is in the object language itself and it gives a new proposition
    **** Exercise 30
    - Prove: $(A \vee B) \wedge B \LeftRightarrow B$
    - Strategy: We'll reduce the left side of the equivalence to be the right side
    - $(A \vee B) \wedge B$
    - $(A \vee B) \wedge (B \vee False)$ (by Identity of OR)
    - $(B \vee A) \wedge (B \vee False)$ (commutativity of AND)
    - $B \vee (A \wedge False)$ (distributivity of OR)
    - $B \vee False$
    - $B$
    **** Exercise 31
    - Prove: $((\neg A \wedge B) \vee (A \wedge \neg B)) \Leftrightarrow (A \vee B) \wedge (\neg (A \wedge B))$
    - Direct proof starting from "left side"
    - $(\neg A \wedge B) \vee (A \wedge \neg B)$
    - $(\neg A \vee (A \wedge \neg B)) \wedge (B \vee (A \wedge \neg B))$ (by distributing the OR over the AND)
    - $((\neg A \vee A) \wedge (\neg A \vee \neg B)) \wedge ((B \vee A) \wedge (B \vee \neg B))$ (by distributing the OR over the AND)
    - $(True \wedge (\neg A \vee \neg B)) \wedge ((B \vee A) \wedge True)$
    - $(\neg A \vee \neg B) \wedge (B \vee A)$
    - $\neg (A \wedge B) \wedge (B \vee A)$ (by Demorgan's laws)
    **** Exercise 32
    - Prove: $\neg (A \wedge B) \equiv \neg A \vee \neg B$
    - Direct proof starting from "right side"
    - $\neg A \vee \neg B$
    - $\neg (\neg (\neg A \vee \neg B))$ (Double negation is just identity)
    - $\neg (A \wedge B)$ (by De Morgan's other law)
    **** Exercise 33
    - Prove: $(A \vee B) \wedge (\neg A \vee C) \wedge (B \vee C) \Leftrightarrow (A \vee B) \wedge (\neg A \vee C)$
    - Proof is by cases on A
    - Case: A is True
    - LHS: $(True \vee B) \wedge ((\neg True) \vee C) \wedge (B \vee C)$
    - i.e. $True \wedge C \wedge (B \vee C)$
    - i.e. $C \wedge (B \vee C)$
    - i.e. $C$ (proven in Review Exercise 45)
    - RHS: $(True \vee B) \wedge ((\neg True) \wedge C)$
    - i.e. $True \wedge C$
    - i.e. $C$
    - So the equality holds in this case
    - Case: A is False
    - LHS: $(False \vee B) \wedge ((\neg False) \vee C) \wedge (B \vee C)$
    - i.e. $B \wedge True \wedge (B \vee C)$
    - i.e. $B \wedge (B \vee C)$
    - i.e. $B$
    - RHS: $(False \vee B) \wedge ((\neg False) \vee C)$
    - i.e. $B \wedge True$
    - i.e. $B$
    - So, the equality holds in this case
    - Since the equality holds in both cases, the statement is proven.

    * Logic in Computer Science
    - Talks about applications of theorem provers

    * Meta Logic
    - Making statements about the logical system itself
    - Fundamental Meta-Logic operators:
    + $P_1, P_2, \cdots, P_n \vdash Q$ means there is a proof that shows $Q$ from the assumptions $P_1, \cdots, P_n$
    + $P_1, P_2, \cdots, P_n \vDash Q$ means $Q$ must be tree if all assumptions are true, but says nothing about the proof
    ** Definition: Consistency of a Logical System
    - A formal system is consistent if, for all well-formed formulas $a$ and $b$, if $a \vdash b$ then $a \vDash b$
    - That is, each proposition that is provable is actually True
    ** Definition: Completeness of a Logical System
    - A formal system is complete if, for all well-formed formulas $a$ and $b$, if $a \vDash b$ then $a \vdash b$
    - That is, every proposition that is true can be proved using the system
    ** Theorem: Propositional Logic is consistent and complete
    - No proof given
    ** Godel's Theorem: A logical system powerful enough to express ordinary arithmetic must be either inconsistent or incomplete
    - It is impossible to capture all of mathematics in a safe logical system

    * Further Reading
    - *Forever Undecided: A Puzzle Guide to Godel* by Raymond Smullyan
    + "Don't miss it"
    - *Godel, Escher, Bach: An Eternal Braid* by Douglas Hofstadter
    + "Another unmissable classic"
    - *How to Prove it: A Structured approach* by Daniel Velleman
    + Good source for hints on carrying out proofs with lots of example
    - *Computer-Aided Reasoning: An approach*: by Matt Kaufmann, Panagiotis Manolios, and J Strother Moore
    + Describes the ACL2 theorem prover
    - *Introduction to HOL*: by M Gordon and T Melham
    - Describes the HOL theorem prover
    - *Logic for Mathematics and Computer Science* by Burris
    + "more advanced treatement of mathematical logic"
    - *A Mathematical Introduction to Logic* by Enderton
    + "standard presentation of logic from a mathematical perspective"
    - *Type Theorey and Functional Programming* by Thompson
    + "detailed development of relationship between inference rules and rules used to define type systems"
    - *Logic and Declarative Language* by Downward
    - *Proofs and Types* by Girard, Lafont and Taylor
    + relationship between inference proofs and type systems at a research level