正格性解析ってなんだ

 正格性解析とはいったいなんだろうか。そもそも正格性とはなにか。ふと気になったんだけど、ちょっと探してみた限りでは日本語では定義がみつからない。きっと教科書に載ってるような基本事項で、知ってて当たり前のことなんだろう。関数型言語の教科書とか持ってないので、言葉の使われ方とかWikipediaの正格性解析の項から適当に推測してみる。
 ある関数が正格であるとは、引数がなんらかの理由で未定義な値になってしまう場合に、その関数も必ず未定義な値を返すような場合を指して言う。(なんらかの理由というのは例えば引数の計算が無限に続いて戻ってこないとか、計算がエラーになったとかそういう理由。この未定義な値をボトムと呼び、⊥と書く。ボトムとかトップとか、論理学でちょっと教えてもらった覚えが…。)逆に、関数が非正格であるとは、引数が未定義になってしまった場合にも、未定義でない値を返せる可能性がある場合を指して言う。
 正格評価とは、プログラムの実行順序で、ある関数を評価する前に、その引数を全て評価する場合を言う。非正格評価の場合は、実際に関数本体で引数を必要とする時点まで引数の評価が遅延される。
 非正格評価では無限リストを簡単に扱うことができる。これは嬉しい。(他にも、リストに対して何回もmapやfilterを適用するような場合にも処理が効率的になりそうな気がするんだけど、実際に試した訳ではないので自信はない。)正格評価で無限リストを扱おうとすると工夫がいる。普通に無限リストを引数に渡してしまうと処理が絶対に止まらないから。遅延評価では、最終的に出力される結果が有限の範囲であるならば、無限リストも扱える。
 正格性解析とは、ある関数が正格であるかどうかを確認するための解析である。なんでこんな解析を行うのかというと、一般的には正格評価の方が非正格評価よりも高速だからである。(非正格評価はメモリを食うのでGCする時間分だけ遅くなる、という事みたいだが、他にも理由はあるのかも。後、非正格評価の方が速い場合もある。たらい回し関数とか。)正格な関数の場合は引数にボトムを与えると確実にボトムが返ってくるので、正格評価(2つの正格という言葉の指す意味が違うことに注意すること!)してやった方が高速に実行できる、という事。非正格な関数の場合は、引数にボトムを与えてもボトムでない値が返ってくる可能性があるので、高速になるからといって正格評価をしてしまうわけにはいかない。というか、全部正格評価しちゃったら、もう非正格評価とは呼べない。
 つまり、正格性解析というのは、遅延評価(非正格評価)を行う言語において部分的に正格評価を行ってプログラムを高速に実行するための解析であり、したがって遅延評価型の言語でしか意味を成さない。