如何在 z3 中建模结构?
How to model struct in z3?
给出这样的结构:
struct MyStruct {
uint[10] a;
uint b;
bool c;
};
Mystruct m;
我的问题是如何使用 z3
对变量 m
建模?一个简单的解决方案是将 m
拆分为多个变量:m.a, m.b, m.c
。但是,它是不可扩展的(在我看来)。 z3
是否支持更好的解决方案?谢谢!
我正在尝试在 z3 中建模结构!
在 SMTLib 中执行此操作的标准方法是使用数据类型。请参阅 https://smtlib.cs.uiowa.edu/papers/smt-lib-reference-v2.6-r2021-05-12.pdf 的第 4.2.3 节。这是该文档中的“对”示例:
(declare-datatypes ((Pair 2)) ((par (X Y) ((pair (first X) (second Y))))))
请注意,以上是参数化的,即它允许您创建具有不同类型的对。您可以将其单态化:
(declare-datatypes ((Pair 0)) ((pair (first int) (second bool)))
并使用标签 a
/b
/c
等来添加您自己的字段和您想要的类型。有关详细信息,请参阅 SMTLib 文档。
如果您使用的是 higher-level API(例如来自 Haskell、Python、Scala 的)等;他们可能会提供更简单的方法来做同样的事情;你需要检查他们自己的文档。特别是,如果您使用的是 z3py,请参阅标题为“数据类型”的部分中的 https://ericpony.github.io/z3py-tutorial/advanced-examples.htm。
请注意,SMTLib/z3 结构甚至可以是递归的,即字段可以包含您正在定义的类型的值。您甚至可以制作相互递归的数据类型。看起来你在这里不需要这些设施,但同样的机制应该对你有用。
给出这样的结构:
struct MyStruct {
uint[10] a;
uint b;
bool c;
};
Mystruct m;
我的问题是如何使用 z3
对变量 m
建模?一个简单的解决方案是将 m
拆分为多个变量:m.a, m.b, m.c
。但是,它是不可扩展的(在我看来)。 z3
是否支持更好的解决方案?谢谢!
我正在尝试在 z3 中建模结构!
在 SMTLib 中执行此操作的标准方法是使用数据类型。请参阅 https://smtlib.cs.uiowa.edu/papers/smt-lib-reference-v2.6-r2021-05-12.pdf 的第 4.2.3 节。这是该文档中的“对”示例:
(declare-datatypes ((Pair 2)) ((par (X Y) ((pair (first X) (second Y))))))
请注意,以上是参数化的,即它允许您创建具有不同类型的对。您可以将其单态化:
(declare-datatypes ((Pair 0)) ((pair (first int) (second bool)))
并使用标签 a
/b
/c
等来添加您自己的字段和您想要的类型。有关详细信息,请参阅 SMTLib 文档。
如果您使用的是 higher-level API(例如来自 Haskell、Python、Scala 的)等;他们可能会提供更简单的方法来做同样的事情;你需要检查他们自己的文档。特别是,如果您使用的是 z3py,请参阅标题为“数据类型”的部分中的 https://ericpony.github.io/z3py-tutorial/advanced-examples.htm。
请注意,SMTLib/z3 结构甚至可以是递归的,即字段可以包含您正在定义的类型的值。您甚至可以制作相互递归的数据类型。看起来你在这里不需要这些设施,但同样的机制应该对你有用。