首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SBV中组合元组?

在SBV中组合元组?
EN

Stack Overflow用户
提问于 2019-07-03 18:23:03
回答 1查看 86关注 0票数 2

基本上,我在想,有没有办法用SBV库编写以下类型的函数:

代码语言:javascript
复制
(SBV a, SBV b) -> SBV (a,b)

这似乎是可能的:如果我们有两个符号值,我们就可以产生一个新的符号值,作为一个具体的对,其元素要么是两个输入的符号值,要么是具体的值。但是我找不到这样的东西,而且SBV类型没有公开它的构造函数。

这个是可能的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-03 23:21:28

听起来你需要tuple函数。下面是一个例子:

代码语言:javascript
复制
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级以下的数据;以上只是一个您想要的类型的实例化。我们有:

代码语言:javascript
复制
$ 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 )。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56875985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档