if-then-else 并不奇怪。它们是 ISO 核心标准的一部分,在 7.8 控制结构、7.8.8 (;)/2 - if-then-else 中定义,它们的好处是存在各种 Prolog 编译方案。
如果 if-then-else 出现在子句的中间,这些 Prolog 编译策略特别有用,因为生成的代码通常比 if-then-else 移动到单独的辅助谓词中产生的开销更少。
析取 (;)/2 也是如此。根据经验,我会说这是安全的,如果没有 if-then-else 分支与其他分支相比引入了许多新变量。然后,当 Prolog 编译器将变量创建移到 if-then-else 之外时,它就有意义了。
这是一个示例,其中 if-then-else 在 YAP Prolog 中显示出优于其他编程风格的一些性能:
tarai_cut(X,Y,_,Y) :- X=<Y, !.
tarai_cut(X,Y,Z,R) :-
X1 is X-1, tarai_cut(X1,Y,Z,Rx),
Y1 is Y-1, tarai_cut(Y1,Z,X,Ry),
Z1 is Z-1, tarai_cut(Z1,X,Y,Rz),
tarai_cut(Rx,Ry,Rz,R).
tarai_or(X,Y,Z,R) :- X=<Y, !, R=Y;
X1 is X-1, tarai_or(X1,Y,Z,Rx),
Y1 is Y-1, tarai_or(Y1,Z,X,Ry),
Z1 is Z-1, tarai_or(Z1,X,Y,Rz),
tarai_or(Rx,Ry,Rz,R).
tarai_if(X,Y,Z,R) :- X=<Y -> R=Y;
X1 is X-1, tarai_if(X1,Y,Z,Rx),
Y1 is Y-1, tarai_if(Y1,Z,X,Ry),
Z1 is Z-1, tarai_if(Z1,X,Y,Rz),
tarai_if(Rx,Ry,Rz,R).
if-then-else 版本运行速度最快:
YAP 6.3.3 (i686-mingw32): Sun Jan 20 18:27:56 GMTST 2013
?- time(tarai_cut(12,6,0,X)).
% 0.687 CPU in 0.690 seconds ( 99% CPU)
X = 12
?- time(tarai_or(12,6,0,X)).
0.734 CPU in 0.735 seconds ( 99% CPU)
X = 12
?- time(tarai_if(12,6,0,X)).
% 0.515 CPU in 0.516 seconds ( 99% CPU)
X = 12