一个非常基本的问题,但作为一个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。感谢。
答案 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
有两个构造函数:yes
和no
,您可以在模式匹配中使用它们:
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 ⌋