精益中的依赖类型有界范围

时间:2018-01-07 20:50:31

标签: lean

假设我想创建一个边界为Z的有界整数a b

def zbound (x₁ x₂ : ℤ) :=
  { n : ℤ // x₁ ≤ n ∧ n ≤ x₂ }

这是一个有界整数的合理表示吗?

现在,我想创建一系列从ab的数字。

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)。如何解决这个问题?我尝试通过显示如果xa限制较低的情况来解决问题,那么它也会受到小于a的每个数字的限制,因此保持形式{{1}的范围(os显然是zbound fro to}的界限。但我不知道如何使用这个想法,或者即使使用它也是有意义的。

1 个答案:

答案 0 :(得分:1)

我不确定这是一个理想的解决方案,但它对我有用。 首先,我们需要一个引理来削弱有界范围:

sapply( purrr::pmap(df_map, power.t.test), "[[", "n")
[1]  72.800532  85.031289 104.927952  18.968545  22.021098  26.989219   9.053694  10.401465
[9]  12.598722

> cbind( df_map, n=sapply( purrr::pmap(df_map, power.t.test), "[[", "n") )
  power delta          n
1  0.85   0.5  72.800532
2  0.90   0.5  85.031289
3  0.95   0.5 104.927952
4  0.85   1.0  18.968545
5  0.90   1.0  22.021098
6  0.95   1.0  26.989219
7  0.85   1.5   9.053694
8  0.90   1.5  10.401465
9  0.95   1.5  12.598722

然后我们可以根据弱化范围重新定义范围:

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 { ... }