Agda重写不会改变_ * _可交换性证明中的目标

时间:2018-08-06 15:09:04

标签: proof agda commutativity

已解决:按照 white-wolf 的建议,我有一个解决方案。如果您对我的解决方案感兴趣,请随时给我发消息。


我正尝试在Agda中为乘法的可交换性编写证明:

lem3 : (x y : ℕ) → (x * y) ≡ (y * x)
lem3 0 y rewrite pr3a y = refl
lem3 (suc x) y rewrite lem3 x y | pr3b x y = refl

我们在哪里:

pr3a : (x : ℕ) → (x * 0) ≡ 0
pr3a 0 = refl
pr3a (suc x) with (x * 0) | pr3a x
... | .0 | refl = refl

pr3b : (x y : ℕ) →  y + y * x ≡ y * suc x
pr3b 0 0 = refl
pr3b 0 (suc y) rewrite pr3b 0 y = refl
pr3b (suc x) y = {!!}

我很难提出这个最终目标。预期的类型为y + y * suc x ≡ y * suc (suc x),我曾期望使用rewrite会给我y * suc (suc x) ≡ y * suc (suc x)作为目标。但是:

pr3b (suc x) y rewrite pr3b x y = {!!}

期望与以前相同的目标:y + y * suc x ≡ y * suc (suc x)

据我了解,rewrite可以有效地将RHS替换为LHS中的x = x,得到y * suc x ≡ y * suc x,然后使用x = suc x得出y * suc (suc x) ≡ y * suc (suc x)。我是误解了rewrite的工作方式还是犯了其他错误?

1 个答案:

答案 0 :(得分:2)

您的目标是y + y * suc x ≡ y * suc (suc x)。您的归纳假设是y + y * x ≡ y * suc x。我可以通过将pr3b x y放入目标并输入C-c C-来进行检查。

Goal: y + y * suc x ≡ y * suc (suc x)
Have: y + y * x ≡ y * suc x

这意味着通过重写,您应该能够将y * suc x替换为y * x。但是,您会看到两侧已切换,因此必须像这样对称地重写

pr3b : (x y : ℕ) →  y + y * x ≡ y * suc x
pr3b 0 0 = refl
pr3b 0 (suc y) rewrite pr3b 0 y = refl
pr3b (suc x) y rewrite sym $ pr3b x y = {!!}

这会将目标提升到y + (y + y * x) ≡ y * suc (suc x)。这种特殊的证明要求完成添加的关联性和可交换性。

编辑

我认为您应该尝试通过在y而不是x上进行归纳来证明这一点。