【问题标题】:Do you know how to set "weak" initial values to each of z3 Array element?您知道如何为每个 z3 Array 元素设置“弱”初始值吗?
【发布时间】:2020-03-13 07:42:44
【问题描述】:

例如,Z3中是否有类似以下的weak_Store函数?

from z3 import * 

a = Array('a', IntSort(), IntSort()) 
a = weak_Store(a, 0, 0) 
a = weak_Store(a, 1, 1) 


s = Solver() 
s.add(a[0] == 100) 
print(s.check()) # should print "sat"

print(s.model().eval(a[0]))  # should print "100"
print(s.model().eval(a[1]))  # should print "1" which is stored as weak_Store. 

由于 a[1] 不参与上述约束求解,因此即使在 s.check() 之后也不应计算和更改。

我认为这与z3_model_eval 中的model_completion 变量有关, 但 z3_model_eval 不适用于 z3 Array 元素。 虽然这个例子是用 Python 写的,但我想用 z3 C api 来做。

谁能帮帮我?

提前谢谢你。

【问题讨论】:

    标签: z3


    【解决方案1】:

    这种约束被称为“软”约束,即那些在必要时可以被违反的约束,但求解器将尝试在其他情况下满足它们。请注意,您必须使用Optimize 对象(而不是Solver),这通常会降低容量。 (即,更慢,更有可能说unknown等)

    要添加软约束,请在 z3py 中使用 add_soft 而不是 add。您可以像这样在 Python 中编写示例代码:

    from z3 import *
    
    a = Array('a', IntSort(), IntSort())
    
    s = Optimize()
    
    s.add_soft(a[0] == 0)
    s.add_soft(a[1] == 1)
    
    s.add(a[0] == 100)
    print(s.check())
    
    print(s.model().eval(a[0]))
    print(s.model().eval(a[1]))
    

    打印出来:

    sat
    100
    1
    

    如您所愿。

    在C-API中,对应的调用是Z3_optimize_assert_soft

    【讨论】:

    • 我猜 SMT 求解器的优化对象除了硬(正常)约束之外,还试图找到软约束中涉及的对象的解决方案。但是我想我可以在不计算那些不必要的情况下做到这一点,因为我只想设置 Array 对象的所有元素的 initial 值。你知道任何替代方案吗?
    • 我不知道任何其他方法。在工业环境中,您首先要运行常规 SAT 求解器。获得模型后,您可以在输入变量的子集上添加这些软约束,以获得“更安静”的模型,即噪声更少的模型。这样,第一个 SAT 调用可以与第二个调用共享其学习的引理,并加快该过程。 (通常情况下,unsat 无论如何都是期望值。)据我所知,Z3 的优化求解器(也称为 MaxSAT/MaxSMT)求解器没有实现这种架构。在工业工具中,您不希望首先执行缓慢的 MaxSAT。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 2022-12-18
    • 2019-10-17
    • 2012-07-11
    相关资源
    最近更新 更多