アトムとは不可分、不変、非解釈(性質が組み込まれていない)を満たす。これだけではモデル化する能力が足りない。 そこで時空間を表せる関係を導入する。これはアトムからなるタプルの集合だ。
前提知識を要さない順に以下がある。
- 述語論理
-
二種類の式
- 関係名
- 限量変数からなるタプル
- ナビゲーション形式
- 式は限量変数から関係をたどって集合を作る
- 関係演算
- 限量子を持たない式が関係を表す
述語論理は冗長なのでナビゲーション形式がよく使われる。
例
// predicate calculus
all n: Name, d, d': Address |
n -> d in address and n -> d' in address implies d = d'
// navigation expression
all n: Name | lone n.address
// relational calculus
no ~address.address - iden
シグネチャ sig A {f: e}
は次の意味と内部的に等価だ。
f in A -> e
in := ⊂
, -> := ×
all this: A | this.f in e
: := ∈
, A.B := {(a_1, b_1, b_2) | b_1 = a_2}
ファクトは常に成り立つ制約を表す。制約を再利用するため述語を用いる。式を再利用するため関数を用いる。 例
常に成り立つかどうかで決めればよいが規模による。ファクトは簡潔だが制御が難しい。大域参照のような性質があるためだ。 アサーション毎に制約を切り替えたくなった場合、ファクトを最小限にして述語を用いてパッケージするほうが良い。
先頭の引数がスカラなら this
キーワードにより参照できる。
e.g. g [f [x, a], b]
を x.f[a].g[b]
と。
式が一つなら | expr
と書いても { expr* }
と書いても等価だ。
let letDecl,+ blockOrBar