refl in agda:解释同余属性

时间:2014-11-23 16:59:41

标签: equality agda

使用以下等式定义,我们将refl作为构造函数

data _≡_ {a} {A : Set a} (x : A) : A → Set a where
    refl : x ≡ x

我们可以证明函数在平等上是一致的

cong : ∀ { a b} { A : Set a }  { B : Set b }
       (f : A → B ) {m  n}  → m ≡ n → f m ≡ f n
cong f  refl  = refl

我不确定我能解析究竟发生了什么。 我认为我们是隐藏参数的模式匹配refl:如果我们用refl替换第一个出现的另一个标识符,我们得到一个类型错误。 在模式匹配之后,我想通过refl的定义m和n是相同的。然后魔术发生(关系的功能定义应用?还是内置?)

是否有关于发生了什么的直观描述?

1 个答案:

答案 0 :(得分:5)

是的,花括号{}中的参数是隐含的,只有在agda无法解决时才需要提供或匹配它们。有必要指定它们,因为依赖类型需要引用它们所依赖的值,但是一直拖动它们会使代码变得笨重。

表达式cong f refl = refl与显式参数(A → B)和(m ≡ n)匹配。如果你想匹配隐式参数,你需要将匹配的表达式放在{}中,但是这里没有必要。然后在右侧,它确实是使用f m ≡ f n构建(refl),它通过魔法和#34;起作用。 Agda有一个内置的公理,证明这是真的。这个公理是相似的(但强于)J - 公理 - 归纳公理:如果某个C : (x y : A) → (x ≡ y) → Set对于C x x refl是正确的,那么对任何x y : A来说也是如此p : x ≡ y

J : forall {A : Set} {C : (x y : A) → (x ≡ y) → Set} →
                     (c : ∀ x → C x x refl) →
                     (x y : A) → (p : x ≡ y) → C x y p
-- this really is an axiom, but in Agda there is a stronger built-in,
-- which can be used to prove this
J c x .x refl = c x -- this _looks_ to only mean x ≡ x
                    -- but Agda's built-in extends this proof to all cases
                    -- for which x ≡ y can be constructed - that's the point
                    -- of having induction

cong : ∀ { a b} { A : Set a }  { B : Set b }
       (f : A → B ) {m  n}  → m ≡ n → f m ≡ f n
cong f {x} {y} p = J {C = \x y p → f x ≡ f y} -- the type of equality
                                               -- of function results
                     (\_ → refl) -- f x ≡ f x is true indeed
                     x y p

(在最后一行中,我们:匹配显式参数fp,以及隐式参数m=xn=y。然后我们传递给{{1}一个隐式参数,但它不是第一个位置隐式,所以我们告诉agda它在定义中是J - 如果不这样做,Agda不会看到{{1}的含义是什么在C