Объединение кортежей в SBV?
В основном мне интересно, есть ли способ написать функцию следующего типа с библиотекой SBV:
(SBV a, SBV b) -> SBV (a,b)
Кажется, это должно быть возможно: если у нас есть два символических значения, мы можем создать новое символическое значение в виде конкретной пары, элементы которой являются символическими или конкретными значениями двух входных данных. Но я не могу найти ничего подобного, и SBV
Тип не имеет своих конструкторов.
Это возможно?
1 ответ
Похоже, вам нужно 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
сам может справиться с Arity до 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
для приведенного выше примера.)