pattern-matching - 如何转换结果?
问题描述
我有这个 Agda 程序:
data ℕ⁺ : ℕ → Set where
one : ℕ⁺ (suc zero)
suc⁺ : {n : ℕ} → ℕ⁺ (suc n)
lemma : ∀ (m n : ℕ) → m ≡ suc n → ℕ⁺ m
lemma m zero p = one
lemma m (suc n) p = suc⁺ {suc n}
问题出在倒数第二行:它抱怨one
is not ℕ⁺ m
,但是我必须p
在那里证明它们确实是。
我怎样才能做到这一点?如果我想证明的实际上是一个相等,我知道该怎么做(好吧,p
在这种情况下只是通过),但我不知道如何使用p
将泛型转换ℕ⁺ m
为ℕ⁺ (suc zero)
.
解决方案
等式类型_≡_
在 Agda 中没有特殊含义。到 Agdaone
看起来像一个值类型ℕ⁺ (suc zero)
,它需要ℕ⁺ m
。transport
应该有帮助。
transport : forall {A : Set} {B : A → Set} {x y : A} → x ≡ y → B x → B y
transport refl bx = bx
comm : forall {A : Set} {x y : A} → x ≡ y → y ≡ x
comm {x = x} p = transport {B = _≡ x} p refl
lemma : ∀ (m n : ℕ) → m ≡ suc n → ℕ⁺ m
lemma _ _ p = transport {B = \k → ℕ⁺ k} (comm p) suc⁺
(这里我删除了one
,因为它不需要。)
推荐阅读
- python - 在 2 个脚本(gui 和 main)之间传递变量
- php - 如何删除作为复合键存在于另一个中的主键
- python - 卷积神经网络的数据集组织
- postgresql - 使用 postgreSQL 迁移时遇到问题
- bash - 在 bash 脚本中创建多个终端并继续执行命令?
- nginx - 如何在 nginx 中的端口 443 上启用 grpc 而不会破坏 kubernetes 中端口 80 上的 http?
- html - 如何使用 css 为不同的分辨率设置 td 和 div 的宽度
- python - 使用 TF2.2 执行 TF1.X 代码会导致错误
- powershell - 值不出现在下一行
- javascript - Html5 视频标签 - 仅加载前几秒