Types Agda中NAT向量的比较

Types Agda中NAT向量的比较,types,functional-programming,agda,dependent-type,Types,Functional Programming,Agda,Dependent Type,我试图使用可判定等式来比较Agda中的两个NAT向量。我尝试打开向量相等模块,将Nat DecSetoid作为参数传递,如下所示: open import Data.Nat open import Data.Vec open import Relation.Binary.PropositionalEquality import Data.Vec.Equality myFunction : {n : ℕ} -> Vec ℕ n -> Vec ℕ n -> ℕ myFunct

我试图使用可判定等式来比较Agda中的两个NAT向量。我尝试打开向量相等模块,将Nat DecSetoid作为参数传递,如下所示:

open import Data.Nat
open import Data.Vec

open import Relation.Binary.PropositionalEquality
import Data.Vec.Equality

myFunction : {n : ℕ} -> Vec ℕ n -> Vec ℕ n -> ℕ 
myFunction v1 v2 
  with v1 Data.Vec.Equality.DecidableEquality.≟ v2
... | _  =  {!!}
  where 
    open Data.Vec.Equality.DecidableEquality  (Relation.Binary.PropositionalEquality.decSetoid Data.Nat._≟_) 
但是,我得到以下错误:

Vec ℕ .n !=< .Relation.Binary.DecSetoid (_d₁_6 v1 v2) (_d₂_7 v1 v2)
of type Set
when checking that the expression v1 has type
.Relation.Binary.DecSetoid (_d₁_6 v1 v2) (_d₂_7 v1 v2)

我不确定我做错了什么。我使用的模块系统是错误的,还是需要使用≟ 不同的是?

这里的问题是where子句没有将标识符带到with中表达式的作用域中。所以当你使用Data.Vec.Equality.decisablequality时。≟, 你指的不是专门研究自然数向量的,而是在Data.Vec.Equality中定义的一般向量。这就是为什么Agda希望DecSetoid作为第一个参数并抱怨

一种可能的修复方法是首先命名您感兴趣的模块,然后使用限定名引用其名称_≟_. 我通过将别名定义为以下方式,自由地使用了较短的名称:


这里的问题是where子句没有将标识符带到with中表达式的作用域中。所以当你使用Data.Vec.Equality.decisablequality时。≟, 你指的不是专门研究自然数向量的,而是在Data.Vec.Equality中定义的一般向量。这就是为什么Agda希望DecSetoid作为第一个参数并抱怨

一种可能的修复方法是首先命名您感兴趣的模块,然后使用限定名引用其名称_≟_. 我通过将别名定义为以下方式,自由地使用了较短的名称:


您还可以在本地定义、导入和打开模块:

open import Data.Nat
open import Data.Vec

open import Relation.Binary.PropositionalEquality as P
import Data.Vec.Equality as VE

myFunction : {n : ℕ} -> Vec ℕ n -> Vec ℕ n -> ℕ 
myFunction v1 v2 with let module DVE = VE.DecidableEquality (decSetoid _≟_) in v1 DVE.≟ v2
... | _ = {!!}
但是,在您的案例中,您并不真正需要-模式匹配lambda就足够了:

open import Function
open import Relation.Nullary

myFunction : {n : ℕ} -> Vec ℕ n -> Vec ℕ n -> ℕ 
myFunction v1 v2 = case v1 DVE.≟ v2 of λ
    { (no  p) -> {!!}
    ; (yes p) -> {!!}
    }
  where module DVE = VE.DecidableEquality (decSetoid _≟_)

您还可以在本地定义、导入和打开模块:

open import Data.Nat
open import Data.Vec

open import Relation.Binary.PropositionalEquality as P
import Data.Vec.Equality as VE

myFunction : {n : ℕ} -> Vec ℕ n -> Vec ℕ n -> ℕ 
myFunction v1 v2 with let module DVE = VE.DecidableEquality (decSetoid _≟_) in v1 DVE.≟ v2
... | _ = {!!}
但是,在您的案例中,您并不真正需要-模式匹配lambda就足够了:

open import Function
open import Relation.Nullary

myFunction : {n : ℕ} -> Vec ℕ n -> Vec ℕ n -> ℕ 
myFunction v1 v2 = case v1 DVE.≟ v2 of λ
    { (no  p) -> {!!}
    ; (yes p) -> {!!}
    }
  where module DVE = VE.DecidableEquality (decSetoid _≟_)