什么永远不等于自己?
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.
现在,说真的。从您的树最小谓词示例开始,有一个简单的选择:当树为空时,谓词可能会简单地失败。更好的选择可能是使用 optional 或 expected 术语库。这些库背后的概念可以在多种编程语言中找到,它们提供了 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).
这个答案越来越长,我不想将其转化为对 optionals 和 expecteds[=65 的优缺点的一般性讨论=].但是关于概念和库的描述很容易找到。例如
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.
现在,说真的。从您的树最小谓词示例开始,有一个简单的选择:当树为空时,谓词可能会简单地失败。更好的选择可能是使用 optional 或 expected 术语库。这些库背后的概念可以在多种编程语言中找到,它们提供了 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).
这个答案越来越长,我不想将其转化为对 optionals 和 expecteds[=65 的优缺点的一般性讨论=].但是关于概念和库的描述很容易找到。例如