[英]Writing Proofs in Agda
我想写一些声明的证明“对于所有x,存在这样的x <y和y是偶数”。 我试过这种方式......
-- ll means less function i.e ' < '
_ll_ : ℕ → ℕ → Bool
0 ll 0 = false
0 ll _ = true
a ll 0 = false
(suc a) ll (suc b) = a ll b
even : ℕ → Bool
even 0 = true
even 1 = false
even (suc (suc n)) = even n
Teven : Bool → Set
Teven true = ⊤
Teven false = ⊥
thm0 : (x : ℕ) → Σ[ y ∈ ℕ ] (Teven ( and (x ll y) (even y)))
thm0 0 = suc (suc zero) , record {}
thm0 (suc a) = ?
对于最后一行,即'suc a'agda无法找到解决方案。 我曾经写过2 * suc a,record {}。 但这也行不通。 任何帮助将不胜感激。
你真正想要的是一次做两个步骤。
这种定义的问题被称为“布尔盲” - 通过将您的命题编码为布尔值,您将丢失它们包含的任何有用信息。 效果是你必须依靠规范化(希望)做它的事情,你不能以任何其他方式帮助Agda(比如通过证据条件上的模式匹配)。
但是,在您的情况下,您可以稍微更改thm0
的定义以帮助Agda进行规范化。 even
提出了两个suc
在每个递归步骤步骤-你可以让thm0
做两步为好。
让我们来看看:
thm0 : ∀ x → ∃ λ y → Teven ((x ll y) ∧ (even y))
thm0 zero = suc (suc zero) , tt
两个新案例是suc zero
(也称为1
):
thm0 (suc zero) = suc (suc zero) , tt
而对于suc (suc x')
:
thm0 (suc (suc x') = ?
现在,如果我们知道y
(你存在量化的那个suc (suc y')
对于其他y'
是成功的suc (suc y')
,那么Agda even y
可以将even y
归一化到even y'
(这只是遵循定义)。 同样处理“小于”证明 - 一旦你知道某些y'
( x'
我们已经知道) x = suc (suc x')
和y = suc (suc y')
),你就可以减少x ll y
到x' ll y'
。
因此y
的选择很简单......但我们如何得到y'
(当然还有证据)? 我们可以使用归纳(递归)并将thm0
应用于x'
! 请记住,给x'
thm0
返回一些y'
连同证明, even y'
和x' ll y'
-这正是我们需要的。
thm0 (suc (suc a)) with thm0 a
... | y' , p = ?
然后我们简单地插入y = suc (suc y')
和p
(如上所述, (x ll y) ∧ even y
减少到(x' ll y') ∧ even y'
,即p
)。
最终代码:
thm0 : ∀ x → ∃ λ y → Teven ((x ll y) ∧ (even y))
thm0 zero = suc (suc zero) , tt
thm0 (suc zero) = suc (suc zero) , tt
thm0 (suc (suc x')) with thm0 x'
... | y' , p = suc (suc y') , p
然而,话虽如此,我建议不要这样做。 不要将您的命题编码为布尔值,然后通过Teven
在类型级别使用它们。 这真的只适用于简单的事情,不能扩展到更复杂的命题。 相反,尝试明确的证据条款:
data _less-than_ : ℕ → ℕ → Set where
suc : ∀ {x y} → x less-than y → x less-than suc y
ref : ∀ {x} → x less-than suc x
data Even : ℕ → Set where
zero : Even 0
suc-suc : ∀ {x} → Even x → Even (2 + x)
thm0
可以使用一个简单的引理来编写thm0
:
something-even : ∀ n → Even n ⊎ Even (suc n)
something-even zero = inj₁ zero
something-even (suc n) with something-even n
... | inj₁ x = inj₂ (suc-suc x)
... | inj₂ y = inj₁ y
(这表明n
是偶数或其后继者是偶数)。 实际上, thm0
可以在不使用递归的情况下实现!
thm0 : ∀ x → ∃ λ y → Even y × x less-than y
thm0 n with something-even n
... | inj₁ x = suc (suc n) , suc-suc x , suc ref
... | inj₂ y = suc n , y , ref
有趣的是,当我写这个定义时,我只是模仿匹配的something-even (suc n)
并使用Ca
(自动完成)来填充右边! 如果给出足够的提示,Agda可以在没有我帮助的情况下编写代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.