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