证明`弱化'不会改变数字的值

时间:2018-05-16 18:11:11

标签: idris

假设我们想证明削弱let url = `https://translation.googleapis.com/language/translate/v2?key=${API_KEY}`; url += '&q=' + encodeURI(text); url += `&source=${fromLang}`; url += `&target=${toLang}`;的上限不会改变数字的值。说明这一点的直观方式是:

Data.Fin

现在让我们生成defini ...坚持下去!让我们考虑一下这个陈述。 weakenEq : (num : Fin n) -> num = weaken num num有不同的类型。我们可以在这种情况下陈述相等吗?

weaken num上的文档建议我们可以尝试,但我们可能希望使用=。好吧,无论如何,让我们继续生成定义和案例分割,从而产生

~=~

weakenEq : (num : Fin n) -> num = weaken num weakenEq FZ = ?weakenEq_rhs_1 weakenEq (FS x) = ?weakenEq_rhs_2 洞的目标是weakenEq_rhs_1,从价值的角度来看仍然有意义。因此,我们乐观地用FZ = FZ替换洞,但只是失败:

Refl

有点神秘的错误信息,所以我们想知道这是否真的与不同的类型有关。

无论如何,我们再试一次,但现在使用When checking right hand side of weakenEq with expected type FZ = weaken FZ Unifying k and S k would lead to infinite value 代替~=~。不幸的是,错误仍然是一样的。

那么,人们如何陈述并证明=不会改变weaken x的价值?它真的有意义吗?如果这是一个较大证明的一部分我应该做什么,我可能希望x rewrite Vect n (Fin k) Vect n (Fin (S k))通过map ping weaken获得原始载体?

2 个答案:

答案 0 :(得分:4)

如果你真的想证明在应用弱化函数后Fin n的值没有改变,你需要证明这些值的相等性:

weakenEq: (num: Fin n) -> finToNat num = finToNat $ weaken num
weakenEq FZ     = Refl
weakenEq (FS x) = cong $ weakenEq x

答案 1 :(得分:1)

你的第二个问题/ Markus'关于map (Data.Fin.finToNat) v = map (Data.Fin.finToNat . Data.Fin.weaken) v的评论:

vectorWeakenEq : (v: Vect n (Fin k)) -> 
                 map Fin.finToNat v = map (Fin.finToNat . Fin.weaken) v
vectorWeakenEq [] = Refl
vectorWeakenEq (x :: xs) =
  rewrite sym $ weakenEq x in
  cong {f=(::) (finToNat x)} (vectorWeakenEq xs)

要了解为什么num = weaken num无法工作,让我们来看一个反例:

getSize : Fin n -> Nat
getSize _ {n} = n

现在使用x : Fin ngetSize x = n != (n + 1) = getSize (weaken x)。这不会发生在仅依赖于构造函数的函数上,例如finToNat。因此,你必须将自己局限于那些,并证明他们的行为就像那样。