2012-06-04 42 views
1

我已經嘗試了很多東西,但是找不到我如何在序言中實現以下願望。如何在序言中實現if-then-else

if list is empty 
     call foo function 
else 
     do nothing 

我做了什麼:

list = [] -> foo(...) 
      ; 
      fail. 

但是,這是行不通的

回答

3

fail並不意味着 「什麼也不做」,而是 「失敗(和原路返回)」。

您需要使用true代替:

(List == [] -> foo(...) ; true), 

此外,List應該是一個變量,所以使用大寫字母。

0

另一個,也許更地道,方式寫這將是

% foo_if_empty(?List) call foo if list is empty 
foo_if_empty([]) :- !,foo(...). 
foo_if_empty(_). 

什麼我的代碼確實是第一款統一,如果列表爲空。

如果是這樣,我們做一個剪輯。如果foo失敗,我們不希望mypred成功。所以我們不想做第二個條款。切割消除了這種可能性。

現在,如果我們不與第一個條款相結合,我們一定會與第二個條款相統一。它什麼都不做。

這是一個比Prolog中的if/then/else比使用 - >更習慣的方式。 - >通常只用於引入另一個pred會遮擋而不是啓發代碼的情況,類似於大括號語言中的?:操作符。

+1

使用'(!)/ 0'的OTOH正確的方式(確保堅定)比使用if-then-else更難! – repeat