評価を高速化するために、論理演算 (AND、OR など) の引数の交換を実装するプログラミング言語はありますか?
例 (Haskell のような遅延評価言語でこのようなメソッドを実装できると思います)
- 2 つの述語
A
とを定義したとしましょうB
。 - プログラム実行時
B
に「True」と評価され、評価A
されなかった - 後の実行では、条件があります
IF A OR B
- 「OR」の引数を入れ替えて、条件は
IF B OR A
- 条件は評価せずに「True」と評価されます
A
評価を高速化するために、論理演算 (AND、OR など) の引数の交換を実装するプログラミング言語はありますか?
例 (Haskell のような遅延評価言語でこのようなメソッドを実装できると思います)
A
とを定義したとしましょうB
。B
に「True」と評価され、評価A
されなかったIF A OR B
IF B OR A
A
遅延評価では、AND と OR は可換ではありません。
foo :: Int -> Bool
foo n = False && foo (n+1) -- evaluates to False
bar :: Int -> Bool
bar n = bar (n+1) && False -- diverges
熱心な評価 (厳密なセマンティクス) の下で、副作用がない場合、それらは交換可能です。ただし、ここで一部のコンパイラによって通常の最適化が行われていることは知りません。(定数は横に折りたたまれます。)
もちろん、副作用が存在する場合、AND/OR は可換ではありません。たとえば、Ocaml コンパイラは、引数の少なくとも 1 つに副作用がないことを証明できない限り、引数を交換できません。
言語の一部として自動的に行われるわけではありません (おそらく、この並べ替えチェックを自由に実行できないため、実行できない最適化にお金を払うことになることがよくあります)。ただし、この目的で使用できるライブラリ関数があります。たとえば、 を参照してくださいunamb
。それで、あなたは書くことができます
(|||) :: Bool -> Bool -> Bool
a ||| b = (a || b) `unamb` (b || a)
そして、1 つの操作の計算が安価であれば、それを選択できます。