1

是否有任何编程语言实现逻辑运算(例如 AND、OR)的参数交换以加快评估速度?

示例(我认为这种方法可以用像 Haskell 这样的惰性评估语言来实现)

  1. 假设我们已经定义了两个谓词AB.
  2. 在程序执行期间,B被评估为“真”并且A未被评估
  3. 在后面的执行中,我们有条件IF A OR B
  4. “OR”的参数被交换,条件变为IF B OR A
  5. 条件被评估为“真”而不评估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 编译器不能交换参数,除非它可以证明其中至少一个是无副作用的。

于 2016-01-29T20:08:35.857 回答
3

它不会作为语言的一部分自动完成(可能是因为执行此重新排序检查不能自由,因此您通常最终会为无法进行的优化付费)。但是,您可以使用一些库函数来达到此目的。例如,参见unamb。有了它,你可以写

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

如果一项操作的计算成本更低,则可以选择它。

于 2016-01-29T20:13:09.460 回答