(* sol.thy,v 1.1 2017/10/11 14:00:50 jdf Exp Original Author: Tjark Weber Updated to Isabelle 2016 by Jacques Fleuriot *) section {* Propositional Logic *} theory sol imports Main begin text {* In this exercise, we will prove some lemmas of propositional logic with the aid of a calculus of natural deduction. For the proofs, you may only use notI: (?P \ False) \ \ ?P notE: \\ ?P; ?P\ \ ?R conjI: \?P; ?Q\ \ ?P \ ?Q conjE: \?P \ ?Q; \?P; ?Q\ \ ?R\ \ ?R disjI1:?P \ ?P \ ?Q disjI2: ?Q \ ?P \ ?Q disjE: \?P \ ?Q; ?P \ ?R; ?Q \ ?R\ \ ?R impI: (?P \ ?Q) \ ?P \ ?Q impE:\?P \ ?Q; ?P; ?Q \ ?R\ \ ?R mp: \?P \ ?Q; ?P\ \ ?Q iffI:\?P \ ?Q; ?Q \ ?P\ \ ?P = ?Q iffE:\?P = ?Q; \?P \ ?Q; ?Q \ ?P\ \ ?R\ \ ?R classical: (\ ?P \ ?P) \ ?P and the proof methods rule, erule and assumption. \end{itemize} Possible proofs - these statements can be proved in multiple ways: *} lemma I: "A \ A" apply (rule impI) apply assumption done lemma "A \ B \ B \ A" apply (rule impI) apply (erule conjE) apply (rule conjI) apply assumption apply assumption done lemma "(A \ B) \ (A \ B)" apply (rule impI) apply (erule conjE) apply (rule disjI1) apply assumption done lemma "((A \ B) \ C) \ A \ (B \ C)" apply (rule impI) apply (erule disjE) apply (erule disjE) apply (rule disjI1) apply assumption apply (rule disjI2) apply (rule disjI1) apply assumption apply (rule disjI2) apply (rule disjI2) apply assumption done lemma K: "A \ B \ A" apply (rule impI)+ apply assumption done lemma "(A \ A) = (A \ A)" apply (rule iffI) apply (erule disjE) apply (rule conjI) apply assumption+ apply (rule conjI) apply assumption+ apply (erule conjE) apply (rule disjI1) apply assumption done lemma S: "(A \ B \ C) \ (A \ B) \ A \ C" apply (rule impI)+ apply (erule impE) apply assumption apply (erule impE) apply assumption apply (erule impE) apply assumption+ done lemma "(A \ B) \ (B \ C) \ A \ C" apply (rule impI)+ apply (erule impE) apply assumption apply (erule impE) apply assumption+ done lemma "\ \ A \ A" apply (rule impI) apply (rule classical) apply (erule notE) apply assumption done lemma "A \ \ \ A" apply (rule impI) apply (rule notI) apply (erule notE) apply assumption done lemma "(\ A \ B) \ (\ B \ A)" apply (rule impI)+ apply (rule classical) apply (erule impE) apply assumption apply (erule notE) apply assumption done lemma "((A \ B) \ A) \ A" apply (rule impI)+ apply (rule classical) apply (erule impE) apply (rule impI) apply (erule notE, assumption)+ done lemma "A \ \ A" apply (rule classical) apply (rule disjI2) apply (rule notI) apply (erule notE) apply (rule disjI1) apply assumption done lemma "(\ (A \ B)) = (\ A \ \ B)" apply (rule iffI) apply (rule classical) apply (erule notE) apply (rule conjI) apply (rule classical) apply (erule notE) apply (rule disjI1) apply assumption apply (rule classical) apply (erule notE) apply (rule disjI2) apply assumption apply (rule notI) apply (erule conjE) apply (erule disjE) apply (erule notE, assumption)+ done (* An alternative proof using ccontr: (\ ?P \ False) \ ?P as well instead of "classical" *) lemma "(\ (A \ B)) = (\ A \ \ B)" apply (rule iffI) apply (rule ccontr) apply (erule notE) apply (rule conjI) apply (rule ccontr) apply (erule notE) apply (rule disjI1) apply assumption apply (rule ccontr) apply (erule notE) apply (rule disjI2) apply assumption apply (rule notI) apply (erule conjE) apply (erule disjE) apply (erule notE, assumption)+ end