- •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
Описания формул
Виды формул: аксиомы (axioms), допущения (assumptions), теоремы (theorems) и утверждения- облигации (obligations)
Команда lemma работает со всеми видами формул
AXIOM, POSTULATE – аксиомы
CHALLENGE, CLAIM, CONJECTURE, COROLLARY, FACT, FORMULA, LAW, LEMMA, PROPOSITION, SUBLEMMA, THEOREM - теоремы
ASSUMPTION – допущения
Свободные переменные – под квантором FORALL
Типы языка спецификаций PVS
сильная типизация структурная эквивалентность
Базисные типы: bool, number (real, rat, int, nat)
-в стандартной библиотеке
•Subtypes: A: TYPE = {x: B | p(x)}
•Function types: [number -> number]
•Record types: [# flag: boolean, value: number #]
• Tuple types: [boolean, number]
• Enumeration types: {red, green, blue}
Подтипы
A: TYPE = {x: B | p(x)} A: TYPE = (p)
nat: TYPE = { n: int | n >=0 }
subrange(n, m: int): TYPE = { i: int | n <= i & i <= m }
параметрические типы
FORALL (i:int):
(i >= 0 IMPLIES (EXISTS (j:int): j >= 0 AND j > i)) можно записать короче
FORALL (i:nat): (EXISTS (j:nat): j > i))
где определен в prelude.pvs следующим образом: naturalnumber:
NONEMPTY TYPE = {i:integer | i >= 0} CONTAINING 0 nat: NONEMPTY TYPE = naturalnumber
existence TCC при наличии константы f: [ int -> {x:int | p(x)} ]
с: f
порождает existence TCC
f_TCC1: OBLIGATION (EXISTS (x: int): p(x))
Чтобы гарантировать непустоту типа, применяется
t: TYPE = {x: int | 0 < x AND x < 10} CONTAINING 1 Для леммы
div_form: FORMULA (FORALL (x,y: int):
x /= y IMPLIES (x - y)/(y - x) = -1)
генерируется subtype TCC:
div_form_TCC1: OBLIGATION
(FORALL (x,y: int): x /= y IMPLIES (y - x) /= 0)
Типы функций
Три эквивалентных формы: [t1, ..., tn -> t] FUNCTION[t1, ..., tn -> t] ARRAY[t1, ..., tn -> t]
Тип предиката pred[t] и тип множества setof[t] есть тип [t -> bool].
Тип функции [t1,...,tn -> t] есть подтип типа [s1,...,sm -> s] t – подтип s, n = m и si = ti для i =1,..., n.
Генерируются TCC, называемые domain mismatch TCCs p,q: pred[int]
f:[{x: int | p(x)} -> int]
g:[{x: int | q(x)} -> int]
h:[int -> int]
eq1: FORMULA f = g eq2: FORMULA f = h
p,q: pred[int]
f:[{x: int | p(x)} -> int]
g:[{x: int | q(x)} -> int]
h:[int -> int]
eq1: FORMULA f = g eq2: FORMULA f = h
Генерируются TCC:
eq1_TCC1: OBLIGATION
(FORALL (x1: {x : int | q(x)}, y1 : {x : int | p(x)}) :
q(y1) AND p(x1))
eq2_TCC1: OBLIGATION
(FORALL (x1: int, y1 : {x : int | p(x)}) : TRUE AND p(x1))
Типы произведения (tuples), n-ки
[t1, ..., tn] , где ti – изображение типа (типовое выражение). Нульмерные тупли запрещены.
(1, TRUE, (LAMBDA (x:int): x + 1)) – выражение типа [int, bool, [int -> int]].
Функции проекции:
`1, `2, . . . , (или proj 1, proj 2, . . . )
i-ая проекция имеет тип [[t1, ..., tn] -> ti].
Тип тупля пустой, если тип одной из компонент пустой
[t1, ..., tn -> t] и [[t1, ..., tn] -> t] эквивалентны;
Тип записи
[# a1: t1, ..., an: tn #] ai – поле
ti – тип поля (изображение типа). x ’ ai – операция взятия поля
Тип записи пуст, если тип одной из компонент пуст
Порядок указания полей несущественен
Зависимые (dependent) типы
Функции, тупли и записи могут быть зависимыми – одна из компонент может зависеть от предыдущих
rem: [nat, d: {n: nat | n /= 0} -> {r: nat | r < d}] pfn: [d:pred[dom], [(d) -> ran]]
stack: [# size: nat, elements: [{n:nat | n < size} -> t] #]
subp(i: int, (j: int | i >= j)): RECURSIVE int = (IF (i=j) THEN 0 ELSE (subp(i, j+1)+1) ENDIF) MEASURE i - j
Виды выражений
Logic: TRUE, FALSE, AND, OR, NOT, IMPLIES, FORALL, EXISTS, =
Arithmetic: +, -, *, /, <, <=, >, >=, 0; 1; 2; : : :
Function application, abstraction ( -expression), and update
Coercions - приведение
Record construction, selection, and update Tuple construction, projection, and update:
id WITH [(0):=42,(1):=12]
IF-THEN-ELSE, COND: |
IF c THEN e1 ELSE e2 ENDIF |
|
CASES: |
COND c1->e1, c2->e2, c3->e3 ENDCOND |
|
Tables, Inductive definitions
