12

查看源代码every?可以清楚地说明原因

(every? string? []) => true

这是因为every?递归实现并用于(nil? (seq coll))结束递归。但是,我的问题是,这种行为有什么意义?刚刚被那个绊倒了。

我已经解决了我的问题

(and (seq x) (every? string? x))
4

6 回答 6

9

因为它的功能与 forall-quantifier 相同。也就是说,它最初被假定为真,并且谓词的每次应用都是试图证明它是假的。存在量词(因为不一致someany?在 Clojure 中被调用)以相反的方式工作 - 它假设为假,并且谓词的每次应用都是试图证明它是真的。

换句话说,某事对所有人来说都是真的总是正确的,而某事对没有人来说是真的总是错误的。

于 2012-11-08T10:45:08.700 回答
8

函数every?实现全称量化

(every? string? []) => false它可以得出[]包含x这样的对象(string? x) => false(这就是全称量词的否定的工作方式)。这导致矛盾,所以(every? string? [])必须返回true

于 2012-11-08T11:33:13.243 回答
7

它在数学中如此定义,这是有充分理由的。every?如果以任何其他方式定义,这将是一场一致性灾难。

使用当前定义,every? foo当且仅当所有连接的集合也满足时,连接的结果才满足every? foo。在空列表上every?返回false会破坏这种方便的等价性和许多其他等价性(例如,删除一个元素有时会导致从 切换every?truefalse

于 2012-11-08T12:25:22.343 回答
0

或者更好地问为什么要(every? string? [])yield false?在某些要求中,这两种变体都会导致错误的答案。但显然这比在空序列上出错要好。

于 2012-11-08T08:59:21.513 回答
0

我的回答是空洞的事实
Wiki 很好地涵盖了它,所以我将简单地引用当前的第一段:

在数学和逻辑中,空洞的真理是断言空集的所有成员都具有某种属性的陈述。例如,只要房间里没有手机,“房间里所有手机都关闭”的陈述就会成立。在这种情况下,“房间里的所有手机都打开”的陈述也将是空洞的,就像两者的合取一样:“房间里的所有手机都打开和关闭”。

于 2017-01-01T23:28:54.323 回答
0

它归结为“and”和“or”操作的标识值。对于任何布尔值 B,B 具有与 相同的值B & T。因此,没有值的“与”必须为真。类似地,与 B 具有相同的值也是正确B | F的,因此没有值的“或”是错误的。

类似地,无项的乘积为 1,无项之和为 0,它们是乘法和加法运算符的恒等值。

于 2017-01-03T08:28:12.040 回答