什么模式适合在 SBV 公式中表达 Null 值
What pattern is suitable for expressing Null value in a SBV formula
我正在将 SQL 谓词翻译成 Z3 语言。
SQL 谓词表达式非常接近 Z3 中的表达式:
where x + y > 0
====
(declare-const x Int)
(declare-const y Int)
(assert (> (+ x y) 0)))
但我不知道如何表示 Null 值。
在裸 Z3 中,我可以定义数据类型:
(declare-datatype
NullableInt
(
(justInt (theInt Int))
(nullInt)
)
)
# where x is null or x > 10
(declare-const x NullableInt)
(assert (ite (= x nullInt) true (> (justInt x) 10)))
SBV 没有声明数据类型。
我想到的第一个选项是替换所有 x
引用
使用 x + 1
然后 x = 0
可以被视为 null
SBV 完全支持可选值,建模 Maybe
数据类型:
https://hackage.haskell.org/package/sbv-8.16/docs/Data-SBV-Maybe.html
所以,我会像在常规 Haskell 中那样对其进行建模,即通过 Maybe Integer
;或者用 SBV 的说法,它的符号等价物 SMaybe Integer
。那应该是一个非常直接的对应关系。这是一个使用示例:
ghci> import Data.SBV
ghci> import qualified Data.SBV.Maybe as SM
ghci> sat $ \mi -> SM.maybe sTrue (.>= 10) mi
Satisfiable. Model:
s0 = Nothing :: Maybe Integer
ghci> sat $ \mi -> SM.maybe sFalse (.>= 10) mi
Satisfiable. Model:
s0 = Just 10 :: Maybe Integer
我正在将 SQL 谓词翻译成 Z3 语言。 SQL 谓词表达式非常接近 Z3 中的表达式:
where x + y > 0
====
(declare-const x Int)
(declare-const y Int)
(assert (> (+ x y) 0)))
但我不知道如何表示 Null 值。 在裸 Z3 中,我可以定义数据类型:
(declare-datatype
NullableInt
(
(justInt (theInt Int))
(nullInt)
)
)
# where x is null or x > 10
(declare-const x NullableInt)
(assert (ite (= x nullInt) true (> (justInt x) 10)))
SBV 没有声明数据类型。
我想到的第一个选项是替换所有 x
引用
使用 x + 1
然后 x = 0
可以被视为 null
SBV 完全支持可选值,建模 Maybe
数据类型:
https://hackage.haskell.org/package/sbv-8.16/docs/Data-SBV-Maybe.html
所以,我会像在常规 Haskell 中那样对其进行建模,即通过 Maybe Integer
;或者用 SBV 的说法,它的符号等价物 SMaybe Integer
。那应该是一个非常直接的对应关系。这是一个使用示例:
ghci> import Data.SBV
ghci> import qualified Data.SBV.Maybe as SM
ghci> sat $ \mi -> SM.maybe sTrue (.>= 10) mi
Satisfiable. Model:
s0 = Nothing :: Maybe Integer
ghci> sat $ \mi -> SM.maybe sFalse (.>= 10) mi
Satisfiable. Model:
s0 = Just 10 :: Maybe Integer