【问题标题】:How to display specific unsat constraint, not whole core (Z3, Python)如何显示特定的未饱和约束,而不是整个核心(Z3,Python)
【发布时间】:2015-10-22 13:34:47
【问题描述】:

如何仅列出来自我的未饱和核心的特定约束结果?我有很多条件,打印整个核心并不能全部打印。我读到可以使用 assert_and_track 和 unsat_core 命令来完成。我找到了一些例子,但它们不起作用。有这方面的经验吗?

s.assert_and_track(A > B, 'p1')
s.assert_and_track(B > C, 'p2')
if s.check() == sat:
  print('ok')
else:
  c = s.unsat_core
  print(c) <- this print all core

那么如何只打印 p1 或 p2(只是真/假结果)?例如p2 = false,或者它可以以 print(c) 模式中显示的方式显示 - 但仅适用于 p1。

【问题讨论】:

    标签: z3 smt z3py


    【解决方案1】:

    实现这一点的最简单方法是简单地将标签映射保存到约束,对于这个示例,我们可以这样做

    M = {}
    M['p1'] = (A > B)
    M['p2'] = (B > C)
    M['p3'] = (C > A)
    

    以便稍后我们可以根据这些约束打印核心,例如如下

    core = s.unsat_core()
    for e in core:
        print(M[str(e)])
    

    当然,如果您只想打印一些条目而不是所有条目,这也可以。

    【讨论】:

    • 它不起作用。首先,我必须将print M[str(e)] 的语法错误纠正为print (M[str(e)]),然后我在for e in core: 上得到TypeError: 'method' object is not iterable。也可以尝试直接使用print (M['p1']) 显示它,但这个显示A &gt; B。所以我尝试将其转换为布尔值print (bool(M['p1'])) 但无论我设置什么条件( ==),此打印始终为真。
    • 看起来你使用的是 Python 3.x,而我一直在使用 2.x;我必须更新示例才能使用 3.x。
    • 我已更新示例并修复了另一个 Python 3.x 问题 Z3 的 API。该示例在 Windows 上使用我的 Python 3.4.3 运行良好。您使用的是旧版本的 Z3 还是 Python?
    • Python v3.5、Z3 v4.4.1 - 均为 x64。我的测试中有小错字unsat_core 应该是unsat_core() 现在它没有错误,但仍然没有输出。如果我使用直接打印对象print (M['p1']) 我得到输出A &gt; B
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多