首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(Z3Py)声明函数

(Z3Py)声明函数
EN

Stack Overflow用户
提问于 2012-08-09 20:12:59
回答 1查看 3.7K关注 0票数 5

我想找出一些给定结果/x对的简单"result=x*t+c“公式中的c和t系数:

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

x=Int('x')
c=Int('c')
t=Int('t')

s=Solver()

f = Function('f', IntSort(), IntSort())

# x*t+c = result
# x, result = [(1,55), (12,34), (13,300)]

s.add (f(x)==(x*t+c))
s.add (f(1)==55, f(12)==34, f(13)==300)

t=s.check()
if t==sat:
    print s.model()
else:
   print t

..。但结果显然是错误的。我可能需要了解如何映射函数参数。

如何正确定义函数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-09 22:26:58

断言f(x) == x*t + c没有为所有x定义函数f。它只是说给定xf的值是x*t + c。Z3支持通用限定符。然而,它们是非常昂贵的,并且当一组约束包含通用量词时,Z3是不完整的,因为问题变得无法确定。也就是说,对于这种问题,Z3可能会返回unknown

请注意,f本质上是脚本中的“宏”。我们可以创建一个Z3函数来实现这个功能,而不是使用Python函数来编码这个“宏”。也就是说,在给定Z3表达式的情况下,Python函数返回一个新的Z3表达式。这是一个新的脚本。该脚本也可通过以下网址在线获取:http://rise4fun.com/Z3Py/Yoi这里是该脚本的另一个版本,其中ctReal而不是Inthttp://rise4fun.com/Z3Py/uZl

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

c=Int('c')
t=Int('t')

def f(x):
    return x*t + c

# data is a list of pairs (x, r)
def find(data):
    s=Solver()
    s.add([ f(x) == r for (x, r) in data ])
    t = s.check()
    if s.check() == sat:
        print s.model()
    else:
        print t

find([(1, 55)])
find([(1, 55), (12, 34)])
find([(1, 55), (12, 34), (13, 300)])

备注:在SMT2.0前端,可以使用命令define-fun来定义宏。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11883185

复制
相关文章

相似问题

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