Просто для удовольствия, а не для ответа, который вы ищете, буквально взяв название вопроса:
?- _ == _ .
false.
Но dif/2
не загрязнен (подсказка: каждое вхождение анонимная переменная представляет другую переменную):
?- dif(_, _).
true.
Теперь серьезно.Начиная с вашего примера предиката минимума дерева, существует тривиальная альтернатива: предикат может просто потерпеть неудачу, когда дерево пусто.Лучшей альтернативой может быть использование необязательных или ожидаемых библиотек терминов.Концепции, лежащие в основе этих библиотек, встречаются в нескольких языках программирования, где они предоставляют лучшую альтернативу null .У вас есть обе библиотеки в Logtalk, которые вы можете использовать с большинством систем Prolog.См .:
и
Вы используете одну или другую библиотеку в зависимости от вашей интерпретации «отсутствующего», означающего что-то, что необязательно (отсутствие значения - это хорошо) или Ожидается (отсутствие значения является ошибкой).Например, предположим, что в вашем конкретном приложении имеет смысл использовать 0
в качестве минимального значения пустого дерева при выполнении специфического вычисления (например, суммы минимумов набора деревьев).Если предикат минимума дерева возвращает необязательную ссылку на термин, Ref
, вместо целого числа, вы можете сделать, например,
...,
optional(Ref)::or_else(Minimum, 0),
Sum1 is Sum0 + Minimum,
...
Это более чистое решение по сравнению с использованием конструкции if-then-else:
...,
( tree_minimum(Tree, Minimum) ->
Sum1 is Sum0 + Minimum
; Sum1 is Sum0
),
...
Он также позволяет использовать разные значения по умолчанию для разных вычислений.Например:
...,
optional(Ref)::or_else(Minimum, 1),
Product1 is Product0 * Minimum,
...
Что более важно, это не маскирует, что вы обрабатываете пустое дерево так же, как это делает значение по умолчанию.Например, следующий код будет записывать только минимальные значения непустых деревьев:
print_tree_minimums(Refs) :-
meta::map(print_tree_minimum, Refs).
print_tree_minimum(Ref) :-
optional(Ref)::if_present(write).
или, используя лямбда-выражение:
print_tree_minimums(Refs) :-
meta::map([Ref]>>(optional(Ref)::if_present(write)), Refs).
Этот ответ становится длинным, и яне хочу превращать это в общее обсуждение плюсов и минусов опционных и ожидаемых .Но описания как концепций, так и библиотек легко найти.Например,
https://en.wikipedia.org/wiki/Option_type
https://youtu.be/NhcHwkUPX7w