如何在prolog中实现if-then-else

时间:2012-06-04 08:04:25

标签: prolog

我已经尝试了很多东西,但我找不到如何在prolog中实现以下愿望。

if list is empty
        call foo function
else
        do nothing

我做了什么:

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

但是,它不起作用

2 个答案:

答案 0 :(得分:3)

fail并不意味着“什么都不做”,而是“失败(和回溯)”。

您需要使用true代替:

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

此外,List应该是变量,因此请使用大写。

答案 1 :(得分:0)

另一种,也许更惯用,写这个的方式是

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

如果list为空,我的代码所做的就是与第一个子句统一。

如果是这样,我们会做一个削减。如果foo失败,我们不希望mypred成功。所以我们不想做第二个条款。切割消除了这种可能性。

现在,如果我们不与第一个条款统一,我们肯定会与第二个条款统一起来。它什么都不做。

这在Prolog中使用if / then / else比使用 - >更为惯用。 - >通常只用于引入另一个pred会模糊而不是启发代码的情况,类似于大括号语言中的?:运算符。