为什么(每个?字符串?[])产生真实?

时间:2012-11-08 08:28:57

标签: clojure

查看every?的源代码,清楚为什么

(every? string? []) => true

这是因为every?是递归实现的,并使用(nil? (seq coll))来结束递归。但是,我的问题是,这种行为有何意义?刚刚绊倒了。

我已经使用

解决了我的问题
(and (seq x) (every? string? x))

6 个答案:

答案 0 :(得分:9)

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

换句话说,对于所有人来说,某些事情都是真的总是如此,对于没有人来说,某些事情是真的总是错误的。

答案 1 :(得分:8)

功能every?实现了universal quantification

(every? string? []) => false开始,[]包含一个对象x,以便(string? x) => false(这是通用量词的negation工作方式)。这会导致矛盾,因此(every? string? [])必须返回true

答案 2 :(得分:7)

在数学方面,这是有一个很好的理由。如果以任何其他方式定义every?,那将是一致性灾难。

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我的回答是vacuous truth Wiki很好地涵盖了它,所以我只是引用当前的第一段:

  

在数学和逻辑学中,一个空洞的真理是一种断言的陈述   空集的所有成员都具有某种属性。对于   例如,声明“房间里的所有手机都关闭”   只要房间里没有手机就行了。在这   案件,声明“房间里的所有手机都打开”会   也是真实的,两者的结合也是如此:“所有的细胞   房间里的电话都打开并关闭“。

答案 5 :(得分:0)

归结为"和"的标识值。和"或"操作。对于任何布尔B,情况是B具有与B & T相同的值。因此,"和"没有价值观必须是真的。同样,B | F与B具有相同的值也是如此,因此"或"没有价值是假的。

同样,没有术语的乘积是1,没有术语的总和是0,那些是乘法运算符和加法运算符的同一性值。