LoginSignup
0
0

双方向変換ってなぁに?

Last updated at Posted at 2023-12-18

この記事は Abstract

授業や研究で『双方向変換 : Bidirectional Transformation』を学習する必要に迫られた人類(筆者含む)に向けて、10分弱で読めて具体例と一緒に雰囲気だけでも掴める記事になればと…
説明の正確さは保証できませんが…

双方向変換 Bidirectional Transformation : BX

概略

双方向変換をかなり簡単化していうなら、『ある情報源から情報の一部をとったり、その情報源を更新する操作』です。ただしこれだけが双方向変換なのではなく、あくまでも双方向変換のメジャーな一種です。以降本記事ではこれについて説明します。その点では先述の説明は不適切ですが今は正確性を捨てます。

変換(?)

双方向変換とは、$s$ をある情報源とし、そこから一部をとってきたものを $v$ として(それぞれ Source、View の頭文字)、 $s$ や $v$ の間で変換する技術です。
また双方向変換は、『情報をとってくる操作 ($\textit{get}$) 』と『情報源を更新する操作 ($\textit{put}$) 』という関数で構成されます。(具体例はあとで挙げます。)
$\textit{get}$ は 情報源 ($s$) を引数に取り、あるビュー ($v$) を返す関数です。
$\textit{put}$ は 更新したい情報源 ($s$) と更新情報を含んだビュー ($v$) 引数に取り、更新された情報源 ($s'$) を返す関数です。引数は二つです。

数学や関数型言語について知ってる人に向けて書くならば、

\begin{align}
    \textit{get} &: S \to V\\
    \textit{put} &: S \times V \to S
\end{align}

となります。なお、$s\in S$ と $v\in V$ です。

ちなみにこの二つの関数の組をレンズ (Lens) と呼ぶことが多いです。というか双方向変換よりレンズの方がメジャーかも?

具体例1. DB

とはいえ私も最初は抽象的な説明だと理解できなかったので具体例を挙げてみます。(具体例を挙げている論文が少なすぎるんじゃ)
情報源 $s_1$ を以下の表とします。[国名、首都、フラッグキャリア]の組です。
今回は $S=[\text{Nation}, \text{Capital}, \text{Flag Carrier}]$ という型になります。

Nation Capital Flag Carrier
Japan Tokyo All Nippon Airways
Italy Rome ITA Airways
Egypt Cairo EgyptAir

get の例

このとき、国名と首都の情報だけ欲しいとします。この『情報をとってくる操作』は $\textit{get}(s_1)=v_1$ と書きビュー $v_1$ は以下の表になります。
ビューの型は $V=[\text{Nation}, \text{Capital}]$ です。

Nation Capital
Japan Tokyo
Italy Rome
Egypt Cairo

put の例

仮に日本がバグって仙台に遷都したとします。このとき、この更新情報を元の情報源 $s$ に反映しなければなりません。今回の例程度の表のサイズなら「直接 $s_1$ に反映しろよ」という話ですが、一般論として小さい表を更新した上でそれが元の大きい表に反映できれば便利だよね、という体で話を進めます。
まずビュー $v_1$ (小さい表)を更新して新しいビュー $v_2$ を作成します。

Nation Capital
Japan Sendai
Italy Rome
Egypt Cairo

これに基づいて、元の情報源 $s_1$ を更新して新しい情報(源) $s_2$ を作成します。
この『情報源を更新する操作』は $\textit{put}(s_1, v_2)=s_2$ となります。
自然な感じに更新して以下のような表 $s_2$ を得ます。

Nation Capital Flag Carrier
Japan Sendai All Nippon Airways
Italy Rome ITA Airways
Egypt Cairo EgyptAir

以上が双方向変換の(おそらく最も容易に想像がつきやすい)具体例です。
この辺は SQL で書けると思います。筆者は長らく SQL を書いていないので忘れましたが…

具体例2. 代数

論文とかのより抽象的な議論が求められるものでは、先ほどの表のような具体例を挙げるのではなく、代数的な例で議論することが多々あります。
例えば

\begin{align}
&S=V=\mathbb{Z}\\
&get(s)=2s\\
&put(s, v) = s + v
\end{align}

とか。ここでは $\mathbb{Z}$ を整数全体の集合とします。
例えば $get(3)=6$、$put(-2, 7)=5$ などとなります。このような代数を用いた双方向変換はその性質の証明や反例をあげるのに使われることが多そうです。

まとめ Concluding Remarks

もちろんこれだけが双方向変換なのではなく、むしろ双方向変換の 1% も説明してません。ただ教科書的なのがなさそうな分野なので大変ですがこれ以上の双方向変換を学ぶには解説論文なりを読みましょう。

最後にもう一度、この記事の正しさは保証しません and/or できません。
間違ってたらそっと教えてください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0