Z3中的获取分配

时间:2013-05-03 04:53:20

标签: z3 smt

(get-assignment)命令应返回符号列表及其真/假值(如果它们是Bool排序)。根据我的理解,这只能在以下情况下完成:produce-assignments设置为true,when(check-sat)返回sat。但是,当我在Z3上运行一个小脚本来测试它时,(get-assignment)只返回() - 空白。 这是我的剧本:

(set-option :produce-assignments true)
(set-logic QF_UF)
(declare-fun a () Bool)
(declare-fun b () Bool)
(assert (= a b )) 
(check-sat)
(get-assignment)

1 个答案:

答案 0 :(得分:2)

get-assignment的语义不直观。它显示named子公式的值。从SMT 2.0 reference(第62页):

  

get-assignment       是一个轻量级且受限制的get-value版本,它要求为之前输入的一组选定的真值分配   公式。(29)与已经讨论过的其他几个命令类似   (例如,get-proof),此命令只有在发出时才能发出   produce-assignments选项(默认为false)设置为true   (见下文第5.1.7节)。求解器不需要支持此功能   选项。与get-value一样,它只能在check-sat之后发出   报告的命令或者可选的报告命令   未知,没有干预断言设置命令。命令   返回所有对的序列(f b),其中b为true或false   f是集合中形式(t)的(子)项的标签   所有断言,与Bool一样。与get-value类似,何时   最近的check-sat命令的响应是sat,只是   然后,所有断言的集合保证有一个模型(在   逻辑)同意返回的真值分配。

以下是使用两个命名子公式(也可在线提供here)的相同示例:

(set-option :produce-assignments true)
(set-logic QF_UF)
(declare-fun a () Bool)
(declare-fun b () Bool)
(assert (! (= (! a :named a_val) b ) :named eq_val)) 
(check-sat)
(get-assignment)