You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

导入Cubical Agda后,HoTT集合证明失效问题求助

Cubical Agda下Σ-isSet证明报错的原因与解决方法

问题根源

普通Agda中的等式x ≡ y是归纳数据类型,唯一构造子为refl,因此可以直接对refl做模式匹配。但Cubical Agda将等式实现为路径类型(Path Type)——这是一个原语类型而非归纳数据类型,因此无法通过refl模式匹配拆分参数,这就是报错Cannot split on argument of non-datatype x ≡ y的直接原因。

另外,普通Agda默认启用唯一性恒等原理(UIP),这使得你无需额外前提就能通过简单的refl匹配完成证明;但Cubical Agda中UIP并非默认成立,证明需要更严谨的路径操作。

解决方法:使用Cubical特有的路径操作

在Cubical环境下,需要借助路径转换、运输(transport)等原语来完成Σ类型的集合性证明。以下是修正后的实现:

open import Cubical.Foundations.Prelude

-- 保持你原有的isSet定义
isSet : ∀ (A : Set) → Set
isSet A = ∀ {x y : A} (p q : x ≡ y) → p ≡ q

-- 修正后的Σ-isSet:需要额外要求A是集合(Cubical中UIP不默认成立)
Σ-isSet : ∀ {A : Set}
        → isSet A
        → (P : A → Set)
        → (∀ x → isSet (P x))
        → isSet (Σ A P)
Σ-isSet isSetA P isSetP {x , px} {y , py} p q =
  let
    -- 将Σ类型的路径拆分为A分量的路径 + P分量的依赖路径
    (p₁ , p₂) = ΣPath≡PathΣ p
    (q₁ , q₂) = ΣPath≡PathΣ q

    -- 证明A分量的两条路径相等
    p₁≡q₁ : p₁ ≡ q₁
    p₁≡q₁ = isSetA p₁ q₁

    -- 利用路径相等将p₂运输到q₁的上下文,再证明与q₂相等
    p₂-transport : transport (λ i → P (p₁≡q₁ i)) p₂ ≡ q₂
    p₂-transport = isSetP _ (transport (λ i → P (p₁≡q₁ i)) p₂) q₂
  in
    -- 将分量的相等组合回Σ类型的路径相等
    ΣPath≡PathΣ⁻¹ (p₁≡q₁ , p₂-transport)

关键说明

  1. Σ路径转换:ΣPath≡PathΣ是Cubical库提供的原语,用于将Σ类型的路径(x,px)≡(y,py)转换为一对路径:A分量的普通路径x≡y,以及P分量的依赖路径transport P p px ≡ py(transport用于将px沿着路径p运输到y的上下文)。
  2. 集合性前提:Cubical中必须明确要求A是集合(即isSet A),因为UIP不再默认成立,无法像普通Agda那样省略该前提。

内容的提问来源于stack exchange,提问作者Werner Germán Busch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 07:03:13