Принцип индукции по неподвижной точке
Пусть есть некоторое утверждение о программах, — непрерывное отображение множества в себя, — наименьшая неподвижная точка отображения или, что то же самое, наименьшее решение уравнения .
Тогда, если истинно и для каждого из истинности следует истинность , то истинно . (Под понимается i-е приближение наименьшей неподвижной точки: .)
Проиллюстрируем применение этого принципа на примере анализа простейшей программы на языке MILAN. Рассмотрим программу вычисления факториала:
Здесь предполагается, что все переменные принимают целые значения. Букву следует понимать не как переменную программы, а как условное обозначение произвольного натурального числа, "засылаемого" в "ячейку" . Мы вынуждены прибегать к столь неэстетичному (с программистской точки зрения) вводу исходного значения, так как наш простенький язык не имеет средств ввода/вывода.
Докажем следующее утверждение об этой программе: если после выполнения программы состояние памяти а таково, что и , то .
Заметим, что мы не определяли в языке операторов ввода и вывода и, следовательно, начальное состояние памяти задается априори (некоторым "оракулом"), а вопрос, как это состояние сформировано, остается за пределами формализации. В нашем примере речь идет о задании начального значения переменной .
Проанализируем теперь, что означает в данном случае индукция по неподвижной точке.
Ясно, что перед выполнением цикла состояние памяти таково, что всегда . Нам нужно доказать, что если выполнение цикла заканчивается после конечного числа итераций, то в результирующем состоянии а будем иметь .
Нам будет удобно определить операцию p-дизъюнкции преобразователей состояний памяти, где — некоторое условие языка MILAN.
Определение 8.19. Назовем p-дизъюнкцией преобразователей состояний памяти и преобразователь, обозначаемый и определяемый следующим образом:
(через обозначено значение условия, или предиката, в состоянии ).
В соответствии с тем, как мы определили выше, Преобразователь состояний , соответствующий циклу, есть наименьшая неподвижная точка уравнения , где функция может быть представлена в виде
![F(g)(\nu)={}_{\lnot p}(ID\lor [\kern-0.15em[S]\kern-0.15em]\circ g)(\nu)](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQQAAAAWCAMAAAARvxIcAAAAM1BMVEVHcEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbQS4qAAAAEHRSTlMAMdAhQWkQAcCB4KGR8FGxsVUkrwAABMVJREFUWMPVWNl24yAMNYtAbIb//9oBsRhwkiZpX4bT01IDQlxJV4Lj+G+aprZ/OrZPf9ZOM/3D3NT38zTh/kL+2xikhPmn/3eUs5uUXEryh5WRja5CMY/gNXKAGa3MYajmmWaclfFl4IDvUGjyRd2xqNZ3B/UCBNTlp+lkbTAq5o9SG/nefmUjvs6dDwQZUVLCpgyNsptUPFtnG9AHwhcYdPlKusRPST2fuJQSbDhfgFB+2lmiOpQLMesmjx9B0IA3e+4jBZHEq4OnjLTB3XttxR/2gUPaLwLyku9TB9G0XkzNXS9t3R0ET9qqsuYdEA4VZDue2PEJ8gIkmfYtx9rdGhbq4N3u9nNXuORrPpTC1mOpndl15eQdBFG11YG9CcLh60IXn41UA2RBQtIuZ7oFZl0sbzjmEfycFYd8lboj6d7TCWtHdH2juIEgU+Xn4g/vgXAWD39oRTm00aFMgjwlY2t4d3GIUUpRHCUQFVdFIVYm8MWgkD6Oh0v+meJQxXVcusBG4wKPByAkz/q0GQRlcGEp5tAIIh3KIKzmEemQ9gVPI+dFCZmVQs0X2Ld1XChOnicLXx6xDrBI606KYnnlJzm3FyDgC0rI8jpELQzc+YAYeUopOLWDoBC0mhgNcsADJVVNx2g+KIDA14FGghmUYBEtmTtv5LtiovyS/ai6a+9JVgxqBcHMTb0g+VFr8MQ2Ssj7DQqg7KWG2yzZwdsMQ9xBIN88DAzTQuEPT2sNCdcNaSAnhkUdsq2svqmtaexT1HG0TlQQfNOuhAVr5JTOj3nRDEoIOyVkXODK2/OJFhCqOUm1CQRdhXQ20VgmnKRgNWAHwRD4nPAdps2UoCol0BnN5aHa4tFDqoOgCjqK86b+p+mhy39ICSzZaaJu7rCBALP3zCBUr1FNqiDxnmatIGAB32/R36uExV1dWd2S0RIORAauafd2OAhxKLaGw50SsvGmOjZ7AZh7sdQMnuNx84SWVmHQi+lumxe6i8V1QQfGlrhWCQtxeUoYjU9nYszYKtcL0Z+IUbdbj3LcgXcLMd4pwS1+lfnAqjsIotKbqmG7EKMFfdWAsgSCqtlUN35XnSsgjBgyHX+pbyksVwW6xV2DECqo3MLw6J9SJKt+4QBYoSZSosnXJRv2XihonbiV5W6pcjsIkLw+hi+uKdJxNFd1bjKOlbNqIhTVYtkJohvVQcU9pNLMXj5o4Ny3SxuVRJrRgE58uuY4/g4PSJOXsSaZfhd8U70TstQa7tentcrtIGRouPE2qnudcCz3asYRsR7mrMxQ69tovZhOKy6XneTYswtslNDL5vZn3um9sjmDIENxpatsnl4C9IOHgkadjy5Q+SM7YdTbrypGfTT+bsWxeVA288euTFNZ4TaoUXsG9ewCFdQ7IIiTbk3N2813F/A5RV6QPQVBlc/NitcFSt0SNjy7c5WLSWKahapuL0X1fsf+4CqN3HuY5P8OhEnuMxAK26tYmXVYz++vOYDPHyGK6+Yasro/xPvrxP02/kObcx/D70Aojyq3j88eVQTnaH1NB3ZcwviKv7Ds5fPXiFIR1cT2iwhU756gUMJvn9cC+oB+M2QwaOXTN8nbI5paVcavfPLLxhDdr4U8fmjVf/DQ+g/uUTEYOcn6OAAAAABJRU5ErkJggg==) (для условия  и тела  цикла  ).
Согласно алгоритму вычисления наименьшей неподвижной точки, , где — стирающий преобразователь.
Вычисляя первое приближение наименьшей неподвижной точки, получаем
![f^{(1)}={}_{\lnot p}(ID\lor [\kern-0.15em[S]\kern-0.15em]\circ \bold{0})](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMkAAAAbBAMAAAAkHrYSAAAALVBMVEVHcEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACttl6nAAAADnRSTlMAAYFEwOZmIRCh0DGRsEoHGbAAAANrSURBVEjHvZbdSxRRFMDP3U8/l1m26WGLZVkShWCZXBSFXBS2DBHRB9EiZBELFFm20FfZMKEvZMmE6CFSKhN6mLAHX1qWgiB7kQp6qJfU3U2j+Rs6587HfuDsSrEN7vHOzLnnd++552MA/udVk0Bxq9qUeyRqE1WmfIX5z+Dsri7EmoSruwBL1aU0SsB2gXX+1WTmdgvaSHCXUQM7EAUWzHXqt01fHeuP9NB/AV5f7vOXvv2oG+hLLqoUl2BqaiEOEAgE4mwcZXMxxd2D8zzPLt6+FvAUUWiPd2R17N362aZS7HFTynn8tWZCAO2ZUPuAv4SC8tErxzAErIVvupRVPPJB9SbVmZ7V9iKbhgfpOvZphOJ4FgcP6XmzTnGMAlsvplgzm8EVYM/Vu2AcXBrFdCu2NOUTGbegYMM4GKdkXtEp4jbtt4hStwN2VL6iHsM5AeoSsJGVYNaUsiihEHPEIzGAM0X8WaI6xbdCSVdESe2AbQ9gjjsoMByABglCoTMwaUoJ04LmyG2+IdzLmKQSvAmD8ruDbKmUiX56Ht4FmyKASCuB0H4InEkeib3c4kaIro6iWG8iSoy0wigYToaaIdVrKqVBUb7plNoWzxoqBVWKjeeAlbz9jo/S3CTFamm0PiDKY1pVMErnSrdLwNbyMTalZBIa5SywLtLUKDyZLL9IGCXz8CtCZscw0NkAipMUbDBDhUmnMGEe3cgpDJfsFQxKA6fU/jhCFfmCs5wZ8h1tQxzhcRdvlHWKNY4eimp70SixQoq3p8RiicfuAh71KaEgXbjXqMTOGFlJhTAma5RpgDe4nnAWbAe6x3zpEkr+9LEOuuHD/SkAOn0jXRz7jCu+WDIoIq4kUnD6FEfiDv2BjfeTcNTUT9dxT6enk3aJIpmJOUR5c8KJZW3G9BODkroAlhGdwibWqVR5MjdiowjjwR2Ty56Ivy7qksAnQUpRBsGlKMpBi7oVsEcNymTT26eykS8CT3fWltnDZ3OU0LAslKcsxtsS0IhuRe9xHxo9xJOvlpvOVjmflVpFds+Taaow9b0vy0dXNAyf8pW1uC8JBTWZX8U1WVVapS6ZHakQxFvf/VrlN+tiZSnWURKXpAoUtXLfjJej6B25pIvx9ifzYK30pZZTG2p3xY4Mh3bk90f6dpiJ/PvXxR/pN9IozHsGkgAAAABJRU5ErkJggg==) , где  — тело цикла.
Очевидно, что для произвольного состояния неравенство имеет место тогда и только тогда, когда определено и равно 0. Тогда .
Таким образом, первое приближение соответствует нулевому числу повторений тела цикла. Для второго приближения имеем
Точно так же легко видеть, что тогда и только тогда, когда определено и равно 0 или когда , но . Таким образом, второе приближение соответствует не более чем однократному числу повторений тела цикла. Методом математической индукции несложно доказать, что i-е приближение наименьшей неподвижной точки для семантики цикла соответствует не более чем (i-1)-кратному повторению тела цикла, если для произвольного состояния .
Следовательно, индукция по неподвижной точке сводится в данном случае к индукции по числу повторений цикла, и нам для данного конкретного примера нужно доказать, что выполнение тела цикла сохраняет соотношение значений переменных и : для любого , такого, что , имеем где — тело цикла в программе вычисления факториала.
В самом деле (что и требовалось доказать),
Теперь остается заметить, что поскольку условие выхода из цикла имеет вид , то, задав переменной некоторой значение из множества натуральных чисел , после выполнения нашей программы достигнем требуемого результата.
Мы рассмотрели простейший случай денотационного определения для языка, не содержащего даже блоков и процедур. При появлении последних возникают локальные определения переменных и необходимо модифицировать понятие состояния памяти. Это может быть реализовано с помощью понятия среды, которая формально определяется как декартово произведение множества переменных на множество "адресов", а состояние памяти при этом понимается как отображение вида .
Денотационное определение, как уже упоминалось, не является единственным в рамках экстенсионального подхода. Кроме него наиболее употребительными являются операциональное и трансформационное определения. При операциональном определении в качестве экстенсионала программы рассматривается множество последовательностей состояний памяти, генерируемых при выполнении программы. Трансформационное определение сопоставляет программе преобразователь вида "состояние памяти → пара (программа, состояние памяти)". А именно если программа начинает работать над некоторым исходным состоянием памяти , то все операторы, которые могут быть выполнены, выполняются, а все операторы, которые не могут быть выполнены (из-за неопределенности значений переменных) "складываются" в новую программу (называемую остаточной): таким образом возникает пара (остаточная программа, частичный результат = новое состояние ). Подобное вычисление, называемое смешанным, позволяет определять различные преобразования (трансформации) программ.
Семантика языков программирования в настоящее время является бурно развивающейся областью теории формальных языков, используемой при разработке и реализации языков программирования и программных продуктов (в частности, при разработке надежного программного обеспечения).
Если заметили ошибку, опечатку или есть предложения, напишите в комментариях.
|