Z3中的软/硬约束

Z3中的软/硬约束,z3,Z3,如何在Z3中表达软约束和硬约束?我从API中知道可以有假设(软约束),但在使用命令行工具时,我无法表达这一点。我使用z3/smt2/si来调用它,smt2.0前端提供了一些假设。它们用于提取不合格的岩心。它们也可用于“收回”假设。 请注意,假设并不是真正的“软约束”,但可以用来实现它们。请参见Z3发行版中的maxsat示例(细分maxsat)。 也就是说,下面是一个关于如何在Z3 SMT 2.0前端中使用假设的示例 ;; Must enable unsat core generation (se

如何在Z3中表达软约束和硬约束?我从API中知道可以有假设(软约束),但在使用命令行工具时,我无法表达这一点。我使用z3/smt2/si来调用它,smt2.0前端提供了一些假设。它们用于提取不合格的岩心。它们也可用于“收回”假设。 请注意,假设并不是真正的“软约束”,但可以用来实现它们。请参见Z3发行版中的maxsat示例(细分maxsat)。 也就是说,下面是一个关于如何在Z3 SMT 2.0前端中使用假设的示例

;; Must enable unsat core generation
(set-option :produce-unsat-cores true)
(set-option :produce-models true)
;; Declare three Boolean constants to "assumptions"
(declare-const p1 Bool)
(declare-const p2 Bool)
(declare-const p3 Bool)
;; We assert (=> p C) to track C using p
(declare-const x Int)
(declare-const y Int)
(assert (=> p1 (> x 10)))
;; An Boolean constant may track more than one formula
(assert (=> p1 (> y x)))

(assert (=> p2 (< y 5)))
(assert (=> p3 (> y 0)))

(check-sat p1 p2 p3)
(get-unsat-core) ;; produce core (p1 p2)

(check-sat p1 p3) ;; "retrack" p2
(get-model)
;;必须启用unsat核心生成
(设置选项:生成unsat核心为真)
(设置选项:生成模型为真)
;; 将三个布尔常量声明为“假设”
(声明常数p1布尔)
(声明常数p2布尔)
(声明常数p3布尔)
;; 我们断言(=>pc)使用p跟踪C
(声明常量x Int)
(声明常数y Int)
(断言(=>p1(>X10)))
;; 布尔常量可以跟踪多个公式
(断言(=>p1(>yx)))
(断言(=>p2(p3(>Y0)))
(检查sat p1 p2 p3)
(获取未sat核心);;生产核心(p1 p2)
(检查sat p1 p3);;“重新跟踪”p2
(获取模型)

我明白你的意思。基本上,您使用选择器变量来切换在检查sat时应该考虑哪些断言。谢谢,这对我很有用。