【发布时间】:2019-08-30 22:37:25
【问题描述】:
Theorem mult_comm : forall m n : nat,
m * n = n * m.
Proof.
intros.
induction n.
- simpl. rewrite (mult_0_r m). reflexivity.
- simpl.
rewrite <- IHn.
induction m.
simpl. reflexivity.
simpl.
以上内容来自软件基金会第二章。
1 subgoal
m, n : nat
IHn : S m * n = n * S m
IHm : m * n = n * m -> m * S n = m + m * n
______________________________________(1/1)
S (n + m * S n) = S (m + (n + m * n))
我真的很困惑IHm 应该在这里。按照我的理解,Coq 策略在后台编译为一些功能程序,但我真的不确定这里发生了什么。我很确定这不是我的本意。
我想做的是类似于下面的 Idris 程序。
add_comm : {a,b : Nat} -> a + b = b + a
add_assoc : {a,b,c : Nat} -> (a + b) + c = a + (b + c)
total
mult_comm : {m,n : Nat} -> (m * n) = n * m
mult_comm {m = Z} {n = Z} = Refl
mult_comm {m = Z} {n = (S k)} = mult_comm {m=Z} {n=k}
mult_comm {m = (S k)} {n = Z} = mult_comm {m=k} {n=Z}
mult_comm {m = (S k)} {n = (S j)} =
let prf1 = mult_comm {m=k} {n=S j}
prf2 = mult_comm {m=S k} {n=j}
prf3 = mult_comm {m=k} {n=j}
prf_add_comm = add_comm {a=k} {b=j}
prf_add_assoc = add_assoc {a=k} {b=j} {c=j*k}
prf_add_assoc' = add_assoc {a=j} {b=k} {c=j*k}
in
rewrite prf1 in
rewrite sym prf2 in
rewrite prf3 in
rewrite sym prf_add_assoc in
rewrite sym prf_add_assoc' in
rewrite (add_comm {a=k} {b=j}) in
Refl
更具体地说,我需要 prf1、prf2 和 prf3,这是我使用对 mult_comm 的递归调用获得的。在 Coq 中,这两个证明被困在一个 lambda 中,我不确定这是怎么发生的。我看到 Coq 的 induction 策略没有做我认为应该做的事情。
除了上面的解释之外,我还想问一下 Coq 的介绍材料是否比 Software Foundations 多,以防我在某些策略上再次陷入这种困境?请注意,我知道如何在 Coq 中解决这个问题,因为我在网上找到了解决方案。
早在 2016 年,我就曾尝试将 SF 书作为依赖类型编程的介绍来解决,但现在事后看来,我发现 Little Typer 和 Idris 书在这方面要好得多。
【问题讨论】:
标签: coq