如何在 SMT-LIB 标准中表示浮点常量(例如 1e307)?

How to represent a floating point constant (such as 1e307) in SMT-LIB standard?

目前我正在Z3上做一些实验,我不知道在SMT中表示浮点常量文字(例如1e307):

(declare-const a Real)
(assert (= a 1e+307))
(check-sat)

同样的问题发生在FPA理论上:

(declare-const a (_ FloatingPoint 11 53))
(assert (= a 1e+307))
(check-sat)

所有这些 SMT 代码都收到错误消息:

(error "line 2 column 14: unknown constant e+307")

那么知道在 Z3 或 SMT-LIB 中表示十进制浮点常量吗?

有关浮点理论的官方语法和语义,请参阅 Theory FP。 FP 数字的主要构造函数是

(fp (_ BitVec 1) (_ BitVec eb) (_ BitVec i) (_ FloatingPoint eb sb))

即,FP 数由 3 个位向量构成。在文档的下方还有转换函数,可以将其他数字转换为浮点数(都称为 to_fp)。

除了那里描述的那些之外,Z3 还支持另一种转换,如下所示:

((_ to_fp 11 53) RNE 1.0 307)

但是请注意,这里的 307 是 2 的幂,而不是 10 的幂,也就是说,这是 1.0*(2^307) 并且某些工具可能会将其打印为 1p307.