Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы на экзаменационные вопросы по ЭСТП.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
399.63 Кб
Скачать

27. Проблема ограниченности вычислительных систем. Возможности преодоления некоторых типов ограничений.

Начнем с "размера" вычислений, т. е. с количества информации и числа выполняемых операций. Существенно, что этот размер велик, так как если бы он оказался малым, то легче было бы обойтись без машины и произвести вычисления вручную. Право вычислительной машины на существование, ее полезность именно в том и состоит, что она способна выполнять большие вычисления, которые непосильны нам, людям. Мы хотим, чтобы машина делала то, чего мы сами никогда не смогли бы сделать, и параметры современной вычислительной техники таковы, что самые заурядные машинные вычисления выходят далеко за пределы нашего "безоружного" воображения.

Тем не менее, мы должны организовать счет таким способом, чтобы, маневрируя нашими ограниченными возможностями, обеспечить нужные результаты вычислений. Организация счета включает в себя составление программы; здесь мы сталкиваемся с новой проблемой размера, а именно с проблемой длины текста программы, и с этим также следует полностью разобраться. Нам следует осознать тот факт, что наша способность читать или писать текст в очень большой степени зависит от размера этого текста. В телефонной книге моей страны информация об абонентах группируется по городам или деревням, а в пределах каждой такой группы список абонентов упорядочивается по фамилиям в алфавитном порядке. Сам я живу в маленьком селении, и если знаю телефонный номер, то мне достаточно просмотреть несколько колонок, чтобы выяснить, кому он принадлежит, но в большом городе то же самое оказалось бы сложной задачей обработки данных!

По аналогии мне хотелось бы привлечь внимание читателя к тому факту, что "ясность" можно определить количественными характеристиками; этот факт, как это ни странно, не учитывается многими математиками. Теорема, утверждающая некое следствие из заполняющего десять страниц набора условий, вряд ли окажется практически полезной, если при каждом применении теоремы требуется проверять все эти условия. В евклидовой геометрии теорема Пифагора справедлива для любых трех точек A, B и C, таких, что через A и С можно провести прямую, перпендикулярную прямой, соединяющей В и С. Многие ли математики отдают себе отчет в том, что эта теорема сохраняет силу в тех случаях, когда некоторые или все точки A, В, С совпадают. Тем не менее, этим в значительной мере объясняется удобство применения теоремы Пифагора.

Подвожу итог: человек соображает медленно, а емкость его памяти очень мала, и ему следует получше научиться жить в таких условиях, учитывать ограниченность своих возможностей и относиться к ней с полным уважением, а не пытаться игнорировать ее, так как такие тщеславные попытки будут обречены на неудачу.

28. Понятие правильности программ. Доказательство правильности программ. Правильность программ

Любые программы правильны в отношении их логического по­строения только для определенного типа данных. Например, про­грамма нахождения наибольшего общего делителя двух чисел верна лишь в том случае, когда оба числа целые. Если же подать на вход такой программы нуль или дробное число, нормальная ра­бота программы нарушится. Поэтому необходимо четко определять область значений данных, в которой программа способна функцио­нировать, и вводить операторы, позволяющие проверять, находятся ли данные в установленных границах.

Чтобы программу можно было применять, прежде всего она должна быть правильной, а нарушение правильности может про­являться двумя способами: либо неверна синтаксическая конст­рукция программы, либо программа выдает неверные результаты. Правильность синтаксиса означает, что должны быть точно сфор­мированы наименования переменных, арифметические и логиче­ские операции должны подчиняться определенным синтаксиче­ским правилам и т. п.

ПРИМЕР ДОКАЗАТЕЛЬСТВА ПРАВИЛЬНОСТИ ПРОГРАММЫ

Рассмотрим следующий фрагмент программы:

integer r, dd;

r:=a; dd:=d;

while dd≤r do dd: =2*dd;

while dd≠d do

begin dd:=dd/2,

if dd≤r do r:=r-dd;

end

в предположении, что целые константы and удовлетворяют отно­шениям

а≥0 и d>0

Чтобы применить теорему линейного поиска (см. раздел "О на­ших интеллектуальных средствах", подраздел "О математической индукции"), рассмотрим последовательность значений, заданную формулами

для i=0 ddi=d

для i>0 ddi=2*ddi-1

Отсюда с помощью обычных математических приемов можно вы­вести, что

ddn=d*2n (1)

Кроме того, поскольку d>0, можно сделать вывод, что для лю­бого конечного значения г отношение

ddk>r

будет выполняться при некотором конечном значении k; первый цикл завершается при

dd=d*2k

Решая уравнение

di=2*di-1

относительно di-1 получаем

di-1= di/2

и теперь теорема линейного поиска позволяет нам утверждать, что второй цикл тоже завершится. (На самом деле второй цикл выпол­нится в точности столько же раз, сколько и первый.)

По окончании первого цикла

dd=ddk

и поэтому выполняется соотношение

0≤r<dd (2)

Это соотношение сохраняется при выполнении повторяемого оператора второго заголовка. После завершения повторений (в соответствии с заголовком while ddd do) мы получим

dd=d

Отсюда и из соотношения (2) следует, что

0≤r<d (3)

Далее мы доказываем, что после начала работы программы всегда выполняется отношение

dd0 mod (d) (4)

Это следует, например, из того, что возможные значения dd имеют вид (см. (1))

d*2i при 0≤ik

Наша следующая задача состоит в том, чтобы показать, что после присваивания г начального значения всегда выполняется отношение

ar mod (d) (5)

(1) Оно выполняется посте начальных присваиваний.

(2) Повторяемый оператор первого заголовка (dd:=2*dd) сохра­няет отношение (5), и поэтому весь первый цикл сохраняет отноше­ние (5).

(3) Повторяемый оператор из второго цикла состоит из двух операторов. Первый (dd:=dd/2) сохраняет инвариантность (5); второй также сохраняет отношение (5), так как он либо не изме­няет значение r, либо уменьшает r на текущее значение dd, а эта операция в силу (4) также сохраняет справедливость отношения (5). Таким образом, весь повторяемый оператор второго цикла со­храняет инвариантность (5), а поэтому и весь второй цикл сохраня­ет отношение (5).

Объединяя отношения (3) и (5), получаем, что окончательное значение r удовлетворяет условиям

0≤r<d и ar mod (d)

т.е. r — это наименьший неотрицательный остаток от деления а на d.

Замечание. В подразделе "О математической индукции" мы доказали теорему линейного поиска. В предыдущем доказательстве мы использовали другую теорему о повторениях (которая, разумеет­ся, может быть доказана только математической индукцией, но до­казательство настолько простое, что мы оставляем его читателю в качестве упражнения). Эта теорема состоит в том, что если перед началом повторений выполняется некоторое соотношение Р, истин­ность которого не нарушается однократным выполнением повторя­емого оператора, то соотношение Р будет выполняться и после за­вершения повторений. Это очень полезная теорема, и она часто по­зволяет нам избежать явного применения математической индукции. (Можно сформулировать эту теорему несколько более кратко; дая цикла

while В do S

нужно показать, что оператор S таков, что истинность

Р/\В

перед выполнением S означает истинность

Р

после выполнения этого оператора.)