関係写像は、関係を関係に変換する写像です。
このノートでは、関係写像をあらわすコードから、
関係写像の内部構造 Relmap c を組み立てる方法の概要を説明します。
このノートの説明は、甲州計算機バーラ実装のバージョン 0.39 に対応します。
関係写像は、関係写像の定義か、判断を出力する節のどちらかに含まれます。
つぎの形式の RELMAP に相当する部分です。
NAME : RELMAP
|== PATTERN : RELMAP
|=X PATTERN : RELMAP
この RELMAP は、以下の処理を経て、
トークン木として得られます。
-
文字列がトークンに分解される。
-
トークンが節単位にまとめられる。
-
節単位のトークン列が節の種類に応じて分類される。
-
関係写像のトークン列を木構造にまとめる。
関係写像は、RELMAP | RELMAP | RELMAP のように、
複数の関係写像が連結されて定義されることが多いので、
まず、連結演算 | で分解します。
連結演算は、唯一の組み込み関係写像演算で、
"op" x y z という形式で書けるとすると、
つぎのような関係写像であるかのように処理されます。
"|" RELMAP RELMAP RELMAP
関係写像が連結演算 | で分解され、
個々の写像まで到達したとします。
個々の写像には、それぞれの処理が必要なため、
関係写像演算子の名前で、演算子の定義を検索します。
たとえば、source A /x /y という関係写像であれば、
演算子の名前 source で検索します。
検索された演算子の定義から、最初に、
引数を分類するための関数を取り出します。
トークン木としてあらわされた演算子の引数に、その関数を適用します。
その結果として、source A /x /y は、
つぎのような連想リストへ分類されます。
| -pattern | -term |
|---|---|
A |
/x /y |
引数に部分写像をもっている演算子の場合は、
部分写像も同様に解析されます。
たとえば、meet がつぎのように使われているとき、
meet (source A /x /y)
引数分類は
| -relmap |
|---|
source A /x /y |
となり、さらに、source A /x /y が解析されます。
甲州記法の関係写像の引数分類の約束として、
-relmap という連想名の内容は、
部分写像であると定めされています。
引数が分類された関係写像は、
半分だけ構成された写像をあらわす
HalfRelmap という型の値です。
この型は、String として演算子の名前、
[Named TokenTree] という連想リストとしての引数、
部分写像のリストである [HalfRelmap] を要素としてもちます。
HalfRelmap は、項目内容の型パラメータ c に依存していないため、
Data.Generics モジュールの型クラス Data と Typeable の
インスタンスにできます。
HalfRelmap から完全な関係写像 Relmap c をつくるため、
まず、部分写像のリストを完全な関係写像のリストに変換します。
つまり、[HalfRelmap] を [Relmap c] という型に変換します。
この部分写像のリスト [Relmap c] と連想リストを、
関係写像演算子の定義に引き渡すことで、関係写像を完成させます。