This PR sets up the new integrated test/bench suite. It then migrates all benchmarks and some related tests to the new suite. There's also some documentation and some linting. For now, a lot of the old tests are left alone so this PR doesn't become even larger than it already is. Eventually, all tests should be migrated to the new suite though so there isn't a confusing mix of two systems.
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!
|