在SBV中合并元组?

时间:2019-07-03 18:23:03

标签: haskell smt sbv

基本上我想知道,有什么方法可以用SBV库编写以下类型的函数:

export default class App extends Component<Props> {
constructor() {
    super();
    this.state = {
        value: "Edit me!"
    };
    this.handleChangeText = this.handleChangeText.bind(this);


}

handleChangeText(newText) {
    this.setState({
        value: newText
    });
}


render() {
    return (
        <View style={styles.container}>
            <TextInput style={styles.editText}
                       onChange={this.handleChangeText}/>
            <Text>hello {this.state.value}</Text>
        </View>
    );
}

似乎应该是可能的:如果我们有两个符号值,我们可以创建一个新的符号值,作为一个具体对,其元素是两个输入的符号或具体值。但是我找不到这样的东西,并且(SBV a, SBV b) -> SBV (a,b) 类型没有公开其构造函数。

这可能吗?

1 个答案:

答案 0 :(得分:3)

听起来像您需要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所示。 )