if语句中的if else if子句类似于C / C ++

时间:2012-04-12 11:38:07

标签: prolog

在c语言中我有类似的东西:

if(cond1)
{}
else if(cond2)
{}
else
{}

在Prolog中这怎么可能?

5 个答案:

答案 0 :(得分:8)

(   If1 -> Then1
;   If2 -> Then2
;   ...
;   otherwise
).

请注意,如果您不能通过不同子句中的模式匹配来表达不同的条件,则只需要if-then-else。模式匹配可以表达的所有内容都应该通过模式匹配来表示,因为这通常会导致更通用且更有效的代码。

答案 1 :(得分:7)

(cond1 ->
    consequent1
; cond2 ->
    consequent2
;
    alternative
)

对于记录,这称为条件

答案 2 :(得分:2)

只有在你想强加某种决定论时才需要 - > / 2。 它就像一个局部切割。但是如果你想要你的代码保留 一些非确定性,没有必要使用 - > / 2。

采取以下命令性代码:

boolean listOfBool(Object obj) {
   if (obj instanceof ConsCell) {
       if (((ConsCell)ob).head() instanceof Boolean) {
           return listOfBool(((ConsCell)ob).tail());
       } else {
           return false;
       }
  } else if (obj == null) {
       return true;
  } else {
       return false;
  }

}

这可以在没有 - > / 2的Prolog中编码,如下所示:

% bool(+Bool)
% bool(-Bool)
bool(0).
bool(1).

% list_of_bool(+List)
% list_of_bool(-List)
list_of_bool(L) :-
    (L = [X|Y], bool(X), list_of_bool(Y);
     L = []).

现在的优点是它可以用来检查列表 布尔值并生成布尔列表:

?- list_of_bool([0,1,0]).
Yes 
?- list_of_bool([0,1,2]).
No
?- List=[_,_,_], list_of_bool(List).
List = [0, 0, 0] ;
List = [0, 0, 1] ;
List = [0, 1, 0] ;
List = [0, 1, 1] Etc..

通常,析取(;)/ 2可以分布在多个上 条款。如果将此与移动统一(=)/ 2结合使用 因为谓词就是这样,所以可以获得一些速度 通常更适合索引。

以下是list_of_bool的替代配方的外观 比如消除(;)/ 2和(=)/ 2:

% list_of_bool2(+List)
% list_of_bool2(-List)
list_of_bool2([X|Y]) :- bool(X), list_of_bool2(Y).
list_of_bool2([]).

以上工作方式完全相同(实际上效果更好, 因为在第一个查询中没有选择点,所以 (;)/ 2通常不会在没有( - >)/ 2的情况下检测到:

?- list_of_bool2([0,1,0]).
Yes
?- list_of_bool2([0,1,2]).
No
?- List=[_,_,_], list_of_bool(List).
List = [0, 0, 0] ;
List = [0, 0, 1] ;
List = [0, 1, 0] ;
List = [0, 1, 1] Etc..

这也是Prolog的启动方式。仅限规则 没有分离(;)/ 2和没有统一(=)/ 2。该 后来两个已经存在于潜在的Horn条款中。

假设您有一个Prolog没有(;)/ 2和没有(=)/ 2,和 你不需要剪切透明(;)/ 2,然后你可以定义 这些构造由你自己完成如下:

X = X.

(A ; _) :- A.
(_ ; B) :- B.

再见

Horn Clause
http://en.wikipedia.org/wiki/Horn_clause

答案 3 :(得分:1)

这并不容易找到,部分是因为(如@mat所述)在Prolog中有一种惯用的选择。您可以找到here SWI-Prolog文档,虽然太过简单,但它是准确的。我引用了一个相关的观点:

  

请注意(If - > Then)充当(If - > Then; fail),如果条件失败,则构造失败。这种不同寻常的语义是ISO和所有事实上的Prolog标准的一部分。

答案 4 :(得分:0)

if_then_else(Condition,Then,Else) :- Condition, !, Then.
if_then_else(Condition,Then,Else) :- Else.

例如:

max(X,Y,Max) :- if_then_else(X>Y,Max=X,Max=Y).

?- max(4,7,A).
A = 7
?- max(8,2,A).
A = 8