我已經嘗試了很多東西,但是找不到我如何在序言中實現以下願望。如何在序言中實現if-then-else
if list is empty
call foo function
else
do nothing
我做了什麼:
list = [] -> foo(...)
;
fail.
但是,這是行不通的
我已經嘗試了很多東西,但是找不到我如何在序言中實現以下願望。如何在序言中實現if-then-else
if list is empty
call foo function
else
do nothing
我做了什麼:
list = [] -> foo(...)
;
fail.
但是,這是行不通的
fail
並不意味着 「什麼也不做」,而是 「失敗(和原路返回)」。
您需要使用true
代替:
(List == [] -> foo(...) ; true),
此外,List
應該是一個變量,所以使用大寫字母。
另一個,也許更地道,方式寫這將是
% foo_if_empty(?List) call foo if list is empty
foo_if_empty([]) :- !,foo(...).
foo_if_empty(_).
什麼我的代碼確實是第一款統一,如果列表爲空。
如果是這樣,我們做一個剪輯。如果foo失敗,我們不希望mypred成功。所以我們不想做第二個條款。切割消除了這種可能性。
現在,如果我們不與第一個條款相結合,我們一定會與第二個條款相統一。它什麼都不做。
這是一個比Prolog中的if/then/else比使用 - >更習慣的方式。 - >通常只用於引入另一個pred會遮擋而不是啓發代碼的情況,類似於大括號語言中的?:操作符。
使用'(!)/ 0'的OTOH正確的方式(確保堅定)比使用if-then-else更難! – repeat