如果那么删除Prolog

问题描述 投票:1回答:2

我想重新格式化我的代码而没有if then else条件。是否有捷径可寻?这只是代码的例子。我认为在prolog中使用IF-THEN-ELSE很奇怪:\而且我希望得到一些更复杂的案例。像模式匹配

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

编辑:编辑我的代码看起来更像它应该看起来

recursion prolog conditional-statements
2个回答
2
投票

一般翻译方案

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.

非常感谢qazxsw poi指出需要在j4n bur53call中使用qazxsw poi - qazxsw poi!

另见in case there's a cut


0
投票

if-then-else不是很奇怪。它们是ISO核心标准的一部分,在7.8控制结构中定义,7.8.8(;)/ 2 - if-then-else,它们具有各种Prolog编译方案的优点。

A

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

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

下面是一个例子,其中if-then-else在YAP Prolog中表现出相当于其他编程风格的性能:

C

if-then-else版本运行速度最快:

-> documentation
© www.soinside.com 2019 - 2024. All rights reserved.