Что никогда не бывает равным самому себе? - PullRequest
0 голосов
/ 21 ноября 2018

Есть ли в Прологе значение, которое не равно самому себе?Я пишу ответ на какой-то вопрос о минимуме дерева , и в этом ответе также говорится, что если дерево пусто, минимальное значение равно нулю.Сначала звучит хорошая идея, но теперь, когда я думаю, что это звучит как плохая идея.

Это нормально, если null <> null, нет проблем.Но в Прологе я вижу, что ноль - это просто атом, так что ...

?- null = null.
true.

?- null == null.
true.

?- dif(null, null).
false.

Как я могу сделать в Прологе такой термин, который всегда говорит:

?- dif(Something, Something).
true.

Но если это какой-то другойвещь, а не этот термин, который все еще говорит null false.?

Или, если это не так, как я должен думать в Прологе, то как я должен думать о не true., а также не false. но "ни правда, ни ложь, потому что чего-то не хватает"?

1 Ответ

0 голосов
/ 21 ноября 2018

Просто для удовольствия, а не для ответа, который вы ищете, буквально взяв название вопроса:

?- _ == _ .
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

...