Z3(SMT)中的简单字节数组

Z3(SMT)中的简单字节数组,z3,smt,Z3,Smt,我试着做一个简单的例子来检查固定数组中的字节。我也读了Z3教程,但我不能让它工作。以下是可能的情况: 我有长度为16:T(16)的固定字节数组 我需要检查以下条件: A = (T(16) + 1) And 0x0F T(A) = 0x76 0x01 <= A <= 0x7F 例如: 在T(16)上是值0x14,+1=0x15,和0x0F=0x05,在T(0x05)上应该是值0x76 谢谢。你不能像那样混合整数和位向量,没有必要。在所有情况下都使用大小为8的位向量。不要使用Int 除

我试着做一个简单的例子来检查固定数组中的字节。我也读了Z3教程,但我不能让它工作。以下是可能的情况:

我有长度为16:T(16)的固定字节数组

我需要检查以下条件:

A = (T(16) + 1) And 0x0F
T(A) = 0x76
0x01 <= A <= 0x7F
例如:

T(16)
上是值
0x14
,+1=
0x15
0x0F
=
0x05
,在
T(0x05)
上应该是值
0x76


谢谢。

你不能像那样混合整数和位向量,没有必要。在所有情况下都使用大小为8的位向量。不要使用
Int

除此之外,这将起作用


您可能会发现不使用数组而只使用位向量更快。这是一个实验。

你不能像那样混合整数和位向量,也没有必要。在所有情况下都使用大小为8的位向量。不要使用
Int

除此之外,这将起作用


您可能会发现不使用数组而只使用位向量更快。这是一个值得尝试的东西。

谢谢你,是的,关于类型你是对的。关于不使用数组的想法-我可以创建16位向量变量。。。但我怎样才能读取X位置上的值呢?案例:T(A)=0x76,可能是某种选择案例?如果A=1,则使用T1;如果A=2,则使用T2变量?因为X是未知的…类似于
i==0?x0:i==1?x1:…
。这很尴尬,但可能比使用数组更快,因为这迫使Z3使用更通用的解算器。关于
i==0?x0
。。。这可以通过if-then-else命令ite写入?e、 g从我们的值T0,T1中分配给值X第N个值<代码>(断言(=X(ite(=a0)T0(ite(=a1)T1 T2)))
。。。。但这将是一个很长的表达。。。(我只写16中的前2个值,就像示例一样)是的,使用ITE,是的,它是一个深链。不过,还有一种更有效的编码方法。创建一个新变量
result
,然后断言
i==0意味着result==x0&&i==1意味着result==x1&&……
等等。这在实践中要快得多。我希望Z3不需要这个解决方法…我最终得到了这个脚本:(不适合这里,所以我把它放到了pastebin)但我仍然得到了未知的结果。我想我有一些蹩脚的错误或定义。。。或者我做错了什么:(谢谢,是的,关于类型你是对的。关于不使用数组的想法-我可以创建16位向量变量…但我如何读取X位置上的值?案例:T(A)=0x76,可能是某种选择情况?如果A=1,则使用T1,如果A=2,则使用T2变量?因为X未知…类似于
i==0?x0:i==1?x1:…
。这很尴尬,但可能比使用数组更快,因为这迫使Z3使用更通用的解算器。关于
i==0?x0
…这可以由If-Then els编写e命令ite?例如,从我们的值T0,T1中为值X指定第N个值。
(断言(=X(ite(=A 0)T0(ite(=A 1)T1 T2)))
…但这将是一个非常长的表达式…(我只写16中的前2个值,如示例所示)是的,使用ITE实现这一点,是的,它是一个深链。不过,有一个更有效的编码。您创建一个新变量
result
,然后断言
i==0暗示result==x0&&i==1暗示result==x1&&…
等。这在实践中要快得多。我希望Z3不需要这种解决方法……我最终得到了这个脚本:(不适合这里,所以我把它放到了pastebin)但我仍然得到了未知的结果。我认为我有一些蹩脚的错误或定义…或者可能我做错了什么:(
(declare-const t (Array Int Int))
(declare-const a Int)
; A = (t(16) + 1) And 0x0F
(assert (= a (bvand (+ (select t 16) 1) #x0F)))
; t(A) = 0x76
(assert (= (select t a) #x76))
(check-sat)
;(get-model)