トップレベル定義
フラットな仕様またはモジュール内の各セクションで定義する| セクション | 概要 | 構文 | 例 |
|---|---|---|---|
types |
型エイリアス |
型名 = 型 inv パターン == 条件式;不変条件 inv パターン == 条件式は省略可 |
ペア = nat * nat;ペア = nat * nat inv mk_(x, y) == x + 1 = y;ペア = nat * nat inv p == p.#1 + 1 = p.#2; |
| レコード定義 |
型名:: フィールド名:型 フィールド名:型... inv パターン == 条件式;フィールド名:は省略可不変条件 inv パターン == 条件式は省略可 |
点 :: x:real y:real;第1象限 :: x:real y:real inv mk_第1象限(x, y) == x >= 0 and y >= 0;第1象限 :: x:real y:real inv p == p.x >= 0 and p.y >= 0; |
|
values |
定数定義 |
変数:型 = 式;:型は省略可 |
PI : real = 3.141592653589793238PI2 : real = PI * 2 |
functions |
関数仮定義 |
関数名: 型 * ... * 型 -> 型
pre 条件式およびpost 条件式は省略可measure 関数名は再帰関数の時のみ、かつ、省略可
|
mid : real * real -> real
|
| 陽関数定義 |
関数名: 型 * ... * 型 -> 型
pre 条件式およびpost 条件式は省略可measure 関数名は再帰関数の時のみ、かつ、省略可
|
mid : real * real -> real
|
|
state |
状態定義 |
state 状態空間名 ofinv パターン == 条件式は省略可
|
state カーソル of
|
operations |
純粋操作仮定義 |
pure 操作名: 型 * ... * 型 ==> 型引数がない場合は 型 * ... * 型は()とする。pre 条件式およびpost 条件式は省略可 |
pure カラム位置: () ==> nat
|
| 純粋操作定義 |
pure 操作名: 型 * ... * 型 ==> 型
引数がない場合は型 * ... * 型は()とする。pre 条件式およびpost 条件式は省略可 |
pure カラム位置: () ==> nat
|
|
| 陽操作仮定義 |
操作名: 型 * ... * 型 ==> 型引数がない場合は 型 * ... * 型は()とする。返値がない場合は ==> 型は==> ()とする。pre 条件式およびpost 条件式は省略可 |
カラム移動: int ==> ()
|
|
| 陽操作定義 |
操作名: 型 * ... * 型 ==> 型
引数がない場合は型 * ... * 型は()とする。返値がない場合は ==> 型は==> ()とする。pre 条件式およびpost 条件式は省略可 |
カラム移動: int ==> ()
|
局所定義
| 種別 | 概要 | 構文 | 例 |
|---|---|---|---|
| 式 | let式 |
let パターン:型=式,...,パターン:型=式 in 式:型は省略可 |
let x:nat = 1 in x + 1let x = 1 in x + 1let x:nat = 1, y:nat = 2 in x + ylet f:nat -> nat1 f(x) == x + 1 in f(2) |
| let be式(条件マッチ) |
let 多重束縛 be st 条件式 in 式 |
let x in set {1,2,3,4} be st x mod 2 = 0 in xlet b1, b2:bool be st b1 => b2 in mk_(b1, b2) |
|
| 文 | let文 |
let パターン:型=式,...,パターン:型=式 in 文:型は省略可 |
let x:nat = 1 in return x + 1let x = 1 in return := x + 1let x:nat = 1, y:nat = 2 in return x + ylet f:nat -> nat1 f(x) == x + 1 in f(2) |
| let be式(条件マッチ) |
let 多重束縛 be st 条件式 in 式 |
let x in set {1,2,3,4} be st x mod 2 = 0 in return xlet b1, b2:bool be st b1 => b2 in return mk_(b1, b2) |
|
| ブロック変数 |
(dcl 変数:型=式,...,変数:型=式; 文; ...)=式は省略可
|
(dcl tmp:nat := v1; v1 := v2; v2 := tmp)
|
|
| 整数forループ |
for 変数 = 整数式 to 整数式 by 整数式 do 文by 整数式は省略可 |
for i = 1 to 10 do s := s ^ [i]
|
|
| 列forループ |
for パターン in 列式 do 文 |
for i in [1,2,3,4,5] do s := s ^ [i]
|
|
| 集合forループ |
for all パターン in set 集合式 do 文 |
for all i in set {1,...,10} do s := s ^ [i]
|
パターン
| 型 | 概要 | 構文 | 例 |
|---|---|---|---|
| 任意の型 | 変数 | 変数 |
let x = 1 in x + 2 |
| 無視 | - |
let - = 1 in 2 |
|
| 値 |
リテラル(式) |
cases 4 mod 2: 0 -> <偶数>, 1 -> <奇数> end |
|
| 組型 | 組パターン | mk_(パターン,...,パターン) |
let mk_(x, y) = mk_(1, 2) in x + y |
| レコード型 | レコードパターン | mk_コンストラクタ(パターン,...,パターン) |
let mk_Point(x, y) = mk_Point(1, 2) in x + y |
| 集合型 | 集合外延パターン | {パターン,...,パターン} |
let {x, y} = {1, 2} in x + y |
| 集合併合パターン | パターン union パターン |
let {x} union {1, 3} = {1, 2, 3} in x |
|
| 列型 | 列外延パターン | [パターン,...,パターン] |
let [x, y] = [1, 2] in x + y |
| 連結パターン | パターン ^ パターン |
let x^[3] = [1,2,3] in x |
|
| 写像型 | 写像外延パターン | [パターン |-> パターン,...,パターン |-> パターン] |
let {2 |-> -, 1 |-> x} = {1 |-> 2, 2 |-> 3} in x |
| 写像併合パターン | パターン munion パターン |
let - munion {1 |-> x} = {1 |-> 2, 2 |-> 3} in x |
束縛
| 型束縛 |
パターン:型ただし 型はboolなど有限な型に限る。 |
{mk_(b1, b2) | b1, b2:bool}{ x | x : <グー> | <チョキ> | <パー> } |
| 集合束縛 | パターン in set 集合式 |
{mk_(b1, b2) | b1, b2 in set {true, false}}{ x | x in set {<グー>, <チョキ>, <パー>}} |