
- •14.11.12 Лекция 9
- •7. Технология предикатного программирования 7.5. Система автоматизации доказательства PVS
- •Система PVS
- •Описания
- •• пустота – непустота типов
- •Рекурсивные определения
- •Макросы
- •Typechecking
- •Описания формул
- •Типы языка спецификаций PVS
- •Подтипы
- •Типы функций
- •p,q: pred[int]
- •Типы произведения (tuples), n-ки
- •Тип записи
- •Зависимые (dependent) типы
- •Виды выражений
- •IF-THEN-ELSE выражения
- •Операции (применения функций)
- •Связывающие (binding) выражения
- •LET и WHERE выражения
- •SET выражения
- •Выражение проекции
- •Поле записи
- •Теории
- •Пример теории
- •Алгебраические типы
- •Алгебраические типы на примере списков
- •Библиотеки теорий PVS
- •NASA Libraries
- •NASA Libraries (cont)
- •Prover
- •Дерево доказательства, вершина цель доказательства, дугашаг доказательства
- •Пусть имеется секвент A├ B & C
- •Логика PVS
IF-THEN-ELSE выражения
IF cond THEN expr1 ELSE expr2 ENDIF полиморфное выражение
АРИФМЕТИЧЕКИЕ выражения
(0, 1, 2, . . . ), унарный -, ^, +, -, *, /. Числа имеют тип real.
Неявные подтверждения (judgements) для чисел; 0 – является типа real, rat, int и nat;
<, <=, >, >=.
ПРИМЕНЕНИЯ ФУНКЦИЙ
f(x) также, в инфиксной и префиксной нотации f(0)(2,3)
Операции (применения функций)
Таблица приоритетов |
|
Операция |
Ассоциативность |
FORALL, EXISTS, LAMBDA, IN |
None |
| |
Left |
|-, |= |
Right |
IFF, <=> |
Right |
IMPLIES, =>, WHEN |
Right |
OR, \/, XOR, ORELSE |
Right |
AND, &, &&, /\, ANDTHEN |
Right |
NOT, ~ |
None |
=, /=, ==, <, <=, >, >=, <<, >>, <<=, >>=, <|, |> |
Left |
WITH |
Left |
WHERE |
Left |
@, # |
Left |
@@, ##, || |
Left |
+, -, ++, |
Left |
, /, **, // |
Left |
- |
None |
o |
Left |
:, ::, HAS TYPE |
Left |
[], <> |
None |
^, ^^ |
Left |
` |
Left |
Связывающие (binding) выражения
FORALL, EXISTS, LAMBDA
Ламбда-выражения – безымянные функции (LAMBDA (x: int): x + 3)
Подкванторные переменные могут быть зависимыми
FORALL (x: int), (y: {z: int | x < z}): p(x, y)
LET и WHERE выражения
LET x: int = 2, y: int = x * x IN x + y x + y WHERE x: int = 2, y: int = x * x
значение = 6 для каждого выражения.
транслируются в ламбда-выражения
(LAMBDA (x: int) : (LAMBDA (y: int) : x + y)(x * x))(2)
SET выражения
Множество есть предикат – функция типа [t -> bool], pred[t], или setof[t],
(LAMBDA (x: t): p(x)) или {x: t | p(x)}
- эквивалентны
Tuple-выражение
Выражение типа [t1,...,tn] имеет форму (e1,...,en).
Выражение проекции
t: [int, bool, [int -> int]]
ft: FORMULA t`2 AND t`1 > t`3(0) ft_deprecated: FORMULA
PROJ_2(t) AND PROJ_1(t) > (PROJ_3(t))(0)
Выражение-запись
Выражение (# a1 := e1, ..., an := en #) |
|
имеет тип [# a1: t1, ..., an: tn #], где ej |
имеет тип tj. |
все компоненты должны присутствовать |
|
Для зависимых типов |
|
R: TYPE = [# a: int, b: {x: int | x < a} #] |
|
r: R = (# a := 3, b := 4 #) |
|
генерируется недоказуемое TCC: |
4 < 3. |
Поле записи
Переменная r имеет тип записи [# x, y: real #]
Доступ к полю x реализуется конструкцией r`x или x(r).
Модификация структурного значения
Override Expression для функций, записей и туплей identity WITH [(0) := 1, (1) := 2]
(id WITH [(0) := 1]) WITH [(1) := 2]
(LAMBDA x: IF x = 1 THEN 2 ELSIF x = 0 THEN 1 ELSE id(x))
R: TYPE = [# a: int, b: [int -> [int, int]] #] r1: R
r2: R = r1 WITH [`a := 0, `b(1)`2 := 4]
f WITH [(-1) |-> 0] с расширением области аргументов
Теории
Specication ::= { Theory | Datatype } +
Theory ::= Id [ TheoryFormals ] : THEORY
[ Exporting ]
BEGIN
[ AssumingPart ]
[ TheoryPart ]
END Id
TheoryFormals ::= [ TheoryFormal++',' ]
TheoryFormal ::= [ ( Importing ) ] TheoryFormalDecl
TheoryFormalDecl ::= TheoryFormalType | TheoryFormalConst
TheoryFormalType ::=
Ids : { TYPE | NONEMPTY TYPE | TYPE+ }
[ FROM TypeExpr ]
TheoryFormalConst ::= IdOps : TypeExpr
Пример теории
groups [G : TYPE, e : G,
o : [G,G->G],
inv : [G->G] ] : THEORY
BEGIN ASSUMING
a, b, c: VAR G
associativity : ASSUMPTION a o (b o c) = (a o b) o c unit : ASSUMPTION e o a = a AND a o e = a
inverse : ASSUMPTION inv(a) o a = e AND a o inv(a) = e ENDASSUMING
left_cancellation: THEOREM a o b = a o c IMPLIES b = c right_cancellation: THEOREM b o a = c o a IMPLIES b = c
END groups
IMPORTIHG groups[int, 0, +, -]
Алгебраические типы
Abstract Datatypes
Datatype ::= Id [ TheoryFormals ] :
DATATYPE [ WITH SUBTYPES Ids ] BEGIN
[ Importing [ ; ] ]
[ AssumingPart ] DatatypePart
END Id
InlineDatatype ::= Id : DATATYPE [ WITH SUBTYPES Ids ] BEGIN
[ Importing [ ; ] ]
[ AssumingPart ] DatatypePart
END id
DatatypePart ::= { Constructor : IdOp [ : Id ] } + Constructor ::= IdOp [ ( {IdOps : TypeExpr }++',' ) ]
datatype -- набор конструкторов с ассоцированными полями и распознавтелями