只是为了好玩,并不是真正要寻找的答案,从字面上看问题标题:
?- _ == _ .
false.
But dif/2
没有被犯规(提示:每次出现匿名变量代表不同的变量):
?- dif(_, _).
true.
现在,说真的。从树最小谓词示例开始,有一个简单的替代方案:当树为空时,谓词可能会失败。更好的选择可能是使用optional or expected术语库。这些库背后的概念可以在多种编程语言中找到,它们提供了更好的替代方案null。您在 Logtalk 中拥有这两个库,可以将其与大多数 Prolog 系统一起使用。看:
- https://logtalk.org/library/optional_0.html https://logtalk.org/library/optional_0.html
- https://logtalk.org/library/optional_1.html https://logtalk.org/library/optional_1.html
and
- https://logtalk.org/library/expected_0.html https://logtalk.org/library/expected_0.html
- https://logtalk.org/library/expected_1.html https://logtalk.org/library/expected_1.html
您使用一个库或另一个库取决于您对“缺失”的解释,即“缺失”的含义optional(没有值也可以)或expected(缺少值是错误)。例如,假设在您的特定应用程序中使用0
作为执行时空树的最小值specific计算(例如一组树的最小值之和)。如果树最小谓词返回可选术语引用,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).
这个答案越来越长,我不想把它变成对利弊的一般性讨论选项 and 预期。但关于概念和库的描述很容易找到。例如。
https://en.wikipedia.org/wiki/Option_type https://en.wikipedia.org/wiki/Option_type
https://youtu.be/NhcHwkUPX7w https://youtu.be/NhcHwkUPX7w