Далее, каковы аксиомы программирования? Самые атомные истины в области?
Я изучил курс под названием «Контрактное программирование» (домашняя страница курса: http://www.daimi.au.dk/KBP2/). Вот что я могу экстраполировать из курса (и других курсов, которые я прошел)
Вы должны формально (математически) определить семантику вашего языка. Давайте подумаем о простом языке программирования; тот, который имеет только глобальные переменные, int, массивы int, арифметику, if-then-else, while, assignment и ничего не делать [вы, вероятно, можете использовать подмножество любого основного языка в качестве «реализации» этого].
Состояние выполнения - это список пар (имя переменной, значение переменной). Прочитайте «{Q1} S1 {Q2}», поскольку «оператор выполнения S1 переводит вас из состояния выполнения Q1 в состояние Q2».
Тогда одна аксиома будет "if both {Q1} S1 {Q2} and {Q2} S2 {Q3}, then {Q1} S1; S2 {Q3}"
. То есть, если оператор S1 переводит вас из состояния Q1 в Q2, а оператор S2 переводит вас из Q2 в Q3, то «S1; S2» (за S1 следует S2) переводит вас из состояния Q1 в состояние Q3.
Другая аксиома была бы "if {Q1 && e != 0} S1 {Q2} and {Q1 && e == 0} S2 {Q2}, then {Q1} if e then S1 else S2 {Q2}"
.
Теперь немного уточнений: Qn в {} на самом деле будут утверждениями о состояниях, а не о самих состояниях.
Предположим, что M (out, A1, A2) - это оператор, который выполняет слияние двух отсортированных массивов и сохраняет результат в out, и что все слова, которые я использую в следующем примере, были выражены формально (математически). Тогда "{sorted(A1) && sorted(A2)} A := M(A1, A2) {sorted(A) && permutationOf(A, A1 concatened with A2)}"
- это утверждение, что М правильно реализует алгоритм слияния.
Можно попытаться доказать это, используя приведенные выше аксиомы (возможно, понадобится несколько других. Вам, вероятно, понадобится петля, например).
Надеюсь, это немного проиллюстрирует, как могут выглядеть корректные программы проверки. И поверьте мне: требуется 1026 * много работы, даже для казалось бы простых алгоритмов, чтобы доказать их правильность. Я знаю, я прочитал много попыток; -)
[если вы читаете это: ваша сдача прошла нормально, это все остальные, которые вызывали у меня головные боли; -)]