首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dreal4 Forall() SMT

Dreal4 Forall() SMT
EN

Stack Overflow用户
提问于 2022-04-13 19:02:17
回答 1查看 124关注 0票数 1

我想使用Dreal4 SMT解算器来检查控制李亚普诺夫函数的下列条件:

集合U中包含一个u,对于集合X中包含的所有x,其中V(x,u)是负的。(我称V(x,u)为那些熟悉CLFs的人的V(x)的李导数)。

我相信我应该能够使用forall()函数调用来解决这个问题(虽然我在文档中似乎找不到一个存在()),但是我不理解forall函数的语法。

简单的例子:

我们会说x是有界的区间:-5,5和u -25,25。

代码语言:javascript
复制
def V(x,u):
    return (x**2) - 1 + u
problem = forall([x], And(V(x,u) < 0, x < 5, x > -5, u > -25, u < 25)
result = CheckSatisfiablitity(problem,0.01)

根据上述条件,这应该是正确的,因为对于每一个x,您都可以选择一个使函数为负值的u。不管我设置的u边界(即使我设置的值会导致函数在任何地方都不能变成负值),我也只能得到一个无返回。

似乎我不理解forall()函数的语法,我应该如何使用forall()函数来验证这个条件?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-14 20:16:58

dReal使用了增量可满足性的概念,这不是您想要的。另外,它还通过机器浮动来建模真值;对于许多实际应用来说,这是足够的,但是当你想要证明这样的定理时,它在数学上是不可靠的。

我不确定如何在dReal中证明这一点,但在z3中,您可以按照以下方式编写代码:

代码语言:javascript
复制
from z3 import *

def V(x, u):
    return (x**2) - 1 + u

x = Real('x')
u = Real('u')

prove(ForAll([x], Implies(And(x < 5, x > -5),
                          Exists([u], And(u > -25, u < 25, V(x, u) < 0)))))

注意嵌套量词的使用,它与您的问题定义相匹配。这些指纹:

代码语言:javascript
复制
proved

如果您出于其他原因不得不使用dReal,我建议您在https://github.com/dreal/dreal4/issues上询问他们可能有哪些更好的建议。请把你发现的东西寄回这里!

得到一个模型

请注意,z3 (和SMT求解器在一般情况下)不显示模型中量化变量的值。要获得该值,需要将其改为顶级声明变量。为了做到这一点,我们宣布一个解决者,并断言否定我们想要“证明”的东西。因此,您可以将其编码如下:

代码语言:javascript
复制
from z3 import *

def V(x, u):
    return (x**2) - 1 + u

x = Real('x')
u = Real('u')

s = Solver()
s.add(x < 5)
s.add(x > -5)

# Add the negation of what we want to prove
s.add(Not(Exists([u], And(u > -20, u < 25, V(x, u) < 0))))

r = s.check()
if r == sat:
    print("Counter-example:")
    print(s.model())
else:
    print("Solver said: ", r)

这些指纹:

代码语言:javascript
复制
Counter-example:
[x = 19/4]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71862652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档