Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Z3 我可以使用SMT程序';结果是另一个SMT表达式?_Z3 - Fatal编程技术网

Z3 我可以使用SMT程序';结果是另一个SMT表达式?

Z3 我可以使用SMT程序';结果是另一个SMT表达式?,z3,Z3,我想在另一个模型中使用一个模型的输出(仅在我的例子中是sat和unsat)。在这里,模型是对一组逻辑公式(本例中为Z3表达式)中涉及的常数的满意赋值。我的目标可以简单地解释如下 我的问题可以详细描述如下:我有一个形式化的问题p,一组逻辑公式(表达式),对应于一些约束条件(C)。在这些表达式中,有一个(例如Ai>0)是我的目标。如果所有约束都可满足,则执行模型/形式化P返回sat。注意,Ai=0始终是可能的。 现在,我想找到一组特定变量的赋值对应于约束(C),以确保Ai>0(对于任何I)是不可能的

我想在另一个模型中使用一个模型的输出(仅在我的例子中是sat和unsat)。在这里,模型是对一组逻辑公式(本例中为Z3表达式)中涉及的常数的满意赋值。我的目标可以简单地解释如下

我的问题可以详细描述如下:我有一个形式化的问题p,一组逻辑公式(表达式),对应于一些约束条件(C)。在这些表达式中,有一个(例如Ai>0)是我的目标。如果所有约束都可满足,则执行模型/形式化P返回sat。注意,Ai=0始终是可能的。 现在,我想找到一组特定变量的赋值对应于约束(C),以确保Ai>0(对于任何I)是不可能的。 目前,我正在通过编写一个程序(用C#)来解决这个问题,该程序开发了一个基于DFS的约束(即约束值)搜索算法,并在“push/pop”的帮助下执行P以查看结果是否为假。虽然我已经努力让搜索变得更好,但这对我没有多大帮助。对于较大的问题规模来说,这是非常低效的。如果我能创建另一个SMT程序(模型),利用P搜索这样一个可满足的集合,那将是非常棒的

问题p(原始问题的简短SMT LIB 2版本)的当前形式化如下:

(declare-fun th1 () Real)
(declare-fun th2 () Real)
(declare-fun th3 () Real)
(declare-fun th4 () Real)
(declare-fun th5 () Real)

(declare-fun l1 () Real)
(declare-fun l2 () Real)
(declare-fun l3 () Real)
(declare-fun l4 () Real)
(declare-fun l5 () Real)
(declare-fun l6 () Real)
(declare-fun l7 () Real)

(declare-fun p1 () Real)
(declare-fun p2 () Real)
(declare-fun p3 () Real)
(declare-fun p4 () Real)
(declare-fun p5 () Real)

(declare-fun sl1 () Int)
(declare-fun sl2 () Int)
(declare-fun sl3 () Int)
(declare-fun sl4 () Int)
(declare-fun sl5 () Int)
(declare-fun sl6 () Int)
(declare-fun sl7 () Int)

(declare-fun sp1 () Int)
(declare-fun sp2 () Int)
(declare-fun sp3 () Int)
(declare-fun sp4 () Int)
(declare-fun sp5 () Int)

(declare-fun a1 () Int)
(declare-fun a2 () Int)
(declare-fun a3 () Int)
(declare-fun a4 () Int)
(declare-fun a5 () Int)

(declare-fun na () Int)
(declare-fun ns () Int)
(declare-fun attack () Bool)

;;;; System
(assert (and      (= l1 (* (- th2 th1) 17.0))
        (= l2 (* (- th5 th1) 4.5))
        (= l3 (* (- th3 th2) 5.05))
        (= l4 (* (- th4 th2) 5.65))
        (= l5 (* (- th5 th2) 5.75))
        (= l6 (* (- th4 th3) 5.85))
        (= l7 (* (- th5 th4) 23.75))        

        (= p1 (+ l1 l2))
        (= p2 (+ l1 l3 l4 l5))
        (= p3 (+ l3 l6))
        (= p4 (+ l4 l6 l7))
        (= p5 (+ l2 l5 l7))
        )
)

;;;; Secured measurements
(assert (and    (or (= sl1 0) (= sl1 1))
        (or (= sl2 0) (= sl2 1))
        (or (= sl3 0) (= sl3 1))
        (or (= sl4 0) (= sl4 1))
        (or (= sl5 0) (= sl5 1))
        (or (= sl6 0) (= sl6 1))
        (or (= sl7 0) (= sl7 1))

        (or (= sp1 0) (= sp1 1))
        (or (= sp2 0) (= sp2 1))
        (or (= sp3 0) (= sp3 1))
        (or (= sp4 0) (= sp4 1))
        (or (= sp5 0) (= sp5 1))        
        )
)        

(assert (and    (=> (not (= l1 0.0)) (= sl1 0))
        (=> (not (= l2 0.0)) (= sl2 0))
        (=> (not (= l3 0.0)) (= sl3 0))
        (=> (not (= l4 0.0)) (= sl4 0))
        (=> (not (= l5 0.0)) (= sl5 0))
        (=> (not (= l6 0.0)) (= sl6 0))
        (=> (not (= l7 0.0)) (= sl7 0))     

        (=> (not (= p1 0.0)) (= sp1 0))
        (=> (not (= p2 0.0)) (= sp2 0))
        (=> (not (= p3 0.0)) (= sp3 0))
        (=> (not (= p4 0.0)) (= sp4 0))
        (=> (not (= p5 0.0)) (= sp5 0))          
    )
)

(assert (and (= sl1 1) (= sl2 1)))

;;;; Attacks
(assert (and    (or (= a1 0) (= a1 1))
        (or (= a2 0) (= a2 1))
        (or (= a3 0) (= a3 1))
        (or (= a4 0) (= a4 1))
        (or (= a5 0) (= a5 1))      
    )
)

(assert (and
        (= (not (= th1 0.0)) (= a1 1))
        (= (not (= th2 0.0)) (= a2 1))
        (= (not (= th3 0.0)) (= a3 1))
        (= (not (= th4 0.0)) (= a4 1))
        (= (not (= th5 0.0)) (= a5 1))      
    )
)

(assert (= th1 0.0)) // Base condition
(assert (= na (+ a1 a2 a3 a4 a5)))
(assert (=> attack (> na 1)))


;;;; Check for satisfiable model

(assert attack)

(check-sat)
(get-model)
(exit)
(assert (= ns (+ sl1 sl2 sl3 sl4 sl5 sl6 sl7 sp1 sp2 sp3 sp4 sp5)))
(assert (<= ns 4))
我希望综合安全度量(即找到“sl”和“sp”术语的分配),以便在给定约束条件下不会发生攻击(即na为0),例如,如下所示:

(declare-fun th1 () Real)
(declare-fun th2 () Real)
(declare-fun th3 () Real)
(declare-fun th4 () Real)
(declare-fun th5 () Real)

(declare-fun l1 () Real)
(declare-fun l2 () Real)
(declare-fun l3 () Real)
(declare-fun l4 () Real)
(declare-fun l5 () Real)
(declare-fun l6 () Real)
(declare-fun l7 () Real)

(declare-fun p1 () Real)
(declare-fun p2 () Real)
(declare-fun p3 () Real)
(declare-fun p4 () Real)
(declare-fun p5 () Real)

(declare-fun sl1 () Int)
(declare-fun sl2 () Int)
(declare-fun sl3 () Int)
(declare-fun sl4 () Int)
(declare-fun sl5 () Int)
(declare-fun sl6 () Int)
(declare-fun sl7 () Int)

(declare-fun sp1 () Int)
(declare-fun sp2 () Int)
(declare-fun sp3 () Int)
(declare-fun sp4 () Int)
(declare-fun sp5 () Int)

(declare-fun a1 () Int)
(declare-fun a2 () Int)
(declare-fun a3 () Int)
(declare-fun a4 () Int)
(declare-fun a5 () Int)

(declare-fun na () Int)
(declare-fun ns () Int)
(declare-fun attack () Bool)

;;;; System
(assert (and      (= l1 (* (- th2 th1) 17.0))
        (= l2 (* (- th5 th1) 4.5))
        (= l3 (* (- th3 th2) 5.05))
        (= l4 (* (- th4 th2) 5.65))
        (= l5 (* (- th5 th2) 5.75))
        (= l6 (* (- th4 th3) 5.85))
        (= l7 (* (- th5 th4) 23.75))        

        (= p1 (+ l1 l2))
        (= p2 (+ l1 l3 l4 l5))
        (= p3 (+ l3 l6))
        (= p4 (+ l4 l6 l7))
        (= p5 (+ l2 l5 l7))
        )
)

;;;; Secured measurements
(assert (and    (or (= sl1 0) (= sl1 1))
        (or (= sl2 0) (= sl2 1))
        (or (= sl3 0) (= sl3 1))
        (or (= sl4 0) (= sl4 1))
        (or (= sl5 0) (= sl5 1))
        (or (= sl6 0) (= sl6 1))
        (or (= sl7 0) (= sl7 1))

        (or (= sp1 0) (= sp1 1))
        (or (= sp2 0) (= sp2 1))
        (or (= sp3 0) (= sp3 1))
        (or (= sp4 0) (= sp4 1))
        (or (= sp5 0) (= sp5 1))        
        )
)        

(assert (and    (=> (not (= l1 0.0)) (= sl1 0))
        (=> (not (= l2 0.0)) (= sl2 0))
        (=> (not (= l3 0.0)) (= sl3 0))
        (=> (not (= l4 0.0)) (= sl4 0))
        (=> (not (= l5 0.0)) (= sl5 0))
        (=> (not (= l6 0.0)) (= sl6 0))
        (=> (not (= l7 0.0)) (= sl7 0))     

        (=> (not (= p1 0.0)) (= sp1 0))
        (=> (not (= p2 0.0)) (= sp2 0))
        (=> (not (= p3 0.0)) (= sp3 0))
        (=> (not (= p4 0.0)) (= sp4 0))
        (=> (not (= p5 0.0)) (= sp5 0))          
    )
)

(assert (and (= sl1 1) (= sl2 1)))

;;;; Attacks
(assert (and    (or (= a1 0) (= a1 1))
        (or (= a2 0) (= a2 1))
        (or (= a3 0) (= a3 1))
        (or (= a4 0) (= a4 1))
        (or (= a5 0) (= a5 1))      
    )
)

(assert (and
        (= (not (= th1 0.0)) (= a1 1))
        (= (not (= th2 0.0)) (= a2 1))
        (= (not (= th3 0.0)) (= a3 1))
        (= (not (= th4 0.0)) (= a4 1))
        (= (not (= th5 0.0)) (= a5 1))      
    )
)

(assert (= th1 0.0)) // Base condition
(assert (= na (+ a1 a2 a3 a4 a5)))
(assert (=> attack (> na 1)))


;;;; Check for satisfiable model

(assert attack)

(check-sat)
(get-model)
(exit)
(assert (= ns (+ sl1 sl2 sl3 sl4 sl5 sl6 sl7 sp1 sp2 sp3 sp4 sp5)))
(assert (<= ns 4))
(断言(=ns(+sl1 sl2 sl3 sl4 sl5 sl6 sl7 sp1 sp2 sp3 sp4 sp5)))

(assert(如果我理解正确,那么您就是在寻找(通用)量化。请原谅我的伪符号,但是您不是在寻找以下自由变量(
config_params
)的满意赋值吗

config_constraints(config_params) -> forall attack_params: not attack_constraints(attack_params, config_params)

其中,
()
符号仅指示哪个变量(集合)约束取决于。我非常确定.Net API中支持量词,就像Java API中支持量词一样。

感谢您澄清了这个问题。如果我理解了一些事情,您可以使用Z3搜索
sli
spj
值,但您不能仅使用SMT-LIB,您需要使用API.T他的想法是使用一次sat检查的模型(满意的作业)作为未来检查的约束条件,如以下答案中详细解释的:

下面是用Python API编码的示例(z3py链接:):


请您澄清一下“模型”是什么意思?听起来您的意思是模型是对系统的描述(例如,防止或允许攻击路径的安全策略,然后您以某种方式使用Z3来证明存在或不存在攻击路径),而您可以表示模型理论意义上的模型,例如,一组逻辑公式(本例中为Z3表达式)中涉及的常数的满意赋值请看以下内容:两种方式都可以定义模型。但是,我认为第二种定义,即对一组逻辑公式(本例中为Z3表达式)中涉及的常数进行满意的赋值,将是定义模型的最佳方式。请提供一个简单的P、C和Ais示例,以帮助理解您的要求(理想情况下,对涉及的所有内容使用适当的排序,例如SMT-LIB格式)?听起来你大概是在通过搜索约束C的值来解决SAT问题,这有点难以理解你在问什么,因为你可能会对其进行编码,然后让Z3为你解决SAT问题,因此一个示例将非常有用。我已经用关于我的问题的示例代码更新了我的问题。我sh现在它将帮助您。感谢您的回复,尽管我无法按照您的想法解决我的问题。但是,我已经用一个例子详细阐述了我的问题描述。我希望这将帮助您更具体地了解我的问题的解决方案。您能解释一下想法之后的问题是什么(描述不足)?即使在你详细阐述之后,“找到‘sl’和‘sp’术语的赋值),这样就不会有攻击”听起来好像你需要(交替)量词来正确地说明你的问题。事实上,尽管我试图用量词来写形式化,但我无法完成,因为我无法理解我可以为量词接受哪一个论点,以及我可以在量词体中放置哪一部分。我变得非常困惑。如果你能告诉我如何看待我的问题,那将是一件好事e、 提前谢谢。再次感谢。但是,我已经提到我在Z3.Net API的帮助下实现了该程序。为了找到安全的测量值,我开发了一个基于树的搜索过程(基于DFS的解决方案)。也就是说,我也尝试过你的想法。但是,这些想法没有效率。在这个问题中,搜索空间是nCr,其中n是要保护的测量数(这里,12)r是最大安全测量的数量。您知道这是一个小示例。对于更大的问题,n>100,r>30。您可以轻松理解开销:(