假设我们想证明削弱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
获得原始载体?
答案 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 n
,getSize x = n != (n + 1) = getSize (weaken x)
。这不会发生在仅依赖于构造函数的函数上,例如finToNat
。因此,你必须将自己局限于那些,并证明他们的行为就像那样。