macro "conj_elim" hp:ident hq:ident "from" h:ident : tactic => `(tactic|(have ⟨$hp,$hq⟩ := $h)) macro "conj_intro" h:ident "from" hp:ident hq:ident : tactic => `(tactic|(have $h : _∧_ := And.intro $hp $hq)) macro "disj_elim" hp:ident hq:ident "from" h:term:arg : tactic => `(tactic|(refine Or.elim $h (fun $hp => ?_) (fun $hq => ?_))) macro "disj_intro_left" h:ident "from" hp:ident q:term:arg : tactic => `(tactic|(have $h : _∨($q) := Or.inl $hp)) macro "disj_intro_right" h:ident "from" p:term:arg hq:ident : tactic => `(tactic|(have $h : ($p)∨_ := Or.inr $hq)) macro "impl_elim" hq:ident "from" hp:ident hpq:ident : tactic => `(tactic|(have $hq := $hpq $hp)) namespace And theorem elim' {P Q : Prop} {R : Sort} (h : P ∧ Q) (f : P → Q → R) : R := by sorry end And open Classical theorem not_not_from { P : Prop } : P → ¬ ¬ P := by sorry theorem from_not_not { P : Prop } : ¬ ¬ P → P := by sorry theorem iff_not_not { P : Prop } : P ↔ ¬ ¬ P := by sorry theorem exists_not_from_not_forall { S : Type } { P : S → Prop } (h : ¬ ∀ x : S, P x ) : ∃ x : S, ¬ P x := by sorry theorem or_not_from_not_and { P Q : Prop } ( h : ¬ ( P ∧ Q ) ) : ¬ P ∨ ¬ Q := by sorry theorem contrapositive ( P Q : Prop ) ( h : ¬ Q → ¬ P ) : P → Q := by sorry example { P Q R : Prop } ( h : Q → ¬ P ) : P → ¬ (Q ∧ R) := by sorry example { P Q R : Prop } ( h : Q → ¬ P ) : P → ¬ (Q ∧ R) := by sorry example { P Q : Prop } : ¬ ( P ∧ Q ) → ( ¬ P ∨ ¬ Q ) := by sorry