优雅的系统提供false/0
作为命令式的声明式同义词fail/0
。它有用的一个例子是当您想要手动强制回溯副作用时,例如:
?- between(1,3,N), format("line ~w\n", [N]), false.
line 1
line 2
line 3
代替false/0
,您还可以使用任何失败的目标,例如短一点:
?- between(1,3,N), format("line ~w\n", [N]), 0=1.
line 1
line 2
line 3
Thus, false/0
不是严格需要的,但相当不错。
EDIT:我有时会看到初学者想要声明例如“我的关系不适用于空列表”,然后添加:
my_relation([]) :- false.
他们的代码。这是not必要的,并且not一个很好的使用例子false/0
,但以编程方式生成的故障切片除外。相反,集中精力陈述那些hold关于你们的关系。在这种情况下,只需省略整个子句,并仅为非空列表(即至少具有一个元素)定义关系:
my_relation([L|Ls]) :- etc.
或者,如果您还描述除列表之外的其他术语,请使用如下约束:
my_relation(T) :- dif(T, []), etc.
仅给出这两个子句中的一个(甚至两个),查询?- my_relation([]).
会自动失败。没有必要引入一个永远无法达到此目的的附加条款。