实际中如何使用方程式推理运算符?

mbw*_*mbw 3 agda

该阿格达标准库出口某些运营商允许你写的证明类似,你会做什么样的纸张,或者它是如何教Haskell的社区的方式。虽然您可以根据需要使用with抽象,rewrites或辅助引理来完善目标,从而以某种系统的方式编写“常规” Agda证明,但是我对使用平等推理原语的证明“如何成为”的印象并不十分清楚。

也就是说,尽管您可以找到有关这些证明完成后的样例,并在此处和那里进行类型检查,但这些已经工作的例子并不能向您展示如何系统地逐步开发它们(也许是漏洞驱动)方式。

在实践中如何完成?人们会“重构”已经存在的证据吗?您是否尝试从初始目标的左侧和右侧以及中间的一个洞开始“从两侧烧蜡烛”?

此外,Agda文档指出,如果相等推理原语在范围内,则“那么Auto将使用这些构造进行相等推理”。这意味着什么?

如果有人可以向我指出正确的方向,甚至发布一个示例,说明他们如何逐步开发此类证明,他们在通过过程中问自己什么问题,在哪里放置漏洞以及以此类推。谢谢!

whi*_*olf 5

我认为在此处通过等式推理来了解等式的等式推理的定义会对您有所帮助。要点是,这只是应用传递链并允许用户查看代码中实际表达式的一种更好的方法,而不是不那么容易阅读的证明。

我对任何类固醇使用方程式推理构建证明的方式是这样的。以自然数为例

open import Relation.Binary.PropositionalEquality
open ?-Reasoning

data ? : Set where
  zero : ?
  succ : ? ? ?

_+_ : ? ? ? ? ?
m + zero   = m
m + succ n = succ (m + n)
Run Code Online (Sandbox Code Playgroud)

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

comm+ : ? m n ? m + n ? n + m
comm+ m zero     = {!!}
comm+ m (succ n) =
  begin
    succ (m + n)
  ?? {!!} ?
    succ n + m
  ?
Run Code Online (Sandbox Code Playgroud)

现在,我看到了原始表达和目标,而我的目标证明就在方括号之间。我只在表达式上工作,不打样证明对象,并添加我认为应该起作用的内容。

comm+ : ? m n ? m + n ? n + m
comm+ m zero     = {!!}
comm+ m (succ n) =
  begin
    succ (m + n)
  ?? {!!} ?
    succ (n + m)
  ?? {!!}?
    succ n + m
  ?
Run Code Online (Sandbox Code Playgroud)

一旦我认为自己有证明,就可以对证明我的步骤合理的证明对象进行研究。

关于自动战术,我认为您不应该为此而烦恼。暂时没有进行这项工作。

  • 我的意思是,这是可及性规则在可及关系中的应用。除了编写`trans p(trans qs)`,您还可以使用推理包编写`__ p _≡⟨q⟩_ s⟩。 (2认同)