我可以发现问题并添加宇宙量化。
但如果有人能拼出真正发生的事情,那将会很有趣。
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
答案 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
构造函数出现问题。 x
和y
的类型现在都是String
,但相等_Tauto'_
仅适用于Bool
s!
修复非常简单:使用模块望远镜中的A
。
data PEq' ( x : A ) : Set where
it : (y : A ) -> (y Tauto' x ) -> PEq' x