関係写像は、関係を関係に変換する写像です。
このノートでは、関係写像をあらわすコードから、
関係写像の内部構造 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]
と連想リストを、
関係写像演算子の定義に引き渡すことで、関係写像を完成させます。