agda中的宇宙量化

时间:2014-12-14 11:38:57

标签: agda

我可以发现问题并添加宇宙量化。

但如果有人能拼出真正发生的事情,那将会很有趣。

module Level0Equality (A : Set) where
  data _Tauto'_ :  A → A → Set where
    refl2 : (a : A) → a Tauto' a

  -- universe quantified
  data _Tauto_ {l} {A : Set l} :  A → A → Set l where
    refl2 : (a : A) → a Tauto a

  -- PEq x =  the type of proof that y ≡ x 
  data PEq  {A : Set} ( x : A ) : Set  where
    it : (y : A ) -> (y Tauto x ) -> PEq x

  -- does not work because of lack of universe quantification in Tauto'
  -- A !=< A of type Set
  -- (because one has deBruijn index 2 and the other 3)
  -- when checking that the expression y has type A
  data PEq'  {A : Set} ( x : A ) : Set  where
    it : (y : A ) -> (y Tauto' x ) -> PEq' x

1 个答案:

答案 0 :(得分:3)

问题在于,您对PEq'的定义告诉我们,它适用于来自A的任何Set。但是,_Tauto'_仅适用于用户提供的A作为Level0Equality的模块参数。

让我用一个例子来证明:

open Level0Equality Bool

_Tauto'_ : Bool → Bool → Set
PEq' : {A : Set} → A → Set

假设我们选择A = String,那么我们有:

PEq' {A = String} : String → Set

这显然会导致PEq'.it构造函数出现问题。 xy的类型现在都是String,但相等_Tauto'_仅适用于Bool s!


修复非常简单:使用模块望远镜中的A

data PEq' ( x : A ) : Set  where
  it : (y : A ) -> (y Tauto' x ) -> PEq' x