lecture1.ppt
- Количество слайдов: 28
2013 Предикатное программирование Формальные методы в описании языков и систем программирования п/г спецкурс Ведет спецкурс: Шелехов Владимир Иванович, зав. лаб. Системного программирования ИСИ, к. т. н. , vshel@iis. nsk. su, р. т. 330 -27 -21, ИСИ СО РАН, к. 269
Кризис программирования 1960 -е Структурное программирование Технологии программирования Э. Дейкстра Объектно-ориентированное программирование Языки спецификации программ Формальная верификация программ Формальные методы в программировании
Формальные методы в программировании формальная верификация: - дедуктивная верификация - проверка на модели (model checking) синтез программ построение программы на базе модели абстрактная интерпретация методы тестирования на базе спецификаций (lite) статический анализ достижимости (software model checking) Software engineering (технология пр-я)
Программа спецкурса общее понятие программы корректность программ-функций язык исчисление вычислимых предикатов методы доказательства корректности предикатных программ • язык и технология предикатного программирования • язык спецификации процессов • технология спецификации и реализации программ реального времени (реактивных систем) • •
Практика построения спецификаций программ Построение предикатных программ Математическое доказательство корректности предикатных программ Построение эффективных программ методом трансформации Спецификация простых протоколов
18. 09. 13 Лекция 1 Общее понятие программы Автоматическая вычислимость Спецификация программы Логика программы
Алгоритм и программа Программа есть описание алгоритма решения задачи, заданное на языке программирования Формализации понятия алгоритма: машина Тьюринга, частично рекурсивные функции, нормальный алгорифм Маркова и каноническая система Поста Основные свойства программы: • автоматическая вычислимость • наличие спецификации программы • логика программы
Автоматическая вычислимость Автоматизация вычислений: счеты арифмометры счетно-решающие устройства ЭВМ калькулятор Программа есть алгоритм, реализованный таким способом и в такой форме, что вычисление алгоритма проводится автоматически
Способы реализации программы • аппаратно реализованная программа (интегральная микросхема, чип) • программа на языке программирования Язык программирования определяет правила представления программы в виде текста в конечном алфавите символов: • типы данных • структура памяти исполняемой программы • виды языковых конструкций программы • правила исполнения конструкции каждого вида и программы в целом
Процессор языка программирования • аппаратно реализованный ― процессор языка системы команд ЭВМ • реализованный на др. языке программирования (интерпретатор байткода для языка Java) • виртуальный (трансляция на другой язык) ― представлен описанием операционной семантики исходного языка
Спецификация программы Базовый процесс окружение программа Модель применения программы Спецификация программы описание преобразования информации, реализуемого вычислением программы
Спецификация описывает связь между входными и выходными потоками информации. Связь либо отражает закон природы, выраженный в математической форме, либо является интерфейсом, спроектированным человеком. Язык спецификаций Связь между спецификацией и программой Свойство 1. Спецификация первична по отношению к программе. ДНК ? Свойство 2. Программа должна соответствовать спецификации.
Свойство 3. Будучи написанной, программа всегда существует и является строго определенной в силу строгости языка программирования. Спецификация, напротив, может быть нестрогой, неполной, устаревшей, отсутствовать или быть ошибочной. Свойство 4. Программа на языке программирования является абсолютно точной и полной спецификацией самой себя. Свойство 5. Спецификация может быть невычислимой. Программа автоматически вычислима.
Классификация программ 1. Программы-функции (преобразователи) 2. Программы-процессы ………. Языковые процессоры Операционные системы Объектно-ориентированное расширение классов Базис классификации: • внешняя форма (интерфейс с окружением) • минимальное ядро языка программирования; • формы определения спецификации программы; • виды условий корректности программы vs спецификации. Разные классы требуют разных методов и технологий
Класс программ-функций (невзаимодействующих программ) Программа не взаимодействует с внешним окружением. Программу можно перестроить программу таким образом, чтобы все операторы ввода данных находились в начале программы, а весь вывод собран в конце программы. Программа обязана всегда завершаться, поскольку бесконечно работающая и невзаимодействующая программа бесполезна. Программа - функция, вычисляющая по набору входных данных (аргументов) некоторый набор результатов. Задачи дискретной и вычислительной математики
Спецификация Свойства Алгоритм Программа Рис1. Схема построения программы Спецификация программы ― условие математической задачи, исходными данными которой являются входные данные программы, а неизвестными результаты программы. Алгоритм строится с использованием свойств (утверждений, лемм, теорем), доказуемых из условия задачи. Эти свойства определяют логику решения задачи. Программа ― реализация алгоритма решения математической задачи. В процессе реализации программа оптимизируется привычным образом: используются циклы вместо рекурсии, используются указатели и т. д. Программирование ― кодирование логики решения в конструкциях языка программирования
Логика решения на примере простейшей программы умножения натуральных чисел a и b через операцию сложения. Логика решения задачи: a b = b + (a -1) b; 0 b = 0 (1) Логическая, функциональная и императивная программы: 0 b 0; a b b + (a - 1) b (2) nat mult(nat a, b) { if (a == 0) 0 else b + mult(a -1, b) } (3) nat c = 0; while (a 0) { c = c + b; a = a -1 } (4) Логика решения тождественна с логической и функциональной программой Императивная программа искривляет логику решения
Логика решения задачи: a b = b + (a -1) b; 0 b = 0 (1) Логическая, функциональная и императивная программы: 0 b 0; a b b + (a - 1) b (2) nat mult(nat a, b) { if (a = 0) 0 else b + mult(a -1, b) } (3) nat c = 0; while (a 0) { c = c + b; a = a -1 } (4) Логика (1), реализованная императивной программой (4), искривлена и сложна для понимания. В предикатном программировании запрещены такие языковые конструкции, как циклы и указатели, серьезно усложняющие программу. Функциональная программа в несколько раз проще в сравнении с императивной программой, реализующей тот же алгоритм, потому что вместо циклов используются рекурсивные функции, а вместо массивов и указателей – списки
Метод предикатного Исходная задача: программирования pred mult(nat a, b: nat c) post c = a b; Обобщение исходной задачи: pred mult. G(nat a, b, d: nat c) post c = d + a b; Логика решения обобщенной задачи: d + a b = d + b + (a -1) b; d + 0 b = d (5) Предикатная программа: pred mult(nat a, b: nat c) post c = a b { mult. G(a, b, 0: c) }; pred mult. G(nat a, b, d: nat c) { if (a == 0) c = d else mult. G(a - 1, b, d + b: c) } post c = d + a b measure a; Программа и логика решения (5) тождественны
Функциональное программирование – предельная декларативность в ущерб эффективности. Оптимизация алгоритма на уровне предикатной программы Оптимизирующие трансформации: • замена хвостовой рекурсии циклом • открытая подстановка тела программы на место вызова • склеивание переменных (замена вхождений переменной на другую переменную) • кодирование рекурсивных структур через массивы и указатели 1. Замена хвостовой рекурсии циклом: pred mult. G(nat a, b, d: nat c) { if (a == 0) c = d else mult. G(a - 1, b, d + b: c) } post c = d + a b measure a; pred mult. G(nat a, b, d: nat c) { M: if (a == 0) c = d else | a, b, d | = |a - 1, b, d + b|; goto M }
1. 1. Раскрытие мультиприсваивания и оформление цикла: pred mult. G(nat a, b, d: nat c) { M: if (a == 0) c = d else | a, b, d | = |a - 1, b, d + b|; goto M } pred mult. G(nat a, b, d: nat c) { for( ; ; ) if (a == 0) c = d else { a = a – 1; d = d + b } } 2. Подстановка программы на место вызова: pred mult(nat a, b: nat c) post c = a b { mult. G(a, b, 0: c) }; pred mult(nat a, b: nat c) { nat d; |a, b, d| = |a, b, 0|; for( ; ; ) if (a == 0) c = d else { a = a – 1; d = d + b } };
2. 1. Раскрытие мультиприсваивания 3. Склеивание переменных: c d pred mult(nat a, b: nat c) { nat d; |a, b, d| = |a, b, 0|; for( ; ; ) if (a == 0) c = d else { a = a – 1; d = d + b } }; nat d; |a, b, d| = |a, b, 0|; nat d = 0; pred mult(nat a, b: nat c) { c = 0; for( ; ; ) if (a == 0) c = c else { a = a – 1; c = c + b } }; 3. 1. Упрощения. Оформление цикла while pred mult(nat a, b: nat c) { c = 0; while (a ≠ 0) { a = a – 1; c = c + b } };
Логика программы Предикат A сильнее B A B L(S) – логика программы-функции S: сильнейший предикат, истинный при завершении исполнения S. sp(P, S) – сильнейшее постусловие программы S при истинности предусловия P L(S) = sp(true, S) Ограничение: программа не взаимодействует с окружением Класс программ-функций (невзаимодействующих программ)
Логика выражений и простых операторов E(x) – выражение Логика выражения E(x) есть L(E(x)) (R(x), E(x)), где R(x) – слабейший предикат, при истинности которого выражение E(x) определено от аргументов x. Например, L(a / b) = (b 0, a / b); Логика оператора A – предикат L(A). R(x) – слабейший предикат, при истинности которого определены выражения, входящие в оператор A. Должно быть истинно L(A) R(x). L(a : = E(x)) R(x) & a = E(x) (a не встречается в наборе x) Например, L(c : = a / b) = b 0 & c = a / b.
Логика базисных операторов L(B; C) ? Необходима специализация S(x: y) оператор S(x, y) с аргументами x и результатами y. Оператор суперпозиции B(x: z); C(z: y), параллельный оператор B(x: y) || C(x: z) x, y и z – разные наборы переменных L(B(x: z); C(z: y)) z. L(B(x: z)) & L(C(z: y)) L(B(x: y) || C(x: z)) L(B(x: y)) & L(C(x: z)) L(if (E) B(x: y) else C(x: y)) E & L(B(x: y)) E & L(C(x: y)) if (E) L(B(x: y)) else L(C(x: y))
Логика оператора цикла W(u, x) – while E do B(u, x) end proc W(u, x) { if (E) { B(u, x); W(u, x)}} L(W(u, x: x’)) = if (E) z. L(B(u, x: z) & L(W(u, z: x’)) else x’ = x наименьшая неподвижная точка Логика бесконечного цикла не существует
Корректность логики программы определяется как согласованность логики с операционной семантикой языка программирования для любых выражений и операторов. Программа – оператор S(x, y) x и y наборы переменных, аргументы и результаты. RUN(S, x, y) любое исполнение оператора S для аргументов со значениями x завершается и значения результатов есть y. x, y. L(S(x, y)) RUN(S, x, y)


