
- •Дополнение
- •Наивная теория алгоритмов
- •4.4. Наивная теория алгоритмов
- •4.4.1. Вычислимые функции
- •4.4.2. Перечислимые множества
- •4.4.3. Разрешимые множества
- •4.4.4. Протокол выполнения алгоритма
- •4.4.5. Алгоритмы и программы
- •4.4.6. Невычислимые функции и неразрешимые множества
- •4.4.7. Истинность и доказуемость
- •4.4.8. Множество истин арифметики
4.4.3. Разрешимые множества
Подмножество слов S перечислимого множества M называется разрешимым, если существует такой алгоритм S: Mbool, что S(m)=T тогда и только тогда, когда mS. Другими словами, множество разрешимо, если существует алгоритм, который распознает принадлежность элементов этому множеству. Ясно, что если множество S разрешимо относительно M, то множество M \ S также разрешимо — достаточно в теле алгоритма S заменить оператор return T оператором return F и наоборот.
Лемма 1. Каково бы ни было множество X, и X разрешимы относительно X.
Доказательство. Для пустого множества искомый алгоритм – константа F, а для множества X — константа T. чтд
Лемма 2. Разрешимое подмножество S перечислимого множества M перечислимо.
Доказательство. Пусть S – разрешающий алгоритм для S, а M – перечисляющий алгоритм для M. Построим перечисляющий алгоритм S для S. Если S=, то S := F, если же S, то существует элемент sS. Тогда
S := for mM do if S(m) then yield m else yield s end if end for. чтд
Отсюда немедленно следует, что всякое разрешимое подмножество натурального ряда перечислимо.
Лемма 3. Подмножество S перечислимого множества M разрешимо тогда и только тогда, когда перечислимо как S, так и его дополнение M \ S.
Доказательство.
[] Если множество S разрешимо относительно M, то множество M \ S также разрешимо, и остается применить лемму 2.
[] Если S или M \ S пусто, то по лемме 1 S разрешимо. Пусть теперь S и M \ S оба не пусты и перечислимы перечисляющими алгоритмами S и S соответственно, а вычислимые функции F и F: M доставляют элементы этих множеств по номерам. Тогда следующий алгоритм разрешает множество S:
proc SS (s: M) : bool
n:=0;
while true do n:= n + 1;
x:=F (n);
y:= F (n);
if x = s then return T end if;
if y = s then return F end if;
end while. чтд
Лемма 4. Если функция вычислима, то образ перечислимого множества перечислим.
Доказательство. Пусть функция F : Dom F Im F вычислима, а множество A Dom F перечислимо, тогда множество F(A) Im F перечисляется следующим алгоритмом: for xA do yield F(x) end for. чтд
Лемма 5. Если функция вычислима и определена на перечислимом множестве, то прообраз перечислимого множества перечислим.
Доказательство. Пусть функция F : Dom F Im F вычислима, а множество B перечислимо вычислимой функцией h, и множество Dom F перечислимо вычислимой функцией g. Если F–1(B)=, то прообраз перечислим, иначе существует элемент sF–1(B). Тогда множество F–1(B) перечисляется следующим алгоритмом:
for <a, b>N2 do if f(h(a))=g(b) then yield h(a) else yield s end if end for чтд
4.4.4. Протокол выполнения алгоритма
Программистская практика свидетельствует, что программы иногда удаётся отладить, то есть найти и устранить ошибки, содержащиеся в алгоритмах. Процесс отладки основан на том, что за работой алгоритма возможно наблюдение, в частности, для любого алгоритма и для любого случая выполнения этого алгоритма можно составить протокол выполнения, в котором исчерпывающим образом отражается история выполнения алгоритма (для заданных входных данных). Другими словами, в самих алгоритмах и в их выполнении нет ничего чудесного, ничего такого, чего нельзя записать словами в алфавите U.
Следующий факт мы принимаем без доказательства, как априорное свойство интуитивного понятия алгоритма.
Аксиома [протокола]. Для каждого алгоритма A существует разрешимое множество H и существуют вычислимые функции a: HU* и z: HU*, такие что A(x)=y тогда и только тогда, когда существует такое hH, что a(h)=x и z(h)=y.
Множество H — это множество всех возможных протоколов выполнения алгоритма A, h — это протокол выполнения с входом x и выходом y, а функции a и z — это функции определения входов и выходов, соответственно.
Отступление. Если для каждой пары <x, y>, для которой A(x)=y слово hH, такое что a(h)=x и z(h)=y не только существует, но и единственно, то алгоритм называется детерминированным. В протоколе детерминированного алгоритма порядок действий строгий линейный (п. 1.8.1). В сформулированной аксиоме протокола единственность не требуется, тем самым допускается, что выполнение алгоритма может быть недетерминированным. В протоколе недетерминированного алгоритма порядок действий нестрогий частичный (п. 1.8.1). В недетерминированности нет ничего страшного, более того, это путь к параллельному программированию и другим современным подходам в информационных технологиях. Поэтому накладывать требование детерминированности без необходимости не следует.
Следствие 1. Область применимости и множество результатов любого алгоритма перечислимы.
Доказательство. Область применимости — это a(H), а множество результатов — это z(H). Оба эти множества перечислимы по лемме 4. чтд
Следствие 2. Область определения и множество значений любой вычислимой функции перечислимы.
Доказательство. Частный случай Следствия 1. чтд
Следствие 3. График любой вычислимой функции перечислим.
Доказательство. По аксиоме протокола для функции существует множество протоколов H и вычислимые функции входа/выхода a(h) и z(h). Тогда следующий алгоритм перечисляет график функции: for hH do yield <a(h), z(h)> end for чтд
Следствие 4. Функция с перечислимым графиком вычислима.
Доказательство. По аксиоме протокола для функции существует множество протоколов H и вычислимые функции входа/выхода a(h) и z(h). Тогда следующий алгоритм перечисляет график функции: for hH do yield <a(h), z(h)> end for чтд