如何转换结果?

时间:2019-06-22 20:15:41

标签: pattern-matching equality agda

我有这个Ag​​da程序:

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

2 个答案:

答案 0 :(得分:3)

相等类型_≡_在Agda中没有特殊含义。对于Agda one来说,它看起来像类型ℕ⁺ (suc zero)的值,它需要ℕ⁺ mtransport应该有帮助。

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,这可能无法工作。)