This PR adds an `foo._unary.eq_def` theorem, so that unfolding `foo._unary` works as expected. This will help with #8019.
99 lines
2.6 KiB
Text
99 lines
2.6 KiB
Text
mutual
|
||
def f : Nat → α → α → α
|
||
| 0, a, b => a
|
||
| n, a, b => g a n b |>.1
|
||
termination_by n _ _ => (n, 2)
|
||
decreasing_by
|
||
apply Prod.Lex.right
|
||
decide
|
||
|
||
def g : α → Nat → α → (α × α)
|
||
| a, 0, b => (a, b)
|
||
| a, n, b => (h a b n, a)
|
||
termination_by _ n _ => (n, 1)
|
||
decreasing_by
|
||
apply Prod.Lex.right
|
||
decide
|
||
|
||
def h : α → α → Nat → α
|
||
| a, b, 0 => b
|
||
| a, b, n+1 => f n a b
|
||
termination_by _ _ n => (n, 0)
|
||
decreasing_by
|
||
apply Prod.Lex.left
|
||
apply Nat.lt_succ_self
|
||
end
|
||
|
||
/-- info: 'a' -/
|
||
#guard_msgs in
|
||
#eval f 5 'a' 'b'
|
||
|
||
/-- info: @f.eq_1 : ∀ {α : Type u_1} (x x_1 : α), f 0 x x_1 = x -/
|
||
#guard_msgs in
|
||
#check @f.eq_1
|
||
/--
|
||
info: @f.eq_2 : ∀ {α : Type u_1} (x : Nat) (x_1 x_2 : α), (x = 0 → False) → f x x_1 x_2 = (g x_1 x x_2).fst
|
||
-/
|
||
#guard_msgs in
|
||
#check @f.eq_2
|
||
/--
|
||
info: @f.eq_def : ∀ {α : Type u_1} (x : Nat) (x_1 x_2 : α),
|
||
f x x_1 x_2 =
|
||
match x, x_1, x_2 with
|
||
| 0, a, b => a
|
||
| n, a, b => (g a n b).fst
|
||
-/
|
||
#guard_msgs in
|
||
#check @f.eq_def
|
||
/-- error: unknown identifier 'f.eq_3' -/
|
||
#guard_msgs in
|
||
#check @f.eq_3
|
||
|
||
/-- info: @h.eq_1 : ∀ {α : Type u_1} (x x_1 : α), h x x_1 0 = x_1 -/
|
||
#guard_msgs in
|
||
#check @h.eq_1
|
||
/-- info: @h.eq_2 : ∀ {α : Type u_1} (x x_1 : α) (n : Nat), h x x_1 n.succ = f n x x_1 -/
|
||
#guard_msgs in
|
||
#check @h.eq_2
|
||
/--
|
||
info: @h.eq_def : ∀ {α : Type u_1} (x x_1 : α) (x_2 : Nat),
|
||
h x x_1 x_2 =
|
||
match x, x_1, x_2 with
|
||
| a, b, 0 => b
|
||
| a, b, n.succ => f n a b
|
||
-/
|
||
#guard_msgs in
|
||
#check @h.eq_def
|
||
|
||
/-- error: unknown identifier 'h.eq_3' -/
|
||
#guard_msgs in
|
||
#check @h.eq_3
|
||
|
||
/--
|
||
info: f._mutual.eq_def.{u_1} {α : Type u_1}
|
||
(x✝ : (_ : Nat) ×' (_ : α) ×' α ⊕' (_ : α) ×' (_ : Nat) ×' α ⊕' (_ : α) ×' (_ : α) ×' Nat) :
|
||
f._mutual x✝ =
|
||
PSum.casesOn x✝
|
||
(fun _x =>
|
||
PSigma.casesOn _x fun a a_1 =>
|
||
PSigma.casesOn a_1 fun a_2 a_3 =>
|
||
match a, a_2, a_3 with
|
||
| 0, a, b => a
|
||
| n, a, b => (f._mutual (PSum.inr (PSum.inl ⟨a, ⟨n, b⟩⟩))).fst)
|
||
fun _x =>
|
||
PSum.casesOn _x
|
||
(fun _x =>
|
||
PSigma.casesOn _x fun a a_1 =>
|
||
PSigma.casesOn a_1 fun a_2 a_3 =>
|
||
match a, a_2, a_3 with
|
||
| a, 0, b => (a, b)
|
||
| a, n, b => (f._mutual (PSum.inr (PSum.inr ⟨a, ⟨b, n⟩⟩)), a))
|
||
fun _x =>
|
||
PSigma.casesOn _x fun a a_1 =>
|
||
PSigma.casesOn a_1 fun a_2 a_3 =>
|
||
match a, a_2, a_3 with
|
||
| a, b, 0 => b
|
||
| a, b, n.succ => f._mutual (PSum.inl ⟨n, ⟨a, b⟩⟩)
|
||
-/
|
||
#guard_msgs in
|
||
#check f._mutual.eq_def
|