【问题标题】:In clojure, (every? pred coll) returns true if coll is empty, could this be a design flaw?在 clojure 中, (every?pred coll) 如果 coll 为空,则返回 true,这可能是设计缺陷吗?
【发布时间】:2013-07-04 21:59:52
【问题描述】:

来自示例和 Clojuredoc 上函数 every? 的评论

user> (every? true? '())    ;empty is true? 
true

user> (every? false? '())    ;empty is false? 
true

这确实很奇怪,而且可能不合逻辑,因为我认为上述两者都是错误的。有人能解释一下这背后的基本原理吗?

【问题讨论】:

  • 这完全合乎逻辑:当您可以找到coll 的元素而pred 返回false 时,(not (every? pred coll)) 应该是正确的。祝你在空集合中找到这样的元素。
  • 你也可以认为是(reduce && true (map pred '()))

标签: clojure


【解决方案1】:

在数学中,特别是在谓词逻辑领域,每个关于空集的全称谓词都是真的是公认的。例如,下面的说法是正确的:

Every integer in the empty set is even.

同样,下面的说法也是正确的:

Every integer in the empty set is odd.

因此,以下离奇的说法也是正确的:

Every integer in the empty set is simultaneously even and odd.

想一想:你能给以上任何一个反例吗?

更正式的解释如下。当你有一个全称谓词时,它可以正式写成∀x∈XP(x)对于X的所有x元素,P(x)),它等价于x∈X ⇒ P(x)形式的蕴涵( X 的 x 元素意味着 P(x))。因为这个蕴涵的左边对于空集是假的(即,没有元素 x 使得x∈Ø,这只是空集的定义),蕴涵是真(即false ⇒ whatever计算结果为真;检查 truth table here)。

这正是您在显示的代码中看到的内容:Clojure 将空列表 '() 上的通用谓词 (every? pred) 评估为 true,根据谓词逻辑,这是正确且完全合乎逻辑的。

最后,您可以期望在每个函数式语言或函数式库上看到完全相同的行为,同义词 allforall 可能还有其他。如果您探索这些函数的实现,您会注意到一个常见模式:该函数将返回 true,除非它找到一个反例,即谓词为 false 的元素;如果它没有找到这样的元素(包括根本没有找到任何元素——空集),那么它不能证明谓词为假,并返回真。这取决于语言或框架,可以使用循环或折叠来完成,但想法始终相同。

例如检查:

(它们的作用与 Clojure 中的 (every? pred coll) 完全相同;您可以随意编辑和添加您喜欢的语言或库!)。

如需更多信息,请务必阅读维基百科关于 Universal QuantificationVacuous truth 的文章。

【讨论】:

  • 感谢您的信息!!从 Wikipedia Vacuous_truth 的摘要部分,我还找到了一种心理变通方法“似乎没有直接的理由选择真实;只是如果我们不这样做,事情就会在我们面前爆炸”。
【解决方案2】:

我们有 3 种可能的情况,一次只有一种适用于集合。

  • 集合有项目并且它们都通过谓词 - True
  • coll 中的一项未通过谓词 - False
  • coll 是空的 - ??

现在,如果您考虑为空列表返回 false,也会感觉很奇怪,因为当 coll 中的至少一项未通过谓词但对于未发生的空列表时返回 false。

我认为为空 coll 选择 true 的合理性是基于这样一个事实,即在现实世界中适用的情况比没有意义的情况更多。例如:有人给了我一个 URL 列表,我需要返回他们下载的内容,现在我的函数首先要验证每个 URL 的格式是否正确,然后使用 map 或 pmap 下载 URL -

(if (every? url? urls) (map download urls) (throw "Invalid url found"))

这个以及更多此类示例将使序列的工作更加无缝。

另一方面,我是一个静态类型语言专家(如 Haskell),并且更愿意使用类型来解决这个问题。我希望这个函数返回Maybe bool,而不是返回真或假:

  • coll 中的每个项目都通过谓词 - Just True
  • coll 中的一项未通过谓词 - Just False
  • coll 为空 - Nothing

【讨论】:

  • 第一种情况包括最后一种情况。也许您希望第一个是“集合有项目并且它们都通过谓词”?
  • 感谢您的解决方案,我同意在现实世界中我们可能需要在这里定义第三种类型,例如 Nothing。从维基百科的摘要部分Vacuous_truth 我读到“似乎没有直接的理由来选择真实;只是如果我们不这样做,事情就会在我们面前爆炸”。
猜你喜欢
  • 2019-12-12
  • 2012-01-21
  • 2012-07-06
  • 2022-10-16
  • 1970-01-01
  • 2018-05-17
  • 1970-01-01
  • 2018-08-27
  • 2013-10-03
相关资源
最近更新 更多