证据涉及可判定的平等

时间:2012-10-27 01:05:06

标签: agda

我试图证明一些关于使用可判定等式的函数的简单事情。这是一个非常简单的例子:

open import Relation.Nullary
open import Relation.Binary
open import Relation.Binary.PropositionalEquality

module Foo {c} {ℓ} (ds : DecSetoid c ℓ) where

open DecSetoid ds hiding (refl)

data Result : Set where
  something something-else : Result

check : Carrier → Carrier → Result
check x y with x ≟ y
... | yes _ = something
... | no  _ = something-else

现在,我试图证明这样的事情,我已经证明_≟_的两边是相同的。

check-same : ∀ x → check x x ≡ something
check-same x = {!!}

此时,目前的目标是(check ds x x | x ≟ x) ≡ something。如果x ≟ x本身,我会通过使用类似refl的东西来解决它,但在这种情况下,我能想到的最好的是这样的:

check-same x with x ≟ x
... | yes p = refl
... | no ¬p with ¬p (DecSetoid.refl ds) 
... | ()

本身并没有那么糟糕,但是在一个更大的证据的中间,这是一个烂摊子。当然必须有更好的方法来做到这一点?

1 个答案:

答案 0 :(得分:3)

由于我的函数(如示例中的函数)不关心x ≟ y返回的证明对象,因此我能够将其替换为返回布尔值的⌊ x ≟ y ⌋

这让我写了这个引理

≟-refl : ∀ x → ⌊ x ≟ x ⌋ ≡ true
≟-refl x with x ≟ x 
... | yes p = refl
... | no ¬p = ⊥-elim (¬p (DecSetoid.refl ds))

然后我可以使用rewrite将我的证明简化为

check-same x rewrite ≟-refl x = refl