基本上,我在想,有没有办法用SBV库编写以下类型的函数:
(SBV a, SBV b) -> SBV (a,b)这似乎是可能的:如果我们有两个符号值,我们就可以产生一个新的符号值,作为一个具体的对,其元素要么是两个输入的符号值,要么是具体的值。但是我找不到这样的东西,而且SBV类型没有公开它的构造函数。
这个是可能的吗?
发布于 2019-07-03 23:21:28
听起来你需要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模块中。(您还可以在同一个模块中找到类似透镜的访问器,它允许您编写、^._1、^._2等以提取元组字段;如上面示例中的z^._2 )。
https://stackoverflow.com/questions/56875985
复制相似问题