精益中的依赖类型有界范围
Dependently typed bounded range in Lean
补充ose 我想创建一个有边界的整数 Z
,边界为 a b
。
def zbound (x₁ x₂ : ℤ) :=
{ n : ℤ // x₁ ≤ n ∧ n ≤ x₂ }
这是有界整数的合理表示吗?
现在我想创建一个从 a
到 b
的数字范围。
def range : ∀(a b : ℤ), list (zbound a b)
| fro to := if h : fro < to
then ⟨fro, and.intro (le_refl _) (int.le_of_lt h)⟩
:: range (fro + 1) to
else []
我可以让它与 range : ℤ → ℤ → list ℤ
一起工作,包括使用 using_well_founded
的终止证明。但是,我发现这种形式不切实际,因为它没有证明范围内的每个数字都是 zbound a b
.
因此,我想获得我的依赖版本。但是,我 运行 认为 range (fro + 1) to
自然是 list (zbound (fro + 1) to)
类型。我需要的是list (zbound fro to)
。如何解决这个问题?我尝试通过证明如果 x
的下限为 a
,那么它也受每个小于 a
的数字的限制,因此保持形式的限制 zbound fro to
](os 这显然在 zbound (fro + 1) to
范围内)。然而,我不知道如何使用这个想法,或者即使使用它是否有意义。
我不确定这是一个理想的解决方案,但它确实适合我。
首先我们需要一个引理来削弱有界范围:
def range_weaken {a b : ℤ} : zbound (a + 1) b → zbound a b
| ⟨i, ⟨lbound, rbound⟩⟩ :=
⟨i, and.intro
(le_of_add_le_left _ 1 _ dec_trivial lbound)
rbound⟩
然后我们可以根据弱化范围重新定义范围:
def range : ∀(a b : ℤ), list (zbound a b)
| fro to := if h : fro < to
then ⟨fro, and.intro (le_refl _) h⟩
:: list.map range_weaken (range (fro + 1) to)
else []
using_well_founded { ... }
注意:我找不到我要找的引理,所以我手工证明了以下内容:
def le_of_add_le_left (a b c : ℤ) : 0 ≤ b → a + b ≤ c → a ≤ c
补充ose 我想创建一个有边界的整数 Z
,边界为 a b
。
def zbound (x₁ x₂ : ℤ) :=
{ n : ℤ // x₁ ≤ n ∧ n ≤ x₂ }
这是有界整数的合理表示吗?
现在我想创建一个从 a
到 b
的数字范围。
def range : ∀(a b : ℤ), list (zbound a b)
| fro to := if h : fro < to
then ⟨fro, and.intro (le_refl _) (int.le_of_lt h)⟩
:: range (fro + 1) to
else []
我可以让它与 range : ℤ → ℤ → list ℤ
一起工作,包括使用 using_well_founded
的终止证明。但是,我发现这种形式不切实际,因为它没有证明范围内的每个数字都是 zbound a b
.
因此,我想获得我的依赖版本。但是,我 运行 认为 range (fro + 1) to
自然是 list (zbound (fro + 1) to)
类型。我需要的是list (zbound fro to)
。如何解决这个问题?我尝试通过证明如果 x
的下限为 a
,那么它也受每个小于 a
的数字的限制,因此保持形式的限制 zbound fro to
](os 这显然在 zbound (fro + 1) to
范围内)。然而,我不知道如何使用这个想法,或者即使使用它是否有意义。
我不确定这是一个理想的解决方案,但它确实适合我。 首先我们需要一个引理来削弱有界范围:
def range_weaken {a b : ℤ} : zbound (a + 1) b → zbound a b
| ⟨i, ⟨lbound, rbound⟩⟩ :=
⟨i, and.intro
(le_of_add_le_left _ 1 _ dec_trivial lbound)
rbound⟩
然后我们可以根据弱化范围重新定义范围:
def range : ∀(a b : ℤ), list (zbound a b)
| fro to := if h : fro < to
then ⟨fro, and.intro (le_refl _) h⟩
:: list.map range_weaken (range (fro + 1) to)
else []
using_well_founded { ... }
注意:我找不到我要找的引理,所以我手工证明了以下内容:
def le_of_add_le_left (a b c : ℤ) : 0 ≤ b → a + b ≤ c → a ≤ c