簡體   English   中英

一個人如何編寫(和調試)一個依賴於兩個參數的應用程序 apd2,並使用它來證明這種 ap 在 agda 中的功能性?

[英]How does one write (and debug) a two arguement dependent application, apd2, and use this to prove functoriality of such ap in agda?

我試圖在依賴產品類型下證明 ap 的函數性,類似於在 Agda 的 HoTT 書中的定理 2.6.5,並且對於如何在存在的情況下如何呈現函數性條件的類型感到困惑依賴類型,因為它需要傳輸。 本書在第 2.7 節的末尾建議將此作為練習。

functorDProdEq : {A A' : Set} {P : A → Set} {Q : A' → Set} (g : A → A')
                 (h : (a : A) →  P a → Q (g a))
                 → ((x1 , y1) (x2 , y2) : Σ A λ a → P a)
                 → (p : x1 ≡ x2) (q : p* {p = p} y1 ≡ y2)
                 → apf (λ - → fDprod g h -) (dpair= (p , q))
                 ≡ dpair= ((apf g p , {!apd (ap2 h ? ?)!} ))
functorDProdEq = {!!}

上面是嘗試的定義,下面有一個獨立的文件,可以從中找到支持材料。 洞中的目標是:

Goal: p* (h (fst .patternInTele0) (snd .patternInTele0)) ≡
      h (fst .patternInTele1) (snd .patternInTele1)

在下面看到的上下文中。 我不了解 patternInTele* 業務,因為我不知道它會在哪里聲明,並且非常感謝任何詳細說明。 此外,我想實現一個依賴應用程序 function 有兩個相等, ap2d ,前者的傳輸引起的第二個相等。

ap2d : {A : Set} {x x' : A}  {P : A → Set} {y : P x} {y' : P x'} {C : (x : A)
  → P x → Set} (f : (x : A) → (y : P x) → C x y )
  → (p : x ≡ x') → (q : (p *) y ≡ y') →
  p* {p = p} f x y ≡ {!!}
  -- p* {p = q} (p* {p = p} (f x)) y ≡ {!f x' y'!}
  -- (f x y ≡ f x' y')
ap2d = {!!}

但是,我什至無法讓它工作。 似乎有人會執行雙重傳輸以獲得所需的結果,但我在最終相等的 lhs 上所做的任何事情似乎都不會改變目標,這始終是C xy而不是所需的C x' y' 這是思考定義我所追求的正確方法嗎,這是否有助於解決產生正確函子定理陳述的原始問題? 在這種情況下實現functorDProdEqap2d以節省空間的正確方法是什么,因為類型簽名往往會變得多毛?

--the context from above
y2 : P (fst .patternInTele1)
y2 = snd .patternInTele1
x2 : A
x2 = fst .patternInTele1
y1 : P (fst .patternInTele0)
y1 = snd .patternInTele0
x1 : A
x1 = fst .patternInTele0
q  : p* (snd .patternInTele0) ≡ snd .patternInTele1
p  : fst .patternInTele0 ≡ fst .patternInTele1
.patternInTele1
   : Σ A (λ a → P a)   (not in scope)
.patternInTele0
   : Σ A (λ a → P a)   (not in scope)
h  : (a : A) → P a → Q (g a)
g  : A → A'
Q  : A' → Set
P  : A → Set
A' : Set
A  : Set

最后,這是代碼。

module question where

open import Agda.Builtin.Sigma public

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

infix 20 _≡_

J : {A : Set}
    → (D : (x y : A) → (x ≡ y) →  Set)
    -- → (d : (a : A) → (D a a r ))
    → ((a : A) → (D a a r ))
    → (x y : A)
    → (p : x ≡ y)
    ------------------------------------
    → D x y p
J D d x .x r = d x

-- ap\_
apf : {A B : Set} → {x y : A} → (f : A → B) → (x ≡ y) → f x ≡ f y
apf {A} {B} {x} {y} f p = J D d x y p
  where
    D : (x y : A) → x ≡ y → Set
    D x y p = {f : A → B} → f x ≡ f y
    d : (x : A) → D x x r
    d = λ x → r 

id : {A : Set} → A → A
id = λ z → z

transport : ∀ {A : Set} {P : A → Set} {x y : A} (p : x ≡ y)  → P x → P y
transport {A} {P} {x} {y} = J D d x y
  where
    D : (x y : A) → x ≡ y → Set
    D x y p =  P x → P y
    d : (x : A) → D x x r
    d = λ x → id

p* : {A : Set} {P : A → Set} {x : A} {y : A} {p : x ≡ y} → P x → P y
-- p* {P = P} {p = p} u = transport P p u
p* {P = P} {p = p} u = transport p u

_* : {A : Set} {P : A → Set} {x : A} {y : A} (p : x ≡ y) → P x → P y
(p *) u = transport p u
-- p * u = transport p u

apd : {A : Set} {P : A → Set} (f : (x : A) → P x) {x y : A} {p : x ≡ y}
  → p* {P = P} {p = p} (f x) ≡ f y
apd {A} {P} f {x} {y} {p} = J D d x y p
  where
    D : (x y : A) → x ≡ y → Set
    D x y p = p* {P = P} {p = p} (f x) ≡ f y
    d : (x : A) → D x x r
    d = λ x → r

_×_ : Set → Set → Set
A × B = Σ A (λ _ → B)

-- 2.6.1
fprodId : {A B : Set} {x y : A × B} → _≡_ {A × B} x y → ((fst x) ≡ (fst y)) × ((snd x) ≡ (snd y))
fprodId p = (apf fst p) , (apf snd p)
-- fprodId r = r , r

-- 2.6.4
-- alternative name consistent with book, A×B
×fam : {Z : Set} {A B : Z → Set} → (Z → Set)
×fam {A = A} {B = B} z = A z × B z

transport× : {Z : Set} {A B : Z → Set} {z w : Z} (p : z ≡ w) (x : ×fam {Z} {A} {B} z) → (transport p x ) ≡ (transport {Z} {A} p (fst x) , transport {Z} {B} p (snd x))
transport× r s = r

fprod : {A B A' B' : Set} (g : A → A') (h : B → B') → (A × B → A' × B')
fprod g h x = g (fst x) , h (snd x)

-- inverse of fprodId
pair= : {A B : Set} {x y : A × B} → (fst x ≡ fst y) × (snd x ≡ snd y) → x ≡ y
pair= (r , r) = r

-- 2.6.5
functorProdEq : {A B A' B' : Set} (g : A → A') (h : B → B')  (x y : A × B) (p : fst x ≡ fst y) (q : snd x ≡ snd y) →  apf (λ - → fprod g h -) (pair= (p , q)) ≡ pair= (apf g p , apf h q)
functorProdEq g h (a , b) (.a , .b) r r = r


  
-- 2.7.3
etaDprod : {A : Set} {P : A → Set} (z : Σ A (λ x → P x)) → z ≡ (fst z , snd z)
etaDprod z = r

-- 2.7.4
Σfam : {A : Set} {P : A → Set} (Q : Σ A (λ x → P x) → Set) → (A → Set)
Σfam {P = P} Q x = Σ (P x) λ u → Q (x , u) 

dpair= : {A : Set} {P : A → Set} {w1 w1' : A} {w2 : P w1 } {w2' : P w1'} →  (p : Σ (w1 ≡ w1') (λ p → p* {p = p} w2 ≡ w2')) → (w1 , w2) ≡ (w1' , w2')
dpair= (r  , r) = r

transportΣ : {A : Set} {P : A → Set} (Q : Σ A (λ x → P x) → Set) (x y : A) (p : x ≡ y) ((u , z) : Σfam Q x)
             →  _* {P = λ - → Σfam Q - } p (u , z) ≡ ((p *) u  , _* {P = λ - → Q ((fst -) , (snd -))} (dpair= (p , r)) z)
transportΣ Q x .x r (u , z) = r -- some agda bug here.  try ctrl-c ctrl-a

fDprod : {A A' : Set} {P : A → Set} {Q : A' → Set} (g : A → A') (h : (a : A) →  P a → Q (g a)) → (Σ A λ a → P a) → (Σ A' λ a' → Q a')
fDprod g h (a , pa) = g a , h a pa

ap2 : {A B C : Set} {x x' : A} {y y' : B} (f : A → B → C)
      → (x ≡ x') → (y ≡ y') → (f x y ≡ f x' y')
ap2 f r r = r

apd' : {A : Set} {P : A → Set} (f : (x : A) → P x) {x y : A} {p : x ≡ y}
  → p* {P = P} {p = p} (f x) ≡ {!f y!}
  -- →  (f x) ≡ {!!}
apd' = {!!}

ap2d : {A : Set} {x x' : A}  {P : A → Set} {y : P x} {y' : P x'} {C : (x : A)
  → P x → Set} (f : (x : A) → (y : P x) → C x y )
  → (p : x ≡ x') → (q : (p *) y ≡ y') →
  p* {p = p} f x y ≡ {!!}
  -- p* {p = q} (p* {p = p} (f x)) y ≡ {!f x' y'!}
  -- (f x y ≡ f x' y')
ap2d = {!!}

-- (.patternInTele0 .patternInTele1 : Σ A P)

functorDProdEq : {A A' : Set} {P : A → Set} {Q : A' → Set} (g : A → A') 
                 (h : (a : A) →  P a → Q (g a))
                 → ((x1 , y1) (x2 , y2) : Σ A λ a → P a)
                 → (p : x1 ≡ x2) (q : p* {p = p} y1 ≡ y2)
                 → apf (λ - → fDprod g h -) (dpair= (p , q))
                 ≡ dpair= ((apf g p , {!apd (ap2 h ? ?)!} ))
functorDProdEq = {!!}

作為部分答案,我能夠通過 Escardo 的注釋使用新transportd的 function 進行重構,這使得一切都變得明確。 盡管如此,我仍然覺得實際發生的事情有點令人困惑。

transportd : {X : Set } (A : X → Set  ) (B : (x : X) → A x → Set )
  {x : X} ((a , b) : Σ (A x) λ a → B x a) {y : X} (p : x ≡ y)
  → B x a → B y (transport {P = A} p a)
transportd A B (a , b) r = id

ap2d : {A : Set} {x x' : A}  {P : A → Set} {y : P x} {y' : P x'} {C : (x : A)
  → P x → Set} (f : (x : A) → (y : P x) → C x y )
  → (p : x ≡ x') → (q : p* {P = P} {p = p} y ≡ y') → 
  p* {P = C x'} {p = q} (transportd P C (y , (f x y)) p (f x y)) ≡ f x' y'
ap2d f r r = r

關於.patternInTele1模式,我能夠通過不在類型簽名中進行模式匹配而是調用 fst 和 snd 構造函數來解決這個問題,因此上下文現在看起來像

Goal: p* (h (fst x) (snd x)) ≡ h (fst y) (snd y)
————————————————————————————————————————————————————————————
q  : p* (snd x) ≡ snd y
p  : fst x ≡ fst y
y  : Σ A (λ a → P a)
x  : Σ A (λ a → P a)
h  : (a : A) → P a → Q (g a)
g  : A → A'
Q  : A' → Set
P  : A → Set
A' : Set
A  : Set
———— Constraints ———————————————————————————————————————————
_2596 := (_ : _P_2595) y : _A_2583

其中新的functorDProdEq是:

functorDProdEq : {A A' : Set} {P : A → Set} {Q : A' → Set} (g : A → A') 
                 (h : (a : A) →  P a → Q (g a))
                 → (x y : Σ A λ a → P a)
                 → (p : fst x ≡ fst y) (q : p* {p = p} (snd x) ≡ snd y)
                 → apf (λ - → fDprod {P = P} {Q = Q} g h -) (dpair= (p , q))
                 ≡ dpair= (apf g p , ? )
functorDProdEq = {!!}

我仍然有問題,因為它不允許我填補最后一個洞。 如果我用ap2d hpq替換問號,它會突出顯示最后兩行黃色,並說

P (fst y) != A' of type Set
when checking that the expression ap2d h p q has type
p* (h (fst x) (snd x)) ≡ h (fst y) (snd y)

我仍然發現 agda 錯誤消息不可讀,特別是!= * of type Set 是否有任何資源可以理解這一點? 相反,如果我嘗試一步一步地填補這個洞,它不會讓我模式匹配 p 或 q,如ap2d hp {!q!}給出

Goal: p* _y_2654 ≡ snd y
Have: p* (snd x) ≡ snd y

哪個看起來應該是正確的? 我錯過了什么?

此外,如果您正在推理您正在構建的類型,是否建議不要在類型上下文中進行模式匹配(我知道嘗試定義您不理解的類型通常是不好的做法,但我這樣做是為了這個練習。)

暫無
暫無

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

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