Loading

QL语言参考-6变量

变量(Variables)

QL 中的变量的使用方式与代数或逻辑中的变量相似。它们表示一组值,这些值通常受到公式的限制。

这与其他一些编程语言中的变量不同,在这些语言中,变量表示可能包含数据的内存位置。这些数据也会随着时间的推移而改变。

例如,在 QL 中,n = n + 1是一个等式,只有当 n 等于 n + 1时才有效(所以实际上它不适用于任何数值)。

在 Java 中,n = n + 1不是一个等式,而是一个通过将1加到当前值来改变 n 值的赋值。

声明变量

所有变量声明都由一个类型和一个变量名组成。名称可以是任何以大写或小写字母开头的标识符。

例如 int i, SsaDefinitionNode node, and LocalScopeVariable lsv 分别声明了变量 i, node, and lsvint, SsaDefinitionNode, and LocalScopeVariable 类型.

变量声明出现在不同的上下文中,例如在一个select子句中,在一个量化(quantified formula)的公式中,作为一个谓词(predicate)的参数,等等。

从概念上讲,您可以认为变量保存了其类型允许的所有值,但受到任何进一步的约束。

例如,考虑下面的 select 子句:

from int i
where i in [0 .. 9]
select i

仅仅基于它的类型,变量 i 就可以包含所有的整数。然而,它受到公式[0..9]。因此select 子句的结果是0和9之间的10个数字。

顺便说一句,请注意下面的查询会导致编译时错误:

from int i
select i

理论上,它会有无穷多个结果,因为变量 i 不受限于有限数目的可能值。而select字节必须是有限的

有关更多信息,请参见 “绑定.”

自由和有界变量(Free and bound variables)

变量可以有不同的角色。有些变量是自由的,它们的值直接影响使用它们的表达式的值,或者使用它们的公式是否成立。其他变量(称为绑定变量)被限制为特定的值集。

通过一个例子可能最容易理解这种区别,看看下面的表达式:

"hello".indexOf("l")

min(float f | f in [-3 .. 3])

(i + 7) * 3

x.sqrt()

第一个表达式没有任何变量。它查找字符串“ hello”中出现“ l”的索引(从零开始) ,因此它的值为2和3。

第二个表达式计算结果为 -3,即范围[-3..3].尽管这个表达式使用了一个变量 f,但它只是一个占位符或“虚拟”变量,您不能为它分配任何值。您可以用不同的变量替换 f,而不改变表达式的含义。例如,min(float f | f in [-3 .. 3])总是等于 min(float other | other in [-3 .. 3]). 这是一个绑定变量的例子。

表达式(i + 7) * 3和 x.sqrt ()呢?在这两种情况下,表达式的值取决于分别赋给变量 i 和 x 的值。换句话说,变量的值对表达式的值有影响。这些是自由变量的例子。

类似地,如果一个公式包含自由变量,那么根据赋给这些变量[1]的值,公式可以保持或不保持。例如:

"hello".indexOf("l") = 1

min(float f | f in [-3 .. 3]) = -3

(i + 7) * 3 instanceof int

exists(float y | x.sqrt() = y)

第一个公式不包含任何变量,而且它从不持有(因为 "hello".indexOf("l")从不为1)。

第二个公式只包含一个绑定变量,因此不受该变量更改的影响。[-3]中的 min (float f | f。.3])等于 -3,这个公式永远成立。

第三个公式包含一个自由变量 i。公式是否成立,取决于赋给 i 什么值。例如,如果赋给 i 1或2(或任何其他 int) ,那么公式成立。另一方面,如果我被分配到3.5,那么它就不成立。

最后一个公式包含一个自由变量 x 和一个有界变量 y。如果 x 被赋予一个非负数,那么最终的公式仍然成立。另一方面,如果 x 被赋值为 -9,那么公式就不成立。变量 y 并不影响公式是否成立。

posted @ 2022-04-25 17:23  我是面包  阅读(166)  评论(0编辑  收藏  举报