Z3/CVC4/SMT-LIB中的离散时间步长

Z3/CVC4/SMT-LIB中的离散时间步长,z3,smt,cvc4,Z3,Smt,Cvc4,我在SMT-LIB中使用Int定义时间步长,这迫使我断言一些事情,以确保负片中没有发生任何事情: (declare-sort Pkg) ; A package (define-sort Time () Int) ; The installation step ; ... (assert (forall ((t Time) (p Pkg)) (=> (< t 0) (not (installed p t))))) (声明排序包);包裹 (定义排序时间()Int);安装步骤 ; ...

我在SMT-LIB中使用Int定义时间步长,这迫使我断言一些事情,以确保负片中没有发生任何事情:

(declare-sort Pkg) ; A package
(define-sort Time () Int) ; The installation step
; ...
(assert (forall ((t Time) (p Pkg)) (=> (< t 0) (not (installed p t)))))
(声明排序包);包裹
(定义排序时间()Int);安装步骤
; ...
(断言(对于所有((t时间)(p Pkg))(=>(

我看到在Z3中,我们可以用通常的方式定义归纳的
Nat
s。使用
Nat
的归纳定义好吗?还是有更好的方法来做我上面尝试做的事情?

您应该真正坚持
Int
,并适当地加入
=0
约束。Z3非常了解
Int
,有各种各样的证明规则和技巧来处理它。虽然您确实可以定义归纳的
Nat
类型,但您将失去处理整数的所有内部机制,并且由于递归定义,Z3的决策过程将不太有效;特别是结合其他理论

话虽如此,除非你尝试,否则是不可能知道的:可能有一些问题领域的归纳定义可能更适合。但是,仅仅从你处理的问题来看,好的
Int
似乎是你的正确选择


另请参阅此相关问题:这与您的上下文绝对相关。

感谢您的观点。我已经看到了您链接到的问题(表示时间约束),但我不确定在我的案例中如何使用Reals,因为我正在查看类似于状态机中的离散步骤。如果我无论如何都能使用Reals,我会反馈结果。