closes #1279 Originally reported at https://leanprover.zulipchat.com/#narrow/stream/270676-lean4/topic/case.20in.20dependent.20match.20not.20triggering.20.28.3F.29/near/288328239
87 lines
2.6 KiB
Text
87 lines
2.6 KiB
Text
inductive O
|
||
| int
|
||
| real
|
||
| bool
|
||
| unit
|
||
deriving Inhabited, BEq, Repr
|
||
|
||
-- only `Arrow.id` and `Arrow.comp` really matter for my problem
|
||
inductive Arrow : (_dom _cod : O) → Type
|
||
-- identity
|
||
| id : {α : O} → Arrow α α
|
||
|
||
-- `α → α` arrows
|
||
| unit : Arrow O.unit O.unit
|
||
| not : Arrow O.bool O.bool
|
||
| succᵢ : Arrow O.int O.int
|
||
| succᵣ : Arrow O.real O.real
|
||
|
||
| comp {α β γ} : Arrow β γ → Arrow α β → Arrow α γ
|
||
|
||
-- `unit → bool`
|
||
| tru : Arrow O.unit O.bool
|
||
| fls : Arrow O.unit O.bool
|
||
-- `unit → int`
|
||
| zero : Arrow O.unit O.int
|
||
-- `int → bool`
|
||
| isZero : Arrow O.int O.bool
|
||
-- `int → real`
|
||
| toReal : Arrow O.int O.real
|
||
deriving Repr
|
||
|
||
def Arrow.compose₁ {α β γ : O} :
|
||
Arrow β γ
|
||
→ Arrow α β
|
||
→ Arrow α γ
|
||
-- id.compose₁ g = g
|
||
| id, g => g
|
||
-- f.compose₁ id = f
|
||
| f, id => f
|
||
-- else
|
||
| comp f₁ f₂, g => comp f₁ (comp f₂ g)
|
||
| f, g => comp f g
|
||
|
||
#print Arrow.compose₁
|
||
-- def Arrow.compose₁ : {α β γ : O} → Arrow β γ → Arrow α β → Arrow α γ :=
|
||
-- fun {α β γ} x x_1 =>
|
||
-- match β, γ, x, x_1 with
|
||
-- | β, .(β), Arrow.id, g => g
|
||
-- | .(α), γ, f, Arrow.id => f
|
||
-- | β, γ, Arrow.comp f₁ f₂, g => Arrow.comp f₁ (Arrow.comp f₂ g)
|
||
-- | β, γ, f, g => Arrow.comp f g
|
||
#eval Arrow.compose₁ Arrow.unit Arrow.id
|
||
-- Arrow.comp (Arrow.unit) (Arrow.id) -- Error: it should be `Arrow.unit`
|
||
|
||
example : Arrow.compose₁ .id .id = (.id (α := o)) := rfl
|
||
example : Arrow.compose₁ .id .unit = .unit := rfl
|
||
example : Arrow.compose₁ .id (.comp f g) = .comp f g := rfl
|
||
example : Arrow.compose₁ .unit .id = .unit := rfl
|
||
example : Arrow.compose₁ (.comp f g) .id = .comp f g := rfl
|
||
example : Arrow.compose₁ .unit .unit = .comp .unit .unit := rfl
|
||
example : Arrow.compose₁ (.comp f g) .unit = .comp f (.comp g .unit) := rfl
|
||
example : Arrow.compose₁ .unit (.comp f g) = .comp .unit (.comp f g) := rfl
|
||
|
||
theorem ex_1 : Arrow.compose₁ f .id = f := by
|
||
cases f <;> simp!
|
||
|
||
theorem ex_2 : Arrow.compose₁ f .id = f := by
|
||
cases f <;> simp!
|
||
|
||
theorem ex_3 : Arrow.compose₁ .id f = f := by
|
||
cases f <;> simp!
|
||
|
||
theorem ex_4 : h ≠ .id → Arrow.compose₁ (.comp f g) h = .comp f (.comp g h) := by
|
||
intros
|
||
cases h <;> simp_all!
|
||
|
||
def Arrow.isId : Arrow dom com → Prop
|
||
| .id => True
|
||
| _ => False
|
||
|
||
def Arrow.isComp : Arrow dom com → Prop
|
||
| .comp .. => True
|
||
| _ => False
|
||
|
||
theorem ex_5 (f : Arrow β γ) (g : Arrow α β) : ¬ f.isId → ¬ g.isId → ¬ f.isComp → Arrow.compose₁ f g = .comp f g := by
|
||
intros
|
||
cases f <;> cases g <;> simp_all!
|