我已经尝试了很多东西,但我找不到如何在prolog中实现以下愿望。
if list is empty
call foo function
else
do nothing
我做了什么:
list = [] -> foo(...)
;
fail.
但是,它不起作用
答案 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会模糊而不是启发代码的情况,类似于大括号语言中的?:运算符。