我有兩個斐波那契實現,見下面,我想證明在功能上是等價的。我如何證明兩個斐波納契實現在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.
通知你引用一個未定義的生產''。你知道任何有關戰術的事情嗎?如果你還沒有寫出任何證據,這個證明在Coq中不會很明顯...... –
我只知道有關加法的自然數的策略。 – Shuzheng
標準庫中'+'的定義與'add_v1'相同。 –