代码之家  ›  专栏  ›  技术社区  ›  SwiftedMind

Agda-交互式构建证明-如何使用hole语法?

  •  0
  • SwiftedMind  · 技术社区  · 5 年前

    对不起,这个奇怪的标题,我不知道这些概念实际上是如何命名的。

    我在跟踪一个 Agda https://plfa.github.io/Induction/#building-proofs-interactively

    这是相当酷的,你可以扩大你的证明一步一步地有洞(这个) { }0 rewrite 语法。

    begin 块,例如:

    +-assoc : ∀ (m n p : ℕ) → (m + n) + p ≡ m + (n + p)
    +-assoc zero n p =
      begin
        (zero + n) + p
        ≡⟨⟩ n + p
        ≡⟨⟩ zero + (n + p)
      ∎
    +-assoc (suc m) n p =
      begin
        (suc m + n) + p
        ≡⟨⟩ suc (m + n) + p
        ≡⟨⟩ suc ((m + n) + p)
        ≡⟨ cong suc (+-assoc m n p) ⟩
          suc (m + (n + p))
        ≡⟨⟩ suc m + (n + p)
      ∎
    
    

    +-assoc : ∀ (m n p : ℕ) → (m + n) + p ≡ m + (n + p)
    +-assoc m n p = ?
    

    +-assoc : ∀ (m n p : ℕ) → (m + n) + p ≡ m + (n + p)
    +-assoc m n p = { }0
    

    在这个例子中,我想用归纳法证明,所以我用 C-c C-c 使用变量 m

    +-assoc : ∀ (m n p : ℕ) → (m + n) + p ≡ m + (n + p)
    +-assoc zero n p = { }0
    +-assoc (suc m) n p = { }1
    

    基本情况是琐碎的,被替换为 refl C-c C-r . 但是,感应壳(孔1)需要一些工作。我怎么能把这个转过来 { }1

    begin
      -- my proof
      ∎
    

    我的编辑说 { }1 是只读的。我不能删除它,只能在大括号之间插入东西。我可以强制删除它,但这显然不是有意的。

    开始 阻止?像这样的

    { begin }1
    

    不起作用并导致错误消息

    谢谢!

    好吧,下面的方法似乎有效:

    { begin ? }1
    

    这就变成了:

    +-assoc : ∀ (m n p : ℕ) → (m + n) + p ≡ m + (n + p)
    +-assoc zero n p = refl
    +-assoc (suc m) n p = begin { }0
    

    这是一个进步:D。但现在我不知道该把证据的实际步骤放在哪里:

    ...
    +-assoc (suc m) n p = begin (suc m + n) + p { }0
    -- or
    +-assoc (suc m) n p = begin { (suc m + n) + p }0
    

    两者似乎都不起作用

    0 回复  |  直到 5 年前
        1
  •  1
  •   effectfully    5 年前

    { }1 是只读的

    • 你试图删除一个带有backspace的孔,这是行不通的。但是,如果洞是空的,可以使用C-backspace
    • 您试图在插入/覆盖模式下编辑一个空孔,这也不起作用

    经验法则是你总是用 C-c C-SPC 类型为等于目标的表达式。对你来说,这意味着从 begin ? ,然后给予 (suc m + n) + p ≡⟨⟩ ? 等等。

    • C-c C-r :在给定函数时为您创建新孔。E、 g.使用此设置:

      test : Bool
      test = {!!}
      

      如果你打字 not

      test : Bool
      test = {!not!}
      

      test : Bool
      test = not {!!}
      

      i、 新的孔是为参数自动创建的。

      用这种方式或者细化一个洞Agda也会按照它喜欢的方式重新格式化代码,我不喜欢这样,所以我通常不使用它。

    • C-C C-SPC公司 :不会为参数创建新孔,也不会重新格式化代码

    推荐文章