Table of Contents
効率的な関数オーバーロード解決手続きの生成
経緯
オーバーロード解決手続きの生成
一般化
手順
オーバーロードの解決手続き
効率的な関数オーバーロード解決手続きの生成
このページでは,次のような入出力を実現するアルゴリズムを解説する
入力: 関数オーバーロードの引数リストのリスト
出力: 最も効率的に関数オーバーロードを解決できるような手続き
経緯
C++のオーバーロード関数をLuaに露出させる際に,Luaから呼び出された時の引数の型による動的なオーバーロード解決が必要になった
オーバーロード解決手続きの生成
一般化
入力: $V \in \textbf{A}^{**}$
符号アルファベット$\textbf{A}$
終端シンボル$\$$を含む
$V$の要素は符号語
$V\neq \phi$
$\forall{v}\in V, v\neq \phi,$ $v$の最後の要素は終端シンボル$\$$
出力: 木$T$
$T$の枝は,シンボル$a\in \textbf{A}$
$T$の節点ノードは,整数値
$T$の葉ノードは,$v\in V$
任意の$v^r\in V$について,任意の葉ノードを$v$としたとき,$\forall{\left<n, e\right>}, P\left(v^r,n,e\right)$,ならばその時に限り,$v^r=v$である
$\left<n, e\right>$は,根から葉ノード$v$までのパス$p^v$における,ノード$n\in p^v$と,$n$の次のノードへの枝$e\in \textbf{A}$である
ただし,$n$は$p^v$の最後の要素ではない
命題$P(v^r, n, e): v^r_{n}=e$
手順
中間木$T'$を生成する
$T'$の枝は,シンボル$a\in \textbf{A}$
$T'$の節点ノードは,その深さを表す整数値
$T'$の葉ノードは,根からその葉まで辿る際に通る枝のシンボル列
$T'$のすべての葉ノードの集合は,$V$と等しい
$T'$から出力$T$を作成する
$T'$の全てのノードのうち,子ノードを1つだけ持つノード$x$と$x$から子ノードへ伸びる枝を,その子ノードで置換する
pythonのサンプルプログラム
オーバーロードの解決手続き
任意の$v^r$について,次のことが言える
$T$の根から$P(v^r, n, e)$が真となるような枝を辿り
葉$v$まで行き着いた場合,$v_r=v$,あるいは,$v_r\notin V$
葉まで辿り着かなかった場合,$v_r\notin V$
info-tech
,
algorithm
,
graph-theory
,
tree
,
coding-theory