TURBO PASCAL |
Новости
|
Состояния и их характеристикаВ течение многих столетий человек оперирует натуральными числами. Мне представляется, что в доисторические времена, когда перед нашими предками впервые забрезжило понятие числа, они изобретали индивидуальные имена для каждого числа, на которое у них обнаруживалась потребность сослаться. Им приходилось иметь имена для чисел точно так же, как мы имеем имена "один, два, три, четыре и так далее". Это поистине "имена" в том смысле, что при исследовании последовательности "один, два, три" никакое правило не поможет нам умозаключить, что следующим именем будет "четыре". Вы, конечно же, должны это знать. (В том возрасте, когда я вполне удовлетворительно умел считать — по-голландски,— мне пришлось учиться счету по-английски и во время экзамена самое изощренное знание слов "семь" и "девять" не смогло помочь мне установить, как писать слово "восемь", не говоря уж о том, как произносить его.)Очевидно, что такое несистематизированное разнообразие позволяет нам выделять индивидуально только весьма ограниченное количество различных чисел. Чтобы избежать подобного ограничения, каждый язык в цивилизованном мире вводит (более или менее) систематизированное именование натуральных чисел, и обучение счету в значительной степени сводится к обнаружению системы, лежащей в основе этого именования. Когда ребенок учится считать до тысячи, ему не приходится заучивать наизусть эту тысячу имен (в их точном порядке!); он руководствуется определенными правилами: наступает момент, когда ребенок узнает, как переходить от любого числа к следующему, например от "четыреста двадцать девять" к "четырестатридцать". Легкость обращения с числами сильно зависит от выбранной нами для них систематизации. Гораздо труднее установить, что так как последние три ответа можно получить, применив простой набор правил, которыми может руководствоваться любой восьмилетний ребенок. При механических манипуляциях над числами преимущества десятичной системы счисления проявляются гораздо более отчетливо. Уже в течение столетий мы располагаем механическими сумматорами, показывающими ответ в окошке, позади которого имеется несколько колес с десятью различными положениями, причем каждое колесо в любом своем положении показывает одну десятичную цифру. (Теперь уже уже не является проблемой показать "00000019", прибавить 4 и затем показать "00000023"; было бы проблемой — по крайней мере если пользоваться чисто механическими средствами — показать вместо этого "девятнадцать" и "двадцать три".) Существенное свойство такого колеса состоит в том, что оно обладает десятью различными устойчивыми положениями. Терминологически это выражается разными способами. Например, колесо называется "переменной с десятью значениями", и если мы хотим большей точности, то даже перечисляем эти значения: от 0 до 9. Здесь каждое "положение" колеса отождествляется со "значением" переменной. Колесо называется "переменной", потому что, хотя его положения и устойчивы, колесо может повернуться в другое положение: "значение" может измениться. (Я вынужден отметить, что этот термин неудачен по крайней мере в двух отношениях. Во-первых, такое колесо, которое (почти) всегда находится в одном из своих десяти положений и, следовательно, (почти) всегда представляет некое значение, является понятием, весьма отличным от того, что математики называют "переменной", поскольку, как правило, математическая переменная вообще не представляет какого-либо конкретного значения. Если мы говорим, что для любого целого числа п утверждение п2 > О истинно, то здесь п является переменной совсем другого рода. Во-вторых, в нашем контексте мы используем термин "переменная" для того, что существует во времени и чье значение, если его не трогать, остается постоянным! Термин "изменяемая константа" подошел бы лучше, но мы не станем вводить его, а будем придерживаться прочно установившейся традиции.)Другой способ терминологически отразить сущность такого колеса, которое (почти) всегда находится в одном из десяти различных положений или "состояний", состоит в том, чтобы поставить этому колесу в соответствие "пространство состояний из десяти точек". Здесь каждое состояние (положение) связывается с "точкой", а собрание этих точек называется — в соответствии с математическо традицией — пространством или, если мы хотим большей точности, "пространством состояний". Вместо того чтобы говорить, что переменная обладает (почти) всегда одним из своих возможных значений, мы можем теперь выразить то же, сказав, что система, состоящая из единственной переменной, находится (почти) всегда в одной из точек своего пространства состояний. Пространство состояний описывает степень свободы системы; больше ей некуда переходить. Отвлечемся теперь от отдельно взятого колеса и сосредоточим наше внимание на регистре с восемью такими колесами в строке. Поскольку каждое из этих колес находится в одном из десяти различных состояний, этот регистр, рассмотренный как целое, находится в одном из 100 000 000 возможных различных состояний, каждое из которых естественно идентифицируется числом (а точнее, строкой из восьми цифр), показываемым в окошке. Если заданы состояния всех колес, то состояние регистра в целом однозначно определено; и обратно, по любому состоянию регистра в целом однозначно определяется состояние каждого отдельного колеса. В этом случае мы говорим (в предыдущей главе нами уже использован этот термин), что получаем (или строим) пространство состояний регистра в целом, формируя "декартово произведение" пространств состояний восьми отдельных колес. Общее число точек в этом пространстве состояний является произведением чисел точек в тех пространствах состояний, из которых оно построено (именно поэтому оно называется декартовым произведением).В зависимости от того, что нас интересует в этом предмете, мы либо рассматриваем такой регистр как единую переменную с 108 различными возможными значениями, либо как составную переменную, составленную из восьми различных переменных, называемых "колесами", с десятью значениями. Если мы интересуемся только показываемыми значениями, то будем, по-видимому, рассматривать регистр как неделимое понятие, тогда как инженер-эксплуатационник, которому нужно заменить колесо со сломанным зубцом, будет, конечно рассматривать регистр как составной объект. Мы наблюдали другой пример построения пространства состояний как декартова произведения более мелких пространств состояний, когда обсуждали алгоритм Евклида и обнаружили, что положение фишки где-то на листе можно полностью идентифицировать с помощью двух полуфишек, каждая из которых находится где-то на своей оси, т. е. с помощью комбинации (а точнее, упорядоченной пары) двух переменых "ж" и " у". (Идея идентификации положения точки на плоскости значениями ее координат хну идет от Декарта, который разработал аналитическую геометрию и в честь которого названо декартово произведение.) Фишка на листе была введена для демонстрации того факта, что развивающийся вычислительный процесс — такой, как выполнение алгоритма Евклида,— можно рассматривать как систему, движущуюся по своему пространству состояний. В соответствии с этой метафорой начальное состояние именуется также "исходной точкой".В этой книге мы будем преимущественно — а может быть, даже исключительно — заниматься системами, пространства состояний которых будут в конечном итоге рассматриваться как некие декартовы произведения. Разумеется, не следует усматривать в этом мое мнение, будто бы пространства состояний, построенные с помощью декартовых произведений, являются общим и окончательным решением всех наших проблем; я отлично знаю, что это не так. Из дальнейшего станет очевидным, почему они заслуживают столь большого нашего внимания и в то же время почему это понятие играет столь главенствующую роль во многих языках программирования. Прежде чем продолжить рассуждения, отмечу одну проблему, с которой нам придется столкнуться. Когда мы образуем пространство состояний, строя декартово произведение, то вовсе не обязательно, что нам окажутся полезными все его точки. Типичным примером этому является характеристика дней данного года с помощью пары (месяц, день), где "месяц" — переменная с 12 значениями (от "янв" до "дек"), а "день" — переменная с 31 значениями (от 1 до 31). В этом случае мы образуем пространство состояний из 372 точек, тогда как никакой год не содержит более чем 366 дней. Что нам делать, скажем, с парой (июн, 31)? Либо мы запрещаем ее, вводя понятие "невозможных дат" и тем самым создавая в некотором смысле возможность внутренних противоречий в системе, либо мы разрешаем ее как другой вариант имени для одного из "истинных" дней, например, приравнивая ее к (июл,1). Феномен "неиспользуемых точек пространства состояний" возникает всякий раз, когда число различных возможных значений, которые мы желаем распознавать, оказывается простым числом. Систематизация, которая автоматически вводится, когда мы строим пространство состояний как декартово произведение, позволяет нам идентифицировать отдельно взятую точку. Например, я могу утверждать, что мой день рождения — это (май, 11). Однако благодаря Декарту нам известен теперь и другой способ фиксации этого факта: мой день рождения приходится на ту дату (месяц, день), Приведенное выше уравнение имеет только одно решение и поэтому представляет собой несколько усложненный способ указания этого единственного дня в году. Однако преимущество использования уравнения состоит в том, что оно позволяет нам охарактеризовать множество всех его решений, и такое множество может содержать значительно больше чем одну точку. Тривиальным примером может служить определение рождества: Более примечательным примером является определение множества дат, в которые выплачивается мое ежемесячное жалованье: и разумеется, это гораздо более компактное описание, чем перечисление вида "(янв, 23), (фев, 23), (мар, 23)" и т. д. Из сказанного выше явствует, что степень легкости, с которой мы используем такие уравнения для характеристики множеств состояний, зависит от того, насколько множества, которые мы хотим охарактеризовать, "соответствуют" структуре пространства состояний, т. е. "соответствуют" введенной системе координат. Например, в рассмотренной выше системе координат было бы несколько неудобно охарактеризовать множество дней, которые приходятся на тот же день недели, что и (янв, 1). Во многих случаях программисту приходится при решении задач вводить пространства состояний с подходящими для его целей системами координат; причем дополнительные требования часто вынуждают его вводить также пространства состояний, в которых число точек во много раз больше, чем число различных возможных значений, которые он должен распознавать. Другой пример использования уравнения для характеристики множества состояний встречался в нашем описании картонной машины для вычисления НОД(^Г, Y), где характеризует все точки того, что мы назвали "линией ответа"; это множество конечных состояний, т. е. вычисление прекращается тогда и только тогда, когда достигнуто какое-нибудь состояние, удовлетворяющее уравнению х = у.Помимо координат пространства состояний, т. е. переменных, в терминах значений которых выражается ход вычислительного процесса, мы встречали в наших уравнениях константы (такие, как "май" или "23"). Кроме того, можно пользоваться так называемыми "свободными переменными", которые можно представить себе как "неспецифицированные константы". Мы применяем их специально для обозначения связей различных состояний, которые могут встречаться на последовательных шагах одного и того же вычислительного процесса. Например, во время некоего конкретного выполнения алгоритма Евклида с начальной точкой (X, Y) все состояния (ж, у) будут удовлетворять формулеЗдесь X и Y не являются такими переменными, как хну. Они представляют собой "их начальные значения". Это константы с точки зрения конкретного вычисления, но они не специфицированы в том смысле, что мы могли бы запустить алгоритм Евклида с любой точкой сетки в качестве начального положения нашей фишки.В заключение некоторые терминологические замечания. Я буду называть такие уравнения "условиями" или "предикатами". (Я мог бы, а возможно, и должен бы различать эти понятия, зарезервировав термин "предикат" для формального выражения, обозначающего "условие". Тогда мы имели бы возможность сказать, например, что два разных предиката " х = у" и "у = х" обозначают одно и то же условие. Однако, зная себя, я не надеюсь преуспеть в такой манере изложения.) Я буду считать синонимичными такие выражения, как "состояние, для которого предикат истинен", "состояние, которое удовлетворяет условию", "состояние, в котором условие удовлетворяется", "состояние, в котором условие справедливо" и т. д. Если система заведомо достигнет состояния, удовлетворяющего условию Р, то мы будем говорить, что система заведомо "обеспечит истинность Р".1 Здесь и далее в математических формулах используются для обозначения логических операций символы and (конъюнкция), or (дизъюнкция) и поп (отрицание).— Прим. перев.Предполагается, что всякий предикат определен в каждой точке рассматриваемого пространства состояний: в каждой точке значением предиката является либо "истина", либо "ложь", и предикат служит для характеристики множества всех точек, для которых (или в которых) этот предикат истинен. Мы будем называть два предиката Р и Q равными (формально "Р = Q"), если они обозначают одно и то же условие, т.е характеризуют одно и то же множество состояний.Два предиката будут играть особую роль, и мы резервируем для них имена " Т" и "F".Т —это предикат, который истинен во всех точках рассматриваемого пространства состояний; ему соответствует полное множество состояний.F — предикат, который ложен во всех точках пространства состояний; он соответствует пустому множеству.
|
(с)Все права защищены По всем интересующим вопросам прошу писать на электронный адрес |