prolog - 什么东西永远不等于自己?

标签 prolog prolog-dif

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).

这个答案越来越长,我不想将其转化为对可选预期优缺点的一般性讨论。但关于概念和库的描述很容易找到。例如

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

https://youtu.be/NhcHwkUPX7w

关于prolog - 什么东西永远不等于自己?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53405266/

相关文章:

序言 : find something not referenced in another predicate

prolog - Prolog 中的无损通用量化

prolog - 为什么SWI-Prolog只给出一种解决方案?

prolog - Prolog 中的简化旅行推销员

list - 使用 prolog 再添加两次

prolog - 序言中的警告 : Singleton variables: [Alice, Ben]

unit-testing - 什么是 PL-Unit 中的 "Test succeeded with choicepoint"警告,我该如何解决?

prolog - Prolog:如何避免不削减成本地回溯?

Prolog,关于如何形成更好的子句

list - 从列表中删除重复项,同时保留最右边的出现