2012-04-12 66 views

回答

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

为了记录在案,这就是所谓的条件

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

请注意,if-then-else仅在不同条件下通过模式匹配表示不同条件时才有必要。所有可以通过模式匹配表达的东西都应该通过模式匹配来表达,因为这通常会导致更一般和更高效的代码。

1

这不是很容易找到,部分原因是(在@mat中指出)在Prolog中有一个惯用的替代方案。你可以找到here SWI-Prolog文档,虽然太过简单,但它是准确的。我引用一个相关点:

请注意(如果 - >然后)作为(如果 - >然后;失败),使构造失败,如果条件失败。这种不寻常的语义是ISO和所有事实上的Prolog标准的一部分。

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; 
    } 

}

这可以在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和没有(=)/ 2,和 你不需要一个透明:

X = X. 

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

再见

Horn子句
http://en.wikipedia.org/wiki/Horn_clause