【发布时间】:2016-11-13 07:15:50
【问题描述】:
我有两个斐波那契实现,如下所示,我想证明它们在功能上是等效的。
我已经证明了自然数的性质,但是这个练习需要另一种我想不通的方法。
我正在使用的教科书介绍了 Coq 的以下语法,因此应该可以使用这种表示法来证明相等性:
<definition> ::= <keyword> <identifier> : <statement> <proof>
<keyword> ::= Proposition | Lemma | Theorem | Corollary
<statement> ::= {<quantifier>,}* <expression>
<quantifier> ::= forall {<identifier>}+ : <type>
| forall {({<identifier>}+ : <type>)}+
<proof> ::= Proof. {<tactic>.}* <end-of-proof>
<end-of-proof> ::= Qed. | Admitted. | Abort.
以下是两种实现方式:
Fixpoint fib_v1 (n : nat) : nat :=
match n with
| 0 => O
| S n' => match n' with
| O => 1
| S n'' => (fib_v1 n') + (fib_v1 n'')
end
end.
Fixpoint visit_fib_v2 (n a1 a2 : nat) : nat :=
match n with
| 0 => a1
| S n' => visit_fib_v2 n' a2 (a1 + a2)
end.
很明显,这些函数对于基本情况 n = 0 计算相同的值,但归纳情况要困难得多?
我已经尝试证明以下引理,但我陷入了归纳案例:
Lemma about_visit_fib_v2 :
forall i j : nat,
visit_fib_v2 i (fib_v1 (S j)) ((fib_v1 j) + (fib_v1 (S j))) = (fib_v1 (add_v1 i (S j))).
Proof.
induction i as [| i' IHi'].
intro j.
rewrite -> (unfold_visit_fib_v2_0 (fib_v1 (S j)) ((fib_v1 j) + (fib_v1 (S j)))).
rewrite -> (add_v1_0_n (S j)).
reflexivity.
intro j.
rewrite -> (unfold_visit_fib_v2_S i' (fib_v1 (S j)) ((fib_v1 j) + (fib_v1 (S j)))).
Admitted.
地点:
Fixpoint add_v1 (i j : nat) : nat :=
match i with
| O => j
| S i' => S (add_v1 i' j)
end.
【问题讨论】:
-
请注意,您的语法中引用了未定义的产生式
<tactic>。你知道任何战术吗?如果你还没有写过证明,这个证明在 Coq 中是不明显的…… -
我只知道关于加法的自然数策略。
-
标准库中
+的定义与add_v1相同。
标签: functional-programming fibonacci coq