【发布时间】:2021-10-31 19:35:15
【问题描述】:
我是 Z3py 的新手,我发现了一个练习,它会要求检查某些验证条件是否为真。到目前为止,我所做的练习基本上是将简单的命题公式转换为 z3py 子句,例如:
Propositional Formula would be:
(n>=4) -> (x = y +2)
Which would become in Z3Py:
n, x, y = Ints('n x y')
s.add(Implies(n>=5, x == y+3))
我现在提出的条件,介绍数组和量词,在花了几个小时试图在文档中弄明白之后,我仍然无法正确完成它。
例如,我将如何执行上述相同的过程,但条件如下:
n ≥ 1 ∧ i = 1 ∧ m = A[0]
i <= n ∧ ∀j. 0 ≤ j < i → m ≥ A[j]
我认为正确完成的事情的一点点:
i, n = Ints('i n')
s.add(And(n>=1, i == 1, ???)
s.add(And(i<=n,Implies(???))
我应该如何替换???以便将条件正确转换为 Z3Py?
解决方案:
- The constraint
n ≥ 1 ∧ i = 1 ∧ m = A[0]
would become in Z3Py:
A = Array('A', IntSort(), IntSort()) //Array declaration
i, n, m, j = Ints('i n m j') //Ints declaration for both constraints
And(n>=1, i==1, m==A[0])
- The constraint
i <= n ∧ ∀j. 0 ≤ j < i → m ≥ A[j]
would become:
And(i<=n,ForAll(j,Implies(And(j>=0,j<i),m>=A[j])))
【问题讨论】: