我想重新格式化我的代码没有,如果然后其他条件。 是否有捷径可寻? 这只是代码为例。 我想用IF-THEN-ELSE在序言是怪异:\我期待得到的东西更多的递归的情况。 像模式匹配
rules(Param1, Param2) :-
(
A ->
B, C, D,
(
E -> F
;
G, H
)
;
I
).
编辑:编辑我的代码看起来像它更应该是什么
对于一般的翻译方案
pred(X):-
( A -> B
; C -> D
; G
).
pred(Y):- Q.
是
pred(X):- pred1(X).
pred(Y):- Q.
pred1(X):- call(A), !, B.
pred1(X):- call(C), !, D.
pred1(X):- G.
非常感谢j4n bur53您指出需要call
- 如果有一个切口内A
或C
!
又见->
文档 。
IF-THEN-ELSE是不是真的不可思议。 他们是ISO核心标准的一部分,在7.8控制结构定义,7.8.8(;)/ 2 - 的if-then-else和他们有利益存在不同的Prolog编制方案。
这些Prolog的汇编策略是如果如果 - 则 - 否则出现在一个条款的中间是特别有用的,因为得到的代码通常产生比当如果 - 则 - 否则会被移动到一个单独的辅助谓词开销更少。
这同样适用于析取(;)/ 2。 作为一个经验法则,我会说这是安全的,如果没有的if-then-else分支比其他分支,介绍了许多新的变数。 然后,它是有道理的,当Prolog的编译器移动IF-THEN-ELSE外变量创建。
下面是一个例子,其中IF-THEN-ELSE,在YAP Prolog的,显示了相当长的一段表现superiour到其他的编程风格:
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