停止性問題と、関数の隣接行列

概略)注)こういうのに興味が出てきたら、Haskell使ったほうがいいのかも、と思えてきたけど数学苦手なのでHaskellのドキュメント読んでもさっぱりわかりません

プログラムがちゃんと終了するかどうか、関数の隣接行列によって調べることを考えます

  • 関数の中では分岐や、for(;;){} while(条件){} みたいな回数を定めないループを使わない
  • 関数のオーバーロードによって、引数の型、条件などによって呼び出す本体を選ぶ

という約束事を決めた、とします。 するとプログラム全体としては、関数と、その呼び出し側のつながり具合のみによって、プログラムがちゃんと終了するかどうかが決まります。

ここまでは、ウソでは無いはず。

では、関数同士の隣接行列を書けば、そのプログラム全体が停止するかどうか、楽に判定できるのでしょうか?

例をいくつか