如何在Agda中证明某种类型有效?

时间:2014-09-09 06:01:44

标签: proof agda theorem-proving dependent-type type-theory

我正在尝试对依赖函数进行证明,而且我遇到了障碍。

所以我们假设我们有一个f-相等的定理

f-equal : ∀ {A B} {f : A → B} {x y : A} → x ≡ y → f x ≡ f y
f-equal refl = refl

我试图证明一个关于依赖函数的平等保存的更普遍的概念,并且陷入困境。即,类型

Π-equal : ∀ {A} {B : A → Set} {f : {a : A} → B a} {x y : A} →
            x ≡ y → f x ≡ f y

让编译器不高兴,因为它无法弄清楚f x和f y属于同一类型。这似乎是一个可以修复的问题。是吗?

请注意;使用的等价关系定义如下:

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

2 个答案:

答案 0 :(得分:6)

您可以明确更改f x的类型:

Π-equal : ∀ {α β} {A : Set α} {B : A -> Set β} {f : (x : A) -> B x} {x y : A}
        -> (p : x ≡ y) -> P.subst B p (f x) ≡ f y
Π-equal refl = refl

或者

Π-equal'T : ∀ {α β} {A : Set α} {B : A -> Set β} -> ((x : A) -> B x) -> (x y : A) -> x ≡ y -> Set β
Π-equal'T f x y p with f x | f y
...| fx | fy rewrite p = fx ≡ fy

Π-equal' : ∀ {α β} {A : Set α} {B : A -> Set β} {f : (x : A) -> B x} {x y : A}
        -> (p : x ≡ y) -> Π-equal'T f x y p
Π-equal' refl = refl

或者您可以使用异构平等:

Π-equal'' : ∀ {α β} {A : Set α} {B : A -> Set β} {f : (x : A) -> B x} {x y : A}
          -> x ≡ y -> f x ≅ f y
Π-equal'' refl = refl

subst函数也很有用,这是它的类型(Emacs中的C-c C-d P.subst):

{a p : .Agda.Primitive.Level} {A : Set a} (P : A → Set p)
      {x y : A} →
      x ≡ y → P x → P y

使用的进口商品:

open import Relation.Binary.PropositionalEquality as P
open import Relation.Binary.HeterogeneousEquality as H

顺便说一句,您的f-equal在标准库中是cong

答案 1 :(得分:2)

它可以通过异构相等来处理,可以从Relation.Binary.HeterogeneousEquality

导入
data _≅_ {ℓ} {A : Set ℓ} (x : A) : {B : Set ℓ} → B → Set ℓ where
   refl : x ≅ x

直观地说,het。平等带有关于所涉及的类型的平等以及价值观平等的证据。

您可以在模块中找到标准相等(substtranscong等)函数的类似物。此外,你可以来回转换标准和het。使用≅-to-≡≡-to-≅进行平等,但仅限于两侧的类型明显相等。

请注意,“重写”语法不能与het一起使用。平等。

或者,我们可以使用标准相等,其中一方被强制使用相应的类型:

Π-equal : 
  ∀ {A : Set} {B : A → Set}{f : ∀ a → B a}{x y : A} → (p : x ≡ y) → subst B p (f x) ≡ f y
Π-equal refl = refl

这种方法实际上相当于het。平等,但我找到了。平等更容易使用。