This PR adjusts the experimental module system to make `private` the default visibility modifier in `module`s, introducing `public` as a new modifier instead. `public section` can be used to revert the default for an entire section, though this is more intended to ease gradual adoption of the new semantics such as in `Init` (and soon `Std`) where they should be replaced by a future decl-by-decl re-review of visibilities.
46 lines
1.7 KiB
Text
46 lines
1.7 KiB
Text
/-
|
||
Copyright (c) 2024 Lean FRO, LLC. All rights reserved.
|
||
Released under Apache 2.0 license as described in the file LICENSE.
|
||
Authors: Leonardo de Moura, Mario Carneiro
|
||
-/
|
||
module
|
||
|
||
prelude
|
||
public import Init.Classical
|
||
|
||
public section
|
||
|
||
/-! # by_cases tactic and if-then-else support -/
|
||
|
||
/--
|
||
`by_cases (h :)? p` splits the main goal into two cases, assuming `h : p` in the first branch, and `h : ¬ p` in the second branch.
|
||
-/
|
||
syntax "by_cases " (atomic(ident " : "))? term : tactic
|
||
|
||
macro_rules
|
||
| `(tactic| by_cases $e) => `(tactic| by_cases h : $e)
|
||
macro_rules
|
||
| `(tactic| by_cases $h : $e) =>
|
||
`(tactic| open Classical in refine if $h:ident : $e then ?pos else ?neg)
|
||
|
||
/-! ## if-then-else -/
|
||
|
||
@[simp] theorem if_true {_ : Decidable True} (t e : α) : ite True t e = t := if_pos trivial
|
||
|
||
@[simp] theorem if_false {_ : Decidable False} (t e : α) : ite False t e = e := if_neg id
|
||
|
||
theorem ite_id [Decidable c] {α} (t : α) : (if c then t else t) = t := by split <;> rfl
|
||
|
||
/-- A function applied to a `dite` is a `dite` of that function applied to each of the branches. -/
|
||
theorem apply_dite (f : α → β) (P : Prop) [Decidable P] (x : P → α) (y : ¬P → α) :
|
||
f (dite P x y) = dite P (fun h => f (x h)) (fun h => f (y h)) := by
|
||
by_cases h : P <;> simp [h]
|
||
|
||
/-- A function applied to a `ite` is a `ite` of that function applied to each of the branches. -/
|
||
theorem apply_ite (f : α → β) (P : Prop) [Decidable P] (x y : α) :
|
||
f (ite P x y) = ite P (f x) (f y) :=
|
||
apply_dite f P (fun _ => x) (fun _ => y)
|
||
|
||
/-- A `dite` whose results do not actually depend on the condition may be reduced to an `ite`. -/
|
||
@[simp] theorem dite_eq_ite [Decidable P] :
|
||
(dite P (fun _ => a) (fun _ => b)) = ite P a b := rfl
|