Я пытаюсь точно понять, что значит доказать правильность программы. Я начинаю с нуля и зацикливаюсь на первых шагах / введении в тему.
В этой статье по полному функциональному программированию даны два определения функции Фибоначчи. Традиционный:
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. Впервые я подумал об анализе таких программ. Довольно интересно думать, что вы можете доказать, что две программы эквивалентны, поэтому я сразу же попытался сделать это доказательство по индукции сам. Либо мои математические навыки устарели, либо задача не так уж проста.
Я доказал для 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, требуется пройти еще один слой индукции. Конечно, правильная формула для доказательства будет
fib' (n+p) = fib (n+p)
f (n+p) 0 1 = fib (n+p)
Пока это тоже не помогло. Может кто-нибудь показать мне, как будет осуществляться индукция? Или ссылку на страницу с доказательством (я искал, ничего не нашел).