1

評価を高速化するために、論理演算 (AND、OR など) の引数の交換を実装するプログラミング言語はありますか?

例 (Haskell のような遅延評価言語でこのようなメソッドを実装できると思います)

  1. 2 つの述語Aとを定義したとしましょうB
  2. プログラム実行時Bに「True」と評価され、評価Aされなかった
  3. 後の実行では、条件がありますIF A OR B
  4. 「OR」の引数を入れ替えて、条件はIF B OR A
  5. 条件は評価せずに「True」と評価されますA
4

2 に答える 2

6

遅延評価では、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 つに副作用がないことを証明できない限り、引数を交換できません。

于 2016-01-29T20:08:35.857 に答える
3

言語の一部として自動的に行われるわけではありません (おそらく、この並べ替えチェックを自由に実行できないため、実行できない最適化にお金を払うことになることがよくあります)。ただし、この目的で使用できるライブラリ関数があります。たとえば、 を参照してくださいunamb。それで、あなたは書くことができます

(|||) :: Bool -> Bool -> Bool
a ||| b = (a || b) `unamb` (b || a)

そして、1 つの操作の計算が安価であれば、それを選択できます。

于 2016-01-29T20:13:09.460 に答える