什么永远不等于自己?

What is never equal to itself?

Prolog中是否存在不等于自身的值?我写 answer to some question about min of tree 并且这个答案还说如果树是空的,最小值是空的。一开始听起来不错,但现在我觉得这听起来很糟糕。

如果null <> null还可以,没问题。但是在 Prolog 中我看到 null 只是 atom 所以....

?- null = null.
true.

?- null == null.
true.

?- dif(null, null).
false.

我怎样才能在 Prolog 中创建一些总是说:

?- dif(Something, Something).
true.

但如果是其他任何东西而不是这个术语,那是 null 东西仍然说 false.?

或者如果这不是我应该在 Prolog 中思考的方式,那么我应该如何思考不是 true. 也不是 false. 而是 "neither true nor false because something is missing"?

只是为了好玩,并不是真正要找的答案,从字面上看问题标题:

?- _ == _ .
false.

但是 dif/2 没有被污染(提示:每次出现 匿名变量 代表一个不同的变量):

?- dif(_, _).
true.

现在,说真的。从您的树最小谓词示例开始,有一个简单的选择:当树为空时,谓词可能会简单地失败。更好的选择可能是使用 optionalexpected 术语库。这些库背后的概念可以在多种编程语言中找到,它们提供了 null 的更好替代方案。您在 Logtalk 中拥有这两个库,您可以将其用于大多数 Prolog 系统。参见:

根据您对 "missing" 的解释,您使用一个库还是另一个库,意思是 可选 (没有值也可以)或 expected(缺少值是错误)。例如,假设在您的特定应用程序中,在执行 specific 计算时使用 0 作为空树的最小值是有意义的(例如,最小值的总和一组树)。如果树最小谓词 returns 是一个可选的术语引用,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,
...

更重要的是,它不会掩盖您正在以与默认值相同的方式处理空树。比如下面的代码只会写出non-empty棵树的最小值:

print_tree_minimums(Refs) :-
    meta::map(print_tree_minimum, Refs).

print_tree_minimum(Ref) :-
    optional(Ref)::if_present(write).

或者,使用 lambda 表达式:

print_tree_minimums(Refs) :-
    meta::map([Ref]>>(optional(Ref)::if_present(write)), Refs).

这个答案越来越长,我不想将其转化为对 optionalsexpecteds[=65 的优缺点的一般性讨论=].但是关于概念和库的描述很容易找到。例如

https://en.wikipedia.org/wiki/Option_type

https://youtu.be/NhcHwkUPX7w