私は、プログラムが正しいことを証明することの意味を正確に学ぼうとしています。私はゼロから始めて、最初のステップ/トピックの紹介に夢中になっています。
トータル関数型プログラミングに関するこの論文では、フィボナッチ関数の2つの定義が与えられています。伝統的なもの:
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)
--fib (n+2) = fib (n+1) + fib (n+2) --The definition as given in the paper
--It seems incorrect to me. Typo?
そして、私が前に見たことがない末尾再帰バージョン:
fib' n = f n 0 1
f 0 a b = a
f n a b = f (n-1) b (a+b)
次に、この論文は、両方の関数がすべての正の整数nに対して同じ結果を返すことを帰納法によって証明することは「簡単」であると主張しました。このようなプログラムを分析することを考えたのはこれが初めてです。2つのプログラムが同等であることを証明できると考えるのは非常に興味深いので、私はすぐに帰納法によってこの証明を試みました。私の数学のスキルがさびているか、タスクが実際にはそれほど単純ではありません。
n=1で証明しました
fib' 1 = f 1 0 1
= f 0 1 1
= 1
fib 1 = 1 (By definition)
therefore
fib' n = fib n for n = 1
n=kの仮定をしました
fib' k = fib k
f k 0 1 = fib k
私は、仮定が当てはまる場合、関数はn = k + 1に対しても同等であることを証明しようとし始めます(したがって、すべてのn> = 1 QEDに対してすべて同等です)
fib' (k+1) = fib (k+1)
f (k+1) 0 1 = fib k + fib (k-1)
適切なタイミングで仮定を代入するなど、さまざまな操作を試みましたが、LHSをRHSと等しくすることができないため、関数/プログラムが同等であることを証明できます。私は何が欠けていますか?論文は、タスクが証明することと同等であると述べています
f n (fib p) (fib (p+1)) = fib (p+n)
任意のpの誘導による。しかし、それがどのように真実であるかはまったくわかりません。著者はどのようにしてこの方程式にたどり着きましたか?これは、がの場合にのみ、方程式の有効な変換ですp = 0
。それが任意のpに対してどのように機能するかわかりません。任意のpについてそれを証明するには、別の誘導層を通過する必要があります。確かに証明する正しい式は
fib' (n+p) = fib (n+p)
f (n+p) 0 1 = fib (n+p)
これまでのところ、それも役に立ちませんでした。誘導がどのように行われるかを誰かに教えてもらえますか?または、証拠を示すページへのリンク(検索しましたが、何も見つかりませんでした)。