我试图证明下面的引理
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
我在目标中写了这个但是得到了错误。我有关联和交换财产的证据。请帮忙。
答案 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)
。