| 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! |