在C语言中,我有这样的:
if(cond1)
{}
else if(cond2)
{}
else
{}
这怎么可能在序言?
在C语言中,我有这样的:
if(cond1)
{}
else if(cond2)
{}
else
{}
这怎么可能在序言?
( If1 -> Then1
; If2 -> Then2
; ...
; otherwise
).
需要注意的是IF-THEN-ELSE只需要,如果你不能表达的方式不同条件在不同的条款匹配。 可以通过模式匹配来表达一切都应该通过模式匹配来表达,因为这通常会导致更普遍,也更高效的代码。
(cond1 ->
consequent1
; cond2 ->
consequent2
;
alternative
)
根据记录,这就是所谓的条件 。
如果你想施加一定的决定时,才需要> / 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;
}
}
这可以在Prolog中被编码,而不 - > / 2,如下所示:
% 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子句。
假设你有一个序言没有(;)/ 2和NO(=)/ 2,而你不需要切割透明(;)/ 2,那么你可以自己定义如下这些结构:
X = X.
(A ; _) :- A.
(_ ; B) :- B.
再见
Horn子句
http://en.wikipedia.org/wiki/Horn_clause
这不是很容易找到,部分原因是因为在序言(由@mat说明)有一个地道的替代品。 你可以找到这里 SWI-Prolog的文件,尽管太多succintly,它是准确的。 我举一个相关的问题:
请注意,(如果 - >然后)作为(如果 - >那么,失败),使得如果条件不满足构建失败。 这种不寻常的语义是ISO和所有事实上的序言标准的一部分。
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