在Agda进行平等测试分支? (基本)

时间:2014-12-05 00:09:16

标签: agda

一个非常基本的问题,但作为一个Agda初学者,我很难过。

我只想检查两个术语是否相等,并根据不同的情况返回不同的东西。我可以编写自己的相等测试程序,但是我如何使用equiv(或者正确的方法)来做这个?

这是一个最小的例子:

import Data.Nat
import Relation.Binary
myeqtest : ℕ → ℕ → ℕ
myeqtest x y = if x Data.Nat.≟ y then true else false

错误讯息:     .Relation.Nullary.Core.Dec(x.Relation.Binary.Core.Dummy.≡y)!=<     布尔型Set     检查表达式xData.Nat.≟y是否具有Bool类型

我实际上想要做一些更复杂的事情(我知道上面的内容在几个方面是多余的),但关键是x \?= y不是Bool类型,它是Set类型,我不知道怎么把那套Set变成Bool。感谢。

1 个答案:

答案 0 :(得分:8)

无聊进口:

open import Relation.Nullary
open import Relation.Nullary.Decidable
open import Relation.Binary.Core
open import Data.Bool hiding (_≟_)
open import Data.Nat

现在让我们问阿格达,她的想法是什么:

myeqtest : ℕ -> ℕ -> Bool
myeqtest x y = {!x ≟ y!}
孔中的C-C C-d给出Dec (x ≡ y)Dec是关于可判定的命题,并在Relation.Nullary.Core模块中定义:

data Dec {p} (P : Set p) : Set p where
  yes : ( p :   P) → Dec P
  no  : (¬p : ¬ P) → Dec P

即。始终存在P¬ P的证明,其中¬表示"不是"。对于某些命题,这只是一个被排除在中间的手工制定法则。在我们的例子中,始终存在一个证据,即一个数字与另一个数字相等或不相等。

所以Dec有两个构造函数:yesno,您可以在模式匹配中使用它们:

myeqtest : ℕ -> ℕ -> Bool
myeqtest x y with x ≟ y
... | yes _ = true
... | no  _ = false

Relation.Nullary.Decidable模块中有一个功能,可将Dec变为Bool

⌊_⌋ : ∀ {p} {P : Set p} → Dec P → Bool
⌊ yes _ ⌋ = true
⌊ no  _ ⌋ = false

因此,您可以将myeqtest定义为

myeqtest : ℕ -> ℕ -> Bool
myeqtest x y = if ⌊ x ≟ y ⌋ then true else false

或只是

myeqtest : ℕ -> ℕ -> Bool
myeqtest x y = ⌊ x ≟ y ⌋