proof - 如何证明类型在 Agda 中有效?

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

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

假设我们有一个定理 f-equal

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

最佳答案

你可以显式改变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

关于proof - 如何证明类型在 Agda 中有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25737609/

相关文章:

haskell - 我们为什么需要容器?

agda - 在商类型上定义非一元函数时避免外延假设

prolog - 自动定理证明

isabelle - 如何在 Isabelle 证明中打印局部变量和 ?thesis(在 Isabelle 中调试)?

c - 如何证明 C 语句 -x、~x+1 和 ~(x-1) 产生相同的结果?

algorithm - 下面的算法稳定吗?

algorithm - 你能把 K-Independent Set 减少到 2-SAT 吗

io - Agda:无法执行 IO - 缺少 Data.FFI、IO.FFI

isabelle - 如何生成html版的伊莎贝尔理论

java - 使用 "*.isInstance"的正确方向是什么?