查看every?
的源代码,清楚为什么
(every? string? []) => true
这是因为every?
是递归实现的,并使用(nil? (seq coll))
来结束递归。但是,我的问题是,这种行为有何意义?刚刚绊倒了。
我已经使用
解决了我的问题(and (seq x) (every? string? x))
答案 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,那些是乘法运算符和加法运算符的同一性值。