Types 如何编写(和调试)一个依赖于两个参数的应用程序apd2,并使用它来证明agda中此类ap的功能性?

Types 如何编写(和调试)一个依赖于两个参数的应用程序apd2,并使用它来证明agda中此类ap的功能性?,types,agda,dependent-type,homotopy-type-theory,Types,Agda,Dependent Type,Homotopy Type Theory,我试图证明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 ,

我试图证明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*业务,因为我不知道它会被宣布在哪里,并且非常感谢任何详细说明。此外,我的想法是实现一个具有两个等式的依赖应用程序函数,
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上所做的任何事情似乎都不会改变目标,它总是
cxy
,而不是期望的
cx'y'
。这是定义我想要的东西的正确方法吗?这有助于解决生成正确的函数定理语句的原始问题吗?在这种情况下,实现
functorDProdEq
ap2d
的正确方法是什么,这样它们可以节省空间,因为类型签名往往会变得毛茸茸的

--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的notes使用一个新的
transportd
函数进行重构,这使得一切都变得明确。尽管如此,我仍然觉得有点困惑到底发生了什么

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 h p q
替换问号,它会突出显示最后两行黄色,并显示

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错误消息无法读取,特别是
!=*类型集合
。有什么资源可以理解这一点吗?相反,如果我尝试一步一步地填补这个漏洞,它不会让我的模式匹配p或q,就像在
ap2dhp{!q!}
中给出的那样

Goal: p* _y_2654 ≡ snd y
Have: p* (snd x) ≡ snd y
这似乎应该是正确的?我错过了什么


此外,如果您正在对正在构建的类型进行推理,是否建议在键入上下文中永远不要进行模式匹配(我知道尝试定义您不理解的类型通常是不好的做法,但我这样做是为了进行此练习)。

=
表示不相等,所以它的意思是Agda需要
P(fst y)
等于
A'
才能接受
ap2d h P q
类型
P*(h(fst x)(snd x))≡ h(fst y)(snd y)