有向グラフのあるノードからあるノードへの全てのパスを表現する

いつまでたってもまとまらないので落書き程度で適当に書く。

有向グラフから圏Cを作る
作り方は http://d.hatena.ne.jp/m-hiyama/20090525/1243210967
ここで、

  • length([a, f1, f2..., fn, b]) = n + 2

とする。

Cの射の集合を射とする圏C'を作る
a, b, cをC'の対象、F, GをC'の射として、

  • 対象 : |C'| = Cの対象
  • 射 : Cのホムセットの部分集合
  • 域 : dom(F) = Fの要素の域
  • 余域 : cod(F) = Fの要素の余域
  • 結合 : cod(F) = dom(G)のとき、F;G = {f;g | f∈F, g∈G}
  • 恒等射 : ida = {[a, a]}

で、さらに以下を定義する。

  • F:a→a のとき、F* = ∪{φ, F, F;F, F;F;F,...} (クリーネ閉包みたいなもの)
  • prim(a, b) = {f | f∈HomC(a, b) ∧ length(f)=3} (HomC(a, b)をCのHom(a, b)とする)
  • S⊂|C'| のとき、Path(S, a, b) = prim(a, b)∪{f | f∈prim(a, k);Path(T, k, k)*;Path(T, k, b), T=S-{a, b}, k∈T}

これがなんだというと、これでnの倍数を受理するオートマトンから正規表現を生成するのに使える。

追記:色々書き直した