Prolog 中是否存在不等于其自身的值?我写answer给一些question about min of tree这个答案还说,如果树为空,则 min 为空。一开始听起来是个好主意,但现在我觉得这听起来像是个坏主意。
如果 null <> null
就还可以, 没问题。但在 Prolog 中我看到 null 只是原子所以......
?- null = null.
true.
?- null == null.
true.
?- dif(null, null).
false.
我怎样才能在 Prolog 中创建一些总是说:
?- dif(Something, Something).
true.
但如果它是任何其他东西而不是这个术语,那就是 null
事情还是说false.
?
或者,如果这不是我在 Prolog 中的思考方式,那么我应该如何思考 not true.
也不是false.
但是“既不正确也不错误,因为缺少某些东西”?
最佳答案
只是为了好玩,并不是真正要寻找的答案,从字面上理解问题标题:
?- _ == _ .
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).
或者,使用 lambda 表达式:
print_tree_minimums(Refs) :-
meta::map([Ref]>>(optional(Ref)::if_present(write)), Refs).
这个答案越来越长,我不想将其转化为对可选和预期优缺点的一般性讨论。但关于概念和库的描述很容易找到。例如
关于prolog - 什么东西永远不等于自己?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53405266/