簡體   English   中英

如何證明類型在Agda中有效?

[英]How can I prove a type is valid in Agda?

我正在嘗試對依賴函數進行證明,並且遇到了麻煩。

假設我們有一個定理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

使得編譯器不滿意,因為它無法確定fx和fy是同一類型。 這似乎應該是一個可解決的問題。 是嗎?

注意; 使用的等價關系定義如下:

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

您可以顯式更改fx的類型:

Π-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中的Cc Cd 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-equalcong標准庫。

它可以通過異構等式處理,可以從Relation.Binary.HeterogeneousEquality導入:

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

憑直覺,嘿。 平等帶有關於所涉及類型的平等以及價值觀念平等的證據。

您可以在模塊中找到標准等價函數( substtranscong等)的類似物。 另外,您可以來回轉換標准和het。 使用≅-to-≡≡-to-≅ ,但僅當側面的類型可證明是相等時。

請注意,het不能使用“ rewrite”語法。 平等。

另外,我們可以使用標准等式,將其中一面強制轉換為適當的類型:

Π-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。 平等,但我發現。 平等容易得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM