证明其中包含 decEq 的函数的 属性

Prove a property of a function with a decEq in it

很容易证明

f : Nat -> Nat

proveMe : (x : Nat) -> Maybe Nat
proveMe x = if (f x) == 0 then Just 42 else Nothing

theProof : (x : Nat) -> (f x = Z) -> (Just 42 = proveMe x)
theProof x prf = rewrite prf in Refl

但是如果Just 42的计算需要证明f x = 0呢?

proveMe2 : (x : Nat) -> Maybe Nat
proveMe2 x with (decEq (f x) Z)
    | Yes prf = Just 42
    | No _ = Nothing

theProof2 : (x : Nat) -> (f x = Z) -> (Just 42 = proveMe2 x)
theProof2 x prf = ?howToFillThis

我现在如何证明?

我试图“遵循 with 子句的结构”,但这样做时我必须让伊德里斯相信反例是不可能的:

theProof3 : (x : Nat) -> (f x = Z) -> (Just 42 = proveMe2 x)
theProof3 x prf with (decEq (f x) Z)
    | Yes prf2 = Refl
    | No contra impossible -- "...is a valid case"

我完全忘记了void : Void -> a。使用 Ex falso quodlibet 证明很简单

theProof3 : (x : Nat) -> (f x = Z) -> (Just 42 = proveMe2 x)
theProof3 x prf with (decEq (f x) Z)
    | Yes prf2 = Refl
    | No contra = void $ contra prf