0

if then else 条件なしでコードを再フォーマットしたいと思います。これを行う簡単な方法はありますか?これはコードの単なる例です。プロローグで IF-THEN-ELSE を使用するのは奇妙だと思います :\ そして、もっと再帰的なケースを探しています。パターンマッチングのように

rules(Param1, Param2) :-
(
    A ->
        B, C, D,    
        (
            E ->  F
        ;
            G, H
        )    
    ;   
        I
).

編集:コードを編集して、本来あるべき姿に近づけました

4

2 に答える 2

0

if-then-else はそれほど奇妙ではありません。これらは ISO コア標準の一部であり、7.8 Control コンストラクト、7.8.8 (;)/2 - if-then-else で定義されており、さまざまな Prolog コンパイル スキームが存在するという利点があります。

ここに画像の説明を入力

これらの Prolog コンパイル戦略は、if-then-else が句の途中にある場合に特に役立ちます。これは、通常、if-then-else が別の補助述語に移動される場合よりも結果のコードで発生するオーバーヘッドが少なくなるためです。

論理和 (;)/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). 

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
于 2019-04-01T19:31:03.800 に答える