2012-04-12 32 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