在c语言中我有类似的东西:
if(cond1)
{}
else if(cond2)
{}
else
{}
在Prolog中这怎么可能?
答案 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