Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lectures / lecture9.ppt
Скачиваний:
21
Добавлен:
06.06.2015
Размер:
241.66 Кб
Скачать

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 -- набор конструкторов с ассоцированными полями и распознавтелями

Соседние файлы в папке lectures