Recursion 序言删除IF-THEN-ELSE

Recursion 序言删除IF-THEN-ELSE,recursion,prolog,conditional-statements,Recursion,Prolog,Conditional Statements,我想在没有if-then-else条件的情况下重新格式化代码。有没有一个简单的方法可以做到这一点?这只是一个代码示例。我认为在prolog中使用IF-THEN-ELSE是很奇怪的:。我希望得到一些更递归的情况。类模式匹配 rules(Param1, Param2) :- ( A -> B, C, D, ( E -> F ; G, H ) ;

我想在没有if-then-else条件的情况下重新格式化代码。有没有一个简单的方法可以做到这一点?这只是一个代码示例。我认为在prolog中使用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.

非常感谢您指出在
A
C
中需要调用
call


另请参见。

如果还有,其他的就不是很奇怪了。它们是ISO核心标准的一部分,在7.8控件构造、7.8.8(;)/2-if-then-else中定义,它们的优点是存在各种Prolog编译方案

这些Prolog编译策略在if子句出现在子句中间时特别有用,因为生成的代码通常比IF,否则将移动到单独的辅助谓词时产生更少的开销。

析取(;)/2也是如此。根据经验,如果没有if-then-else分支与其他分支相比引入了许多新变量,那么我会说这是安全的。当Prolog编译器将变量创建移到if-then-else之外时,这就有意义了

下面是一个例子,在YAP Prolog中,if-then-else显示了比其他编程风格更高的性能:

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). 

嗯,我试着修改我的代码,在一次迭代@Lorac之后,它始终为我提供true。我认为您的映射与威尔的规则不太一致。我认为插入语
(E->F;G,H)
需要被分解成它自己的谓词,类似这样:@j4nbur53啊,对了,“元调用对切割来说是不透明的”文档对此表示感谢!但是,如果有更多的子句用于
pred/1
,则需要更精确地处理(“与!/0不同,谓词的选择点作为一个整体(由于多个子句)不会被破坏。”)…Prolog中的参数如果是未实例化的变量,则应以大写字母开头。@mbratch对此表示抱歉,这是一个输入错误。
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). 
   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