Джон Харрисон
Университет Кембриджа
10 сентября 2008 г.
Темы
Проблема корректности
Тестирование и верификация
Завершимость и полнота
Вычисление степени и НОД
Конкатенация и обращение списков
Проблема корректности
Опасные ошибки
Тестирование и верификация
N(N + 1)
Σn=N
n=0 n =
2
Мы можем проверить его для множества определённых значений N,
но проще и надёжнее доказать её (по индукции).
Ограничения верификации
Верификацию можно представить в виде диаграммы:
Требования к системе
6
Реализация системы
append l1 (append l2 l3 )
= append [] (append l2 l3 )
= append l2 l3
= append (append [] l2 ) l3
= append (append l1 l2 ) l3
Что и требовалось.
Поэтому:
append l1 (append l2 l3 )
= append (h :: t) (append l2 l3 )
= h :: (append t (append l2 l3 ))
= h :: (append (append t l2 ) l3 )
= append (h :: (append t l2 )) l3
= append (append (h :: t) l2 ) l3
= append (append l1 l2 ) l3
Теорема доказана.
rev(rev t) = t
rev(rev l )
= rev(rev (h :: t))
= rev(append (rev t) [h])
= append (rev [h]) (rev(rev t))
= append (rev [h]) t
= append (rev (h :: [])) t
= append (append [] [h]) t
= append [h] t
= append (h :: []) t
= h :: (append [] t)
= h :: t
= l