lean2/library/init/simplifier.lean
2015-12-04 08:30:04 -08:00

85 lines
2.8 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/-
Copyright (c) 2015 Daniel Selsam. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Author: Daniel Selsam
-/
prelude
import init.logic
namespace simplifier
namespace unit_simp
open eq.ops
-- TODO(dhs): prove these lemmas elsewhere and only gather the
-- [simp] attributes here
variables {A B C : Prop}
lemma and_imp [simp] : (A ∧ B → C) ↔ (A → B → C) :=
iff.intro (assume H a b, H (and.intro a b))
(assume H ab, H (and.left ab) (and.right ab))
lemma or_imp [simp] : (A B → C) ↔ ((A → C) ∧ (B → C)) :=
iff.intro (assume H, and.intro (assume a, H (or.inl a))
(assume b, H (or.inr b)))
(assume H ab, and.rec_on H
(assume Hac Hbc, or.rec_on ab Hac Hbc))
lemma imp_and [simp] : (A → B ∧ C) ↔ ((A → B) ∧ (A → C)) :=
iff.intro (assume H, and.intro (assume a, and.left (H a))
(assume a, and.right (H a)))
(assume H a, and.rec_on H
(assume Hab Hac, and.intro (Hab a) (Hac a)))
-- TODO(dhs, leo): do we want to pre-process away the [iff]s?
/-
lemma iff_and_imp [simp] : ((A ↔ B) → C) ↔ (((A → B) ∧ (B → A)) → C) :=
iff.intro (assume H1 H2, and.rec_on H2 (assume ab ba, H1 (iff.intro ab ba)))
(assume H1 H2, H1 (and.intro (iff.elim_left H2) (iff.elim_right H2)))
-/
lemma a_of_a [simp] : (A → A) ↔ true :=
iff.intro (assume H, trivial)
(assume t a, a)
lemma not_true_of_false [simp] : ¬ true ↔ false :=
iff.intro (assume H, H trivial)
(assume f, false.rec (¬ true) f)
lemma imp_true [simp] : (A → true) ↔ true :=
iff.intro (assume H, trivial)
(assume t a, trivial)
lemma true_imp [simp] : (true → A) ↔ A :=
iff.intro (assume H, H trivial)
(assume a t, a)
lemma fold_not [simp] : (A → false) ↔ ¬ A :=
iff.intro id id
lemma false_imp [simp] : (false → A) ↔ true :=
iff.intro (assume H, trivial)
(assume t f, false.rec A f)
lemma ite_and [simp] [A_dec : decidable A] : ite A B C ↔ ((A → B) ∧ (¬ A → C)) :=
iff.intro (assume H, and.intro (assume a, implies_of_if_pos H a)
(assume a, implies_of_if_neg H a))
(assume H, and.rec_on H
(assume Hab Hnac, decidable.rec_on A_dec
(assume a,
assert rw : @decidable.inl A a = A_dec, from
subsingleton.rec_on (subsingleton_decidable A)
(assume H, H (@decidable.inl A a) A_dec),
by rewrite [rw, if_pos a] ; exact Hab a)
(assume na,
assert rw : @decidable.inr A na = A_dec, from
subsingleton.rec_on (subsingleton_decidable A)
(assume H, H (@decidable.inr A na) A_dec),
by rewrite [rw, if_neg na] ; exact Hnac na)))
end unit_simp
end simplifier