Элегантные системы предоставляют 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
Таким образом, false/0
не является строго необходимым, но довольно приятным.
РЕДАКТИРОВАТЬ : Иногда я вижу новичков, которые хотят заявить, например, «мои отношения»не имеет места для пустого списка ", а затем добавьте:
my_relation([]) :- false.
к их коду.Это не необходимо, и не хороший пример использования false/0
, за исключением, например, срезов сбоев, которые генерируются программным путем.Вместо этого сосредоточьтесь на том, чтобы изложить то, что содержит в ваших отношениях.В этом случае просто пропустите весь пункт и определите отношение только для списков, которые не являются пустыми, то есть содержат хотя бы один элемент:
my_relation([L|Ls]) :- etc.
или, если выописывают другие термины в дополнение к спискам, используйте ограничение как:
my_relation(T) :- dif(T, []), etc.
Учитывая только одно (или даже оба) из этих двух предложений, запрос ?- my_relation([]).
будетавтоматически терпит неудачу.Нет необходимости вводить дополнительное предложение, которое никогда не сработает для этой цели.