Skip to content

Latest commit

 

History

History

construct-relmap

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

関係写像の構成

関係写像は、関係を関係に変換する写像です。 このノートでは、関係写像をあらわすコードから、 関係写像の内部構造 Relmap c を組み立てる方法の概要を説明します。 このノートの説明は、甲州計算機バーラ実装のバージョン 0.39 に対応します。

関係写像のトークン木

関係写像は、関係写像の定義か、判断を出力する節のどちらかに含まれます。 つぎの形式の RELMAP に相当する部分です。

NAME : RELMAP
|== PATTERN : RELMAP
|=X PATTERN : RELMAP

この RELMAP は、以下の処理を経て、 トークン木として得られます。

  1. 文字列がトークンに分解される。

  2. トークンが節単位にまとめられる。

  3. 節単位のトークン列が節の種類に応じて分類される。

  4. 関係写像のトークン列を木構造にまとめる。

写像連結の分解

関係写像は、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 モジュールの型クラス DataTypeable の インスタンスにできます。

HalfRelmap から完全な関係写像 Relmap c をつくるため、 まず、部分写像のリストを完全な関係写像のリストに変換します。 つまり、[HalfRelmap][Relmap c] という型に変換します。 この部分写像のリスト [Relmap c] と連想リストを、 関係写像演算子の定義に引き渡すことで、関係写像を完成させます。