TURBO PASCAL |
Новости
|
Характеристика СемантикиНас интересуют преимущественно такие системы, которые, приступив к работе в некоем "начальном состоянии", завершат ее в каком-то "конечном состоянии", которое, как правило, зависит от выбора начального состояния. Этот подход несколько отличается от концепции автомата с конечным числом состояний, который, с одной стороны, воспринимает поток входных символов, а с другой стороны, порождает поток выходных символов. Чтобы перевести это в нашу схему, мы должны предположить, что значение входа (т. е. аргумент) отражается в выборе начального состояния и что значение выхода (т. е. ответ) отражается в выборе конечного состояния. Наш подход избавляет нас от всевозможных непринципиальных сложностей. Первая часть этой главы посвящена почти исключительно так называемым "детерминированным машинам", тогда как во второй части (которую можно пропустить при первом чтении) речь идет о так называемых "недетерминированных машинах". Различие между этими двумя понятиями состоит в том, что для детерминированной машины событие, которое произойдет после запуска конструкции, полностью определяется ее начальным состоянием. Если она запускается дважды в одинаковых начальных состояниях, то произойдут одинаковые события: поведение детерминированной машины полностью воспроизводимо. Для недетерминированной машины, напротив, запуск в заданном начальном состоянии приведет к какому-то одному событию из класса возможных событий; начальное состояние только фиксирует этот класс в целом. Теперь я предполагаю, что проектирование такой системы является целенаправленной деятельностью, т. е. мы желаем достичь чего-то с помощью этой системы. Например, если мы хотим создать машину, способную вычислять наибольший общий делитель, то можем потребовать, чтобы конечное состояние удовлетворяло условию В рассмотренной ранее машине мы будем иметь также у = НОД(^Г, Y), потому что игра заканчивается при х = у, но это отнюдь не часть наших требований, когда мы решаем принять конечное значение х в качестве ответа.Мы называем условие (1) (желаемым) "постусловием" — "пост", потому что оно налагается на то состояние, в котором система должна оказаться после своей работы. Заметим, что постусловие может удовлетворяться многими возможными состояниями. В таком случае мы естественно считаем каждое из них одинаково удовлетворительным, так что нет оснований требовать, чтобы конечное состояние было однозначной функцией от начального состояния. (Читатель увидит из дальнейшего, что именно здесь проявляется потенциальная полезность недетерминированного устройства.)Для того чтобы использовать эту машину, когда мы хотим получить от нее ответ (например, хотим "чтобы она достигла конечного состояния, удовлетворяющего постусловию (1) для заданного набора значений X и Y"), нам желательно знать множество соответствующих начальных состояний, а более точно, множество таких начальных состояний, при которых запуск обязательно приведет к событию правильного завершения причем система останется в конечном состоянии, удовлетворяющем постусловию. Если мы можем привести систему без вычислительных усилий в одно из таких состояний, то мы уже знаем, как использовать эту систему для получения желаемого ответа. Приведем пример для евклидовой игры на картоне: мы можем гарантировать конечное состояние, удовлетворяющее постусловию (1) для любого начального состояния, удовлетворяющего условию (Верхние границы добавлены, чтобы учесть ограниченный размер листа картона. Если мы начинаем с парой (X, Y), такой, что НОД(^Г, Y) = 713, то не существует пары (ж, у), удовлетворяющей условию (2), т.е. для таких значений X и Y условие (2) сводится к предикату F, аэто означает, что рассматриваемая машина не может быть использована для вычисления НОД (X, Y) применительно к этой паре значений XnY).При многих комбинациях (X, Y) многие состояния удовлетворяют условию (2). В случае 0 < X < 500 и 0 < Y < 500 тривиальным выбором является х = X и у = Y. Этот выбор может быть произведен без какого-либо вычисления функции НОД и даже без учета того факта, что это симметричная функция от своих аргументов.Условие, характеризующее множество всех начальных состояний, при которых запуск обязательно приведет к событию правильного завершения, причем система останется в конечном состоянии, удовлетворяющем заданному постусловию, называется "слабейшим предусловием, соответствующим этому постусловию". (Мы называем его "слабейшим", поскольку, чем слабее условие, тем больше состояний удовлетворяют ему, а мы стремимся здесь охарактеризовать все возможные начальные состояния, которые неизбежно приведут к желаемому конечному с Если система (машина, конструкция) обозначается через S, а желаемое постусловие — через R, то соответствующее слабейшее предусловие мы обозначим1 Если начальное состояние удовлетворяет wp (S, R), то конструкция обязательно обеспечит в конце концов истинность R. Поскольку wp(S', R) — это слабейшее предусловие, мы знаем также, что если начальное состояние не удовлетворяет wp(S', R), то такой гарантии дать нельзя, т. е. ход событий может привести к завершению работы в конечном состоянии, не удовлетворяющем R, а может даже и вообще помешать достижению какого бы то ни было конечного состояния (как мы увидим далее, либо потому, что система оказывается вовлеченной в выполнение незавершимого задания, либо потому, что система попадает в тупик).Мы считаем, что нам достаточно хорошо известно, как работает конструкция S, если можем вывести для любого постусловия R соответствующее слабейшее предусловие wp(S', R), поскольку тем самым мы уловили, что эта конструкция способна сделать для нас; это называется "ее семантикой". Здесь уместны два замечания. Во-первых, множество возможных постусловий, вообще говоря, столь огромно, что эта информация в табличной форме (т. е. в виде таблицы, где каждому постусловию R соответствует запись, в которой содержится соответствующее предусловие wp(S', R)), оказалась бы совершенно необозримой, а следовательно, бесполезной. Поэтому определение семантики той или иной конструкции всегда дается другим способом — в виде правила, описывающего, как для любого заданного постусловия R можно вывести соответствующее слабейшее предусловие wp(S', R)). Для фиксированной конструкции S такое правило, которое по заданному предикату R, означающему постусловие, вырабатывает предикат wp(S', R), означающий соответствующее слабейшее предусловие, называется "преобразователем предикатов". Когда мы просим, чтобы нам сообщили описание семантики конструкции S, то в сущности речь идет о соответствующем этой конструкции преобразователе предикатов. Во-вторых,— и я чувствую искушение добавить "благодаря судьбе" — часто нас не интересует полная семантика конструкции. Это объясняется тем, что мы стремимся использовать конструкцию S только для конкретной надобности, а точнее, для того, чтобы обеспечить истинность весьма конкретного постусловия R, ради которого производилась разработка конструкции. И даже применительно к этому конкретному постусловию R нас часто не интересует точный вид wp(S', R); зачастую мы удовлетворяемся более сильным условием Р, т. е. таким условием, для которого можно показать, что утверждениесправедливо. (Предикат " Р => Q" (читается "из Р следует Q") ложен только в тех точках пространства состояний, где условие Р справедливо, a Q не справедливо; во всех остальных точках он истинен. Требуя, чтобы утверждение "Р => wp(S', R)" было справедливо для всех состояний, мы тем самым требуем, чтобы всякий раз когда Р — истина, условие wp(S', R) тоже было истиной; тогда Р — достаточное предусловие. В теоретико-множественной терминологии это означает, что множество состояний, характеризуемое условием Р, является подмножеством того множества состояний, которое характеризуется условием wp(S', R).) Если для заданных Р, S и R отношение (3) выполняется, это часто можно доказать, не прибегая к точной формулировке,— или, если вам так больше нравится, "вычислению" или "выводу" — предиката wp(S', R). И это отрадное обстоятельство, поскольку, за исключением тривиальных случаев, следует ожидать, что явная формулировка условия wp(S', R) превысит по крайней мере резерв нашей писчей бумаги, нашего терпения или нашей (аналитической) изобретательности (или какую-то комбинацию этих резервов).Смысл wp(S', R), т. е. "слабейшего предусловия для начального состояния, при котором запуск обязательно приведет к событию правильного завершения, причем система S останется в конечном состоянии, удовлетворяющем постусловию R" позволяет нам установить, что преобразователь предикатов, рассматриваемый как функция от постусловия R, обладает рядом определенных свойств. Свойство 1. Для любой конструкции S мы имеемПредположим, что оказалось не так; при этом нашлось хоть одно состояние, удовлетворяющее условию wp(S', F). Возьмем такое состояние в качестве начального состояния для конструкции S. Тогда, согласно нашему определению, запуск привел бы к событию правильного завершения, причем система осталась бы в конечном состоянии, удовлетворяющем предикату F. Но здесь возникает противоречие, так как по определению предиката F не существует состояний, удовлетворяющих F; тем самым доказано отношение (4). Свойство 1 известно также под названием "закон исключенного чуда". Свойство 2. Для любой конструкции S и любых постусловий Q и R, таких, чтоВ самом деле, при любом начальном состоянии, удовлетворяющем wp(S', Q), согласно определению, по окончании работы системы будет обеспечена истинность Q. С учетом отношения (5) тем самым будет обеспечена и истинность R. Следовательно, данное начальное состояние будет одновременно удовлетворять и условию wp(S', R), как записано в (6). Свойство 2 — это свойство монотонности. Свойство 3. Для любой конструкции S и для любых постусловий Q и R справедливо Нам нужно показать, что следование выполняется и в левую сторону. Рассмотрим какое-то начальное состояние, удовлетворяющее wp(S', Q or R), этому начальному состоянию соответствует единственное конечное состояние, удовлетворяющее либо Q, либо R, либо обоим условиям; следовательно, данное начальное состояние должно удовлетворять либо wp(S', Q), либо wp(S', R), либо обоим условиям соответственно, т. е. он должно удовлетворять (wp(S', Q) or wp(S', R)). И этим доказано свойство 4'.В этой книге я буду — и это может оказаться одной из ее отличительных особенностей — рассматривать недетерминированность как правило, а детерминированность как исключение: детерминированная машина будет рассматриваться как частный случай недетерминированной, как конструкция, для которой справедливо свойство 4' а не только более слабое свойство 4. Такое решение отражает коренное изменение в моем мировоззрении. В 1958 г. я был одним из первых, кто разрабатывал базовое программное обеспечение для машины с прерываниями ввода-вывода, и невоспроизводимость поведения такой во всех отношениях недетерминированной машины явилась горестным обстоятельством. Когда впервые была предложена идея прерываний ввода-вывода, меня настолько пугала сама мысль о необходимости разрабатывать надежное программное обеспечение для такого неукротимого зверя, что я оттягивал принятие решения о допущении таких прерываний по крайней мере в течение трех месяцев. И даже после того, как я сдался (мое сопротивление сломили лестью), чувствовал я себя весьма неуютно: ведь ошибка в программе способна вызвать несуразное поведение системы, столь сходное с невоспроизводимым машинным сбоем. Кроме того,— и это в то время, когда для детерминированных машин мы все еще полагались на "отладку",— с самого начала было совершенно очевидно, что тестирование программ оказывалось теперь совсем непригодным средством для достижения должного уровня надежности. В течение многих лет впоследствии я относился к невоспроизводимости поведения недетерминированной машины как к добавочному осложнению, которого следует избегать любыми способами. Прерывания были для меня не чем иным, как злыми кознями инженеров по аппаратуре против бедных разработчиков программного обеспечения. Из этого моего страха родилась дисциплина "гармонически взаимодействующих последовательных процессов". Несмотря на ее успех, мои опасения сохранялись, поскольку наши решения — хоть бы и с доказанной правильностью — представлялись частными решениями проблемы "укрощения" (именно так мы это воспринимали!) конкретных видов недетерминированности. Основанием для моего страха было отсутствие общей методологии. С тех пор два обстоятельства изменили картину. Первое возникло с пониманием того, что даже в случае полностью детерминированных машин полезность тестирования программ оказывается сомнительной. Как я уже много раз говорил и во многих местах писал, тестирование программы может вполне эффективно служить для демонстрации наличия в ней ошибок, но, к сожалению, непригодно для доказательства их отсутствия. Другим прояснившимся тем временем обстоятельством явилось обнаружение необходимости того, чтобы всякая дисциплина проектирования должным образом учитывала тот факт, что само проектирование конструкции, предназначенной для какой-то цели, тоже должно быть целенаправленной деятельностью. В нашем конкретном случае это означает естественность предположения, что отправной точкой для проектных рассмотрений будет служить заданное постусловие. В каком-то смысле мы будем "работать вспять". Действуя так, мы обнаружим, что весьма существенным оказывается следование из свойства 4, тогда как от равенства из свойства 4' мы получим очень мало пользы. Как только мы разработали математический аппарат, позволяющий проектировать недетерминированные конструкции, достигающие цели, недетерминированная машина перестает нас пугать. Напротив! Мы научимся даже ценить ее как важную степень на пути разработки проекта в конечном итоге полностью детерминированной конструкции. (Последующая часть этой главы может быть пропущена при первом чтении.) Ранее мы договорились, что представляем функционирование конструкции S достаточно хорошо, если только знаем, как соответствующий ей преобразователь предикатов wp(S', R) действует над любым постусловием R. Если нам известно также, что данная конструкция детерминирована, то знание этого преобразователя предикатов полностью определяет возможное поведение конструкции. Для детерминированной конструкции S и некоторого постусловия R всякое начальное состояние попадает в одно из трех непересекающихся множеств в соответствии со следующими взаимно исключающими возможностями: (а) Запуск конструкции S приведет к конечному состоянию, удовлетворяющему R. (б) Запуск конструкции S приведет к конечному состоянию, удовлетворяющему поп Д. (в) Запуск конструкции S не приведет к какому бы то ни было конечному состоянию, т. е. работа не сможет завершиться правильным образом. Первое множество характеризуется выражением wp(S', R), второе множество — выражением wp(S', поп R), их объединение — выражением (wp(S', R) or wp(S', поп R)) = wp(S', R or non R) = wp(S', T) a следовательно, третье множество характеризуется выражением nonwp(S', T).Труднее дать полную семантическую характеристику недетерминированной системы. По отношению к любому заданному постусловию R мы снова имеем три возможных типа событий, как перечислено выше в пунктах (а), (б) и (в). Однако в случае недетерминированной системы одно и то же начальное состояние не обязательно приводит к единственному событию, которое по определению относилось бы к одному из трех взаимно исключающих типов; для любого начального состояния возможные события могут теперь относиться к одному, двум или даже ко всем трем типам. Чтобы описывать такие ситуации, мы можем использовать понятие "свободного предусловия". Ранее мы рассмотривали такие предусловия, при которых гарантировалась достижимость "правильного результата", т. е. конечного состояния, удовлетворяющего R. Свободное предусловие является более слабым: оно гарантирует только, что система не выдаст неправильного результата, т. е. не достигнет такого конечного состояния, которое не удовлетворяло бы R, однако не исключается возможность незавершения работы системы. Аналогично и для свободных предусловий мы можем ввести понятие "слабейшего свободного предусловия"; обозначим его через wlp(S', R), При этом пространство начальных состояний подразделяется в принципе на семь взаимно непересекающихся областей, ни одна из которых не обязана быть пустой. (Их семь, потому что из трех объектов можно сделать семь непустых выборок.) Все они легко характеризуются тремя предикатами: wlp(S', R), wlp(S', попД) и wp(S,T). Если бы было не так, то существовало бы начальное состояние, для которого можно было бы гарантировать и завершимость, и незавершимость работы. На рис. 3.1 дано графическое //рис.31 представление пространства состояний,причем внутренние части прямоугольников удовлетворяют wlp(S', R), wlp(S', поп Д) и wp(S', Т) соответственно. Этот анализ приведен для полноты, а также потому, что на практике понятие свободного предусловия оказывается весьма полезным. Если, например, кто-то реализует язык программирования, то он не станет доказывать, что при этой реализации любая правильная программа выполняется правильно. Он был бы удовлетворен и счастлив, если бы твердо знал, что никакая правильная программа не будет выполнена правильно без соответствующего предупреждения,— разумеется, при условии, что класс программ, которые на самом деле будут выполняться правильно, достаточно велик для того, чтобы эта реализация представляла какой-то интерес. Однако пока мы не будем рассматривать понятие свободного предусловия, а сосредоточим свое внимание на способе характеристики тех начальных состояний, которые гарантируют получение правильного результата. Когда такой способ будет разработан, мы посмотрим, как можно его видоизменить таким образом, чтобы это позволило нам рассуждать о свободных предусловиях в той мере, в которой они нас интересуют. |
(с)Все права защищены По всем интересующим вопросам прошу писать на электронный адрес |