Một sự hiểu biết đầy đủ về những gì J
đã thực sự nói và tại sao chỉ đến gần đây. Bài đăng blog này thảo luận về nó. Trong khi suy nghĩ về mặt đồng luân và các hàm liên tục cung cấp rất nhiều trực giác và kết nối với một lĩnh vực toán học rất phong phú, tôi sẽ cố gắng duy trì cuộc thảo luận dưới đây ở mức logic.
Hãy nói rằng bạn axiomatized loại bình đẳng trực tiếp (đây là những groupoid hoạt động và pháp luật):
Γ⊢x:AΓ⊢reflx:x=AxΓ,x:A,y:A⊢p:x=AyΓ,x:A,y:A⊢p−1:y=AxΓ,x:A,y:A⊢p:x=AyΓ,y:A,z:A⊢q:y=AzΓ,x:A,y:A,z:A⊢p⋅q:x=Az
(p−1)−1≡pp⋅p−1≡refl(p⋅q)−1≡q−1⋅p−1refl⋅p≡p≡p⋅refl(p⋅q)⋅r≡p⋅(q⋅r)
Chúng tôi có sự thay thế đó là functorial.
Γ,z:A⊢F(z):UΓ,x:A,y:A⊢p:x=AyΓ,x:A,y:A⊢subst(F,p):F(x)→F(y)
subst(F,refl)=idsubst(F,p⋅q)=subst(F,q)∘subst(F,p)subst(λx.c=Ax,p)(q)=q⋅p
Cuối cùng, chúng ta sẽ có các quy tắc phù hợp cho tất cả mọi thứ, nói rằng mọi thứ đều tôn trọng sự bình đẳng này. Đây là một trong những công việc quan trọng nhất.
Γ,x:A,y:A⊢p:x=AyΓ,z:A⊢B(z):UΓ,x:A,y:A,b:B(x)⊢liftB(b,p):⟨x,b⟩=Σx:A.B(x)⟨y,subst(B,p)(b)⟩
Bây giờ hãy xem xét một trường hợp đặc biệt của sự thay thế.
Γ⊢c:AΓ,t:Σx:A.c=Ax⊢C(t):UΓ⊢b:C(⟨c,reflc⟩)Γ,y:A,p:c=Ay⊢subst(C,liftλz.c=z(reflc,p))(b):C(⟨y,p⟩)
Đây là J
. Chúng ta có thể sử dụng currying để có được hình thức đẹp hơn:
Γ⊢c:AΓ,y:A,p:c=Ay⊢C(y,p):UΓ⊢b:C(c,reflc)Γ,y:A,p:c=Ay⊢JA,c(C,b,y,p):C(y,p)
Tất nhiên, nếu chúng ta bắt đầu với J
chúng ta có thể định hướng lại tất cả các cấu trúc khác mà tôi đã xác định.
Bây giờ nếu chúng ta có p:x=Ay và q:y=Ay′ sau đó liftλz.x=z(p,q):⟨y,p⟩=⟨y′,p⋅q⟩. Vì vậy, nếu chúng ta có⟨y′,p′⟩, không có cách nào để có được nó từ ⟨y,p⟩ thông qua một lựa chọn trước q nói chung trừ khi p⋅q=p′. (Từ quan điểm đồng luân,p⋅q=p′ nói rằng chúng ta có thể điền vào hình tam giác với các cạnh p, qvà p′.) Để làm cho nó cùn hơn, đặt p=reflx (và y=x) and we get q=p′ being the required equality which is not true in general (because a value of type x=Ay′ can represent an arbitrary equivalence and there's nothing saying two equivalences have to be the same, or, equivalently, because we know groupoids can be non-trivial). The point of this is to demonstrate that things can be equal in more than one way, i.e. one value of y=y′ is not as good as another in general.
A key thing to understand is that J
says the type Σy:A.x=Ay is inductively defined, and says little about the type x=Ay for fixed x and y. One way to see this, and why J
is the way it is, is to look at what congruence at equality types with matching endpoints looks like. We have the following rule (ignoring the proof term, it's expressible with subst or J
):
Γ,x:A⊢p:x=AxΓ,x:A,q:x=Ax⊢_:q=x=Axp⋅q⋅p−1
With
liftλz.x=z we have the option of doing
liftλz.x=z(p,p−1⋅p′):⟨y,p⟩=⟨y′,p′⟩ so every point was equivalent to every other point (though not necessarily trivially). With both endpoints matched, we don't have the flexibility of choosing the equalities to first cancel out the input equality and then performing an arbitrary equality.
While J
carefully respects the non-trivial groupoid structure of equality types, in typical dependently typed languages there's no way to actually define a non-trivial element of an equality type. At this point you hit a fork in the road. One route is to add Axiom K which says that the groupoid is actually trivial which makes many proofs much simpler. The other route is to add axioms that allow you to articulate the non-trivial groupoid structure. The most dramatic instance of this is the Univalence Axiom which leads to Homotopy Type Theory.