我有这个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
不是ℕ⁺ m
,但是我在那里有p
证明它们确实存在。
我该怎么做?如果我想证明实际上是相等的,我知道该怎么做(在这种情况下,只需传递p
即可),但是我不知道如何使用p
来转换通用{ {1}}至ℕ⁺ m
。
答案 0 :(得分:3)
相等类型_≡_
在Agda中没有特殊含义。对于Agda one
来说,它看起来像类型ℕ⁺ (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
,因为它是不需要的。)
答案 1 :(得分:1)
如果您在p
上进行模式匹配,则会将m
细化为.(suc n)
:
lemma : ∀ (m n : ℕ) → m ≡ suc n → ℕ⁺ m
lemma .(suc n) zero refl = one
lemma .(suc n) (suc n) refl = suc⁺
(免责声明:这是从非HoTT / CTT的角度来看;没有axiom K,这可能无法工作。)