检测图中是否存在循环:Z3的SMTLIB格式

检测图中是否存在循环:Z3的SMTLIB格式,z3,smt,Z3,Smt,这个问题涉及: 我想扭转上述链接中描述的问题。我的意思是我想检测一个图中循环的不存在性 提议的解决办法是: (set-option :fixedpoint.engine datalog) (define-sort s () Int) (declare-rel edge (s s)) (declare-rel path (s s)) (declare-var a s) (declare-var b s) (declare-var c s) (rule (=> (edge

这个问题涉及:

我想扭转上述链接中描述的问题。我的意思是我想检测一个图中循环的不存在性

提议的解决办法是:

(set-option :fixedpoint.engine datalog) 
(define-sort s () Int) 

(declare-rel edge (s s)) 
(declare-rel path (s s)) 

(declare-var a s) 
(declare-var b s) 
(declare-var c s) 

(rule (=> (edge a b) (path a b)) P-1)
(rule (=> (and (path a b) (path b c)) (path a c)) P-2)

(rule (edge 1 2) E-1)
(rule (edge 2 3) E-2)
(rule (edge 3 1) E-3)

(declare-rel cycle (s))
(rule (=> (path a a) (cycle a)))
(query cycle :print-answer true)
但我的问题是,当图表中没有循环时,如何获得SAT,当存在循环时,如何获得UNSAT

一个建议(但不符合我的需要)是:

结果返回:

> z3 test.txt
sat
(model
  (define-fun a () Int
    0)
  (define-fun path ((x!0 Int) (x!1 Int)) Bool
    (ite (and (= x!0 0) (= x!1 0)) false
      false))
)
我不明白为什么z3将0指定给变量,而我只有1、2和3作为顶点

另一项建议是:

(set-option :fixedpoint.engine datalog) 
(define-sort s () Int) 

(declare-rel edge (s s)) 
(declare-rel path (s s)) 

(declare-var a s) 
(declare-var b s) 
(declare-var c s) 

(rule (=> (edge a b) (path a b)))
(rule (=> (and (path a b) (path b c)) (path a c)))

(rule (edge 1 2) r-1)
(rule (edge 2 3) r-2)
(rule (edge 3 1) r-3)


(assert
         (=> (path a a)
            false
            )  

 )


(check-sat)
(get-model)
返回结果:

> z3 test2.txt
sat
(model
  (define-fun a () Int
    0)
  (define-fun path ((x!0 Int) (x!1 Int)) Bool
    (ite (and (= x!0 0) (= x!1 0)) false
      false))
)
有什么办法解决这个问题吗


(使用量词会增加问题的复杂性,这就是为什么我在寻找一些替代解决方案的原因)。

我不熟悉z3的这一部分,但总的来说,结果对我来说是合理的。Z3正试图为你的问题找到一个模型。 你从来没有说过1、2、3都是顶点,只是说它们是一些顶点。您可能可以通过为顶点引入一个谓词并说其他任何东西都不是顶点来解决这个问题

在最坏的情况下,您可能需要一个量词

> z3 test2.txt
sat
(model
  (define-fun a () Int
    0)
  (define-fun path ((x!0 Int) (x!1 Int)) Bool
    (ite (and (= x!0 0) (= x!1 0)) false
      false))
)