
- •24.10.12 Лекция 6
- •Метод индукции, использующий меру
- •5. Построение языка предикатного программирования. Методы доказательства корректности предикатных программ (продолжение )
- •Методы доказательства корректности рекурсивных программ
- •Рекурсивное кольцо состоит из единственного определения предиката:
- •Пример 5.1. Программа умножения через сложение.
- •Перепишем вторую цель в виде суперпозиции:
- •Пример 5.2. Программа D(a, b: c) вычисления наибольшего общего делителя (НОД) положительных a
- •6. Язык предикатного программирования
- •Лексемы
- •Определение предиката
- •Операторы
- •Выражения
- •Описания переменных
- •Структура предикатной программы
- •Определения типов
- •Алгебраические типы
- •Списки
- •Массивы
- •Формулы
- •Императивное расширение
Массивы
type ar1_5 = array (int, 1..5);
ar1_5 squ;
squ = for (var i) i*i; ar1_5 r = for (i) 100 - i;
type Ar(nat k) = array (real, 1..k);
F (nat n, Ar(n) x: Ar(n+1) x')
{ x' = for (var j) { case 1..n : x[j] + 1 case n + 1 : 0 } }
type MATR(nat k) = array(real, 1..k, 1..k); perm_lines(nat n, MATR(n) a, nat k, m : MATR(n) a' ) pre 1 <= k < m <= n
{ a' = a with for (i, j) { case (k, 1..n): a[m, j] case (m, 1..n): a[k, j]
}
}
[<тип массива>] ( [<список выражений>] )
<выражение-массив> + <выражение-массив>
<вырезка массива> ::= <выражение-массив>[<суженный тип индексов>]
<суженный тип индексов> ::= <изображение типа>
Формулы
ФОРМУЛА ::= ЛОГИЧЕСКОЕ-ВЫРАЖЕНИЕ | ( ФОРМУЛА ) | [КВАНТОРНАЯ-ЧАСТЬ] ФОРМУЛА | ! ФОРМУЛА | ФОРМУЛА & ФОРМУЛА | ФОРМУЛА or ФОРМУЛА | ФОРМУЛА -> ФОРМУЛА | ФОРМУЛА <-> ФОРМУЛА
ЛОГИЧЕСКОЕ-ВЫРАЖЕНИЕ ::= ВЫРАЖЕНИЕ КВАНТОРНАЯ-ЧАСТЬ ::=
( КВАНТОР СПИСОК-ПОДКВАНТОРНЫХ-ПЕРЕМЕННЫХ ) [КВАНТОРНАЯ-ЧАСТЬ]
КВАНТОР ::= ! | ? | forall | exists
“!” - квантор всеобщности, а “?” - квантор существования. СПИСОК-ПОДКВАНТОРНЫХ-ПЕРЕМЕННЫХ ::=
[ИЗОБРАЖЕНИЕ-ТИПА [:blank:]] ПОДКВАНТОРНАЯ-ПЕРЕМЕННАЯ (, ПОДКВАНТОРНАЯ-ПЕРЕМЕННАЯ)*
ПОДКВАНТОРНАЯ-ПЕРЕМЕННАЯ ::= ИДЕНТИФИКАТОР
Императивное расширение
операторы перехода и помеченные операторы Для предиката-функции допускается отсутствие результатов
ОПЕРАТОР-ИМПЕРАТИВНОГО-РАСШИРЕНИЯ ::=
ГРУППОВОЙ-ОПЕРАТОР-ПРИСВАИВАНИЯ | break | ОПЕРАТОР-FOR | ОПЕРАТОР-ЕСЛИ
ГРУППОВОЙ-ОПЕРАТОР-ПРИСВАИВАНИЯ ::= | СПИСОК-ПЕРЕМЕННЫХ | = | СПИСОК-ВЫРАЖЕНИЙ |
ОПЕРАТОР-FOR ::= for ( ЗАГОЛОВОК-ЦИКЛА )
{ ОПЕРАТОР [; ОПЕРАТОР] }
ЗАГОЛОВОК-ЦИКЛА ::= [[ИЗОБРАЖЕНИЕ-ТИПА]
ПАРАМЕТР-ЦИКЛА = ВЫРАЖЕНИЕ] ; [УСЛОВИЕ-ЗАВЕРШЕНИЯ] ; [ПЕРЕСЧЕТ-ПАРАМЕТРА]
ПАРАМЕТР-ЦИКЛА |
::= ИДЕНТИФИКАТОР |
УСЛОВИЕ-ЗАВЕРШЕНИЯ |
::= ВЫРАЖЕНИЕ |
ПЕРЕСЧЕТ-ПАРАМЕТРА |
::= ОПЕРАТОР |