在实践中如何使用等式推理算子?

时间:2017-12-05 15:26:14

标签: agda

Agda Standard Library导出一些操作符,这些操作符允许您以与您在纸上所做的相似的方式编写证明,或者如何在Haskell社区中教授它。虽然你可以写"传统" Agda通过根据需要使用with抽象,rewrite或帮助引理来改进目标,以某种系统的方式进行证明,对于我如何使用等式推理原语进行证明并不是很清楚#34;来#34;

也就是说,虽然您可以找到有关这些样张完成后的样子以及类型检查herethere的示例,但这些已经有效的示例并未向您展示是以系统的逐步(可能是空穴驱动)方式开发的。

在实践中如何完成?人们重构"一个已经存在的证据?你是否试图从两边烧蜡烛"从最初目标的左手侧和右手侧开始,中间是一个洞?

此外,Agda documentation表明如果等式推理原语在范围内,"那么Auto将使用这些结构"进行相等推理。这是什么意思?

如果有人可以指出我正确的方向,或者甚至发布他们如何逐步开发这类证据的例子,我们会很感激,当他们经历这些问题时他们会问自己什么问题,他们放在哪里洞等等。谢谢!

1 个答案:

答案 0 :(得分:5)

我认为在这里Equational Reasoning查看身份的等式推理定义会更有帮助。重点是它只是一种更好的方式来应用传递链并允许用户在代码中查看实际表达式,而不是不易于阅读的证明证据。

我使用等式推理为任何setoid建立证明的方式是这样的。以自然数的例子

open import Relation.Binary.PropositionalEquality
open ≡-Reasoning

data ℕ : Set where
  zero : ℕ
  succ : ℕ → ℕ

_+_ : ℕ → ℕ → ℕ
m + zero   = m
m + succ n = succ (m + n)

让我们以交换性为例。 这就是我从目标开始的方式。

comm+ : ∀ m n → m + n ≡ n + m
comm+ m zero     = {!!}
comm+ m (succ n) =
  begin
    succ (m + n)
  ≡⟨ {!!} ⟩
    succ n + m
  ∎

现在我看到原始表达和目标,我的目标证明在括号之间。 我只在表达式上工作,保持证明对象不变并添加 我认为应该有用。

comm+ : ∀ m n → m + n ≡ n + m
comm+ m zero     = {!!}
comm+ m (succ n) =
  begin
    succ (m + n)
  ≡⟨ {!!} ⟩
    succ (n + m)
  ≡⟨ {!!}⟩
    succ n + m
  ∎

一旦我认为我有证据,我就会研究证明我的步骤的证据对象。

关于自动战术,在我看来你不应该为此烦恼。它暂时没有工作。