Rego中every关键字为何从不返回false?设计理念解析
关于Rego中
every关键字返回undefined的设计解析 一、Rego中undefined的核心设计逻辑
Rego是基于逻辑编程范式的语言,它的undefined和JavaScript等命令式语言里的“未初始化变量”完全不是一回事,核心是用来表示**“无法证明命题为真”**的状态:
- 在逻辑编程的语境下,一个命题只有两种明确的结果:能被证明为真,或者无法被证明为真(undefined)。而
false是一个明确可证伪的结论——即有确凿证据证明命题不成立。 - 文档里提到的“无法引用undefined”,是指
undefined不能作为一个合法的值被存储、传递或返回,它只是求值过程中的一种临时状态;而false是标准JSON值,可以像其他值一样被处理。 - 在查询或规则求值时,
undefined和false的表现看似一致——只要出现其中一种,整个查询/规则就不会成功,但本质差异在于:false是明确的否定,undefined是“没有足够证据证明为真”。
二、every返回true/undefined的原因
every的语义是“集合中所有元素都满足指定条件”,这个命题在逻辑编程的框架下,无法直接被证伪,只能被证真或无法证真:
- 当集合中所有元素都满足条件时,命题可被明确证明为真,返回
true。 - 当存在至少一个元素不满足条件时,我们无法证明“所有元素都满足”这个命题,但也不能直接得出“这个命题为假”的结论(逻辑编程的开放世界假设:没找到证据不代表不存在),所以返回
undefined。
对比成员操作符in:in的语义是“元素是否存在于集合中”,这是一个可以在封闭范围内明确证真或证伪的命题——遍历集合找到元素就是true,遍历完所有元素都没找到就是false,因此它始终返回true或false。
示例代码
# 定义测试集合 nums = [1, 2, 3] # every的两种情况 all_positive := every n in nums { n > 0 } # 所有元素满足条件,返回true all_even := every n in nums { n % 2 == 0 } # 存在不满足的元素,返回undefined # in的两种情况 has_two := 2 in nums # 找到元素,返回true has_four := 4 in nums # 未找到元素,返回false
内容的提问来源于stack exchange,提问作者Old Pro
相关产品推荐
相关产品推荐

