我在上一个问题Using the value of a computed function for a proof in agda 中看到了检查函数的示例,但我仍然无法解决这个问题。
这是一个简单的例子:
给定函数crazy
,
crazy : ℕ -> ℕ
crazy 0 = 10
crazy 1 = 0
crazy 2 = 0
crazy 3 = 1
crazy 4 = 0
crazy xxx = xxx
我想创建一个safe
这样的函数safe : {nn : ℕ} -> (id nn) ≢ 0 -> Fin (id nn)
。换句话说,它会返回一个数字 mod crazy,如果你给它一个疯狂的证明是 0。(我知道这个例子有点做作,我可能会更好地使用suc
函数签名)
我的第一个解决方案是
safebad : {nn : ℕ} -> (crazy nn) ≢ 0 -> Fin (crazy nn)
safebad {1} hh with hh refl
... | ()
safebad {2} hh with hh refl
... | ()
safebad {4} hh with hh refl
... | ()
safebad {0} hh = # 0
safebad {3} hh = # 0
safebad {suc (suc (suc (suc (suc _))))} _ = # 0
但这是漫长而混乱的。因此,我尝试在将计算函数的值用于 agda 中的证明中模拟示例,但只能到此为止
safegood : (nn : ℕ) -> (crazy nn) ≢ 0 -> Fin (crazy nn)
safegood nn nez with crazy nn | inspect crazy nn
... | 0 | [ proof ] = ⊥-elim ???
... | _ | _ = # 0
我认为,inspect 使用 Hidden 在类型签名中隐藏函数应用程序的记录。然后可以使用reveal来检索它。
这是我认为我理解的:
Reveal_is_
似乎持有隐藏的价值f
,并且x
;以及x
应用于的结果f
。 [_]
将导致该相等性的证明。
⊥-elim
接受矛盾证明并返回矛盾。
我要投入什么才能让它???
发挥作用?