结合交换的证明和加法的相关性

时间:2015-12-14 03:54:39

标签: agda

我试图证明下面的引理

 infixr 5 _~_
 _~_ = trans

lemma-+swap : ∀ a b c → a + (b + c) ≡ b + (a + c)
lemma-+swap zero b c = refl
lemma-+swap (suc a) b c = (+-assoc a b c) ~ (comm-+ a (b + c)) ~ (+-assoc b c a)

注意:我导入了这个文件

open import Relation.Binary.PropositionalEquality as PropEq
  using (_≡_; refl; sym; trans; cong; cong₂)

在纸上我试着用这种方式:

(a + b) + c equivalent a + (b + c) -- associativity
 a + (b + c) equivalent to (b + c) + a -- commutativity
(b + c) + a equi to b + (c + a) -- associativity

我在目标中写了这个但是得到了错误。我有关联和交换财产的证据。请帮忙。

2 个答案:

答案 0 :(得分:3)

转录您已经在纸上的证据

编写这样的证据的一种非常好的方法是使用Relation.Binary.PropositionalEquality.≡-Reasoning模块,因为它使您能够准确地写出您的证明如何在纸上完成:

open import Relation.Binary.PropositionalEquality as PropEq using (_≡_)
open import Data.Nat
open import Data.Nat.Properties.Simple using (+-assoc; +-comm)

lemma-+swap : ∀ a b c → a + (b + c) ≡ b + (a + c)
lemma-+swap a b c = begin
  a + (b + c) ≡⟨ {!!} ⟩
  (a + b) + c ≡⟨ {!!} ⟩
  (b + a) + c ≡⟨ {!!} ⟩
  b + (a + c) ∎
  where
    open PropEq.≡-Reasoning

现在您需要填写的是与证明的三个步骤相对应的三个孔。

使用半环解算器

无忧无虑的方式就是让semiring solver照顾你的平等,因为自然数的加法和乘法形成了一个半环。但是,我不建议你现在这样做,因为你似乎需要更多的基础知识经验,以确保你不会陷入思考半环解决方案是不应理解的黑盒魔法的陷阱。所以下面的内容对于这个答案的其他读者来说意味着更多,而不是OP:

open import Relation.Binary.PropositionalEquality as PropEq using (_≡_; refl)
open import Data.Nat

lemma-+swap : ∀ a b c → a + (b + c) ≡ b + (a + c)
lemma-+swap = solve 3 (λ a b c → a :+ (b :+ c) := b :+ (a :+ c)) refl
  where
    open import Data.Nat.Properties as Nat
    open Nat.SemiringSolver

答案 1 :(得分:2)

你基本上做了不必要的案件分裂。让我们检查两个函数子句中的目标。在第一个中,我们得到:

lemma-+swap zero b c = ?

-- goal: b + c ≡ b + c

简单refl满足。然而,第二个是:

lemma-+swap (suc a) b c = ?

-- goal: suc (a + (b + c)) ≡ b + suc (a + c)

请注意+-assoc a b c(来自Data.Nat.Properties.Simple)的类型a + b + c ≡ a + (b + c) - 看不到suc

所以你有两个选择:首选是避免大小写分裂并直接使用属性。另一种方法是使用suc a代替a的属性。

即使您解决了上述问题,您的实施也很可能无效。

在这里,我假设您的属性与上面提到的模块中的属性相同(这是一个公平的假设,因为对于其他变体,子表达式+-assoc a b c ~ comm-+ a (b + c) ~ +-assoc b c a没有进行类型检查。)

+-assoc a b c    : a + b + c   ≡ a + (b + c)
+-comm a (b + c) : a + (b + c) ≡ b + c + a
+-assoc b c a    : b + c + a   ≡ b + (c + a)

+-assoc a b c ~ comm-+ a (b + c) ~ +-assoc b c a : a + b + c ≡ b + (c + a)       (*)

因此,子表达式的类型为(*),但您的目标是a + (b + c) ≡ b + (a + c)