在 SBV 中组合元组?
Combining Tuples in SBV?
基本上我想知道,有没有办法用 SBV 库编写以下类型的函数:
(SBV a, SBV b) -> SBV (a,b)
这似乎应该是可能的:如果我们有两个符号值,我们可以创建一个新的符号值,作为一个具体对,其元素是符号或具体两个输入的值。但是我找不到这样的东西,而且 SBV
类型没有公开其构造函数。
这可能吗?
听起来您需要 tuple
函数。这是一个例子:
import Data.SBV
import Data.SBV.Tuple
tup :: (SymVal a, SymVal b) => (SBV a, SBV b) -> SBV (a, b)
tup = tuple
tst :: Predicate
tst = do x <- sInteger "x"
y <- sInteger "y"
z <- sTuple "xy"
return $ tup (x, y) .== z
当然,tuple
本身最多可以处理8个;以上只是您想要的确切类型的一个实例。我们有:
$ ghci a.hs
GHCi, version 8.6.4: http://www.haskell.org/ghc/ :? for help
[1 of 1] Compiling Main ( a.hs, interpreted )
Ok, one module loaded.
*Main> sat tst
Satisfiable. Model:
x = 0 :: Integer
y = 1 :: Integer
xy = (0,1) :: (Integer, Integer)
还有另一个方向的 untuple
函数。它们都在您必须显式导入的 Data.SBV.Tuple
模块中。 (您还可以在同一模块中找到 lens-like 访问器,它允许您编写 ^._1
、^._2
等来提取元组的字段;如上面的 z^._2
例如。)
基本上我想知道,有没有办法用 SBV 库编写以下类型的函数:
(SBV a, SBV b) -> SBV (a,b)
这似乎应该是可能的:如果我们有两个符号值,我们可以创建一个新的符号值,作为一个具体对,其元素是符号或具体两个输入的值。但是我找不到这样的东西,而且 SBV
类型没有公开其构造函数。
这可能吗?
听起来您需要 tuple
函数。这是一个例子:
import Data.SBV
import Data.SBV.Tuple
tup :: (SymVal a, SymVal b) => (SBV a, SBV b) -> SBV (a, b)
tup = tuple
tst :: Predicate
tst = do x <- sInteger "x"
y <- sInteger "y"
z <- sTuple "xy"
return $ tup (x, y) .== z
当然,tuple
本身最多可以处理8个;以上只是您想要的确切类型的一个实例。我们有:
$ ghci a.hs
GHCi, version 8.6.4: http://www.haskell.org/ghc/ :? for help
[1 of 1] Compiling Main ( a.hs, interpreted )
Ok, one module loaded.
*Main> sat tst
Satisfiable. Model:
x = 0 :: Integer
y = 1 :: Integer
xy = (0,1) :: (Integer, Integer)
还有另一个方向的 untuple
函数。它们都在您必须显式导入的 Data.SBV.Tuple
模块中。 (您还可以在同一模块中找到 lens-like 访问器,它允许您编写 ^._1
、^._2
等来提取元组的字段;如上面的 z^._2
例如。)