読者です 読者をやめる 読者になる 読者になる

かな入力とローマ字入力を定義するver.2

タイピング

かな入力とローマ字入力を定義する - tomoemonの日記」の続き
この前の定義だとそもそもかな入力すら正しく定義できなかったので考えなおしてみました。前の記事で言いたかった本題に変わりはありません。

この定義は、日本語入力配列について共通の枠組みの下で形式的に評価や議論ができるようになることを期待して作りました。枠組みは一つではないので、より実用的な枠組みがすでにあったり、新しく作られたら教えていただきたいです。

本題

n個の(入力→出力)の組み合わせを持った日本語入力配列Jを以下のように定義する。
J = \{(K_1,A_1,S_1),(K_2,A_2,S_2),\ldots,(K_n,A_n,S_n)\}
(K_i,A_i,S_i) \in J \hspace{20pt} (0 \leq i \leq n)
は、キーボードを使った日本語入力システムimに(K_i,A_i)の組を入力すると文字列S_iを出力する関係を持つ。K_iはキーの列、A_iK_iの各キーをいつまで押し下げ続けるかを表し、A_iに従ってK_iの要素であるキーを順に押し下げていくことでimへの入力を行う。
im(K_i,A_i) \rightarrow S_i \hspace{20pt} (0 \leq i \leq n)


K_i, \hspace{10pt} A_i, \hspace{10pt} S_iをそれぞれ以下のように定義する。
K_i = k_1k_2 \ldots k_l \hspace{20pt} (k_j \subseteq Keys, \hspace{10pt} 1 \leq j \leq l)
A_i = a_1a_2 \ldots a_l \hspace{20pt} (a_j \in \{0,1,\ldots,l\}, \hspace{10pt} 1 \leq j \leq l)
S_i = s_1s_2 \ldots s_m \hspace{20pt} (s_j \in \Sigma, \hspace{10pt} 1 \leq j \leq m)
(l \geq 1, \hspace{10pt} m \geq 1)
ここで、Keysはキーボードで押下可能なキーの集合、\Sigmaはすべての文字集合を表す。また、a_j \hspace{10pt} (a_j \in A_i)は、対応するk_j \hspace{10pt} (k_j \in K_i)のキーをk_({j+a_j})のキーを押すまで下げ続けることを意味する。
同時押しを定義できるようにするため、k_jKeysの要素ではなく部分集合(1つ以上のキーの組)と定義している。特に、k_jが複数のキーの組であるとき、「押し下げる」とはk_jのすべてのキーが押し下げられている状態にすることを表す。

以上の定義を使うと、任意のパターンを組み合わせることで様々な配列を定義できる。以下の例ではKeysを英数記号を使って表記している。また、同時押しの組については{}で表している。
ローマ字入力

  • im(asu, 000) -> あす
  • im(kyou, 0000) -> きょう

かな入力(押し続ける定義を含む)

  • im(3r, 00) -> あす
  • im(gS94, 0100) -> きょう (SはShiftキーを表す)

姫踊子草配列(同時押しの定義を含む)

  • im(l{er}, 00) -> してぃ