Скачать презентацию 2013 Предикатное программирование Формальные методы в описании языков Скачать презентацию 2013 Предикатное программирование Формальные методы в описании языков

lecture1.ppt

  • Количество слайдов: 28

2013 Предикатное программирование Формальные методы в описании языков и систем программирования п/г спецкурс Ведет 2013 Предикатное программирование Формальные методы в описании языков и систем программирования п/г спецкурс Ведет спецкурс: Шелехов Владимир Иванович, зав. лаб. Системного программирования ИСИ, к. т. н. , vshel@iis. nsk. su, р. т. 330 -27 -21, ИСИ СО РАН, к. 269

Кризис программирования 1960 -е Структурное программирование Технологии программирования Э. Дейкстра Объектно-ориентированное программирование Языки спецификации Кризис программирования 1960 -е Структурное программирование Технологии программирования Э. Дейкстра Объектно-ориентированное программирование Языки спецификации программ Формальная верификация программ Формальные методы в программировании

Формальные методы в программировании формальная верификация: - дедуктивная верификация - проверка на модели (model Формальные методы в программировании формальная верификация: - дедуктивная верификация - проверка на модели (model checking) синтез программ построение программы на базе модели абстрактная интерпретация методы тестирования на базе спецификаций (lite) статический анализ достижимости (software model checking) Software engineering (технология пр-я)

Программа спецкурса общее понятие программы корректность программ-функций язык исчисление вычислимых предикатов методы доказательства корректности Программа спецкурса общее понятие программы корректность программ-функций язык исчисление вычислимых предикатов методы доказательства корректности предикатных программ • язык и технология предикатного программирования • язык спецификации процессов • технология спецификации и реализации программ реального времени (реактивных систем) • •

Практика построения спецификаций программ Построение предикатных программ Математическое доказательство корректности предикатных программ Построение эффективных Практика построения спецификаций программ Построение предикатных программ Математическое доказательство корректности предикатных программ Построение эффективных программ методом трансформации Спецификация простых протоколов

 18. 09. 13 Лекция 1 Общее понятие программы Автоматическая вычислимость Спецификация программы Логика 18. 09. 13 Лекция 1 Общее понятие программы Автоматическая вычислимость Спецификация программы Логика программы

Алгоритм и программа Программа есть описание алгоритма решения задачи, заданное на языке программирования Формализации Алгоритм и программа Программа есть описание алгоритма решения задачи, заданное на языке программирования Формализации понятия алгоритма: машина Тьюринга, частично рекурсивные функции, нормальный алгорифм Маркова и каноническая система Поста Основные свойства программы: • автоматическая вычислимость • наличие спецификации программы • логика программы

Автоматическая вычислимость Автоматизация вычислений: счеты арифмометры счетно-решающие устройства ЭВМ калькулятор Программа есть алгоритм, реализованный Автоматическая вычислимость Автоматизация вычислений: счеты арифмометры счетно-решающие устройства ЭВМ калькулятор Программа есть алгоритм, реализованный таким способом и в такой форме, что вычисление алгоритма проводится автоматически

Способы реализации программы • аппаратно реализованная программа (интегральная микросхема, чип) • программа на языке Способы реализации программы • аппаратно реализованная программа (интегральная микросхема, чип) • программа на языке программирования Язык программирования определяет правила представления программы в виде текста в конечном алфавите символов: • типы данных • структура памяти исполняемой программы • виды языковых конструкций программы • правила исполнения конструкции каждого вида и программы в целом

Процессор языка программирования • аппаратно реализованный ― процессор языка системы команд ЭВМ • реализованный Процессор языка программирования • аппаратно реализованный ― процессор языка системы команд ЭВМ • реализованный на др. языке программирования (интерпретатор байткода для языка Java) • виртуальный (трансляция на другой язык) ― представлен описанием операционной семантики исходного языка

Спецификация программы Базовый процесс окружение программа Модель применения программы Спецификация программы описание преобразования информации, Спецификация программы Базовый процесс окружение программа Модель применения программы Спецификация программы описание преобразования информации, реализуемого вычислением программы

Спецификация описывает связь между входными и выходными потоками информации. Связь либо отражает закон природы, Спецификация описывает связь между входными и выходными потоками информации. Связь либо отражает закон природы, выраженный в математической форме, либо является интерфейсом, спроектированным человеком. Язык спецификаций Связь между спецификацией и программой Свойство 1. Спецификация первична по отношению к программе. ДНК ? Свойство 2. Программа должна соответствовать спецификации.

Свойство 3. Будучи написанной, программа всегда существует и является строго определенной в силу строгости Свойство 3. Будучи написанной, программа всегда существует и является строго определенной в силу строгости языка программирования. Спецификация, напротив, может быть нестрогой, неполной, устаревшей, отсутствовать или быть ошибочной. Свойство 4. Программа на языке программирования является абсолютно точной и полной спецификацией самой себя. Свойство 5. Спецификация может быть невычислимой. Программа автоматически вычислима.

Классификация программ 1. Программы-функции (преобразователи) 2. Программы-процессы ………. Языковые процессоры Операционные системы Объектно-ориентированное расширение Классификация программ 1. Программы-функции (преобразователи) 2. Программы-процессы ………. Языковые процессоры Операционные системы Объектно-ориентированное расширение классов Базис классификации: • внешняя форма (интерфейс с окружением) • минимальное ядро языка программирования; • формы определения спецификации программы; • виды условий корректности программы vs спецификации. Разные классы требуют разных методов и технологий

Класс программ-функций (невзаимодействующих программ) Программа не взаимодействует с внешним окружением. Программу можно перестроить программу Класс программ-функций (невзаимодействующих программ) Программа не взаимодействует с внешним окружением. Программу можно перестроить программу таким образом, чтобы все операторы ввода данных находились в начале программы, а весь вывод собран в конце программы. Программа обязана всегда завершаться, поскольку бесконечно работающая и невзаимодействующая программа бесполезна. Программа - функция, вычисляющая по набору входных данных (аргументов) некоторый набор результатов. Задачи дискретной и вычислительной математики

Спецификация Свойства Алгоритм Программа Рис1. Схема построения программы Спецификация программы ― условие математической задачи, Спецификация Свойства Алгоритм Программа Рис1. Схема построения программы Спецификация программы ― условие математической задачи, исходными данными которой являются входные данные программы, а неизвестными результаты программы. Алгоритм строится с использованием свойств (утверждений, лемм, теорем), доказуемых из условия задачи. Эти свойства определяют логику решения задачи. Программа ― реализация алгоритма решения математической задачи. В процессе реализации программа оптимизируется привычным образом: используются циклы вместо рекурсии, используются указатели и т. д. Программирование ― кодирование логики решения в конструкциях языка программирования

Логика решения на примере простейшей программы умножения натуральных чисел a и b через операцию Логика решения на примере простейшей программы умножения натуральных чисел 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 = Логика решения задачи: 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 Метод предикатного Исходная задача: программирования 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: 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: 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: Логика программы Предикат 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) – выражение Логика выражения 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) с Логика базисных операторов 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, Логика оператора цикла 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)