界定普遍量化的变量

时间:2016-04-19 12:03:08

标签: z3 z3py quantifiers forall

我想知道是否可以在Z3中约束通用量化变量的值范围。

例如,假设我有一个名为“time”的Real类型的变量,用于模拟系统中的时间。 假设我有一个断言,它表示某些一元函数“func1”的值应始终在1到100之间。该函数将输入作为时间变量。在Z3中表示,我已将该属性编码如下:

  1. ForAll(time, And(func1(time) >= 1, func1(time) <= 100))

    请注意,我明确需要时间变量进行普遍量化,因为如果我注入以下类型的属性,我想让Z3给我不满:

  2. Exists(time, func1(time) == 101)

    就我对Z3的理解而言,所有常量都有数学(理论)而不是计算机(实际)实现,即它们的值没有约束(遗憾的是我不能指向我此刻读过的资源) 。假设随着时间的推移,我在我的系统中建模时间,并且根据系统约束,它不能运行超过x小时,我可以使用并说时间值介于0和x * 60'* 60之间以给出最大值执行时间以秒为单位。我知道我可以使用以下断言断言允许的时间值:

  3. And(time >= 0, time <= x*60*60)

    但它是否会影响1?

  4. 中给出的通用量化

    因此,这会导致如果注入属性2并且我指定x*60*60 + 1的时间值,则不应该取消设置,因为ForAll仅对时间值有效

1 个答案:

答案 0 :(得分:1)

  

但是它会影响1)中给出的通用量化吗?

请注意

var_dump

处理变量&#34; time&#34;作为约束。该公式的含义与:

相同
ForAll(time, And(func1(time) >= 1, func1(time) <= 100))

当断言上述内容时,意思是xx的任何实例化都成立(被断言)。特别是,您可以使用自由变量&#34; time&#34;来实例化量化变量。特别是,你可以用x * 60 * 60 + 1实例化产生断言:

ForAll(xx, And(func1(xx) >= 1, func1(xx) <= 100))

假设你想说那个

 And(func1(x*60*60+1) >= 1, func1(x*60*60+1) <= 100)

保持0和x * 60 * 60之间的每个值xx,然后你可以写:

 And(func1(xx) >= 1, func1(xx) <= 100))
  

(遗憾的是,我不能指出我此刻读过这篇文章的资源)。

合理的逻辑教科书或计算机科学书籍的基础应该深入解释。 Z3支持标准的一阶多分类逻辑(具有背景理论)。