grisette 0.11.0.0 → 0.12.0.0
raw patch · 146 files changed
+17009/−14136 lines, 146 filesdep ~containersdep ~doctestdep ~hashablePVP ok
version bump matches the API change (PVP)
Dependency ranges changed: containers, doctest, hashable, parallel, transformers
API changes (from Hackage documentation)
- Grisette.Internal.SymPrim.GeneralFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, GHC.Classes.Eq a0, GHC.Show.Show a0, Data.Hashable.Class.Hashable a0, Data.Typeable.Internal.Typeable a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, GHC.Classes.Eq a1, GHC.Show.Show a1, Data.Hashable.Class.Hashable a1, Data.Typeable.Internal.Typeable a1) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.GeneralFun.--> a1)
- Grisette.Internal.SymPrim.GeneralFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, GHC.Classes.Eq a0, GHC.Show.Show a0, Data.Hashable.Class.Hashable a0, Data.Typeable.Internal.Typeable a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, GHC.Classes.Eq a1, GHC.Show.Show a1, Data.Hashable.Class.Hashable a1, Data.Typeable.Internal.Typeable a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, GHC.Classes.Eq a2, GHC.Show.Show a2, Data.Hashable.Class.Hashable a2, Data.Typeable.Internal.Typeable a2) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.GeneralFun.--> (a1 Grisette.Internal.SymPrim.GeneralFun.--> a2))
- Grisette.Internal.SymPrim.GeneralFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, GHC.Classes.Eq a0, GHC.Show.Show a0, Data.Hashable.Class.Hashable a0, Data.Typeable.Internal.Typeable a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, GHC.Classes.Eq a1, GHC.Show.Show a1, Data.Hashable.Class.Hashable a1, Data.Typeable.Internal.Typeable a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, GHC.Classes.Eq a2, GHC.Show.Show a2, Data.Hashable.Class.Hashable a2, Data.Typeable.Internal.Typeable a2, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a3, GHC.Classes.Eq a3, GHC.Show.Show a3, Data.Hashable.Class.Hashable a3, Data.Typeable.Internal.Typeable a3) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.GeneralFun.--> (a1 Grisette.Internal.SymPrim.GeneralFun.--> (a2 Grisette.Internal.SymPrim.GeneralFun.--> a3)))
- Grisette.Internal.SymPrim.GeneralFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, GHC.Classes.Eq a0, GHC.Show.Show a0, Data.Hashable.Class.Hashable a0, Data.Typeable.Internal.Typeable a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, GHC.Classes.Eq a1, GHC.Show.Show a1, Data.Hashable.Class.Hashable a1, Data.Typeable.Internal.Typeable a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, GHC.Classes.Eq a2, GHC.Show.Show a2, Data.Hashable.Class.Hashable a2, Data.Typeable.Internal.Typeable a2, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a3, GHC.Classes.Eq a3, GHC.Show.Show a3, Data.Hashable.Class.Hashable a3, Data.Typeable.Internal.Typeable a3, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a4, GHC.Classes.Eq a4, GHC.Show.Show a4, Data.Hashable.Class.Hashable a4, Data.Typeable.Internal.Typeable a4) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.GeneralFun.--> (a1 Grisette.Internal.SymPrim.GeneralFun.--> (a2 Grisette.Internal.SymPrim.GeneralFun.--> (a3 Grisette.Internal.SymPrim.GeneralFun.--> a4))))
- Grisette.Internal.SymPrim.GeneralFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, GHC.Classes.Eq a0, GHC.Show.Show a0, Data.Hashable.Class.Hashable a0, Data.Typeable.Internal.Typeable a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, GHC.Classes.Eq a1, GHC.Show.Show a1, Data.Hashable.Class.Hashable a1, Data.Typeable.Internal.Typeable a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, GHC.Classes.Eq a2, GHC.Show.Show a2, Data.Hashable.Class.Hashable a2, Data.Typeable.Internal.Typeable a2, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a3, GHC.Classes.Eq a3, GHC.Show.Show a3, Data.Hashable.Class.Hashable a3, Data.Typeable.Internal.Typeable a3, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a4, GHC.Classes.Eq a4, GHC.Show.Show a4, Data.Hashable.Class.Hashable a4, Data.Typeable.Internal.Typeable a4, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a5, GHC.Classes.Eq a5, GHC.Show.Show a5, Data.Hashable.Class.Hashable a5, Data.Typeable.Internal.Typeable a5) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.GeneralFun.--> (a1 Grisette.Internal.SymPrim.GeneralFun.--> (a2 Grisette.Internal.SymPrim.GeneralFun.--> (a3 Grisette.Internal.SymPrim.GeneralFun.--> (a4 Grisette.Internal.SymPrim.GeneralFun.--> a5)))))
- Grisette.Internal.SymPrim.GeneralFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, GHC.Classes.Eq a0, GHC.Show.Show a0, Data.Hashable.Class.Hashable a0, Data.Typeable.Internal.Typeable a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, GHC.Classes.Eq a1, GHC.Show.Show a1, Data.Hashable.Class.Hashable a1, Data.Typeable.Internal.Typeable a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, GHC.Classes.Eq a2, GHC.Show.Show a2, Data.Hashable.Class.Hashable a2, Data.Typeable.Internal.Typeable a2, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a3, GHC.Classes.Eq a3, GHC.Show.Show a3, Data.Hashable.Class.Hashable a3, Data.Typeable.Internal.Typeable a3, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a4, GHC.Classes.Eq a4, GHC.Show.Show a4, Data.Hashable.Class.Hashable a4, Data.Typeable.Internal.Typeable a4, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a5, GHC.Classes.Eq a5, GHC.Show.Show a5, Data.Hashable.Class.Hashable a5, Data.Typeable.Internal.Typeable a5, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a6, GHC.Classes.Eq a6, GHC.Show.Show a6, Data.Hashable.Class.Hashable a6, Data.Typeable.Internal.Typeable a6) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.GeneralFun.--> (a1 Grisette.Internal.SymPrim.GeneralFun.--> (a2 Grisette.Internal.SymPrim.GeneralFun.--> (a3 Grisette.Internal.SymPrim.GeneralFun.--> (a4 Grisette.Internal.SymPrim.GeneralFun.--> (a5 Grisette.Internal.SymPrim.GeneralFun.--> a6))))))
- Grisette.Internal.SymPrim.GeneralFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, GHC.Classes.Eq a0, GHC.Show.Show a0, Data.Hashable.Class.Hashable a0, Data.Typeable.Internal.Typeable a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, GHC.Classes.Eq a1, GHC.Show.Show a1, Data.Hashable.Class.Hashable a1, Data.Typeable.Internal.Typeable a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, GHC.Classes.Eq a2, GHC.Show.Show a2, Data.Hashable.Class.Hashable a2, Data.Typeable.Internal.Typeable a2, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a3, GHC.Classes.Eq a3, GHC.Show.Show a3, Data.Hashable.Class.Hashable a3, Data.Typeable.Internal.Typeable a3, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a4, GHC.Classes.Eq a4, GHC.Show.Show a4, Data.Hashable.Class.Hashable a4, Data.Typeable.Internal.Typeable a4, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a5, GHC.Classes.Eq a5, GHC.Show.Show a5, Data.Hashable.Class.Hashable a5, Data.Typeable.Internal.Typeable a5, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a6, GHC.Classes.Eq a6, GHC.Show.Show a6, Data.Hashable.Class.Hashable a6, Data.Typeable.Internal.Typeable a6, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a7, GHC.Classes.Eq a7, GHC.Show.Show a7, Data.Hashable.Class.Hashable a7, Data.Typeable.Internal.Typeable a7) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.GeneralFun.--> (a1 Grisette.Internal.SymPrim.GeneralFun.--> (a2 Grisette.Internal.SymPrim.GeneralFun.--> (a3 Grisette.Internal.SymPrim.GeneralFun.--> (a4 Grisette.Internal.SymPrim.GeneralFun.--> (a5 Grisette.Internal.SymPrim.GeneralFun.--> (a6 Grisette.Internal.SymPrim.GeneralFun.--> a7)))))))
- Grisette.Internal.SymPrim.Prim.Internal.Caches: type Ident = StableName Any
- Grisette.Internal.SymPrim.Prim.Internal.Instances.BVPEval: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalBitCastTerm (Grisette.Internal.SymPrim.BV.IntN n) (Grisette.Internal.SymPrim.BV.WordN n)
- Grisette.Internal.SymPrim.Prim.Internal.Instances.BVPEval: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalBitCastTerm (Grisette.Internal.SymPrim.BV.WordN n) (Grisette.Internal.SymPrim.BV.IntN n)
- Grisette.Internal.SymPrim.Prim.Internal.Instances.BVPEval: instance Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalBVTerm Grisette.Internal.SymPrim.BV.IntN
- Grisette.Internal.SymPrim.Prim.Internal.Instances.BVPEval: instance Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalBVTerm Grisette.Internal.SymPrim.BV.WordN
- Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalBitwiseTerm: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalBitwiseTerm (Grisette.Internal.SymPrim.BV.IntN n)
- Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalBitwiseTerm: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalBitwiseTerm (Grisette.Internal.SymPrim.BV.WordN n)
- Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP: pevalFPBinaryTerm :: (ValidFP eb sb, SupportedPrim (FP eb sb)) => FPBinaryOp -> Term (FP eb sb) -> Term (FP eb sb) -> Term (FP eb sb)
- Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP: pevalFPFMATerm :: (ValidFP eb sb, SupportedPrim (FP eb sb)) => Term FPRoundingMode -> Term (FP eb sb) -> Term (FP eb sb) -> Term (FP eb sb) -> Term (FP eb sb)
- Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP: pevalFPRoundingBinaryTerm :: (ValidFP eb sb, SupportedPrim (FP eb sb)) => FPRoundingBinaryOp -> Term FPRoundingMode -> Term (FP eb sb) -> Term (FP eb sb) -> Term (FP eb sb)
- Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP: pevalFPRoundingUnaryTerm :: (ValidFP eb sb, SupportedPrim (FP eb sb)) => FPRoundingUnaryOp -> Term FPRoundingMode -> Term (FP eb sb) -> Term (FP eb sb)
- Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP: pevalFPTraitTerm :: (ValidFP eb sb, SupportedPrim (FP eb sb)) => FPTrait -> Term (FP eb sb) -> Term Bool
- Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP: pevalFPUnaryTerm :: (ValidFP eb sb, SupportedPrim (FP eb sb)) => FPUnaryOp -> Term (FP eb sb) -> Term (FP eb sb)
- Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP: sbvFPBinaryTerm :: ValidFP eb sb => FPBinaryOp -> SFloatingPoint eb sb -> SFloatingPoint eb sb -> SFloatingPoint eb sb
- Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP: sbvFPFMATerm :: ValidFP eb sb => SRoundingMode -> SFloatingPoint eb sb -> SFloatingPoint eb sb -> SFloatingPoint eb sb -> SFloatingPoint eb sb
- Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP: sbvFPRoundingBinaryTerm :: ValidFP eb sb => FPRoundingBinaryOp -> SRoundingMode -> SFloatingPoint eb sb -> SFloatingPoint eb sb -> SFloatingPoint eb sb
- Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP: sbvFPRoundingUnaryTerm :: ValidFP eb sb => FPRoundingUnaryOp -> SRoundingMode -> SFloatingPoint eb sb -> SFloatingPoint eb sb
- Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP: sbvFPTraitTerm :: ValidFP eb sb => FPTrait -> SFloatingPoint eb sb -> SBool
- Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP: sbvFPUnaryTerm :: ValidFP eb sb => FPUnaryOp -> SFloatingPoint eb sb -> SFloatingPoint eb sb
- Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalNumTerm: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalNumTerm (Grisette.Internal.SymPrim.BV.IntN n)
- Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalNumTerm: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalNumTerm (Grisette.Internal.SymPrim.BV.WordN n)
- Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalNumTerm: pevalDefaultAddNumTerm :: (PEvalNumTerm a, Eq a) => Term a -> Term a -> Term a
- Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalNumTerm: pevalDefaultNegNumTerm :: (PEvalNumTerm a, Eq a) => Term a -> Term a
- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: bvIsNonZeroFromGEq1 :: forall w r proxy. 1 <= w => proxy w -> (BVIsNonZero w => r) -> r
- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance (GHC.TypeNats.KnownNat w, 1 Data.Type.Ord.<= w) => Grisette.Internal.SymPrim.Prim.Internal.Term.NonFuncSBVRep (Grisette.Internal.SymPrim.BV.IntN w)
- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance (GHC.TypeNats.KnownNat w, 1 Data.Type.Ord.<= w) => Grisette.Internal.SymPrim.Prim.Internal.Term.NonFuncSBVRep (Grisette.Internal.SymPrim.BV.WordN w)
- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance (GHC.TypeNats.KnownNat w, 1 Data.Type.Ord.<= w) => Grisette.Internal.SymPrim.Prim.Internal.Term.SBVRep (Grisette.Internal.SymPrim.BV.IntN w)
- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance (GHC.TypeNats.KnownNat w, 1 Data.Type.Ord.<= w) => Grisette.Internal.SymPrim.Prim.Internal.Term.SBVRep (Grisette.Internal.SymPrim.BV.WordN w)
- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance (GHC.TypeNats.KnownNat w, 1 Data.Type.Ord.<= w) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim (Grisette.Internal.SymPrim.BV.IntN w)
- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance (GHC.TypeNats.KnownNat w, 1 Data.Type.Ord.<= w) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim (Grisette.Internal.SymPrim.BV.WordN w)
- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance (GHC.TypeNats.KnownNat w, 1 Data.Type.Ord.<= w) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (Grisette.Internal.SymPrim.BV.IntN w)
- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance (GHC.TypeNats.KnownNat w, 1 Data.Type.Ord.<= w) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (Grisette.Internal.SymPrim.BV.WordN w)
- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance (GHC.TypeNats.KnownNat w, 1 Data.Type.Ord.<= w) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrimConstraint (Grisette.Internal.SymPrim.BV.IntN w)
- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance (GHC.TypeNats.KnownNat w, 1 Data.Type.Ord.<= w) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrimConstraint (Grisette.Internal.SymPrim.BV.WordN w)
- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.SymPrim.Prim.Internal.Term.NonFuncSBVRep (Grisette.Internal.SymPrim.FP.FP eb sb)
- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.SymPrim.Prim.Internal.Term.SBVRep (Grisette.Internal.SymPrim.FP.FP eb sb)
- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim (Grisette.Internal.SymPrim.FP.FP eb sb)
- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (Grisette.Internal.SymPrim.FP.FP eb sb)
- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrimConstraint (Grisette.Internal.SymPrim.FP.FP eb sb)
- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance Grisette.Internal.SymPrim.Prim.Internal.Term.NonFuncSBVRep GHC.Num.Integer.Integer
- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance Grisette.Internal.SymPrim.Prim.Internal.Term.NonFuncSBVRep Grisette.Internal.SymPrim.AlgReal.AlgReal
- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance Grisette.Internal.SymPrim.Prim.Internal.Term.NonFuncSBVRep Grisette.Internal.SymPrim.FP.FPRoundingMode
- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance Grisette.Internal.SymPrim.Prim.Internal.Term.SBVRep GHC.Num.Integer.Integer
- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance Grisette.Internal.SymPrim.Prim.Internal.Term.SBVRep Grisette.Internal.SymPrim.AlgReal.AlgReal
- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance Grisette.Internal.SymPrim.Prim.Internal.Term.SBVRep Grisette.Internal.SymPrim.FP.FPRoundingMode
- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim GHC.Num.Integer.Integer
- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim Grisette.Internal.SymPrim.AlgReal.AlgReal
- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim Grisette.Internal.SymPrim.FP.FPRoundingMode
- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim GHC.Num.Integer.Integer
- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim Grisette.Internal.SymPrim.AlgReal.AlgReal
- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim Grisette.Internal.SymPrim.FP.FPRoundingMode
- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrimConstraint GHC.Num.Integer.Integer
- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrimConstraint Grisette.Internal.SymPrim.AlgReal.AlgReal
- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrimConstraint Grisette.Internal.SymPrim.FP.FPRoundingMode
- Grisette.Internal.SymPrim.Prim.Internal.Term: [AbsNumTerm] :: (SupportedPrim t, PEvalNumTerm t) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term t -> Term t
- Grisette.Internal.SymPrim.Prim.Internal.Term: [AddNumTerm] :: (SupportedPrim t, PEvalNumTerm t) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term t -> !Term t -> Term t
- Grisette.Internal.SymPrim.Prim.Internal.Term: [AndBitsTerm] :: (SupportedPrim t, PEvalBitwiseTerm t) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term t -> !Term t -> Term t
- Grisette.Internal.SymPrim.Prim.Internal.Term: [AndTerm] :: WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term Bool -> !Term Bool -> Term Bool
- Grisette.Internal.SymPrim.Prim.Internal.Term: [ApplyTerm] :: (PEvalApplyTerm f a b, SupportedPrim b) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term f -> !Term a -> Term b
- Grisette.Internal.SymPrim.Prim.Internal.Term: [BVConcatTerm] :: (PEvalBVTerm bv, KnownNat l, KnownNat r, KnownNat (l + r), 1 <= l, 1 <= r, 1 <= (l + r), SupportedPrim (bv (l + r))) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term (bv l) -> !Term (bv r) -> Term (bv (l + r))
- Grisette.Internal.SymPrim.Prim.Internal.Term: [BVExtendTerm] :: (PEvalBVTerm bv, KnownNat l, KnownNat r, 1 <= l, 1 <= r, l <= r, SupportedPrim (bv r)) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Bool -> !Proxy r -> !Term (bv l) -> Term (bv r)
- Grisette.Internal.SymPrim.Prim.Internal.Term: [BVSelectTerm] :: (PEvalBVTerm bv, KnownNat n, KnownNat ix, KnownNat w, 1 <= n, 1 <= w, (ix + w) <= n, SupportedPrim (bv w)) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Proxy ix -> !Proxy w -> !Term (bv n) -> Term (bv w)
- Grisette.Internal.SymPrim.Prim.Internal.Term: [BitCastOrTerm] :: (SupportedPrim b, PEvalBitCastOrTerm a b) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term b -> !Term a -> Term b
- Grisette.Internal.SymPrim.Prim.Internal.Term: [BitCastTerm] :: (SupportedPrim b, PEvalBitCastTerm a b) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term a -> Term b
- Grisette.Internal.SymPrim.Prim.Internal.Term: [ComplementBitsTerm] :: (SupportedPrim t, PEvalBitwiseTerm t) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term t -> Term t
- Grisette.Internal.SymPrim.Prim.Internal.Term: [ConTerm] :: SupportedPrim t => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !t -> Term t
- Grisette.Internal.SymPrim.Prim.Internal.Term: [DistinctTerm] :: WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !NonEmpty (Term t) -> Term Bool
- Grisette.Internal.SymPrim.Prim.Internal.Term: [DivIntegralTerm] :: (SupportedPrim t, PEvalDivModIntegralTerm t) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term t -> !Term t -> Term t
- Grisette.Internal.SymPrim.Prim.Internal.Term: [EqTerm] :: WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term t -> !Term t -> Term Bool
- Grisette.Internal.SymPrim.Prim.Internal.Term: [ExistsTerm] :: WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !TypedSymbol 'ConstantKind t -> !Term Bool -> Term Bool
- Grisette.Internal.SymPrim.Prim.Internal.Term: [FPBinaryTerm] :: (ValidFP eb sb, SupportedPrim (FP eb sb)) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !FPBinaryOp -> !Term (FP eb sb) -> !Term (FP eb sb) -> Term (FP eb sb)
- Grisette.Internal.SymPrim.Prim.Internal.Term: [FPFMATerm] :: (ValidFP eb sb, SupportedPrim (FP eb sb)) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term FPRoundingMode -> !Term (FP eb sb) -> !Term (FP eb sb) -> !Term (FP eb sb) -> Term (FP eb sb)
- Grisette.Internal.SymPrim.Prim.Internal.Term: [FPRoundingBinaryTerm] :: (ValidFP eb sb, SupportedPrim (FP eb sb)) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !FPRoundingBinaryOp -> !Term FPRoundingMode -> !Term (FP eb sb) -> !Term (FP eb sb) -> Term (FP eb sb)
- Grisette.Internal.SymPrim.Prim.Internal.Term: [FPRoundingUnaryTerm] :: (ValidFP eb sb, SupportedPrim (FP eb sb)) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !FPRoundingUnaryOp -> !Term FPRoundingMode -> !Term (FP eb sb) -> Term (FP eb sb)
- Grisette.Internal.SymPrim.Prim.Internal.Term: [FPTraitTerm] :: (ValidFP eb sb, SupportedPrim (FP eb sb)) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !FPTrait -> !Term (FP eb sb) -> Term Bool
- Grisette.Internal.SymPrim.Prim.Internal.Term: [FPUnaryTerm] :: (ValidFP eb sb, SupportedPrim (FP eb sb)) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !FPUnaryOp -> !Term (FP eb sb) -> Term (FP eb sb)
- Grisette.Internal.SymPrim.Prim.Internal.Term: [FdivTerm] :: (SupportedPrim t, PEvalFractionalTerm t) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term t -> !Term t -> Term t
- Grisette.Internal.SymPrim.Prim.Internal.Term: [FloatingUnaryTerm] :: (SupportedPrim t, PEvalFloatingTerm t) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !FloatingUnaryOp -> !Term t -> Term t
- Grisette.Internal.SymPrim.Prim.Internal.Term: [ForallTerm] :: WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !TypedSymbol 'ConstantKind t -> !Term Bool -> Term Bool
- Grisette.Internal.SymPrim.Prim.Internal.Term: [FromFPOrTerm] :: (PEvalIEEEFPConvertibleTerm a, ValidFP eb sb, SupportedPrim a) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term a -> !Term FPRoundingMode -> !Term (FP eb sb) -> Term a
- Grisette.Internal.SymPrim.Prim.Internal.Term: [FromIntegralTerm] :: (PEvalFromIntegralTerm a b, SupportedPrim b) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term a -> Term b
- Grisette.Internal.SymPrim.Prim.Internal.Term: [ITETerm] :: SupportedPrim t => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term Bool -> !Term t -> !Term t -> Term t
- Grisette.Internal.SymPrim.Prim.Internal.Term: [LeOrdTerm] :: (SupportedPrim t, PEvalOrdTerm t) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term t -> !Term t -> Term Bool
- Grisette.Internal.SymPrim.Prim.Internal.Term: [LtOrdTerm] :: (SupportedPrim t, PEvalOrdTerm t) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term t -> !Term t -> Term Bool
- Grisette.Internal.SymPrim.Prim.Internal.Term: [ModIntegralTerm] :: (SupportedPrim t, PEvalDivModIntegralTerm t) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term t -> !Term t -> Term t
- Grisette.Internal.SymPrim.Prim.Internal.Term: [MulNumTerm] :: (SupportedPrim t, PEvalNumTerm t) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term t -> !Term t -> Term t
- Grisette.Internal.SymPrim.Prim.Internal.Term: [NegNumTerm] :: (SupportedPrim t, PEvalNumTerm t) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term t -> Term t
- Grisette.Internal.SymPrim.Prim.Internal.Term: [NotTerm] :: WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term Bool -> Term Bool
- Grisette.Internal.SymPrim.Prim.Internal.Term: [OrBitsTerm] :: (SupportedPrim t, PEvalBitwiseTerm t) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term t -> !Term t -> Term t
- Grisette.Internal.SymPrim.Prim.Internal.Term: [OrTerm] :: WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term Bool -> !Term Bool -> Term Bool
- Grisette.Internal.SymPrim.Prim.Internal.Term: [PowerTerm] :: (SupportedPrim t, PEvalFloatingTerm t) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term t -> !Term t -> Term t
- Grisette.Internal.SymPrim.Prim.Internal.Term: [QuotIntegralTerm] :: (SupportedPrim t, PEvalDivModIntegralTerm t) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term t -> !Term t -> Term t
- Grisette.Internal.SymPrim.Prim.Internal.Term: [RecipTerm] :: (SupportedPrim t, PEvalFractionalTerm t) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term t -> Term t
- Grisette.Internal.SymPrim.Prim.Internal.Term: [RemIntegralTerm] :: (SupportedPrim t, PEvalDivModIntegralTerm t) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term t -> !Term t -> Term t
- Grisette.Internal.SymPrim.Prim.Internal.Term: [RotateLeftTerm] :: (SupportedPrim t, PEvalRotateTerm t) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term t -> !Term t -> Term t
- Grisette.Internal.SymPrim.Prim.Internal.Term: [RotateRightTerm] :: (SupportedPrim t, PEvalRotateTerm t) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term t -> !Term t -> Term t
- Grisette.Internal.SymPrim.Prim.Internal.Term: [ShiftLeftTerm] :: (SupportedPrim t, PEvalShiftTerm t) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term t -> !Term t -> Term t
- Grisette.Internal.SymPrim.Prim.Internal.Term: [ShiftRightTerm] :: (SupportedPrim t, PEvalShiftTerm t) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term t -> !Term t -> Term t
- Grisette.Internal.SymPrim.Prim.Internal.Term: [SignumNumTerm] :: (SupportedPrim t, PEvalNumTerm t) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term t -> Term t
- Grisette.Internal.SymPrim.Prim.Internal.Term: [SymTerm] :: WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !TypedSymbol 'AnyKind t -> Term t
- Grisette.Internal.SymPrim.Prim.Internal.Term: [ToFPTerm] :: (PEvalIEEEFPConvertibleTerm a, ValidFP eb sb, SupportedPrim (FP eb sb)) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term FPRoundingMode -> !Term a -> Proxy eb -> Proxy sb -> Term (FP eb sb)
- Grisette.Internal.SymPrim.Prim.Internal.Term: [XorBitsTerm] :: (SupportedPrim t, PEvalBitwiseTerm t) => WeakThreadId -> {-# UNPACK #-} !Digest -> Id -> Ident -> !Term t -> !Term t -> Term t
- Grisette.Internal.SymPrim.Prim.Internal.Term: introSupportedPrimConstraint :: forall t a. Term t -> ((SupportedPrim t, Typeable t) => a) -> a
- Grisette.Internal.SymPrim.Prim.Internal.Term: termIdent :: Term t -> Ident
- Grisette.Internal.SymPrim.Prim.Internal.Term: typeHashId :: forall t. Term t -> TypeHashId
- Grisette.Internal.SymPrim.Prim.Internal.Term: withConstantSymbolSupported :: forall t a. TypedSymbol 'ConstantKind t -> ((SupportedNonFuncPrim t, Typeable t) => a) -> a
- Grisette.Internal.SymPrim.Prim.Internal.Term: withSupportedPrimTypeable :: forall a b. SupportedPrim a => (Typeable a => b) -> b
- Grisette.Internal.SymPrim.Prim.Internal.Term: withSymbolKind :: TypedSymbol knd t -> (IsSymbolKind knd => a) -> a
- Grisette.Internal.SymPrim.Prim.Internal.Term: withSymbolSupported :: forall knd t a. TypedSymbol knd t -> ((SupportedPrim t, Typeable t) => a) -> a
- Grisette.Internal.SymPrim.TabularFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, GHC.Classes.Eq a0, GHC.Show.Show a0, Data.Hashable.Class.Hashable a0, Data.Typeable.Internal.Typeable a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, GHC.Classes.Eq a1, GHC.Show.Show a1, Data.Hashable.Class.Hashable a1, Data.Typeable.Internal.Typeable a1) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.TabularFun.=-> a1)
- Grisette.Internal.SymPrim.TabularFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, GHC.Classes.Eq a0, GHC.Show.Show a0, Data.Hashable.Class.Hashable a0, Data.Typeable.Internal.Typeable a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, GHC.Classes.Eq a1, GHC.Show.Show a1, Data.Hashable.Class.Hashable a1, Data.Typeable.Internal.Typeable a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, GHC.Classes.Eq a2, GHC.Show.Show a2, Data.Hashable.Class.Hashable a2, Data.Typeable.Internal.Typeable a2) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.TabularFun.=-> (a1 Grisette.Internal.SymPrim.TabularFun.=-> a2))
- Grisette.Internal.SymPrim.TabularFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, GHC.Classes.Eq a0, GHC.Show.Show a0, Data.Hashable.Class.Hashable a0, Data.Typeable.Internal.Typeable a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, GHC.Classes.Eq a1, GHC.Show.Show a1, Data.Hashable.Class.Hashable a1, Data.Typeable.Internal.Typeable a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, GHC.Classes.Eq a2, GHC.Show.Show a2, Data.Hashable.Class.Hashable a2, Data.Typeable.Internal.Typeable a2, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a3, GHC.Classes.Eq a3, GHC.Show.Show a3, Data.Hashable.Class.Hashable a3, Data.Typeable.Internal.Typeable a3) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.TabularFun.=-> (a1 Grisette.Internal.SymPrim.TabularFun.=-> (a2 Grisette.Internal.SymPrim.TabularFun.=-> a3)))
- Grisette.Internal.SymPrim.TabularFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, GHC.Classes.Eq a0, GHC.Show.Show a0, Data.Hashable.Class.Hashable a0, Data.Typeable.Internal.Typeable a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, GHC.Classes.Eq a1, GHC.Show.Show a1, Data.Hashable.Class.Hashable a1, Data.Typeable.Internal.Typeable a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, GHC.Classes.Eq a2, GHC.Show.Show a2, Data.Hashable.Class.Hashable a2, Data.Typeable.Internal.Typeable a2, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a3, GHC.Classes.Eq a3, GHC.Show.Show a3, Data.Hashable.Class.Hashable a3, Data.Typeable.Internal.Typeable a3, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a4, GHC.Classes.Eq a4, GHC.Show.Show a4, Data.Hashable.Class.Hashable a4, Data.Typeable.Internal.Typeable a4) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.TabularFun.=-> (a1 Grisette.Internal.SymPrim.TabularFun.=-> (a2 Grisette.Internal.SymPrim.TabularFun.=-> (a3 Grisette.Internal.SymPrim.TabularFun.=-> a4))))
- Grisette.Internal.SymPrim.TabularFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, GHC.Classes.Eq a0, GHC.Show.Show a0, Data.Hashable.Class.Hashable a0, Data.Typeable.Internal.Typeable a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, GHC.Classes.Eq a1, GHC.Show.Show a1, Data.Hashable.Class.Hashable a1, Data.Typeable.Internal.Typeable a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, GHC.Classes.Eq a2, GHC.Show.Show a2, Data.Hashable.Class.Hashable a2, Data.Typeable.Internal.Typeable a2, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a3, GHC.Classes.Eq a3, GHC.Show.Show a3, Data.Hashable.Class.Hashable a3, Data.Typeable.Internal.Typeable a3, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a4, GHC.Classes.Eq a4, GHC.Show.Show a4, Data.Hashable.Class.Hashable a4, Data.Typeable.Internal.Typeable a4, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a5, GHC.Classes.Eq a5, GHC.Show.Show a5, Data.Hashable.Class.Hashable a5, Data.Typeable.Internal.Typeable a5) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.TabularFun.=-> (a1 Grisette.Internal.SymPrim.TabularFun.=-> (a2 Grisette.Internal.SymPrim.TabularFun.=-> (a3 Grisette.Internal.SymPrim.TabularFun.=-> (a4 Grisette.Internal.SymPrim.TabularFun.=-> a5)))))
- Grisette.Internal.SymPrim.TabularFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, GHC.Classes.Eq a0, GHC.Show.Show a0, Data.Hashable.Class.Hashable a0, Data.Typeable.Internal.Typeable a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, GHC.Classes.Eq a1, GHC.Show.Show a1, Data.Hashable.Class.Hashable a1, Data.Typeable.Internal.Typeable a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, GHC.Classes.Eq a2, GHC.Show.Show a2, Data.Hashable.Class.Hashable a2, Data.Typeable.Internal.Typeable a2, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a3, GHC.Classes.Eq a3, GHC.Show.Show a3, Data.Hashable.Class.Hashable a3, Data.Typeable.Internal.Typeable a3, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a4, GHC.Classes.Eq a4, GHC.Show.Show a4, Data.Hashable.Class.Hashable a4, Data.Typeable.Internal.Typeable a4, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a5, GHC.Classes.Eq a5, GHC.Show.Show a5, Data.Hashable.Class.Hashable a5, Data.Typeable.Internal.Typeable a5, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a6, GHC.Classes.Eq a6, GHC.Show.Show a6, Data.Hashable.Class.Hashable a6, Data.Typeable.Internal.Typeable a6) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.TabularFun.=-> (a1 Grisette.Internal.SymPrim.TabularFun.=-> (a2 Grisette.Internal.SymPrim.TabularFun.=-> (a3 Grisette.Internal.SymPrim.TabularFun.=-> (a4 Grisette.Internal.SymPrim.TabularFun.=-> (a5 Grisette.Internal.SymPrim.TabularFun.=-> a6))))))
- Grisette.Internal.SymPrim.TabularFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, GHC.Classes.Eq a0, GHC.Show.Show a0, Data.Hashable.Class.Hashable a0, Data.Typeable.Internal.Typeable a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, GHC.Classes.Eq a1, GHC.Show.Show a1, Data.Hashable.Class.Hashable a1, Data.Typeable.Internal.Typeable a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, GHC.Classes.Eq a2, GHC.Show.Show a2, Data.Hashable.Class.Hashable a2, Data.Typeable.Internal.Typeable a2, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a3, GHC.Classes.Eq a3, GHC.Show.Show a3, Data.Hashable.Class.Hashable a3, Data.Typeable.Internal.Typeable a3, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a4, GHC.Classes.Eq a4, GHC.Show.Show a4, Data.Hashable.Class.Hashable a4, Data.Typeable.Internal.Typeable a4, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a5, GHC.Classes.Eq a5, GHC.Show.Show a5, Data.Hashable.Class.Hashable a5, Data.Typeable.Internal.Typeable a5, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a6, GHC.Classes.Eq a6, GHC.Show.Show a6, Data.Hashable.Class.Hashable a6, Data.Typeable.Internal.Typeable a6, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a7, GHC.Classes.Eq a7, GHC.Show.Show a7, Data.Hashable.Class.Hashable a7, Data.Typeable.Internal.Typeable a7) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.TabularFun.=-> (a1 Grisette.Internal.SymPrim.TabularFun.=-> (a2 Grisette.Internal.SymPrim.TabularFun.=-> (a3 Grisette.Internal.SymPrim.TabularFun.=-> (a4 Grisette.Internal.SymPrim.TabularFun.=-> (a5 Grisette.Internal.SymPrim.TabularFun.=-> (a6 Grisette.Internal.SymPrim.TabularFun.=-> a7)))))))
- Grisette.Internal.TH.GADT.BinaryOpCommon: BinaryOpClassConfig :: [BinaryOpFieldConfig] -> [Name] -> Bool -> Bool -> BinaryOpClassConfig
- Grisette.Internal.TH.GADT.BinaryOpCommon: BinaryOpFieldConfig :: [String] -> ([Exp] -> (Exp, Exp) -> Exp -> Q (Exp, [Bool])) -> (Name -> [Exp] -> Q (Exp, [Bool])) -> (Exp -> Q Exp) -> Q Exp -> Q Exp -> FieldFunExp -> [Name] -> BinaryOpFieldConfig
- Grisette.Internal.TH.GADT.BinaryOpCommon: [binaryOpAllowExistential] :: BinaryOpClassConfig -> Bool
- Grisette.Internal.TH.GADT.BinaryOpCommon: [binaryOpAllowSumType] :: BinaryOpClassConfig -> Bool
- Grisette.Internal.TH.GADT.BinaryOpCommon: [binaryOpFieldConfigs] :: BinaryOpClassConfig -> [BinaryOpFieldConfig]
- Grisette.Internal.TH.GADT.BinaryOpCommon: [binaryOpInstanceNames] :: BinaryOpClassConfig -> [Name]
- Grisette.Internal.TH.GADT.BinaryOpCommon: [extraPatNames] :: BinaryOpFieldConfig -> [String]
- Grisette.Internal.TH.GADT.BinaryOpCommon: [fieldCombineFun] :: BinaryOpFieldConfig -> Name -> [Exp] -> Q (Exp, [Bool])
- Grisette.Internal.TH.GADT.BinaryOpCommon: [fieldDifferentExistentialFun] :: BinaryOpFieldConfig -> Exp -> Q Exp
- Grisette.Internal.TH.GADT.BinaryOpCommon: [fieldFunExp] :: BinaryOpFieldConfig -> FieldFunExp
- Grisette.Internal.TH.GADT.BinaryOpCommon: [fieldFunNames] :: BinaryOpFieldConfig -> [Name]
- Grisette.Internal.TH.GADT.BinaryOpCommon: [fieldLMatchResult] :: BinaryOpFieldConfig -> Q Exp
- Grisette.Internal.TH.GADT.BinaryOpCommon: [fieldRMatchResult] :: BinaryOpFieldConfig -> Q Exp
- Grisette.Internal.TH.GADT.BinaryOpCommon: [fieldResFun] :: BinaryOpFieldConfig -> [Exp] -> (Exp, Exp) -> Exp -> Q (Exp, [Bool])
- Grisette.Internal.TH.GADT.BinaryOpCommon: data BinaryOpClassConfig
- Grisette.Internal.TH.GADT.BinaryOpCommon: data BinaryOpFieldConfig
- Grisette.Internal.TH.GADT.BinaryOpCommon: defaultFieldFunExp :: [Name] -> FieldFunExp
- Grisette.Internal.TH.GADT.BinaryOpCommon: genBinaryOpClass :: DeriveConfig -> BinaryOpClassConfig -> Int -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.BinaryOpCommon: genBinaryOpClause :: BinaryOpFieldConfig -> [(Type, Kind)] -> [(Type, Kind)] -> Bool -> ConstructorInfo -> ConstructorInfo -> Q [Clause]
- Grisette.Internal.TH.GADT.BinaryOpCommon: type FieldFunExp = Map Name Name -> Type -> Q Exp
- Grisette.Internal.TH.GADT.Common: CheckArgsResult :: [ConstructorInfo] -> [(Type, Kind)] -> [(Type, Kind)] -> CheckArgsResult
- Grisette.Internal.TH.GADT.Common: DeriveConfig :: [(Int, EvalModeConfig)] -> [Int] -> [(Int, Int)] -> Bool -> Bool -> DeriveConfig
- Grisette.Internal.TH.GADT.Common: EvalModeConstraints :: [Name] -> EvalModeConfig
- Grisette.Internal.TH.GADT.Common: EvalModeSpecified :: EvalModeTag -> EvalModeConfig
- Grisette.Internal.TH.GADT.Common: [argVars] :: CheckArgsResult -> [(Type, Kind)]
- Grisette.Internal.TH.GADT.Common: [bitSizePositions] :: DeriveConfig -> [Int]
- Grisette.Internal.TH.GADT.Common: [constructors] :: CheckArgsResult -> [ConstructorInfo]
- Grisette.Internal.TH.GADT.Common: [evalModeConfig] :: DeriveConfig -> [(Int, EvalModeConfig)]
- Grisette.Internal.TH.GADT.Common: [fpBitSizePositions] :: DeriveConfig -> [(Int, Int)]
- Grisette.Internal.TH.GADT.Common: [keptVars] :: CheckArgsResult -> [(Type, Kind)]
- Grisette.Internal.TH.GADT.Common: [needExtraMergeableUnderEvalMode] :: DeriveConfig -> Bool
- Grisette.Internal.TH.GADT.Common: [needExtraMergeableWithConcretizedEvalMode] :: DeriveConfig -> Bool
- Grisette.Internal.TH.GADT.Common: checkArgs :: String -> Int -> Name -> Bool -> Int -> Q CheckArgsResult
- Grisette.Internal.TH.GADT.Common: ctxForVar :: [Type] -> Type -> Kind -> Q (Maybe Pred)
- Grisette.Internal.TH.GADT.Common: data CheckArgsResult
- Grisette.Internal.TH.GADT.Common: data DeriveConfig
- Grisette.Internal.TH.GADT.Common: data EvalModeConfig
- Grisette.Internal.TH.GADT.Common: evalModeSpecializeList :: DeriveConfig -> [(Int, EvalModeTag)]
- Grisette.Internal.TH.GADT.Common: extraBitSizeConstraint :: Name -> Name -> [(Type, Kind)] -> Int -> Q [Pred]
- Grisette.Internal.TH.GADT.Common: extraConstraint :: DeriveConfig -> Name -> Name -> [(Type, Kind)] -> [(Type, Kind)] -> [ConstructorInfo] -> Q [Pred]
- Grisette.Internal.TH.GADT.Common: extraEvalModeConstraint :: Name -> Name -> [(Type, Kind)] -> (Int, EvalModeConfig) -> Q [Pred]
- Grisette.Internal.TH.GADT.Common: extraExtraMergeableConstraint :: [ConstructorInfo] -> [(Type, Kind)] -> Q [Pred]
- Grisette.Internal.TH.GADT.Common: extraFpBitSizeConstraint :: Name -> Name -> [(Type, Kind)] -> (Int, Int) -> Q [Pred]
- Grisette.Internal.TH.GADT.Common: freshenCheckArgsResult :: Bool -> CheckArgsResult -> Q CheckArgsResult
- Grisette.Internal.TH.GADT.Common: instance GHC.Base.Monoid Grisette.Internal.TH.GADT.Common.DeriveConfig
- Grisette.Internal.TH.GADT.Common: instance GHC.Base.Semigroup Grisette.Internal.TH.GADT.Common.DeriveConfig
- Grisette.Internal.TH.GADT.Common: isVarUsedInFields :: CheckArgsResult -> Name -> Bool
- Grisette.Internal.TH.GADT.Common: specializeResult :: [(Int, EvalModeTag)] -> CheckArgsResult -> Q CheckArgsResult
- Grisette.Internal.TH.GADT.ConvertOpCommon: ConvertOpClassConfig :: EvalModeTag -> [Name] -> [Name] -> (Exp -> Exp -> Q Exp) -> (Name -> [Exp] -> Q Exp) -> FieldFunExp -> ConvertOpClassConfig
- Grisette.Internal.TH.GADT.ConvertOpCommon: [convertFieldCombineFun] :: ConvertOpClassConfig -> Name -> [Exp] -> Q Exp
- Grisette.Internal.TH.GADT.ConvertOpCommon: [convertFieldFunExp] :: ConvertOpClassConfig -> FieldFunExp
- Grisette.Internal.TH.GADT.ConvertOpCommon: [convertFieldResFun] :: ConvertOpClassConfig -> Exp -> Exp -> Q Exp
- Grisette.Internal.TH.GADT.ConvertOpCommon: [convertOpFunNames] :: ConvertOpClassConfig -> [Name]
- Grisette.Internal.TH.GADT.ConvertOpCommon: [convertOpInstanceNames] :: ConvertOpClassConfig -> [Name]
- Grisette.Internal.TH.GADT.ConvertOpCommon: [convertOpTarget] :: ConvertOpClassConfig -> EvalModeTag
- Grisette.Internal.TH.GADT.ConvertOpCommon: data ConvertOpClassConfig
- Grisette.Internal.TH.GADT.ConvertOpCommon: defaultFieldFunExp :: [Name] -> FieldFunExp
- Grisette.Internal.TH.GADT.ConvertOpCommon: genConvertOpClass :: DeriveConfig -> ConvertOpClassConfig -> Int -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveAllSyms: deriveGADTAllSyms :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveAllSyms: deriveGADTAllSyms1 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveAllSyms: deriveGADTAllSyms2 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveEq: deriveGADTEq :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveEq: deriveGADTEq1 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveEq: deriveGADTEq2 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveEvalSym: deriveGADTEvalSym :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveEvalSym: deriveGADTEvalSym1 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveEvalSym: deriveGADTEvalSym2 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveExtractSym: deriveGADTExtractSym :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveExtractSym: deriveGADTExtractSym1 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveExtractSym: deriveGADTExtractSym2 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveGADT: allClasses0 :: [Name]
- Grisette.Internal.TH.GADT.DeriveGADT: allClasses01 :: [Name]
- Grisette.Internal.TH.GADT.DeriveGADT: allClasses012 :: [Name]
- Grisette.Internal.TH.GADT.DeriveGADT: basicClasses0 :: [Name]
- Grisette.Internal.TH.GADT.DeriveGADT: basicClasses1 :: [Name]
- Grisette.Internal.TH.GADT.DeriveGADT: basicClasses2 :: [Name]
- Grisette.Internal.TH.GADT.DeriveGADT: deriveGADT :: [Name] -> [Name] -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveGADT: deriveGADTWith :: DeriveConfig -> [Name] -> [Name] -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveGADT: noExistentialClasses0 :: [Name]
- Grisette.Internal.TH.GADT.DeriveGADT: noExistentialClasses1 :: [Name]
- Grisette.Internal.TH.GADT.DeriveGADT: noExistentialClasses2 :: [Name]
- Grisette.Internal.TH.GADT.DeriveGADT: ordClasses0 :: [Name]
- Grisette.Internal.TH.GADT.DeriveGADT: ordClasses1 :: [Name]
- Grisette.Internal.TH.GADT.DeriveGADT: ordClasses2 :: [Name]
- Grisette.Internal.TH.GADT.DeriveHashable: deriveGADTHashable :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveHashable: deriveGADTHashable1 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveHashable: deriveGADTHashable2 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveMergeable: deriveGADTMergeable :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveMergeable: deriveGADTMergeable1 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveMergeable: deriveGADTMergeable2 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveMergeable: deriveGADTMergeable3 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveMergeable: genMergeable :: DeriveConfig -> Name -> Int -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveMergeable: genMergeable' :: DeriveConfig -> MergingInfoResult -> Name -> Int -> Q (Name, [Dec])
- Grisette.Internal.TH.GADT.DeriveMergeable: genMergeableAndGetMergingInfoResult :: DeriveConfig -> Name -> Int -> Q (MergingInfoResult, [Dec])
- Grisette.Internal.TH.GADT.DeriveMergeable: genMergeableNoExistential :: DeriveConfig -> Name -> Int -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveMergeable: instance Grisette.Internal.TH.GADT.UnaryOpCommon.UnaryOpFunConfig Grisette.Internal.TH.GADT.DeriveMergeable.MergeableNoExistentialConfig
- Grisette.Internal.TH.GADT.DeriveNFData: deriveGADTNFData :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveNFData: deriveGADTNFData1 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveNFData: deriveGADTNFData2 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveOrd: deriveGADTOrd :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveOrd: deriveGADTOrd1 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveOrd: deriveGADTOrd2 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DerivePPrint: deriveGADTPPrint :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DerivePPrint: deriveGADTPPrint1 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DerivePPrint: deriveGADTPPrint2 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveSerial: deriveGADTSerial :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveSerial: deriveGADTSerial1 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveSerial: deriveGADTSerial2 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveSerial: instance Grisette.Internal.TH.GADT.UnaryOpCommon.UnaryOpFunConfig Grisette.Internal.TH.GADT.DeriveSerial.UnaryOpDeserializeConfig
- Grisette.Internal.TH.GADT.DeriveShow: deriveGADTShow :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveShow: deriveGADTShow1 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveShow: deriveGADTShow2 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveSimpleMergeable: deriveGADTSimpleMergeable :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveSimpleMergeable: deriveGADTSimpleMergeable1 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveSimpleMergeable: deriveGADTSimpleMergeable2 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveSubstSym: deriveGADTSubstSym :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveSubstSym: deriveGADTSubstSym1 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveSubstSym: deriveGADTSubstSym2 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveSymEq: deriveGADTSymEq :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveSymEq: deriveGADTSymEq1 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveSymEq: deriveGADTSymEq2 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveSymOrd: deriveGADTSymOrd :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveSymOrd: deriveGADTSymOrd1 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveSymOrd: deriveGADTSymOrd2 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveToCon: deriveGADTToCon :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveToCon: deriveGADTToCon1 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveToCon: deriveGADTToCon2 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveToSym: deriveGADTToSym :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveToSym: deriveGADTToSym1 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveToSym: deriveGADTToSym2 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveUnifiedSimpleMergeable: deriveGADTUnifiedSimpleMergeable :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveUnifiedSimpleMergeable: deriveGADTUnifiedSimpleMergeable1 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveUnifiedSimpleMergeable: deriveGADTUnifiedSimpleMergeable2 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveUnifiedSymEq: deriveGADTUnifiedSymEq :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveUnifiedSymEq: deriveGADTUnifiedSymEq1 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveUnifiedSymEq: deriveGADTUnifiedSymEq2 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveUnifiedSymOrd: deriveGADTUnifiedSymOrd :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveUnifiedSymOrd: deriveGADTUnifiedSymOrd1 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.DeriveUnifiedSymOrd: deriveGADTUnifiedSymOrd2 :: DeriveConfig -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.ShowPPrintCommon: showPrintFieldFunExp :: [Name] -> [Name] -> FieldFunExp
- Grisette.Internal.TH.GADT.UnaryOpCommon: UnaryOpClassConfig :: [UnaryOpConfig] -> [Name] -> (DeriveConfig -> Q [(Type, Kind)]) -> (DeriveConfig -> [(Type, Kind)] -> [(Type, Kind)] -> Name -> Q Type) -> Bool -> UnaryOpClassConfig
- Grisette.Internal.TH.GADT.UnaryOpCommon: UnaryOpFieldConfig :: [String] -> (Int -> [String]) -> (ConstructorVariant -> Name -> [Exp] -> Int -> Exp -> Exp -> Q (Exp, [Bool])) -> (Int -> ConstructorVariant -> Name -> [Exp] -> [Exp] -> Q (Exp, [Bool])) -> FieldFunExp -> UnaryOpFieldConfig
- Grisette.Internal.TH.GADT.UnaryOpCommon: [UnaryOpConfig] :: UnaryOpFunConfig config => config -> [Name] -> UnaryOpConfig
- Grisette.Internal.TH.GADT.UnaryOpCommon: [extraLiftedPatNames] :: UnaryOpFieldConfig -> Int -> [String]
- Grisette.Internal.TH.GADT.UnaryOpCommon: [extraPatNames] :: UnaryOpFieldConfig -> [String]
- Grisette.Internal.TH.GADT.UnaryOpCommon: [fieldCombineFun] :: UnaryOpFieldConfig -> Int -> ConstructorVariant -> Name -> [Exp] -> [Exp] -> Q (Exp, [Bool])
- Grisette.Internal.TH.GADT.UnaryOpCommon: [fieldFunExp] :: UnaryOpFieldConfig -> FieldFunExp
- Grisette.Internal.TH.GADT.UnaryOpCommon: [fieldResFun] :: UnaryOpFieldConfig -> ConstructorVariant -> Name -> [Exp] -> Int -> Exp -> Exp -> Q (Exp, [Bool])
- Grisette.Internal.TH.GADT.UnaryOpCommon: [unaryOpAllowExistential] :: UnaryOpClassConfig -> Bool
- Grisette.Internal.TH.GADT.UnaryOpCommon: [unaryOpConfigs] :: UnaryOpClassConfig -> [UnaryOpConfig]
- Grisette.Internal.TH.GADT.UnaryOpCommon: [unaryOpExtraVars] :: UnaryOpClassConfig -> DeriveConfig -> Q [(Type, Kind)]
- Grisette.Internal.TH.GADT.UnaryOpCommon: [unaryOpInstanceNames] :: UnaryOpClassConfig -> [Name]
- Grisette.Internal.TH.GADT.UnaryOpCommon: [unaryOpInstanceTypeFromConfig] :: UnaryOpClassConfig -> DeriveConfig -> [(Type, Kind)] -> [(Type, Kind)] -> Name -> Q Type
- Grisette.Internal.TH.GADT.UnaryOpCommon: class UnaryOpFunConfig config
- Grisette.Internal.TH.GADT.UnaryOpCommon: data UnaryOpClassConfig
- Grisette.Internal.TH.GADT.UnaryOpCommon: data UnaryOpConfig
- Grisette.Internal.TH.GADT.UnaryOpCommon: data UnaryOpFieldConfig
- Grisette.Internal.TH.GADT.UnaryOpCommon: defaultFieldFunExp :: [Name] -> FieldFunExp
- Grisette.Internal.TH.GADT.UnaryOpCommon: defaultFieldResFun :: ConstructorVariant -> Name -> [Exp] -> Int -> Exp -> Exp -> Q (Exp, [Bool])
- Grisette.Internal.TH.GADT.UnaryOpCommon: defaultUnaryOpInstanceTypeFromConfig :: DeriveConfig -> [(Type, Kind)] -> [(Type, Kind)] -> Name -> Q Type
- Grisette.Internal.TH.GADT.UnaryOpCommon: genUnaryOpClass :: DeriveConfig -> UnaryOpClassConfig -> Int -> Name -> Q [Dec]
- Grisette.Internal.TH.GADT.UnaryOpCommon: genUnaryOpFun :: UnaryOpFunConfig config => DeriveConfig -> config -> [Name] -> Int -> [(Type, Kind)] -> [(Type, Kind)] -> [(Type, Kind)] -> (Name -> Bool) -> [ConstructorInfo] -> Q Dec
- Grisette.Internal.TH.GADT.UnaryOpCommon: instance Grisette.Internal.TH.GADT.UnaryOpCommon.UnaryOpFunConfig Grisette.Internal.TH.GADT.UnaryOpCommon.UnaryOpFieldConfig
- Grisette.Internal.TH.GADT.UnaryOpCommon: type FieldFunExp = Map Name Name -> Map Name [Name] -> Type -> Q Exp
- Grisette.Internal.TH.GADT.UnifiedOpCommon: UnaryOpUnifiedConfig :: (Type -> (Type, Kind) -> Q (Maybe Exp)) -> UnaryOpUnifiedConfig
- Grisette.Internal.TH.GADT.UnifiedOpCommon: [unifiedFun] :: UnaryOpUnifiedConfig -> Type -> (Type, Kind) -> Q (Maybe Exp)
- Grisette.Internal.TH.GADT.UnifiedOpCommon: defaultUnaryOpUnifiedFun :: [Name] -> Type -> (Type, Kind) -> Q (Maybe Exp)
- Grisette.Internal.TH.GADT.UnifiedOpCommon: instance Grisette.Internal.TH.GADT.UnaryOpCommon.UnaryOpFunConfig Grisette.Internal.TH.GADT.UnifiedOpCommon.UnaryOpUnifiedConfig
- Grisette.Internal.TH.GADT.UnifiedOpCommon: newtype UnaryOpUnifiedConfig
- Grisette.TH: deriveGADT :: [Name] -> [Name] -> Q [Dec]
- Grisette.TH: deriveGADTWith :: DeriveConfig -> [Name] -> [Name] -> Q [Dec]
- Grisette.TH: ordClasses0 :: [Name]
- Grisette.TH: ordClasses1 :: [Name]
- Grisette.TH: ordClasses2 :: [Name]
+ Grisette.Core: asMetadata :: AsMetadata a => a -> SExpr
+ Grisette.Core: class AsMetadata a
+ Grisette.Core: fromMetadata :: AsMetadata a => SExpr -> Maybe a
+ Grisette.Core: sortIndices :: Mergeable a => a -> [DynamicSortedIdx]
+ Grisette.Internal.Core.Data.Class.Mergeable: sortIndices :: Mergeable a => a -> [DynamicSortedIdx]
+ Grisette.Internal.Core.Data.Symbol: asMetadata :: AsMetadata a => a -> SExpr
+ Grisette.Internal.Core.Data.Symbol: class AsMetadata a
+ Grisette.Internal.Core.Data.Symbol: fromMetadata :: AsMetadata a => SExpr -> Maybe a
+ Grisette.Internal.Core.Data.Symbol: instance Grisette.Internal.Core.Data.Symbol.AsMetadata Grisette.Internal.Core.Data.SExpr.SExpr
+ Grisette.Internal.Core.Data.Symbol: pattern Metadata :: AsMetadata a => a -> SExpr
+ Grisette.Internal.SymPrim.GeneralFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.GeneralFun.--> a1)
+ Grisette.Internal.SymPrim.GeneralFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.GeneralFun.--> (a1 Grisette.Internal.SymPrim.GeneralFun.--> a2))
+ Grisette.Internal.SymPrim.GeneralFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a3) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.GeneralFun.--> (a1 Grisette.Internal.SymPrim.GeneralFun.--> (a2 Grisette.Internal.SymPrim.GeneralFun.--> a3)))
+ Grisette.Internal.SymPrim.GeneralFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a3, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a4) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.GeneralFun.--> (a1 Grisette.Internal.SymPrim.GeneralFun.--> (a2 Grisette.Internal.SymPrim.GeneralFun.--> (a3 Grisette.Internal.SymPrim.GeneralFun.--> a4))))
+ Grisette.Internal.SymPrim.GeneralFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a3, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a4, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a5) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.GeneralFun.--> (a1 Grisette.Internal.SymPrim.GeneralFun.--> (a2 Grisette.Internal.SymPrim.GeneralFun.--> (a3 Grisette.Internal.SymPrim.GeneralFun.--> (a4 Grisette.Internal.SymPrim.GeneralFun.--> a5)))))
+ Grisette.Internal.SymPrim.GeneralFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a3, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a4, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a5, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a6) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.GeneralFun.--> (a1 Grisette.Internal.SymPrim.GeneralFun.--> (a2 Grisette.Internal.SymPrim.GeneralFun.--> (a3 Grisette.Internal.SymPrim.GeneralFun.--> (a4 Grisette.Internal.SymPrim.GeneralFun.--> (a5 Grisette.Internal.SymPrim.GeneralFun.--> a6))))))
+ Grisette.Internal.SymPrim.GeneralFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a3, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a4, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a5, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a6, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a7) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.GeneralFun.--> (a1 Grisette.Internal.SymPrim.GeneralFun.--> (a2 Grisette.Internal.SymPrim.GeneralFun.--> (a3 Grisette.Internal.SymPrim.GeneralFun.--> (a4 Grisette.Internal.SymPrim.GeneralFun.--> (a5 Grisette.Internal.SymPrim.GeneralFun.--> (a6 Grisette.Internal.SymPrim.GeneralFun.--> a7)))))))
+ Grisette.Internal.SymPrim.Prim.Internal.Caches: CachedInfo :: {-# UNPACK #-} !WeakThreadId -> {-# UNPACK #-} !Digest -> {-# UNPACK #-} !Id -> {-# UNPACK #-} !StableIdent -> CachedInfo
+ Grisette.Internal.SymPrim.Prim.Internal.Caches: [cachedDigest] :: CachedInfo -> {-# UNPACK #-} !Digest
+ Grisette.Internal.SymPrim.Prim.Internal.Caches: [cachedId] :: CachedInfo -> {-# UNPACK #-} !Id
+ Grisette.Internal.SymPrim.Prim.Internal.Caches: [cachedStableIdent] :: CachedInfo -> {-# UNPACK #-} !StableIdent
+ Grisette.Internal.SymPrim.Prim.Internal.Caches: [cachedThreadId] :: CachedInfo -> {-# UNPACK #-} !WeakThreadId
+ Grisette.Internal.SymPrim.Prim.Internal.Caches: data CachedInfo
+ Grisette.Internal.SymPrim.Prim.Internal.Caches: type StableIdent = StableName Any
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP: instance Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalFPTerm Grisette.Internal.SymPrim.FP.FP
+ Grisette.Internal.SymPrim.Prim.Internal.Term: CachedInfo :: {-# UNPACK #-} !WeakThreadId -> {-# UNPACK #-} !Digest -> {-# UNPACK #-} !Id -> {-# UNPACK #-} !StableIdent -> CachedInfo
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [AbsNumTerm'] :: (SupportedPrim t, PEvalNumTerm t) => {-# UNPACK #-} !CachedInfo -> !Term t -> Term t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [AddNumTerm'] :: (SupportedPrim t, PEvalNumTerm t) => {-# UNPACK #-} !CachedInfo -> !Term t -> !Term t -> Term t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [AndBitsTerm'] :: (SupportedPrim t, PEvalBitwiseTerm t) => {-# UNPACK #-} !CachedInfo -> !Term t -> !Term t -> Term t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [AndTerm'] :: {-# UNPACK #-} !CachedInfo -> !Term Bool -> !Term Bool -> !HashSet (Term Bool) -> Term Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [ApplyTerm'] :: (PEvalApplyTerm f a b, SupportedPrim b) => {-# UNPACK #-} !CachedInfo -> !Term f -> !Term a -> Term b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [BVConcatTerm'] :: (PEvalBVTerm bv, KnownNat l, KnownNat r, KnownNat (l + r), 1 <= l, 1 <= r, 1 <= (l + r), SupportedPrim (bv (l + r))) => {-# UNPACK #-} !CachedInfo -> !Term (bv l) -> !Term (bv r) -> Term (bv (l + r))
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [BVExtendTerm'] :: (PEvalBVTerm bv, KnownNat l, KnownNat r, 1 <= l, 1 <= r, l <= r, SupportedPrim (bv r)) => {-# UNPACK #-} !CachedInfo -> !Bool -> !Proxy r -> !Term (bv l) -> Term (bv r)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [BVSelectTerm'] :: (PEvalBVTerm bv, KnownNat n, KnownNat ix, KnownNat w, 1 <= n, 1 <= w, (ix + w) <= n, SupportedPrim (bv w)) => {-# UNPACK #-} !CachedInfo -> !Proxy ix -> !Proxy w -> !Term (bv n) -> Term (bv w)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [BitCastOrTerm'] :: (SupportedPrim b, PEvalBitCastOrTerm a b) => {-# UNPACK #-} !CachedInfo -> !Term b -> !Term a -> Term b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [BitCastTerm'] :: (SupportedPrim b, PEvalBitCastTerm a b) => {-# UNPACK #-} !CachedInfo -> !Term a -> Term b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [ComplementBitsTerm'] :: (SupportedPrim t, PEvalBitwiseTerm t) => {-# UNPACK #-} !CachedInfo -> !Term t -> Term t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [ConTerm'] :: SupportedPrim t => {-# UNPACK #-} !CachedInfo -> !t -> Term t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [DistinctTerm'] :: {-# UNPACK #-} !CachedInfo -> !NonEmpty (Term t) -> Term Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [DivIntegralTerm'] :: (SupportedPrim t, PEvalDivModIntegralTerm t) => {-# UNPACK #-} !CachedInfo -> !Term t -> !Term t -> Term t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [EqTerm'] :: {-# UNPACK #-} !CachedInfo -> !Term t -> !Term t -> Term Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [ExistsTerm'] :: {-# UNPACK #-} !CachedInfo -> !TypedSymbol 'ConstantKind t -> !Term Bool -> Term Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [FPBinaryTerm'] :: (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) => {-# UNPACK #-} !CachedInfo -> !FPBinaryOp -> !Term (fp eb sb) -> !Term (fp eb sb) -> Term (fp eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [FPFMATerm'] :: (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) => {-# UNPACK #-} !CachedInfo -> !Term FPRoundingMode -> !Term (fp eb sb) -> !Term (fp eb sb) -> !Term (fp eb sb) -> Term (fp eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [FPRoundingBinaryTerm'] :: (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) => {-# UNPACK #-} !CachedInfo -> !FPRoundingBinaryOp -> !Term FPRoundingMode -> !Term (fp eb sb) -> !Term (fp eb sb) -> Term (fp eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [FPRoundingUnaryTerm'] :: (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) => {-# UNPACK #-} !CachedInfo -> !FPRoundingUnaryOp -> !Term FPRoundingMode -> !Term (fp eb sb) -> Term (fp eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [FPTraitTerm'] :: (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) => {-# UNPACK #-} !CachedInfo -> !FPTrait -> !Term (fp eb sb) -> Term Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [FPUnaryTerm'] :: (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) => {-# UNPACK #-} !CachedInfo -> !FPUnaryOp -> !Term (fp eb sb) -> Term (fp eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [FdivTerm'] :: (SupportedPrim t, PEvalFractionalTerm t) => {-# UNPACK #-} !CachedInfo -> !Term t -> !Term t -> Term t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [FloatingUnaryTerm'] :: (SupportedPrim t, PEvalFloatingTerm t) => {-# UNPACK #-} !CachedInfo -> !FloatingUnaryOp -> !Term t -> Term t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [ForallTerm'] :: {-# UNPACK #-} !CachedInfo -> !TypedSymbol 'ConstantKind t -> !Term Bool -> Term Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [FromFPOrTerm'] :: (PEvalIEEEFPConvertibleTerm a, ValidFP eb sb, SupportedPrim a) => {-# UNPACK #-} !CachedInfo -> !Term a -> !Term FPRoundingMode -> !Term (FP eb sb) -> Term a
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [FromIntegralTerm'] :: (PEvalFromIntegralTerm a b, SupportedPrim b) => {-# UNPACK #-} !CachedInfo -> !Term a -> Term b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [ITETerm'] :: SupportedPrim t => {-# UNPACK #-} !CachedInfo -> !Term Bool -> !Term t -> !Term t -> Term t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [LeOrdTerm'] :: (SupportedPrim t, PEvalOrdTerm t) => {-# UNPACK #-} !CachedInfo -> !Term t -> !Term t -> Term Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [LtOrdTerm'] :: (SupportedPrim t, PEvalOrdTerm t) => {-# UNPACK #-} !CachedInfo -> !Term t -> !Term t -> Term Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [ModIntegralTerm'] :: (SupportedPrim t, PEvalDivModIntegralTerm t) => {-# UNPACK #-} !CachedInfo -> !Term t -> !Term t -> Term t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [MulNumTerm'] :: (SupportedPrim t, PEvalNumTerm t) => {-# UNPACK #-} !CachedInfo -> !Term t -> !Term t -> Term t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [NegNumTerm'] :: (SupportedPrim t, PEvalNumTerm t) => {-# UNPACK #-} !CachedInfo -> !Term t -> Term t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [NotTerm'] :: {-# UNPACK #-} !CachedInfo -> !Term Bool -> Term Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [OrBitsTerm'] :: (SupportedPrim t, PEvalBitwiseTerm t) => {-# UNPACK #-} !CachedInfo -> !Term t -> !Term t -> Term t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [OrTerm'] :: {-# UNPACK #-} !CachedInfo -> !Term Bool -> !Term Bool -> !HashSet (Term Bool) -> Term Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [PowerTerm'] :: (SupportedPrim t, PEvalFloatingTerm t) => {-# UNPACK #-} !CachedInfo -> !Term t -> !Term t -> Term t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [QuotIntegralTerm'] :: (SupportedPrim t, PEvalDivModIntegralTerm t) => {-# UNPACK #-} !CachedInfo -> !Term t -> !Term t -> Term t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [RecipTerm'] :: (SupportedPrim t, PEvalFractionalTerm t) => {-# UNPACK #-} !CachedInfo -> !Term t -> Term t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [RemIntegralTerm'] :: (SupportedPrim t, PEvalDivModIntegralTerm t) => {-# UNPACK #-} !CachedInfo -> !Term t -> !Term t -> Term t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [RotateLeftTerm'] :: (SupportedPrim t, PEvalRotateTerm t) => {-# UNPACK #-} !CachedInfo -> !Term t -> !Term t -> Term t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [RotateRightTerm'] :: (SupportedPrim t, PEvalRotateTerm t) => {-# UNPACK #-} !CachedInfo -> !Term t -> !Term t -> Term t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [ShiftLeftTerm'] :: (SupportedPrim t, PEvalShiftTerm t) => {-# UNPACK #-} !CachedInfo -> !Term t -> !Term t -> Term t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [ShiftRightTerm'] :: (SupportedPrim t, PEvalShiftTerm t) => {-# UNPACK #-} !CachedInfo -> !Term t -> !Term t -> Term t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [SignumNumTerm'] :: (SupportedPrim t, PEvalNumTerm t) => {-# UNPACK #-} !CachedInfo -> !Term t -> Term t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [SymTerm'] :: {-# UNPACK #-} !CachedInfo -> !TypedSymbol 'AnyKind t -> Term t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [ToFPTerm'] :: (PEvalIEEEFPConvertibleTerm a, ValidFP eb sb, SupportedPrim (FP eb sb)) => {-# UNPACK #-} !CachedInfo -> !Term FPRoundingMode -> !Term a -> Proxy eb -> Proxy sb -> Term (FP eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [XorBitsTerm'] :: (SupportedPrim t, PEvalBitwiseTerm t) => {-# UNPACK #-} !CachedInfo -> !Term t -> !Term t -> Term t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [cachedDigest] :: CachedInfo -> {-# UNPACK #-} !Digest
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [cachedId] :: CachedInfo -> {-# UNPACK #-} !Id
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [cachedStableIdent] :: CachedInfo -> {-# UNPACK #-} !StableIdent
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [cachedThreadId] :: CachedInfo -> {-# UNPACK #-} !WeakThreadId
+ Grisette.Internal.SymPrim.Prim.Internal.Term: allConstantHandler :: BinaryPartialStrategy tag a b c => tag -> a -> b -> Maybe (Term c)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: binaryPartial :: forall tag a b c. BinaryPartialStrategy tag a b c => tag -> PartialRuleBinary a b c
+ Grisette.Internal.SymPrim.Prim.Internal.Term: binaryUnfoldOnce :: forall a b c. SupportedPrim c => PartialRuleBinary a b c -> TotalRuleBinary a b c -> TotalRuleBinary a b c
+ Grisette.Internal.SymPrim.Prim.Internal.Term: boolToBVTerm :: forall bv n. (PEvalBVTerm bv, KnownNat n, 1 <= n, forall m. (KnownNat m, 1 <= m) => SupportedPrim (bv m)) => Term Bool -> Term (bv n)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: bvIsNonZeroFromGEq1 :: forall w r proxy. 1 <= w => proxy w -> (BVIsNonZero w => r) -> r
+ Grisette.Internal.SymPrim.Prim.Internal.Term: class BinaryCommPartialStrategy tag a c | tag a -> c
+ Grisette.Internal.SymPrim.Prim.Internal.Term: class BinaryPartialStrategy tag a b c | tag a b -> c
+ Grisette.Internal.SymPrim.Prim.Internal.Term: class PEvalFPTerm fp
+ Grisette.Internal.SymPrim.Prim.Internal.Term: class UnaryPartialStrategy tag a b | tag a -> b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: constantHandler :: UnaryPartialStrategy tag a b => tag -> a -> Maybe (Term b)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: data CachedInfo
+ Grisette.Internal.SymPrim.Prim.Internal.Term: doPevalNoOverflowAbsNumTerm :: PEvalNumTerm a => Term a -> Maybe (Term a)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: doPevalNoOverflowSignumNumTerm :: PEvalNumTerm a => Term a -> Maybe (Term a)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: extractor :: UnaryPartialStrategy tag a b => tag -> Term a -> Maybe a
+ Grisette.Internal.SymPrim.Prim.Internal.Term: extractora :: BinaryPartialStrategy tag a b c => tag -> Term a -> Maybe a
+ Grisette.Internal.SymPrim.Prim.Internal.Term: extractorb :: BinaryPartialStrategy tag a b c => tag -> Term b -> Maybe b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: generalBinaryUnfolded :: forall a b c. (Typeable a, Typeable b, SupportedPrim c) => (a -> b -> c) -> (Term a -> Term b -> Term c) -> Term a -> Term b -> Term c
+ Grisette.Internal.SymPrim.Prim.Internal.Term: generalUnaryUnfolded :: forall a b. (Typeable a, SupportedPrim b) => (a -> b) -> (Term a -> Term b) -> Term a -> Term b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalBitCastTerm (Grisette.Internal.SymPrim.BV.IntN n) (Grisette.Internal.SymPrim.BV.WordN n)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalBitCastTerm (Grisette.Internal.SymPrim.BV.WordN n) (Grisette.Internal.SymPrim.BV.IntN n)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalBitwiseTerm (Grisette.Internal.SymPrim.BV.IntN n)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalBitwiseTerm (Grisette.Internal.SymPrim.BV.WordN n)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalNumTerm (Grisette.Internal.SymPrim.BV.IntN n)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalNumTerm (Grisette.Internal.SymPrim.BV.WordN n)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance (GHC.TypeNats.KnownNat w, 1 Data.Type.Ord.<= w) => Grisette.Internal.SymPrim.Prim.Internal.Term.NonFuncSBVRep (Grisette.Internal.SymPrim.BV.IntN w)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance (GHC.TypeNats.KnownNat w, 1 Data.Type.Ord.<= w) => Grisette.Internal.SymPrim.Prim.Internal.Term.NonFuncSBVRep (Grisette.Internal.SymPrim.BV.WordN w)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance (GHC.TypeNats.KnownNat w, 1 Data.Type.Ord.<= w) => Grisette.Internal.SymPrim.Prim.Internal.Term.SBVRep (Grisette.Internal.SymPrim.BV.IntN w)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance (GHC.TypeNats.KnownNat w, 1 Data.Type.Ord.<= w) => Grisette.Internal.SymPrim.Prim.Internal.Term.SBVRep (Grisette.Internal.SymPrim.BV.WordN w)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance (GHC.TypeNats.KnownNat w, 1 Data.Type.Ord.<= w) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim (Grisette.Internal.SymPrim.BV.IntN w)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance (GHC.TypeNats.KnownNat w, 1 Data.Type.Ord.<= w) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim (Grisette.Internal.SymPrim.BV.WordN w)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance (GHC.TypeNats.KnownNat w, 1 Data.Type.Ord.<= w) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (Grisette.Internal.SymPrim.BV.IntN w)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance (GHC.TypeNats.KnownNat w, 1 Data.Type.Ord.<= w) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (Grisette.Internal.SymPrim.BV.WordN w)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance (GHC.TypeNats.KnownNat w, 1 Data.Type.Ord.<= w) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrimConstraint (Grisette.Internal.SymPrim.BV.IntN w)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance (GHC.TypeNats.KnownNat w, 1 Data.Type.Ord.<= w) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrimConstraint (Grisette.Internal.SymPrim.BV.WordN w)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Control.DeepSeq.NFData Grisette.Internal.SymPrim.Prim.Internal.Caches.CachedInfo
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.SymPrim.Prim.Internal.Term.NonFuncSBVRep (Grisette.Internal.SymPrim.FP.FP eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.SymPrim.Prim.Internal.Term.SBVRep (Grisette.Internal.SymPrim.FP.FP eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim (Grisette.Internal.SymPrim.FP.FP eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (Grisette.Internal.SymPrim.FP.FP eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrimConstraint (Grisette.Internal.SymPrim.FP.FP eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Grisette.Internal.SymPrim.Prim.Internal.Term.NonFuncSBVRep GHC.Num.Integer.Integer
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Grisette.Internal.SymPrim.Prim.Internal.Term.NonFuncSBVRep Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Grisette.Internal.SymPrim.Prim.Internal.Term.NonFuncSBVRep Grisette.Internal.SymPrim.FP.FPRoundingMode
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalBVTerm Grisette.Internal.SymPrim.BV.IntN
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalBVTerm Grisette.Internal.SymPrim.BV.WordN
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Grisette.Internal.SymPrim.Prim.Internal.Term.SBVRep GHC.Num.Integer.Integer
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Grisette.Internal.SymPrim.Prim.Internal.Term.SBVRep Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Grisette.Internal.SymPrim.Prim.Internal.Term.SBVRep Grisette.Internal.SymPrim.FP.FPRoundingMode
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim GHC.Num.Integer.Integer
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim Grisette.Internal.SymPrim.FP.FPRoundingMode
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim GHC.Num.Integer.Integer
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim Grisette.Internal.SymPrim.FP.FPRoundingMode
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrimConstraint GHC.Num.Integer.Integer
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrimConstraint Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrimConstraint Grisette.Internal.SymPrim.FP.FPRoundingMode
+ Grisette.Internal.SymPrim.Prim.Internal.Term: leftConstantHandler :: (BinaryPartialStrategy tag a b c, a ~ b, BinaryCommPartialStrategy tag a c) => tag -> a -> Term b -> Maybe (Term c)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: nonBinaryConstantHandler :: BinaryPartialStrategy tag a b c => tag -> Term a -> Term b -> Maybe (Term c)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: nonConstantHandler :: UnaryPartialStrategy tag a b => tag -> Term a -> Maybe (Term b)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pattern BVExtendTerm :: forall ret. () => forall bv l r. (PEvalBVTerm bv, KnownNat l, KnownNat r, 1 <= l, 1 <= r, l <= r, SupportedPrim (bv l), SupportedPrim (bv r), ret ~ bv r) => Bool -> Proxy r -> Term (bv l) -> Term ret
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pattern FPBinaryTerm :: forall ret. () => forall fp eb sb. (ret ~ fp eb sb, ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) => FPBinaryOp -> Term (fp eb sb) -> Term (fp eb sb) -> Term ret
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pattern FPRoundingBinaryTerm :: forall ret. () => forall fp eb sb. (ret ~ fp eb sb, ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) => FPRoundingBinaryOp -> Term FPRoundingMode -> Term (fp eb sb) -> Term (fp eb sb) -> Term ret
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pattern FPRoundingUnaryTerm :: forall ret. () => forall fp eb sb. (ret ~ fp eb sb, ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) => FPRoundingUnaryOp -> Term FPRoundingMode -> Term (fp eb sb) -> Term ret
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pattern FPTraitTerm :: forall r. () => forall eb sb fp. (r ~ Bool, ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) => FPTrait -> Term (fp eb sb) -> Term r
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pattern FPUnaryTerm :: forall ret. () => forall fp eb sb. (ret ~ fp eb sb, ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) => FPUnaryOp -> Term (fp eb sb) -> Term ret
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pattern FloatingUnaryTerm :: forall t. () => (SupportedPrim t, PEvalFloatingTerm t) => FloatingUnaryOp -> Term t -> Term t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pattern DistinctTerm :: forall r. () => forall t. (r ~ Bool, SupportedPrim t) => NonEmpty (Term t) -> Term r
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pattern BVSelectTerm :: forall ret. () => forall bv w n ix. (PEvalBVTerm bv, KnownNat n, KnownNat ix, KnownNat w, 1 <= n, 1 <= w, (ix + w) <= n, SupportedPrim (bv n), SupportedPrim (bv w), ret ~ bv w) => Proxy ix -> Proxy w -> Term (bv n) -> Term ret
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pattern ExistsTerm :: forall r. () => forall t. (r ~ Bool, SupportedNonFuncPrim t) => TypedSymbol 'ConstantKind t -> Term Bool -> Term r
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pattern ConTerm :: forall t. () => SupportedPrim t => t -> Term t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pevalBitsAbsNumTerm :: (PEvalNumTerm a, Bits a) => Term a -> Term a
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pevalDefaultAddNumTerm :: (PEvalNumTerm a, Eq a) => Term a -> Term a -> Term a
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pevalDefaultMulNumTerm :: (PEvalNumTerm a, Eq a) => Term a -> Term a -> Term a
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pevalDefaultNegNumTerm :: (PEvalNumTerm a, Eq a) => Term a -> Term a
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pevalFPBinaryTerm :: (PEvalFPTerm fp, ValidFP eb sb) => FPBinaryOp -> Term (fp eb sb) -> Term (fp eb sb) -> Term (fp eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pevalFPFMATerm :: (PEvalFPTerm fp, ValidFP eb sb) => Term FPRoundingMode -> Term (fp eb sb) -> Term (fp eb sb) -> Term (fp eb sb) -> Term (fp eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pevalFPRoundingBinaryTerm :: (PEvalFPTerm fp, ValidFP eb sb) => FPRoundingBinaryOp -> Term FPRoundingMode -> Term (fp eb sb) -> Term (fp eb sb) -> Term (fp eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pevalFPRoundingUnaryTerm :: (PEvalFPTerm fp, ValidFP eb sb) => FPRoundingUnaryOp -> Term FPRoundingMode -> Term (fp eb sb) -> Term (fp eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pevalFPTraitTerm :: (PEvalFPTerm fp, ValidFP eb sb) => FPTrait -> Term (fp eb sb) -> Term Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pevalFPUnaryTerm :: (PEvalFPTerm fp, ValidFP eb sb) => FPUnaryOp -> Term (fp eb sb) -> Term (fp eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pevalGeneralSignumNumTerm :: PEvalNumTerm a => Term a -> Term a
+ Grisette.Internal.SymPrim.Prim.Internal.Term: rightConstantHandler :: (BinaryPartialStrategy tag a b c, a ~ b, BinaryCommPartialStrategy tag a c) => tag -> Term a -> b -> Maybe (Term c)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvFPBinaryTerm :: (PEvalFPTerm fp, ValidFP eb sb) => FPBinaryOp -> SBVType (fp eb sb) -> SBVType (fp eb sb) -> SBVType (fp eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvFPFMATerm :: (PEvalFPTerm fp, ValidFP eb sb) => SBVType FPRoundingMode -> SBVType (fp eb sb) -> SBVType (fp eb sb) -> SBVType (fp eb sb) -> SBVType (fp eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvFPRoundingBinaryTerm :: (PEvalFPTerm fp, ValidFP eb sb) => FPRoundingBinaryOp -> SBVType FPRoundingMode -> SBVType (fp eb sb) -> SBVType (fp eb sb) -> SBVType (fp eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvFPRoundingUnaryTerm :: (PEvalFPTerm fp, ValidFP eb sb) => FPRoundingUnaryOp -> SBVType FPRoundingMode -> SBVType (fp eb sb) -> SBVType (fp eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvFPTraitTerm :: (PEvalFPTerm fp, ValidFP eb sb) => FPTrait -> SBVType (fp eb sb) -> SBVType Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvFPUnaryTerm :: (PEvalFPTerm fp, ValidFP eb sb) => FPUnaryOp -> SBVType (fp eb sb) -> SBVType (fp eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: singleConstantHandler :: BinaryCommPartialStrategy tag a c => tag -> a -> Term a -> Maybe (Term c)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: termDigest :: Term t -> Digest
+ Grisette.Internal.SymPrim.Prim.Internal.Term: termInfo :: Term t -> CachedInfo
+ Grisette.Internal.SymPrim.Prim.Internal.Term: termStableIdent :: Term t -> StableIdent
+ Grisette.Internal.SymPrim.Prim.Internal.Term: termThreadId :: Term t -> WeakThreadId
+ Grisette.Internal.SymPrim.Prim.Internal.Term: totalize :: PartialFun a b -> (a -> b) -> a -> b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: totalize2 :: (a -> PartialFun b c) -> (a -> b -> c) -> a -> b -> c
+ Grisette.Internal.SymPrim.Prim.Internal.Term: type PartialFun a b = a -> Maybe b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: type PartialRuleBinary a b c = Term a -> PartialFun (Term b) (Term c)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: type PartialRuleUnary a b = PartialFun (Term a) (Term b)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: type TotalRuleBinary a b c = Term a -> Term b -> Term c
+ Grisette.Internal.SymPrim.Prim.Internal.Term: type TotalRuleUnary a b = Term a -> Term b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: unaryPartial :: forall tag a b. UnaryPartialStrategy tag a b => tag -> PartialRuleUnary a b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: unaryUnfoldOnce :: forall a b. SupportedPrim b => PartialRuleUnary a b -> TotalRuleUnary a b -> TotalRuleUnary a b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: unsafePevalBVConcatTerm :: forall bv n1 n2 r. PEvalBVTerm bv => NatRepr n1 -> NatRepr n2 -> NatRepr r -> Term (bv n1) -> Term (bv n2) -> Term (bv r)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: unsafePevalBVExtendTerm :: forall bv l r. PEvalBVTerm bv => NatRepr l -> NatRepr r -> Bool -> Term (bv l) -> Term (bv r)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: unsafePevalBVSelectTerm :: forall bv n ix w. PEvalBVTerm bv => NatRepr n -> NatRepr ix -> NatRepr w -> Term (bv n) -> Term (bv w)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: withSymbolKindConstraint :: IsSymbolKind knd => TypedSymbol knd t -> (SymbolKindConstraint knd t => a) -> a
+ Grisette.Internal.SymPrim.Prim.Pattern: pattern SubTerms :: [SomeTerm] -> Term a
+ Grisette.Internal.SymPrim.TabularFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.TabularFun.=-> a1)
+ Grisette.Internal.SymPrim.TabularFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.TabularFun.=-> (a1 Grisette.Internal.SymPrim.TabularFun.=-> a2))
+ Grisette.Internal.SymPrim.TabularFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a3) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.TabularFun.=-> (a1 Grisette.Internal.SymPrim.TabularFun.=-> (a2 Grisette.Internal.SymPrim.TabularFun.=-> a3)))
+ Grisette.Internal.SymPrim.TabularFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a3, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a4) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.TabularFun.=-> (a1 Grisette.Internal.SymPrim.TabularFun.=-> (a2 Grisette.Internal.SymPrim.TabularFun.=-> (a3 Grisette.Internal.SymPrim.TabularFun.=-> a4))))
+ Grisette.Internal.SymPrim.TabularFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a3, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a4, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a5) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.TabularFun.=-> (a1 Grisette.Internal.SymPrim.TabularFun.=-> (a2 Grisette.Internal.SymPrim.TabularFun.=-> (a3 Grisette.Internal.SymPrim.TabularFun.=-> (a4 Grisette.Internal.SymPrim.TabularFun.=-> a5)))))
+ Grisette.Internal.SymPrim.TabularFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a3, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a4, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a5, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a6) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.TabularFun.=-> (a1 Grisette.Internal.SymPrim.TabularFun.=-> (a2 Grisette.Internal.SymPrim.TabularFun.=-> (a3 Grisette.Internal.SymPrim.TabularFun.=-> (a4 Grisette.Internal.SymPrim.TabularFun.=-> (a5 Grisette.Internal.SymPrim.TabularFun.=-> a6))))))
+ Grisette.Internal.SymPrim.TabularFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a3, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a4, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a5, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a6, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a7) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.TabularFun.=-> (a1 Grisette.Internal.SymPrim.TabularFun.=-> (a2 Grisette.Internal.SymPrim.TabularFun.=-> (a3 Grisette.Internal.SymPrim.TabularFun.=-> (a4 Grisette.Internal.SymPrim.TabularFun.=-> (a5 Grisette.Internal.SymPrim.TabularFun.=-> (a6 Grisette.Internal.SymPrim.TabularFun.=-> a7)))))))
+ Grisette.Internal.TH.Derivation.BinaryOpCommon: BinaryOpClassConfig :: [BinaryOpFieldConfig] -> [Name] -> Bool -> Bool -> BinaryOpClassConfig
+ Grisette.Internal.TH.Derivation.BinaryOpCommon: BinaryOpFieldConfig :: [String] -> ([Exp] -> (Exp, Exp) -> Exp -> Q (Exp, [Bool])) -> (Name -> [Exp] -> Q (Exp, [Bool])) -> (Exp -> Q Exp) -> Q Exp -> Q Exp -> FieldFunExp -> [Name] -> BinaryOpFieldConfig
+ Grisette.Internal.TH.Derivation.BinaryOpCommon: [binaryOpAllowExistential] :: BinaryOpClassConfig -> Bool
+ Grisette.Internal.TH.Derivation.BinaryOpCommon: [binaryOpAllowSumType] :: BinaryOpClassConfig -> Bool
+ Grisette.Internal.TH.Derivation.BinaryOpCommon: [binaryOpFieldConfigs] :: BinaryOpClassConfig -> [BinaryOpFieldConfig]
+ Grisette.Internal.TH.Derivation.BinaryOpCommon: [binaryOpInstanceNames] :: BinaryOpClassConfig -> [Name]
+ Grisette.Internal.TH.Derivation.BinaryOpCommon: [extraPatNames] :: BinaryOpFieldConfig -> [String]
+ Grisette.Internal.TH.Derivation.BinaryOpCommon: [fieldCombineFun] :: BinaryOpFieldConfig -> Name -> [Exp] -> Q (Exp, [Bool])
+ Grisette.Internal.TH.Derivation.BinaryOpCommon: [fieldDifferentExistentialFun] :: BinaryOpFieldConfig -> Exp -> Q Exp
+ Grisette.Internal.TH.Derivation.BinaryOpCommon: [fieldFunExp] :: BinaryOpFieldConfig -> FieldFunExp
+ Grisette.Internal.TH.Derivation.BinaryOpCommon: [fieldFunNames] :: BinaryOpFieldConfig -> [Name]
+ Grisette.Internal.TH.Derivation.BinaryOpCommon: [fieldLMatchResult] :: BinaryOpFieldConfig -> Q Exp
+ Grisette.Internal.TH.Derivation.BinaryOpCommon: [fieldRMatchResult] :: BinaryOpFieldConfig -> Q Exp
+ Grisette.Internal.TH.Derivation.BinaryOpCommon: [fieldResFun] :: BinaryOpFieldConfig -> [Exp] -> (Exp, Exp) -> Exp -> Q (Exp, [Bool])
+ Grisette.Internal.TH.Derivation.BinaryOpCommon: data BinaryOpClassConfig
+ Grisette.Internal.TH.Derivation.BinaryOpCommon: data BinaryOpFieldConfig
+ Grisette.Internal.TH.Derivation.BinaryOpCommon: defaultFieldFunExp :: [Name] -> FieldFunExp
+ Grisette.Internal.TH.Derivation.BinaryOpCommon: genBinaryOpClass :: DeriveConfig -> BinaryOpClassConfig -> Int -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.BinaryOpCommon: genBinaryOpClause :: BinaryOpFieldConfig -> [(Type, Kind)] -> [(Type, Kind)] -> Bool -> ConstructorInfo -> ConstructorInfo -> Q [Clause]
+ Grisette.Internal.TH.Derivation.BinaryOpCommon: type FieldFunExp = Map Name Name -> Type -> Q Exp
+ Grisette.Internal.TH.Derivation.Common: CheckArgsResult :: [ConstructorInfo] -> [(Type, Kind)] -> [(Type, Kind)] -> CheckArgsResult
+ Grisette.Internal.TH.Derivation.Common: DeriveConfig :: [(Int, EvalModeConfig)] -> [Int] -> [(Int, Int)] -> [Int] -> Bool -> Bool -> Bool -> Bool -> DeriveConfig
+ Grisette.Internal.TH.Derivation.Common: EvalModeConstraints :: [Name] -> EvalModeConfig
+ Grisette.Internal.TH.Derivation.Common: EvalModeSpecified :: EvalModeTag -> EvalModeConfig
+ Grisette.Internal.TH.Derivation.Common: [argVars] :: CheckArgsResult -> [(Type, Kind)]
+ Grisette.Internal.TH.Derivation.Common: [bitSizePositions] :: DeriveConfig -> [Int]
+ Grisette.Internal.TH.Derivation.Common: [constructors] :: CheckArgsResult -> [ConstructorInfo]
+ Grisette.Internal.TH.Derivation.Common: [evalModeConfig] :: DeriveConfig -> [(Int, EvalModeConfig)]
+ Grisette.Internal.TH.Derivation.Common: [fpBitSizePositions] :: DeriveConfig -> [(Int, Int)]
+ Grisette.Internal.TH.Derivation.Common: [keptVars] :: CheckArgsResult -> [(Type, Kind)]
+ Grisette.Internal.TH.Derivation.Common: [needExtraMergeableUnderEvalMode] :: DeriveConfig -> Bool
+ Grisette.Internal.TH.Derivation.Common: [needExtraMergeableWithConcretizedEvalMode] :: DeriveConfig -> Bool
+ Grisette.Internal.TH.Derivation.Common: [unconstrainedPositions] :: DeriveConfig -> [Int]
+ Grisette.Internal.TH.Derivation.Common: [useNoStrategy] :: DeriveConfig -> Bool
+ Grisette.Internal.TH.Derivation.Common: [useSerialForCerealAndBinary] :: DeriveConfig -> Bool
+ Grisette.Internal.TH.Derivation.Common: checkArgs :: String -> Int -> Name -> Bool -> Int -> Q CheckArgsResult
+ Grisette.Internal.TH.Derivation.Common: ctxForVar :: [Type] -> Type -> Kind -> Q (Maybe Pred)
+ Grisette.Internal.TH.Derivation.Common: data CheckArgsResult
+ Grisette.Internal.TH.Derivation.Common: data DeriveConfig
+ Grisette.Internal.TH.Derivation.Common: data EvalModeConfig
+ Grisette.Internal.TH.Derivation.Common: evalModeSpecializeList :: DeriveConfig -> [(Int, EvalModeTag)]
+ Grisette.Internal.TH.Derivation.Common: extraBitSizeConstraint :: Name -> Name -> [(Type, Kind)] -> Int -> Q [Pred]
+ Grisette.Internal.TH.Derivation.Common: extraConstraint :: DeriveConfig -> Name -> Name -> [(Type, Kind)] -> [(Type, Kind)] -> [ConstructorInfo] -> Q [Pred]
+ Grisette.Internal.TH.Derivation.Common: extraEvalModeConstraint :: Name -> Name -> [(Type, Kind)] -> (Int, EvalModeConfig) -> Q [Pred]
+ Grisette.Internal.TH.Derivation.Common: extraExtraMergeableConstraint :: DeriveConfig -> [ConstructorInfo] -> [(Type, Kind)] -> Q [Pred]
+ Grisette.Internal.TH.Derivation.Common: extraFpBitSizeConstraint :: Name -> Name -> [(Type, Kind)] -> (Int, Int) -> Q [Pred]
+ Grisette.Internal.TH.Derivation.Common: freshenCheckArgsResult :: Bool -> CheckArgsResult -> Q CheckArgsResult
+ Grisette.Internal.TH.Derivation.Common: instance GHC.Base.Monoid Grisette.Internal.TH.Derivation.Common.DeriveConfig
+ Grisette.Internal.TH.Derivation.Common: instance GHC.Base.Semigroup Grisette.Internal.TH.Derivation.Common.DeriveConfig
+ Grisette.Internal.TH.Derivation.Common: isVarUsedInFields :: CheckArgsResult -> Name -> Bool
+ Grisette.Internal.TH.Derivation.Common: specializeResult :: [(Int, EvalModeTag)] -> CheckArgsResult -> Q CheckArgsResult
+ Grisette.Internal.TH.Derivation.ConvertOpCommon: ConvertOpClassConfig :: EvalModeTag -> [Name] -> [Name] -> (Exp -> Exp -> Q Exp) -> (Name -> [Exp] -> Q Exp) -> FieldFunExp -> ConvertOpClassConfig
+ Grisette.Internal.TH.Derivation.ConvertOpCommon: [convertFieldCombineFun] :: ConvertOpClassConfig -> Name -> [Exp] -> Q Exp
+ Grisette.Internal.TH.Derivation.ConvertOpCommon: [convertFieldFunExp] :: ConvertOpClassConfig -> FieldFunExp
+ Grisette.Internal.TH.Derivation.ConvertOpCommon: [convertFieldResFun] :: ConvertOpClassConfig -> Exp -> Exp -> Q Exp
+ Grisette.Internal.TH.Derivation.ConvertOpCommon: [convertOpFunNames] :: ConvertOpClassConfig -> [Name]
+ Grisette.Internal.TH.Derivation.ConvertOpCommon: [convertOpInstanceNames] :: ConvertOpClassConfig -> [Name]
+ Grisette.Internal.TH.Derivation.ConvertOpCommon: [convertOpTarget] :: ConvertOpClassConfig -> EvalModeTag
+ Grisette.Internal.TH.Derivation.ConvertOpCommon: data ConvertOpClassConfig
+ Grisette.Internal.TH.Derivation.ConvertOpCommon: defaultFieldFunExp :: [Name] -> FieldFunExp
+ Grisette.Internal.TH.Derivation.ConvertOpCommon: genConvertOpClass :: DeriveConfig -> ConvertOpClassConfig -> Int -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.Derive: allClasses0 :: [Name]
+ Grisette.Internal.TH.Derivation.Derive: allClasses01 :: [Name]
+ Grisette.Internal.TH.Derivation.Derive: allClasses012 :: [Name]
+ Grisette.Internal.TH.Derivation.Derive: allSymsClasses :: [Name]
+ Grisette.Internal.TH.Derivation.Derive: basicClasses0 :: [Name]
+ Grisette.Internal.TH.Derivation.Derive: basicClasses1 :: [Name]
+ Grisette.Internal.TH.Derivation.Derive: basicClasses2 :: [Name]
+ Grisette.Internal.TH.Derivation.Derive: concreteOrdClasses0 :: [Name]
+ Grisette.Internal.TH.Derivation.Derive: concreteOrdClasses1 :: [Name]
+ Grisette.Internal.TH.Derivation.Derive: concreteOrdClasses2 :: [Name]
+ Grisette.Internal.TH.Derivation.Derive: derive :: [Name] -> [Name] -> Q [Dec]
+ Grisette.Internal.TH.Derivation.Derive: deriveWith :: DeriveConfig -> [Name] -> [Name] -> Q [Dec]
+ Grisette.Internal.TH.Derivation.Derive: eqClasses :: [Name]
+ Grisette.Internal.TH.Derivation.Derive: evalSymClasses :: [Name]
+ Grisette.Internal.TH.Derivation.Derive: extractSymClasses :: [Name]
+ Grisette.Internal.TH.Derivation.Derive: filterExactNumArgs :: Int -> [Name] -> [Name]
+ Grisette.Internal.TH.Derivation.Derive: filterLeqNumArgs :: Int -> [Name] -> [Name]
+ Grisette.Internal.TH.Derivation.Derive: hashableClasses :: [Name]
+ Grisette.Internal.TH.Derivation.Derive: mergeableClasses :: [Name]
+ Grisette.Internal.TH.Derivation.Derive: nfDataClasses :: [Name]
+ Grisette.Internal.TH.Derivation.Derive: noExistentialClasses0 :: [Name]
+ Grisette.Internal.TH.Derivation.Derive: noExistentialClasses1 :: [Name]
+ Grisette.Internal.TH.Derivation.Derive: noExistentialClasses2 :: [Name]
+ Grisette.Internal.TH.Derivation.Derive: ordClasses :: [Name]
+ Grisette.Internal.TH.Derivation.Derive: pprintClasses :: [Name]
+ Grisette.Internal.TH.Derivation.Derive: serialClasses :: [Name]
+ Grisette.Internal.TH.Derivation.Derive: showClasses :: [Name]
+ Grisette.Internal.TH.Derivation.Derive: simpleMergeableClasses :: [Name]
+ Grisette.Internal.TH.Derivation.Derive: substSymClasses :: [Name]
+ Grisette.Internal.TH.Derivation.Derive: symEqClasses :: [Name]
+ Grisette.Internal.TH.Derivation.Derive: symOrdClasses :: [Name]
+ Grisette.Internal.TH.Derivation.Derive: toConClasses :: [Name]
+ Grisette.Internal.TH.Derivation.Derive: toSymClasses :: [Name]
+ Grisette.Internal.TH.Derivation.Derive: unifiedSimpleMergeableClasses :: [Name]
+ Grisette.Internal.TH.Derivation.Derive: unifiedSymEqClasses :: [Name]
+ Grisette.Internal.TH.Derivation.Derive: unifiedSymOrdClasses :: [Name]
+ Grisette.Internal.TH.Derivation.DeriveAllSyms: deriveAllSyms :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveAllSyms: deriveAllSyms1 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveAllSyms: deriveAllSyms2 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveBinary: deriveBinary :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveCereal: deriveCereal :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveEq: deriveEq :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveEq: deriveEq1 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveEq: deriveEq2 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveEvalSym: deriveEvalSym :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveEvalSym: deriveEvalSym1 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveEvalSym: deriveEvalSym2 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveExtractSym: deriveExtractSym :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveExtractSym: deriveExtractSym1 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveExtractSym: deriveExtractSym2 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveHashable: deriveHashable :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveHashable: deriveHashable1 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveHashable: deriveHashable2 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveMergeable: deriveMergeable :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveMergeable: deriveMergeable1 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveMergeable: deriveMergeable2 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveMergeable: deriveMergeable3 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveMergeable: genMergeable :: DeriveConfig -> Name -> Int -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveMergeable: genMergeable' :: DeriveConfig -> MergingInfoResult -> Name -> Int -> Q (Name, [Dec])
+ Grisette.Internal.TH.Derivation.DeriveMergeable: genMergeableAndGetMergingInfoResult :: DeriveConfig -> Name -> Int -> Q (MergingInfoResult, [Dec])
+ Grisette.Internal.TH.Derivation.DeriveMergeable: genMergeableList :: DeriveConfig -> Name -> [Int] -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveMergeable: genMergeableNoExistential :: DeriveConfig -> Name -> Int -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveMergeable: genMergeableNoStrategy :: DeriveConfig -> Name -> Int -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveMergeable: instance Grisette.Internal.TH.Derivation.UnaryOpCommon.UnaryOpFunConfig Grisette.Internal.TH.Derivation.DeriveMergeable.MergeableNoExistentialConfig
+ Grisette.Internal.TH.Derivation.DeriveNFData: deriveNFData :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveNFData: deriveNFData1 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveNFData: deriveNFData2 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveOrd: deriveOrd :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveOrd: deriveOrd1 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveOrd: deriveOrd2 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DerivePPrint: derivePPrint :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DerivePPrint: derivePPrint1 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DerivePPrint: derivePPrint2 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveSerial: deriveSerial :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveSerial: deriveSerial1 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveSerial: deriveSerial2 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveShow: deriveShow :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveShow: deriveShow1 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveShow: deriveShow2 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveSimpleMergeable: deriveSimpleMergeable :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveSimpleMergeable: deriveSimpleMergeable1 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveSimpleMergeable: deriveSimpleMergeable2 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveSubstSym: deriveSubstSym :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveSubstSym: deriveSubstSym1 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveSubstSym: deriveSubstSym2 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveSymEq: deriveSymEq :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveSymEq: deriveSymEq1 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveSymEq: deriveSymEq2 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveSymOrd: deriveSymOrd :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveSymOrd: deriveSymOrd1 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveSymOrd: deriveSymOrd2 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveToCon: deriveToCon :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveToCon: deriveToCon1 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveToCon: deriveToCon2 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveToSym: deriveToSym :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveToSym: deriveToSym1 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveToSym: deriveToSym2 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveUnifiedSimpleMergeable: deriveUnifiedSimpleMergeable :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveUnifiedSimpleMergeable: deriveUnifiedSimpleMergeable1 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveUnifiedSimpleMergeable: deriveUnifiedSimpleMergeable2 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveUnifiedSymEq: deriveUnifiedSymEq :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveUnifiedSymEq: deriveUnifiedSymEq1 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveUnifiedSymEq: deriveUnifiedSymEq2 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveUnifiedSymOrd: deriveUnifiedSymOrd :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveUnifiedSymOrd: deriveUnifiedSymOrd1 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.DeriveUnifiedSymOrd: deriveUnifiedSymOrd2 :: DeriveConfig -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.SerializeCommon: instance Grisette.Internal.TH.Derivation.UnaryOpCommon.UnaryOpFunConfig Grisette.Internal.TH.Derivation.SerializeCommon.UnaryOpDeserializeConfig
+ Grisette.Internal.TH.Derivation.SerializeCommon: instance Grisette.Internal.TH.Derivation.UnaryOpCommon.UnaryOpFunConfig Grisette.Internal.TH.Derivation.SerializeCommon.UnaryOpDeserializeWithSerialConfig
+ Grisette.Internal.TH.Derivation.SerializeCommon: instance Grisette.Internal.TH.Derivation.UnaryOpCommon.UnaryOpFunConfig Grisette.Internal.TH.Derivation.SerializeCommon.UnaryOpSerializeWithSerialConfig
+ Grisette.Internal.TH.Derivation.SerializeCommon: serializeConfig :: [Name] -> [Name] -> [Name] -> UnaryOpClassConfig
+ Grisette.Internal.TH.Derivation.SerializeCommon: serializeWithSerialConfig :: [Name] -> [Name] -> [Name] -> UnaryOpClassConfig
+ Grisette.Internal.TH.Derivation.ShowPPrintCommon: showPrintFieldFunExp :: [Name] -> [Name] -> FieldFunExp
+ Grisette.Internal.TH.Derivation.UnaryOpCommon: UnaryOpClassConfig :: [UnaryOpConfig] -> [Name] -> Maybe [Name] -> (DeriveConfig -> Q [(Type, Kind)]) -> (DeriveConfig -> [(Type, Kind)] -> [(Type, Kind)] -> Name -> Q Type) -> Bool -> UnaryOpClassConfig
+ Grisette.Internal.TH.Derivation.UnaryOpCommon: UnaryOpFieldConfig :: [String] -> (Int -> [String]) -> (ConstructorVariant -> Name -> [Exp] -> Int -> Exp -> Exp -> Q (Exp, [Bool])) -> (Int -> Int -> ConstructorVariant -> Name -> [Exp] -> [Exp] -> Q (Exp, [Bool])) -> FieldFunExp -> UnaryOpFieldConfig
+ Grisette.Internal.TH.Derivation.UnaryOpCommon: [UnaryOpConfig] :: UnaryOpFunConfig config => config -> [Name] -> UnaryOpConfig
+ Grisette.Internal.TH.Derivation.UnaryOpCommon: [extraLiftedPatNames] :: UnaryOpFieldConfig -> Int -> [String]
+ Grisette.Internal.TH.Derivation.UnaryOpCommon: [extraPatNames] :: UnaryOpFieldConfig -> [String]
+ Grisette.Internal.TH.Derivation.UnaryOpCommon: [fieldCombineFun] :: UnaryOpFieldConfig -> Int -> Int -> ConstructorVariant -> Name -> [Exp] -> [Exp] -> Q (Exp, [Bool])
+ Grisette.Internal.TH.Derivation.UnaryOpCommon: [fieldFunExp] :: UnaryOpFieldConfig -> FieldFunExp
+ Grisette.Internal.TH.Derivation.UnaryOpCommon: [fieldResFun] :: UnaryOpFieldConfig -> ConstructorVariant -> Name -> [Exp] -> Int -> Exp -> Exp -> Q (Exp, [Bool])
+ Grisette.Internal.TH.Derivation.UnaryOpCommon: [unaryOpAllowExistential] :: UnaryOpClassConfig -> Bool
+ Grisette.Internal.TH.Derivation.UnaryOpCommon: [unaryOpConfigs] :: UnaryOpClassConfig -> [UnaryOpConfig]
+ Grisette.Internal.TH.Derivation.UnaryOpCommon: [unaryOpContextNames] :: UnaryOpClassConfig -> Maybe [Name]
+ Grisette.Internal.TH.Derivation.UnaryOpCommon: [unaryOpExtraVars] :: UnaryOpClassConfig -> DeriveConfig -> Q [(Type, Kind)]
+ Grisette.Internal.TH.Derivation.UnaryOpCommon: [unaryOpInstanceNames] :: UnaryOpClassConfig -> [Name]
+ Grisette.Internal.TH.Derivation.UnaryOpCommon: [unaryOpInstanceTypeFromConfig] :: UnaryOpClassConfig -> DeriveConfig -> [(Type, Kind)] -> [(Type, Kind)] -> Name -> Q Type
+ Grisette.Internal.TH.Derivation.UnaryOpCommon: class UnaryOpFunConfig config
+ Grisette.Internal.TH.Derivation.UnaryOpCommon: data UnaryOpClassConfig
+ Grisette.Internal.TH.Derivation.UnaryOpCommon: data UnaryOpConfig
+ Grisette.Internal.TH.Derivation.UnaryOpCommon: data UnaryOpFieldConfig
+ Grisette.Internal.TH.Derivation.UnaryOpCommon: defaultFieldFunExp :: [Name] -> FieldFunExp
+ Grisette.Internal.TH.Derivation.UnaryOpCommon: defaultFieldResFun :: ConstructorVariant -> Name -> [Exp] -> Int -> Exp -> Exp -> Q (Exp, [Bool])
+ Grisette.Internal.TH.Derivation.UnaryOpCommon: defaultUnaryOpInstanceTypeFromConfig :: DeriveConfig -> [(Type, Kind)] -> [(Type, Kind)] -> Name -> Q Type
+ Grisette.Internal.TH.Derivation.UnaryOpCommon: genUnaryOpClass :: DeriveConfig -> UnaryOpClassConfig -> Int -> Name -> Q [Dec]
+ Grisette.Internal.TH.Derivation.UnaryOpCommon: genUnaryOpFun :: UnaryOpFunConfig config => DeriveConfig -> config -> [Name] -> Int -> [(Type, Kind)] -> [(Type, Kind)] -> [(Type, Kind)] -> (Name -> Bool) -> [ConstructorInfo] -> Q Dec
+ Grisette.Internal.TH.Derivation.UnaryOpCommon: instance Grisette.Internal.TH.Derivation.UnaryOpCommon.UnaryOpFunConfig Grisette.Internal.TH.Derivation.UnaryOpCommon.UnaryOpFieldConfig
+ Grisette.Internal.TH.Derivation.UnaryOpCommon: type FieldFunExp = Map Name Name -> Map Name [Name] -> Type -> Q Exp
+ Grisette.Internal.TH.Derivation.UnifiedOpCommon: UnaryOpUnifiedConfig :: (Type -> (Type, Kind) -> Q (Maybe Exp)) -> UnaryOpUnifiedConfig
+ Grisette.Internal.TH.Derivation.UnifiedOpCommon: [unifiedFun] :: UnaryOpUnifiedConfig -> Type -> (Type, Kind) -> Q (Maybe Exp)
+ Grisette.Internal.TH.Derivation.UnifiedOpCommon: defaultUnaryOpUnifiedFun :: [Name] -> Type -> (Type, Kind) -> Q (Maybe Exp)
+ Grisette.Internal.TH.Derivation.UnifiedOpCommon: instance Grisette.Internal.TH.Derivation.UnaryOpCommon.UnaryOpFunConfig Grisette.Internal.TH.Derivation.UnifiedOpCommon.UnaryOpUnifiedConfig
+ Grisette.Internal.TH.Derivation.UnifiedOpCommon: newtype UnaryOpUnifiedConfig
+ Grisette.Internal.Unified.Util: instance Grisette.Internal.Unified.Util.DecideEvalMode c => Grisette.Internal.Unified.Util.EvalModeConvertible c c
+ Grisette.SymPrim: [SomeTerm] :: forall a. SupportedPrim a => Term a -> SomeTerm
+ Grisette.SymPrim: data SomeTerm
+ Grisette.SymPrim: data Term t
+ Grisette.SymPrim: pattern BVExtendTerm :: forall ret. () => forall bv l r. (PEvalBVTerm bv, KnownNat l, KnownNat r, 1 <= l, 1 <= r, l <= r, SupportedPrim (bv l), SupportedPrim (bv r), ret ~ bv r) => Bool -> Proxy r -> Term (bv l) -> Term ret
+ Grisette.SymPrim: pattern FPBinaryTerm :: forall ret. () => forall fp eb sb. (ret ~ fp eb sb, ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) => FPBinaryOp -> Term (fp eb sb) -> Term (fp eb sb) -> Term ret
+ Grisette.SymPrim: pattern FPRoundingBinaryTerm :: forall ret. () => forall fp eb sb. (ret ~ fp eb sb, ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) => FPRoundingBinaryOp -> Term FPRoundingMode -> Term (fp eb sb) -> Term (fp eb sb) -> Term ret
+ Grisette.SymPrim: pattern FPRoundingUnaryTerm :: forall ret. () => forall fp eb sb. (ret ~ fp eb sb, ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) => FPRoundingUnaryOp -> Term FPRoundingMode -> Term (fp eb sb) -> Term ret
+ Grisette.SymPrim: pattern FPTraitTerm :: forall r. () => forall eb sb fp. (r ~ Bool, ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) => FPTrait -> Term (fp eb sb) -> Term r
+ Grisette.SymPrim: pattern FPUnaryTerm :: forall ret. () => forall fp eb sb. (ret ~ fp eb sb, ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) => FPUnaryOp -> Term (fp eb sb) -> Term ret
+ Grisette.SymPrim: pattern FloatingUnaryTerm :: forall t. () => (SupportedPrim t, PEvalFloatingTerm t) => FloatingUnaryOp -> Term t -> Term t
+ Grisette.SymPrim: pattern DistinctTerm :: forall r. () => forall t. (r ~ Bool, SupportedPrim t) => NonEmpty (Term t) -> Term r
+ Grisette.SymPrim: pattern BVSelectTerm :: forall ret. () => forall bv w n ix. (PEvalBVTerm bv, KnownNat n, KnownNat ix, KnownNat w, 1 <= n, 1 <= w, (ix + w) <= n, SupportedPrim (bv n), SupportedPrim (bv w), ret ~ bv w) => Proxy ix -> Proxy w -> Term (bv n) -> Term ret
+ Grisette.SymPrim: pattern SubTerms :: [SomeTerm] -> Term a
+ Grisette.SymPrim: pattern ToFPTerm :: forall ret. () => forall eb sb a. (PEvalIEEEFPConvertibleTerm a, ValidFP eb sb, SupportedPrim (FP eb sb), SupportedPrim a, ret ~ FP eb sb) => Term FPRoundingMode -> Term a -> Proxy eb -> Proxy sb -> Term ret
+ Grisette.SymPrim: pattern ExistsTerm :: forall r. () => forall t. (r ~ Bool, SupportedNonFuncPrim t) => TypedSymbol 'ConstantKind t -> Term Bool -> Term r
+ Grisette.SymPrim: pattern ConTerm :: forall t. () => SupportedPrim t => t -> Term t
+ Grisette.SymPrim: someTermSize :: SomeTerm -> Int
+ Grisette.SymPrim: someTermsSize :: [SomeTerm] -> Int
+ Grisette.SymPrim: termSize :: Term a -> Int
+ Grisette.SymPrim: termsSize :: [Term a] -> Int
+ Grisette.SymPrim: underlyingTerm :: LinkedRep con sym => sym -> Term con
+ Grisette.SymPrim: withSymbolKindConstraint :: IsSymbolKind knd => TypedSymbol knd t -> (SymbolKindConstraint knd t => a) -> a
+ Grisette.SymPrim: wrapTerm :: LinkedRep con sym => Term con -> sym
+ Grisette.TH: [unconstrainedPositions] :: DeriveConfig -> [Int]
+ Grisette.TH: [useNoStrategy] :: DeriveConfig -> Bool
+ Grisette.TH: [useSerialForCerealAndBinary] :: DeriveConfig -> Bool
+ Grisette.TH: allSymsClasses :: [Name]
+ Grisette.TH: concreteOrdClasses0 :: [Name]
+ Grisette.TH: concreteOrdClasses1 :: [Name]
+ Grisette.TH: concreteOrdClasses2 :: [Name]
+ Grisette.TH: derive :: [Name] -> [Name] -> Q [Dec]
+ Grisette.TH: deriveWith :: DeriveConfig -> [Name] -> [Name] -> Q [Dec]
+ Grisette.TH: eqClasses :: [Name]
+ Grisette.TH: evalSymClasses :: [Name]
+ Grisette.TH: extractSymClasses :: [Name]
+ Grisette.TH: filterExactNumArgs :: Int -> [Name] -> [Name]
+ Grisette.TH: filterLeqNumArgs :: Int -> [Name] -> [Name]
+ Grisette.TH: hashableClasses :: [Name]
+ Grisette.TH: mergeableClasses :: [Name]
+ Grisette.TH: nfDataClasses :: [Name]
+ Grisette.TH: ordClasses :: [Name]
+ Grisette.TH: pprintClasses :: [Name]
+ Grisette.TH: serialClasses :: [Name]
+ Grisette.TH: showClasses :: [Name]
+ Grisette.TH: simpleMergeableClasses :: [Name]
+ Grisette.TH: substSymClasses :: [Name]
+ Grisette.TH: symEqClasses :: [Name]
+ Grisette.TH: symOrdClasses :: [Name]
+ Grisette.TH: toConClasses :: [Name]
+ Grisette.TH: toSymClasses :: [Name]
+ Grisette.TH: unifiedSimpleMergeableClasses :: [Name]
+ Grisette.TH: unifiedSymEqClasses :: [Name]
+ Grisette.TH: unifiedSymOrdClasses :: [Name]
- Grisette.Core: mapMetadata :: (SExpr -> SExpr) -> Identifier -> Identifier
+ Grisette.Core: mapMetadata :: AsMetadata a => (SExpr -> a) -> Identifier -> Identifier
- Grisette.Core: withMetadata :: Text -> SExpr -> Identifier
+ Grisette.Core: withMetadata :: AsMetadata a => Text -> a -> Identifier
- Grisette.Internal.Core.Data.Symbol: mapMetadata :: (SExpr -> SExpr) -> Identifier -> Identifier
+ Grisette.Internal.Core.Data.Symbol: mapMetadata :: AsMetadata a => (SExpr -> a) -> Identifier -> Identifier
- Grisette.Internal.Core.Data.Symbol: withMetadata :: Text -> SExpr -> Identifier
+ Grisette.Internal.Core.Data.Symbol: withMetadata :: AsMetadata a => Text -> a -> Identifier
- Grisette.Internal.SymPrim.Prim.Internal.Caches: identify :: Interned t => WeakThreadId -> Digest -> Id -> Ident -> Uninterned t -> t
+ Grisette.Internal.SymPrim.Prim.Internal.Caches: identify :: Interned t => CachedInfo -> Uninterned t -> t
- Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalShiftTerm: pevalFiniteBitsSymShiftShiftLeftTerm :: forall a. (Integral a, SymShift a, FiniteBits a, PEvalShiftTerm a) => Term a -> Term a -> Term a
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalShiftTerm: pevalFiniteBitsSymShiftShiftLeftTerm :: forall bv n. (forall m. (KnownNat m, 1 <= m) => Integral (bv m), forall m. (KnownNat m, 1 <= m) => SymShift (bv m), forall m. (KnownNat m, 1 <= m) => SupportedPrim (bv m), forall m. (KnownNat m, 1 <= m) => PEvalShiftTerm (bv m), PEvalBVTerm bv, KnownNat n, 1 <= n) => Term (bv n) -> Term (bv n) -> Term (bv n)
- Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalShiftTerm: pevalFiniteBitsSymShiftShiftRightTerm :: forall a. (Integral a, SymShift a, FiniteBits a, PEvalShiftTerm a) => Term a -> Term a -> Term a
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalShiftTerm: pevalFiniteBitsSymShiftShiftRightTerm :: forall bv n. (forall m. (KnownNat m, 1 <= m) => Integral (bv m), forall m. (KnownNat m, 1 <= m) => SymShift (bv m), forall m. (KnownNat m, 1 <= m) => SupportedPrim (bv m), forall m. (KnownNat m, 1 <= m) => PEvalShiftTerm (bv m), PEvalBVTerm bv, KnownNat n, 1 <= n) => Term (bv n) -> Term (bv n) -> Term (bv n)
- Grisette.Internal.SymPrim.Prim.Internal.Term: [UAndTerm] :: !Term Bool -> !Term Bool -> UTerm Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [UAndTerm] :: !Term Bool -> !Term Bool -> !HashSet (Term Bool) -> UTerm Bool
- Grisette.Internal.SymPrim.Prim.Internal.Term: [UFPBinaryTerm] :: (ValidFP eb sb, SupportedPrim (FP eb sb)) => !FPBinaryOp -> !Term (FP eb sb) -> !Term (FP eb sb) -> UTerm (FP eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [UFPBinaryTerm] :: (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) => !FPBinaryOp -> !Term (fp eb sb) -> !Term (fp eb sb) -> UTerm (fp eb sb)
- Grisette.Internal.SymPrim.Prim.Internal.Term: [UFPFMATerm] :: (ValidFP eb sb, SupportedPrim (FP eb sb)) => !Term FPRoundingMode -> !Term (FP eb sb) -> !Term (FP eb sb) -> !Term (FP eb sb) -> UTerm (FP eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [UFPFMATerm] :: (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) => !Term FPRoundingMode -> !Term (fp eb sb) -> !Term (fp eb sb) -> !Term (fp eb sb) -> UTerm (fp eb sb)
- Grisette.Internal.SymPrim.Prim.Internal.Term: [UFPRoundingBinaryTerm] :: (ValidFP eb sb, SupportedPrim (FP eb sb)) => !FPRoundingBinaryOp -> !Term FPRoundingMode -> !Term (FP eb sb) -> !Term (FP eb sb) -> UTerm (FP eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [UFPRoundingBinaryTerm] :: (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) => !FPRoundingBinaryOp -> !Term FPRoundingMode -> !Term (fp eb sb) -> !Term (fp eb sb) -> UTerm (fp eb sb)
- Grisette.Internal.SymPrim.Prim.Internal.Term: [UFPRoundingUnaryTerm] :: (ValidFP eb sb, SupportedPrim (FP eb sb)) => !FPRoundingUnaryOp -> !Term FPRoundingMode -> !Term (FP eb sb) -> UTerm (FP eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [UFPRoundingUnaryTerm] :: (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) => !FPRoundingUnaryOp -> !Term FPRoundingMode -> !Term (fp eb sb) -> UTerm (fp eb sb)
- Grisette.Internal.SymPrim.Prim.Internal.Term: [UFPTraitTerm] :: (ValidFP eb sb, SupportedPrim (FP eb sb)) => !FPTrait -> !Term (FP eb sb) -> UTerm Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [UFPTraitTerm] :: (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) => !FPTrait -> !Term (fp eb sb) -> UTerm Bool
- Grisette.Internal.SymPrim.Prim.Internal.Term: [UFPUnaryTerm] :: (ValidFP eb sb, SupportedPrim (FP eb sb)) => !FPUnaryOp -> !Term (FP eb sb) -> UTerm (FP eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [UFPUnaryTerm] :: (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) => !FPUnaryOp -> !Term (fp eb sb) -> UTerm (fp eb sb)
- Grisette.Internal.SymPrim.Prim.Internal.Term: [UOrTerm] :: !Term Bool -> !Term Bool -> UTerm Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [UOrTerm] :: !Term Bool -> !Term Bool -> !HashSet (Term Bool) -> UTerm Bool
- Grisette.Internal.SymPrim.Prim.Internal.Term: class IsSymbolKind (ty :: SymbolKind) where {
+ Grisette.Internal.SymPrim.Prim.Internal.Term: class IsSymbolKind (knd :: SymbolKind) where {
- Grisette.Internal.SymPrim.Prim.Internal.Term: class (SupportedPrim a, Ord a) => NonFuncSBVRep a where {
+ Grisette.Internal.SymPrim.Prim.Internal.Term: class (SupportedPrim a, Ord a, Eq a, Show a, Hashable a, Typeable a) => NonFuncSBVRep a where {
- Grisette.Internal.SymPrim.Prim.Internal.Term: class (SizedBV bv) => PEvalBVTerm bv
+ Grisette.Internal.SymPrim.Prim.Internal.Term: class (SizedBV bv, forall n. (KnownNat n, 1 <= n) => PEvalNumTerm (bv n), forall n. (KnownNat n, 1 <= n) => PEvalBitwiseTerm (bv n), forall n. (KnownNat n, 1 <= n) => FiniteBits (bv n), forall n. (KnownNat n, 1 <= n) => Num (bv n)) => PEvalBVTerm bv
- Grisette.Internal.SymPrim.Prim.Internal.Term: class (Lift t, NFData t, SupportedPrimConstraint t, SBVRep t) => SupportedPrim t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: class (Lift t, NFData t, Typeable t, SupportedPrimConstraint t, SBVRep t) => SupportedPrim t
- Grisette.Internal.SymPrim.Prim.Internal.Term: decideSymbolKind :: IsSymbolKind ty => Either (ty :~~: 'ConstantKind) (ty :~~: 'AnyKind)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: decideSymbolKind :: IsSymbolKind knd => Either (knd :~~: 'ConstantKind) (knd :~~: 'AnyKind)
- Grisette.Internal.SymPrim.Prim.Internal.Term: fpBinaryTerm :: (ValidFP eb sb, SupportedPrim (FP eb sb)) => FPBinaryOp -> Term (FP eb sb) -> Term (FP eb sb) -> Term (FP eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: fpBinaryTerm :: (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) => FPBinaryOp -> Term (fp eb sb) -> Term (fp eb sb) -> Term (fp eb sb)
- Grisette.Internal.SymPrim.Prim.Internal.Term: fpFMATerm :: (ValidFP eb sb, SupportedPrim (FP eb sb)) => Term FPRoundingMode -> Term (FP eb sb) -> Term (FP eb sb) -> Term (FP eb sb) -> Term (FP eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: fpFMATerm :: (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) => Term FPRoundingMode -> Term (fp eb sb) -> Term (fp eb sb) -> Term (fp eb sb) -> Term (fp eb sb)
- Grisette.Internal.SymPrim.Prim.Internal.Term: fpRoundingBinaryTerm :: (ValidFP eb sb, SupportedPrim (FP eb sb)) => FPRoundingBinaryOp -> Term FPRoundingMode -> Term (FP eb sb) -> Term (FP eb sb) -> Term (FP eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: fpRoundingBinaryTerm :: (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) => FPRoundingBinaryOp -> Term FPRoundingMode -> Term (fp eb sb) -> Term (fp eb sb) -> Term (fp eb sb)
- Grisette.Internal.SymPrim.Prim.Internal.Term: fpRoundingUnaryTerm :: (ValidFP eb sb, SupportedPrim (FP eb sb)) => FPRoundingUnaryOp -> Term FPRoundingMode -> Term (FP eb sb) -> Term (FP eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: fpRoundingUnaryTerm :: (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) => FPRoundingUnaryOp -> Term FPRoundingMode -> Term (fp eb sb) -> Term (fp eb sb)
- Grisette.Internal.SymPrim.Prim.Internal.Term: fpTraitTerm :: (ValidFP eb sb, SupportedPrim (FP eb sb)) => FPTrait -> Term (FP eb sb) -> Term Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: fpTraitTerm :: (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) => FPTrait -> Term (fp eb sb) -> Term Bool
- Grisette.Internal.SymPrim.Prim.Internal.Term: fpUnaryTerm :: (ValidFP eb sb, SupportedPrim (FP eb sb)) => FPUnaryOp -> Term (FP eb sb) -> Term (FP eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: fpUnaryTerm :: (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) => FPUnaryOp -> Term (fp eb sb) -> Term (fp eb sb)
- Grisette.Internal.SymPrim.Prim.Internal.Term: pattern DynTerm :: forall a b. SupportedPrim a => Term a -> Term b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pattern ToFPTerm :: forall ret. () => forall eb sb a. (PEvalIEEEFPConvertibleTerm a, ValidFP eb sb, SupportedPrim (FP eb sb), SupportedPrim a, ret ~ FP eb sb) => Term FPRoundingMode -> Term a -> Proxy eb -> Proxy sb -> Term ret
- Grisette.Internal.SymPrim.Prim.Internal.Term: type SymbolKindConstraint ty :: Type -> Constraint;
+ Grisette.Internal.SymPrim.Prim.Internal.Term: type SymbolKindConstraint knd :: Type -> Constraint;
- Grisette.Internal.SymPrim.SymPrim: type BasicSymPrim a = (SymPrim a, SimpleMergeable a, GenSymSimple () a, Apply a, Solvable (ConType a) a, ConRep a, LinkedRep (ConType a) a, ToCon a (ConType a), ToSym (ConType a) a)
+ Grisette.Internal.SymPrim.SymPrim: type BasicSymPrim a = (SymPrim a, SimpleMergeable a, GenSymSimple () a, Solvable (ConType a) a, ConRep a, LinkedRep (ConType a) a, ToCon a (ConType a), ToSym (ConType a) a, Apply a, a ~ FunType a, SupportedNonFuncPrim (ConType a))
- Grisette.Lib.Data.Bool: mrgFalse :: forall m_abyB5. (Mergeable Bool, Applicative m_abyB5, TryMerge m_abyB5) => m_abyB5 Bool
+ Grisette.Lib.Data.Bool: mrgFalse :: forall m_acurz. (Mergeable Bool, Applicative m_acurz, TryMerge m_acurz) => m_acurz Bool
- Grisette.Lib.Data.Bool: mrgTrue :: forall m_abyB6. (Mergeable Bool, Applicative m_abyB6, TryMerge m_abyB6) => m_abyB6 Bool
+ Grisette.Lib.Data.Bool: mrgTrue :: forall m_acurA. (Mergeable Bool, Applicative m_acurA, TryMerge m_acurA) => m_acurA Bool
- Grisette.Lib.Data.Either: mrgLeft :: forall (a_ahOt :: Type) (b_ahOu :: Type) m_abyCM. (Mergeable (Either a_ahOt b_ahOu), Applicative m_abyCM, TryMerge m_abyCM) => a_ahOt -> m_abyCM (Either a_ahOt b_ahOu)
+ Grisette.Lib.Data.Either: mrgLeft :: forall (a_ahQ2 :: Type) (b_ahQ3 :: Type) m_acutg. (Mergeable (Either a_ahQ2 b_ahQ3), Applicative m_acutg, TryMerge m_acutg) => a_ahQ2 -> m_acutg (Either a_ahQ2 b_ahQ3)
- Grisette.Lib.Data.Either: mrgRight :: forall (a_ahOt :: Type) (b_ahOu :: Type) m_abyCO. (Mergeable (Either a_ahOt b_ahOu), Applicative m_abyCO, TryMerge m_abyCO) => b_ahOu -> m_abyCO (Either a_ahOt b_ahOu)
+ Grisette.Lib.Data.Either: mrgRight :: forall (a_ahQ2 :: Type) (b_ahQ3 :: Type) m_acuti. (Mergeable (Either a_ahQ2 b_ahQ3), Applicative m_acuti, TryMerge m_acuti) => b_ahQ3 -> m_acuti (Either a_ahQ2 b_ahQ3)
- Grisette.Lib.Data.Functor.Sum: mrgInL :: forall (k_a6hCh :: Type) (f_a6hCi :: k_a6hCh -> Type) (g_a6hCj :: k_a6hCh -> Type) (a_a6hCk :: k_a6hCh) m_abyFd. (Mergeable (Sum f_a6hCi g_a6hCj a_a6hCk), Applicative m_abyFd, TryMerge m_abyFd) => f_a6hCi a_a6hCk -> m_abyFd (Sum f_a6hCi g_a6hCj a_a6hCk)
+ Grisette.Lib.Data.Functor.Sum: mrgInL :: forall (k_a792o :: Type) (f_a792p :: k_a792o -> Type) (g_a792q :: k_a792o -> Type) (a_a792r :: k_a792o) m_acuvH. (Mergeable (Sum f_a792p g_a792q a_a792r), Applicative m_acuvH, TryMerge m_acuvH) => f_a792p a_a792r -> m_acuvH (Sum f_a792p g_a792q a_a792r)
- Grisette.Lib.Data.Functor.Sum: mrgInR :: forall (k_a6hCh :: Type) (f_a6hCi :: k_a6hCh -> Type) (g_a6hCj :: k_a6hCh -> Type) (a_a6hCk :: k_a6hCh) m_abyFf. (Mergeable (Sum f_a6hCi g_a6hCj a_a6hCk), Applicative m_abyFf, TryMerge m_abyFf) => g_a6hCj a_a6hCk -> m_abyFf (Sum f_a6hCi g_a6hCj a_a6hCk)
+ Grisette.Lib.Data.Functor.Sum: mrgInR :: forall (k_a792o :: Type) (f_a792p :: k_a792o -> Type) (g_a792q :: k_a792o -> Type) (a_a792r :: k_a792o) m_acuvJ. (Mergeable (Sum f_a792p g_a792q a_a792r), Applicative m_acuvJ, TryMerge m_acuvJ) => g_a792q a_a792r -> m_acuvJ (Sum f_a792p g_a792q a_a792r)
- Grisette.Lib.Data.Maybe: mrgJust :: forall (a_11 :: Type) m_abyHZ. (Mergeable (Maybe a_11), Applicative m_abyHZ, TryMerge m_abyHZ) => a_11 -> m_abyHZ (Maybe a_11)
+ Grisette.Lib.Data.Maybe: mrgJust :: forall (a_11 :: Type) m_acuyt. (Mergeable (Maybe a_11), Applicative m_acuyt, TryMerge m_acuyt) => a_11 -> m_acuyt (Maybe a_11)
- Grisette.Lib.Data.Maybe: mrgNothing :: forall (a_11 :: Type) m_abyHY. (Mergeable (Maybe a_11), Applicative m_abyHY, TryMerge m_abyHY) => m_abyHY (Maybe a_11)
+ Grisette.Lib.Data.Maybe: mrgNothing :: forall (a_11 :: Type) m_acuys. (Mergeable (Maybe a_11), Applicative m_acuys, TryMerge m_acuys) => m_acuys (Maybe a_11)
- Grisette.Lib.Data.Tuple: mrgTuple2 :: forall (a_11 :: Type) (b_12 :: Type) m_abyKH. (Mergeable ((,) a_11 b_12), Applicative m_abyKH, TryMerge m_abyKH) => a_11 -> b_12 -> m_abyKH ((,) a_11 b_12)
+ Grisette.Lib.Data.Tuple: mrgTuple2 :: forall (a_11 :: Type) (b_12 :: Type) m_acuBb. (Mergeable ((,) a_11 b_12), Applicative m_acuBb, TryMerge m_acuBb) => a_11 -> b_12 -> m_acuBb ((,) a_11 b_12)
- Grisette.Lib.Data.Tuple: mrgTuple3 :: forall (a_11 :: Type) (b_12 :: Type) (c_13 :: Type) m_abyLU. (Mergeable ((,,) a_11 b_12 c_13), Applicative m_abyLU, TryMerge m_abyLU) => a_11 -> b_12 -> c_13 -> m_abyLU ((,,) a_11 b_12 c_13)
+ Grisette.Lib.Data.Tuple: mrgTuple3 :: forall (a_11 :: Type) (b_12 :: Type) (c_13 :: Type) m_acuCo. (Mergeable ((,,) a_11 b_12 c_13), Applicative m_acuCo, TryMerge m_acuCo) => a_11 -> b_12 -> c_13 -> m_acuCo ((,,) a_11 b_12 c_13)
- Grisette.Lib.Data.Tuple: mrgTuple4 :: forall (a_11 :: Type) (b_12 :: Type) (c_13 :: Type) (d_14 :: Type) m_abyNj. (Mergeable ((,,,) a_11 b_12 c_13 d_14), Applicative m_abyNj, TryMerge m_abyNj) => a_11 -> b_12 -> c_13 -> d_14 -> m_abyNj ((,,,) a_11 b_12 c_13 d_14)
+ Grisette.Lib.Data.Tuple: mrgTuple4 :: forall (a_11 :: Type) (b_12 :: Type) (c_13 :: Type) (d_14 :: Type) m_acuDN. (Mergeable ((,,,) a_11 b_12 c_13 d_14), Applicative m_acuDN, TryMerge m_acuDN) => a_11 -> b_12 -> c_13 -> d_14 -> m_acuDN ((,,,) a_11 b_12 c_13 d_14)
- Grisette.Lib.Data.Tuple: mrgTuple5 :: forall (a_11 :: Type) (b_12 :: Type) (c_13 :: Type) (d_14 :: Type) (e_15 :: Type) m_abyOU. (Mergeable ((,,,,) a_11 b_12 c_13 d_14 e_15), Applicative m_abyOU, TryMerge m_abyOU) => a_11 -> b_12 -> c_13 -> d_14 -> e_15 -> m_abyOU ((,,,,) a_11 b_12 c_13 d_14 e_15)
+ Grisette.Lib.Data.Tuple: mrgTuple5 :: forall (a_11 :: Type) (b_12 :: Type) (c_13 :: Type) (d_14 :: Type) (e_15 :: Type) m_acuFo. (Mergeable ((,,,,) a_11 b_12 c_13 d_14 e_15), Applicative m_acuFo, TryMerge m_acuFo) => a_11 -> b_12 -> c_13 -> d_14 -> e_15 -> m_acuFo ((,,,,) a_11 b_12 c_13 d_14 e_15)
- Grisette.Lib.Data.Tuple: mrgTuple6 :: forall (a_11 :: Type) (b_12 :: Type) (c_13 :: Type) (d_14 :: Type) (e_15 :: Type) (f_16 :: Type) m_abyQH. (Mergeable ((,,,,,) a_11 b_12 c_13 d_14 e_15 f_16), Applicative m_abyQH, TryMerge m_abyQH) => a_11 -> b_12 -> c_13 -> d_14 -> e_15 -> f_16 -> m_abyQH ((,,,,,) a_11 b_12 c_13 d_14 e_15 f_16)
+ Grisette.Lib.Data.Tuple: mrgTuple6 :: forall (a_11 :: Type) (b_12 :: Type) (c_13 :: Type) (d_14 :: Type) (e_15 :: Type) (f_16 :: Type) m_acuHb. (Mergeable ((,,,,,) a_11 b_12 c_13 d_14 e_15 f_16), Applicative m_acuHb, TryMerge m_acuHb) => a_11 -> b_12 -> c_13 -> d_14 -> e_15 -> f_16 -> m_acuHb ((,,,,,) a_11 b_12 c_13 d_14 e_15 f_16)
- Grisette.Lib.Data.Tuple: mrgTuple7 :: forall (a_11 :: Type) (b_12 :: Type) (c_13 :: Type) (d_14 :: Type) (e_15 :: Type) (f_16 :: Type) (g_17 :: Type) m_abySG. (Mergeable ((,,,,,,) a_11 b_12 c_13 d_14 e_15 f_16 g_17), Applicative m_abySG, TryMerge m_abySG) => a_11 -> b_12 -> c_13 -> d_14 -> e_15 -> f_16 -> g_17 -> m_abySG ((,,,,,,) a_11 b_12 c_13 d_14 e_15 f_16 g_17)
+ Grisette.Lib.Data.Tuple: mrgTuple7 :: forall (a_11 :: Type) (b_12 :: Type) (c_13 :: Type) (d_14 :: Type) (e_15 :: Type) (f_16 :: Type) (g_17 :: Type) m_acuJa. (Mergeable ((,,,,,,) a_11 b_12 c_13 d_14 e_15 f_16 g_17), Applicative m_acuJa, TryMerge m_acuJa) => a_11 -> b_12 -> c_13 -> d_14 -> e_15 -> f_16 -> g_17 -> m_acuJa ((,,,,,,) a_11 b_12 c_13 d_14 e_15 f_16 g_17)
- Grisette.Lib.Data.Tuple: mrgTuple8 :: forall (a_11 :: Type) (b_12 :: Type) (c_13 :: Type) (d_14 :: Type) (e_15 :: Type) (f_16 :: Type) (g_17 :: Type) (h_18 :: Type) m_abyUR. (Mergeable ((,,,,,,,) a_11 b_12 c_13 d_14 e_15 f_16 g_17 h_18), Applicative m_abyUR, TryMerge m_abyUR) => a_11 -> b_12 -> c_13 -> d_14 -> e_15 -> f_16 -> g_17 -> h_18 -> m_abyUR ((,,,,,,,) a_11 b_12 c_13 d_14 e_15 f_16 g_17 h_18)
+ Grisette.Lib.Data.Tuple: mrgTuple8 :: forall (a_11 :: Type) (b_12 :: Type) (c_13 :: Type) (d_14 :: Type) (e_15 :: Type) (f_16 :: Type) (g_17 :: Type) (h_18 :: Type) m_acuLl. (Mergeable ((,,,,,,,) a_11 b_12 c_13 d_14 e_15 f_16 g_17 h_18), Applicative m_acuLl, TryMerge m_acuLl) => a_11 -> b_12 -> c_13 -> d_14 -> e_15 -> f_16 -> g_17 -> h_18 -> m_acuLl ((,,,,,,,) a_11 b_12 c_13 d_14 e_15 f_16 g_17 h_18)
- Grisette.Lib.Data.Tuple: mrgUnit :: forall m_abyJR. (Mergeable (), Applicative m_abyJR, TryMerge m_abyJR) => m_abyJR ()
+ Grisette.Lib.Data.Tuple: mrgUnit :: forall m_acuAl. (Mergeable (), Applicative m_acuAl, TryMerge m_acuAl) => m_acuAl ()
- Grisette.SymPrim: class IsSymbolKind (ty :: SymbolKind) where {
+ Grisette.SymPrim: class IsSymbolKind (knd :: SymbolKind) where {
- Grisette.SymPrim: class (Lift t, NFData t, SupportedPrimConstraint t, SBVRep t) => SupportedPrim t
+ Grisette.SymPrim: class (Lift t, NFData t, Typeable t, SupportedPrimConstraint t, SBVRep t) => SupportedPrim t
- Grisette.SymPrim: decideSymbolKind :: IsSymbolKind ty => Either (ty :~~: 'ConstantKind) (ty :~~: 'AnyKind)
+ Grisette.SymPrim: decideSymbolKind :: IsSymbolKind knd => Either (knd :~~: 'ConstantKind) (knd :~~: 'AnyKind)
- Grisette.SymPrim: type BasicSymPrim a = (SymPrim a, SimpleMergeable a, GenSymSimple () a, Apply a, Solvable (ConType a) a, ConRep a, LinkedRep (ConType a) a, ToCon a (ConType a), ToSym (ConType a) a)
+ Grisette.SymPrim: type BasicSymPrim a = (SymPrim a, SimpleMergeable a, GenSymSimple () a, Solvable (ConType a) a, ConRep a, LinkedRep (ConType a) a, ToCon a (ConType a), ToSym (ConType a) a, Apply a, a ~ FunType a, SupportedNonFuncPrim (ConType a))
- Grisette.SymPrim: type SymbolKindConstraint ty :: Type -> Constraint;
+ Grisette.SymPrim: type SymbolKindConstraint knd :: Type -> Constraint;
- Grisette.TH: DeriveConfig :: [(Int, EvalModeConfig)] -> [Int] -> [(Int, Int)] -> Bool -> Bool -> DeriveConfig
+ Grisette.TH: DeriveConfig :: [(Int, EvalModeConfig)] -> [Int] -> [(Int, Int)] -> [Int] -> Bool -> Bool -> Bool -> Bool -> DeriveConfig
Files
- CHANGELOG.md +165/−110
- README.md +31/−23
- grisette.cabal +82/−74
- src/Grisette/Core.hs +8/−4
- src/Grisette/Internal/Backend/Solving.hs +155/−159
- src/Grisette/Internal/Backend/SymBiMap.hs +8/−6
- src/Grisette/Internal/Core/Control/Monad/CBMCExcept.hs +2/−4
- src/Grisette/Internal/Core/Data/Class/GenSym.hs +63/−45
- src/Grisette/Internal/Core/Data/Class/SymFiniteBits.hs +33/−13
- src/Grisette/Internal/Core/Data/Symbol.hs +26/−4
- src/Grisette/Internal/Internal/Decl/Core/Control/Monad/Union.hs +4/−2
- src/Grisette/Internal/Internal/Decl/Core/Data/Class/Mergeable.hs +3/−0
- src/Grisette/Internal/Internal/Decl/Core/Data/Class/SimpleMergeable.hs +7/−2
- src/Grisette/Internal/Internal/Decl/Core/Data/Class/SymEq.hs +1/−1
- src/Grisette/Internal/Internal/Impl/Core/Control/Monad/Union.hs +1/−1
- src/Grisette/Internal/Internal/Impl/Core/Data/Class/EvalSym.hs +4/−4
- src/Grisette/Internal/Internal/Impl/Core/Data/Class/ExtractSym.hs +4/−4
- src/Grisette/Internal/Internal/Impl/Core/Data/Class/Mergeable.hs +5/−5
- src/Grisette/Internal/Internal/Impl/Core/Data/Class/PPrint.hs +12/−5
- src/Grisette/Internal/Internal/Impl/Core/Data/Class/SimpleMergeable.hs +36/−21
- src/Grisette/Internal/Internal/Impl/Core/Data/Class/Solver.hs +2/−2
- src/Grisette/Internal/Internal/Impl/Core/Data/Class/SubstSym.hs +4/−4
- src/Grisette/Internal/Internal/Impl/Core/Data/Class/SymEq.hs +4/−4
- src/Grisette/Internal/Internal/Impl/Core/Data/Class/SymOrd.hs +4/−4
- src/Grisette/Internal/Internal/Impl/Core/Data/Class/ToCon.hs +4/−4
- src/Grisette/Internal/Internal/Impl/Core/Data/Class/ToSym.hs +4/−4
- src/Grisette/Internal/Internal/Impl/SymPrim/AllSyms.hs +4/−4
- src/Grisette/Internal/Internal/Impl/Unified/Class/UnifiedSimpleMergeable.hs +4/−4
- src/Grisette/Internal/Internal/Impl/Unified/Class/UnifiedSymEq.hs +9/−9
- src/Grisette/Internal/Internal/Impl/Unified/Class/UnifiedSymOrd.hs +9/−9
- src/Grisette/Internal/SymPrim/FunInstanceGen.hs +3/−14
- src/Grisette/Internal/SymPrim/GeneralFun.hs +124/−197
- src/Grisette/Internal/SymPrim/ModelRep.hs +3/−2
- src/Grisette/Internal/SymPrim/Prim/Internal/Caches.hs +47/−57
- src/Grisette/Internal/SymPrim/Prim/Internal/Instances/BVPEval.hs +0/−601
- src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalBitCastTerm.hs +10/−10
- src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalBitwiseTerm.hs +0/−118
- src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalDivModIntegralTerm.hs +34/−36
- src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalFP.hs +131/−230
- src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalFloatingTerm.hs +0/−1
- src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalFractionalTerm.hs +11/−12
- src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalFromIntegralTerm.hs +5/−5
- src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalIEEEFPConvertibleTerm.hs +11/−11
- src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalNumTerm.hs +7/−205
- src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalOrdTerm.hs +22/−19
- src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalRotateTerm.hs +23/−23
- src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalShiftTerm.hs +139/−49
- src/Grisette/Internal/SymPrim/Prim/Internal/Instances/SupportedPrim.hs +0/−413
- src/Grisette/Internal/SymPrim/Prim/Internal/Serialize.hs +133/−142
- src/Grisette/Internal/SymPrim/Prim/Internal/Term.hs +8407/−5550
- src/Grisette/Internal/SymPrim/Prim/Internal/Unfold.hs +13/−10
- src/Grisette/Internal/SymPrim/Prim/Model.hs +20/−22
- src/Grisette/Internal/SymPrim/Prim/Pattern.hs +132/−0
- src/Grisette/Internal/SymPrim/Prim/SomeTerm.hs +6/−8
- src/Grisette/Internal/SymPrim/Prim/Term.hs +2/−7
- src/Grisette/Internal/SymPrim/Prim/TermUtils.hs +20/−234
- src/Grisette/Internal/SymPrim/SomeBV.hs +7/−2
- src/Grisette/Internal/SymPrim/SymAlgReal.hs +4/−2
- src/Grisette/Internal/SymPrim/SymBV.hs +3/−2
- src/Grisette/Internal/SymPrim/SymBool.hs +4/−2
- src/Grisette/Internal/SymPrim/SymFP.hs +14/−11
- src/Grisette/Internal/SymPrim/SymGeneralFun.hs +4/−2
- src/Grisette/Internal/SymPrim/SymInteger.hs +4/−2
- src/Grisette/Internal/SymPrim/SymPrim.hs +8/−3
- src/Grisette/Internal/SymPrim/SymTabularFun.hs +4/−2
- src/Grisette/Internal/SymPrim/TabularFun.hs +8/−3
- src/Grisette/Internal/TH/Ctor/UnifiedConstructor.hs +1/−1
- src/Grisette/Internal/TH/Derivation/BinaryOpCommon.hs +389/−0
- src/Grisette/Internal/TH/Derivation/Common.hs +465/−0
- src/Grisette/Internal/TH/Derivation/ConvertOpCommon.hs +453/−0
- src/Grisette/Internal/TH/Derivation/Derive.hs +968/−0
- src/Grisette/Internal/TH/Derivation/DeriveAllSyms.hs +90/−0
- src/Grisette/Internal/TH/Derivation/DeriveBinary.hs +48/−0
- src/Grisette/Internal/TH/Derivation/DeriveCereal.hs +48/−0
- src/Grisette/Internal/TH/Derivation/DeriveEq.hs +79/−0
- src/Grisette/Internal/TH/Derivation/DeriveEvalSym.hs +96/−0
- src/Grisette/Internal/TH/Derivation/DeriveExtractSym.hs +101/−0
- src/Grisette/Internal/TH/Derivation/DeriveHashable.hs +92/−0
- src/Grisette/Internal/TH/Derivation/DeriveMergeable.hs +857/−0
- src/Grisette/Internal/TH/Derivation/DeriveNFData.hs +84/−0
- src/Grisette/Internal/TH/Derivation/DeriveOrd.hs +78/−0
- src/Grisette/Internal/TH/Derivation/DerivePPrint.hs +211/−0
- src/Grisette/Internal/TH/Derivation/DeriveSerial.hs +53/−0
- src/Grisette/Internal/TH/Derivation/DeriveShow.hs +197/−0
- src/Grisette/Internal/TH/Derivation/DeriveSimpleMergeable.hs +87/−0
- src/Grisette/Internal/TH/Derivation/DeriveSubstSym.hs +89/−0
- src/Grisette/Internal/TH/Derivation/DeriveSymEq.hs +85/−0
- src/Grisette/Internal/TH/Derivation/DeriveSymOrd.hs +99/−0
- src/Grisette/Internal/TH/Derivation/DeriveToCon.hs +67/−0
- src/Grisette/Internal/TH/Derivation/DeriveToSym.hs +67/−0
- src/Grisette/Internal/TH/Derivation/DeriveUnifiedSimpleMergeable.hs +114/−0
- src/Grisette/Internal/TH/Derivation/DeriveUnifiedSymEq.hs +104/−0
- src/Grisette/Internal/TH/Derivation/DeriveUnifiedSymOrd.hs +104/−0
- src/Grisette/Internal/TH/Derivation/SerializeCommon.hs +243/−0
- src/Grisette/Internal/TH/Derivation/ShowPPrintCommon.hs +57/−0
- src/Grisette/Internal/TH/Derivation/UnaryOpCommon.hs +400/−0
- src/Grisette/Internal/TH/Derivation/UnifiedOpCommon.hs +107/−0
- src/Grisette/Internal/TH/GADT/BinaryOpCommon.hs +0/−377
- src/Grisette/Internal/TH/GADT/Common.hs +0/−452
- src/Grisette/Internal/TH/GADT/ConvertOpCommon.hs +0/−469
- src/Grisette/Internal/TH/GADT/DeriveAllSyms.hs +0/−88
- src/Grisette/Internal/TH/GADT/DeriveEq.hs +0/−79
- src/Grisette/Internal/TH/GADT/DeriveEvalSym.hs +0/−94
- src/Grisette/Internal/TH/GADT/DeriveExtractSym.hs +0/−99
- src/Grisette/Internal/TH/GADT/DeriveGADT.hs +0/−735
- src/Grisette/Internal/TH/GADT/DeriveHashable.hs +0/−90
- src/Grisette/Internal/TH/GADT/DeriveMergeable.hs +0/−792
- src/Grisette/Internal/TH/GADT/DeriveNFData.hs +0/−82
- src/Grisette/Internal/TH/GADT/DeriveOrd.hs +0/−78
- src/Grisette/Internal/TH/GADT/DerivePPrint.hs +0/−195
- src/Grisette/Internal/TH/GADT/DeriveSerial.hs +0/−203
- src/Grisette/Internal/TH/GADT/DeriveShow.hs +0/−195
- src/Grisette/Internal/TH/GADT/DeriveSimpleMergeable.hs +0/−87
- src/Grisette/Internal/TH/GADT/DeriveSubstSym.hs +0/−87
- src/Grisette/Internal/TH/GADT/DeriveSymEq.hs +0/−85
- src/Grisette/Internal/TH/GADT/DeriveSymOrd.hs +0/−99
- src/Grisette/Internal/TH/GADT/DeriveToCon.hs +0/−67
- src/Grisette/Internal/TH/GADT/DeriveToSym.hs +0/−67
- src/Grisette/Internal/TH/GADT/DeriveUnifiedSimpleMergeable.hs +0/−112
- src/Grisette/Internal/TH/GADT/DeriveUnifiedSymEq.hs +0/−102
- src/Grisette/Internal/TH/GADT/DeriveUnifiedSymOrd.hs +0/−102
- src/Grisette/Internal/TH/GADT/ShowPPrintCommon.hs +0/−57
- src/Grisette/Internal/TH/GADT/UnaryOpCommon.hs +0/−371
- src/Grisette/Internal/TH/GADT/UnifiedOpCommon.hs +0/−107
- src/Grisette/Internal/Unified/Class/UnifiedFiniteBits.hs +3/−3
- src/Grisette/Internal/Unified/Util.hs +6/−0
- src/Grisette/SymPrim.hs +124/−2
- src/Grisette/TH.hs +59/−12
- test/Grisette/Backend/LoweringTests.hs +2/−2
- test/Grisette/Backend/TermRewritingGen.hs +8/−1
- test/Grisette/Backend/TermRewritingTests.hs +483/−26
- test/Grisette/Core/Data/Class/PPrintTests.hs +18/−36
- test/Grisette/Core/Data/Class/TryMergeTests.hs +1/−1
- test/Grisette/Core/TH/DerivationData.hs +57/−17
- test/Grisette/Core/TH/DerivationTest.hs +10/−1
- test/Grisette/Lib/Control/Monad/Trans/State/Common.hs +1/−2
- test/Grisette/Lib/Data/FoldableTests.hs +2/−2
- test/Grisette/Lib/Data/ListTests.hs +1/−2
- test/Grisette/Lib/Data/TraversableTests.hs +3/−3
- test/Grisette/SymPrim/FPTests.hs +7/−7
- test/Grisette/SymPrim/Prim/BVTests.hs +10/−15
- test/Grisette/SymPrim/Prim/BitsTests.hs +112/−79
- test/Grisette/SymPrim/SomeBVTests.hs +2/−2
- test/Grisette/SymPrim/SymPrimConstraintTests.hs +97/−0
- test/Grisette/Unified/UnifiedClassesTest.hs +3/−3
- test/Grisette/Unified/UnifiedConstructorTest.hs +6/−6
CHANGELOG.md view
@@ -3,12 +3,58 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),-and this project adheres to [Semantic-Versioning](https://semver.org/spec/v2.0.0.html).+and this project adheres to+[Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [0.11.0.0] - 2024-12-29+## [Unreleased] +## [0.12.0.0] -- 2025-04-12+ ### Added++- Added derivation of `Mergeable` instances using `NoStrategy`.+ ([#269](https://github.com/lsrcz/grisette/pull/269))+- Added `filterExactNumArgs` and `filterLeqNumArgs` for filtering classes that+ accepts type constructors with exactly or at most $n$ arguments. Added more+ list of classes. ([#269](https://github.com/lsrcz/grisette/pull/269))+- Added derivation for `Mergeable` using `NoStrategy`.+ ([#270](https://github.com/lsrcz/grisette/pull/270))+- Added derivation for cereal and binary serializations.+ ([#271](https://github.com/lsrcz/grisette/pull/271))+- Added unconstrained positions for derivation.+ ([#273](https://github.com/lsrcz/grisette/pull/273))+- Added `AsMetadata` type class and `Metadata` pattern for embedding and+ extracting values from metadata represented as an S-expression.+ ([#277](https://github.com/lsrcz/grisette/pull/277))+- Improved `SupportedNonFuncPrim` and `BasicSymPrim` constraints.+ ([#278](https://github.com/lsrcz/grisette/pull/278))+- Provided better patterns for term analysis.+ ([#280](https://github.com/lsrcz/grisette/pull/280))+- Added `PPrint` instances for `SomeTerm` and `Term`.+ ([#281](https://github.com/lsrcz/grisette/pull/281))+- Types with `SimpleMergeable` instances now have default `ITEOp` instances.+ ([#290](https://github.com/lsrcz/grisette/pull/290))++### Changed++- Derivation of `PPrint` no longer relies on `OverloadedStrings` extension.+ ([#268](https://github.com/lsrcz/grisette/pull/268))+- The `choose*Fresh` functions will not try its best to minimize the size of the+ guards. ([#283](https://github.com/lsrcz/grisette/pull/283))+- `EvalModeConvertible` is now reflexive.+ ([#284](https://github.com/lsrcz/grisette/pull/284))+- \[Breaking\] Renamed `deriveGADT` to `derive`.+ ([#286](https://github.com/lsrcz/grisette/pull/286))++### Fixed++- Fixed the derivation for empty data types.+ ([#272](https://github.com/lsrcz/grisette/pull/272))++## [0.11.0.0] -- 2024-12-29++### Added+ - Added `deriveGADT` for deriving all relevant instances for GADTs. ([#267](https://github.com/lsrcz/grisette/pull/267)) - Added `EvalModeConvertible` for a unified constraint for the evaluation modes@@ -16,14 +62,16 @@ ([#267](https://github.com/lsrcz/grisette/pull/267)) ### Changed-- [Breaking] We no longer support direct `toCon` from a union to a single value- or `toSym` from a single value to a union. These should now be done through- `mrgToSym`, `toUnionSym`, and `unionToCon`.++- \[Breaking\] We no longer support direct `toCon` from a union to a single+ value or `toSym` from a single value to a union. These should now be done+ through `mrgToSym`, `toUnionSym`, and `unionToCon`. ([#267](https://github.com/lsrcz/grisette/pull/267))-- [Breaking] Changed the `EvalMode` tag for `Con` to `C` and `Sym` to `S`.+- \[Breaking\] Changed the `EvalMode` tag for `Con` to `C` and `Sym` to `S`. ([#267](https://github.com/lsrcz/grisette/pull/267)) ### Fixed+ - Fixed some missing constraints for unified interfaces. ([#267](https://github.com/lsrcz/grisette/pull/267)) - Fixed badly staged types in the lifting of terms.@@ -32,10 +80,11 @@ ([#267](https://github.com/lsrcz/grisette/pull/267)) ### Removed+ - Removed old template-haskell-based derivation mechanism. ([#267](https://github.com/lsrcz/grisette/pull/267)) -## [0.10.0.0] - 2024-12-11+## [0.10.0.0] -- 2024-12-11 ### Added @@ -49,18 +98,20 @@ ([#265](https://github.com/lsrcz/grisette/pull/265)) ### Changed-- [Breaking] Improved the `SymFiniteBits` interface.++- \[Breaking\] Improved the `SymFiniteBits` interface. ([#262](https://github.com/lsrcz/grisette/pull/262))-- [Breaking] Changed the smart constructor generation Template Haskell procedure- name to `makeSmartCtorWith`, `makePrefixedSmartCtorWith`,+- \[Breaking\] Changed the smart constructor generation Template Haskell+ procedure name to `makeSmartCtorWith`, `makePrefixedSmartCtorWith`, `makeNamedSmartCtor`, and `makeSmartCtor`. ([#263](https://github.com/lsrcz/grisette/pull/263))-- [Breaking] Renamed the evaluation mode tags `Con` and `Sym` to `C` and `S`.+- \[Breaking\] Renamed the evaluation mode tags `Con` and `Sym` to `C` and `S`. ([#264](https://github.com/lsrcz/grisette/pull/264)) -## [0.9.0.0] - 2024-11-07+## [0.9.0.0] -- 2024-11-07 ### Added+ - Added missing instances for concrete general and tabular functions. ([#249](https://github.com/lsrcz/grisette/pull/249)) - Added eval mode constraint on demand.@@ -75,24 +126,25 @@ ([#254](https://github.com/lsrcz/grisette/pull/254)) ### Changed-- [Breaking] Moved the constraints for the general and tabular functions and++- \[Breaking\] Moved the constraints for the general and tabular functions and simplified their instances declaration. ([#249](https://github.com/lsrcz/grisette/pull/249))-- [Breaking] Renamed `EvalMode` to `EvalModeAll`, renamed `MonadWithMode` to - `MonadEvalModeAll`.- ([#250](https://github.com/lsrcz/grisette/pull/250))+- \[Breaking\] Renamed `EvalMode` to `EvalModeAll`, renamed `MonadWithMode` to+ `MonadEvalModeAll`. ([#250](https://github.com/lsrcz/grisette/pull/250)) - Improved parallel symbolic evaluation performance. ([#252](https://github.com/lsrcz/grisette/pull/252))-- [Breaking] Changed the metadata for identifiers from existential arguments to- s-expressions. ([#253](https://github.com/lsrcz/grisette/pull/253))-- [Breaking] Changed the solving/cegis results from maintaining the exception+- \[Breaking\] Changed the metadata for identifiers from existential arguments+ to s-expressions. ([#253](https://github.com/lsrcz/grisette/pull/253))+- \[Breaking\] Changed the solving/cegis results from maintaining the exception themselves to maintaining a textual representation of them. ([#253](https://github.com/lsrcz/grisette/pull/253))-- [Breaking] Changed the 'VerifierResult' type for CEGIS to allow it report that- the verifier cannot find a counter example.+- \[Breaking\] Changed the 'VerifierResult' type for CEGIS to allow it report+ that the verifier cannot find a counter example. ([#257](https://github.com/lsrcz/grisette/pull/257)) ### Fixed+ - Fixed memory leak within the term cache. ([#252](https://github.com/lsrcz/grisette/pull/252)) - Fixed printing of bv terms.@@ -106,19 +158,20 @@ intermediate states are not properly memoized. ([#259](https://github.com/lsrcz/grisette/pull/259)) -## [0.8.0.0] - 2024-08-13+## [0.8.0.0] -- 2024-08-13 ### Added+ - Added pretty printer for models. ([#225](https://github.com/lsrcz/grisette/pull/225)) - Added support for algebraic reals (`AlgReal` and `SymAlgReal`). ([#228](https://github.com/lsrcz/grisette/pull/228),- [#229](https://github.com/lsrcz/grisette/pull/229))+ [#229](https://github.com/lsrcz/grisette/pull/229)) - Added support for quantifiers. ([#230](https://github.com/lsrcz/grisette/pull/230)) - Added `SafeFdiv`, `SafeLogBase`, `DivOr`, `FdivOr`, and `LogBaseOr`. ([#228](https://github.com/lsrcz/grisette/pull/228),- [#231](https://github.com/lsrcz/grisette/pull/231))+ [#231](https://github.com/lsrcz/grisette/pull/231)) - Added bitcast from and to `Bool`, `IntN`, `WordN`, `FP` and their symbolic counterparts when appropriate. ([#232](https://github.com/lsrcz/grisette/pull/232))@@ -130,37 +183,36 @@ ([#236](https://github.com/lsrcz/grisette/pull/236)) - Add `SymFiniteBits`. ([#237](https://github.com/lsrcz/grisette/pull/237)) - Add unified instances for all provided operations, including `FP` and- `AlgReal`.- ([#239](https://github.com/lsrcz/grisette/pull/239),- [#240](https://github.com/lsrcz/grisette/pull/240),- [#243](https://github.com/lsrcz/grisette/pull/243))+ `AlgReal`. ([#239](https://github.com/lsrcz/grisette/pull/239),+ [#240](https://github.com/lsrcz/grisette/pull/240),+ [#243](https://github.com/lsrcz/grisette/pull/243)) - Allow the use of number literals for `SomeBV`. ([#245](https://github.com/lsrcz/grisette/pull/245))-- Add `symDistinct`.- ([#246](https://github.com/lsrcz/grisette/pull/246),- [#247](https://github.com/lsrcz/grisette/pull/247))+- Add `symDistinct`. ([#246](https://github.com/lsrcz/grisette/pull/246),+ [#247](https://github.com/lsrcz/grisette/pull/247)) ### Fixed+ - Fixed model parsing for floating points. ([#227](https://github.com/lsrcz/grisette/pull/227)) - Allowed `mkUnifiedConstructor` to be used with types without modes or args. ([#242](https://github.com/lsrcz/grisette/pull/242)) ### Changed-- [Breaking] Changed the operand order for `liftPFormatPrec2` and- `liftPFormatList2`.- ([#225](https://github.com/lsrcz/grisette/pull/225))-- [Breaking] Changed the term representation with a compile-time tag for its++- \[Breaking\] Changed the operand order for `liftPFormatPrec2` and+ `liftPFormatList2`. ([#225](https://github.com/lsrcz/grisette/pull/225))+- \[Breaking\] Changed the term representation with a compile-time tag for its kind (`AnyKind` for all symbols and `ConstantKind` for symbols other than uninterpreted functions). This also affects the 'ExtractSym'. A new `extractSymMaybe` will regard this tag if not all symbols can be casted to that tag. `extractSym` will always succeed, returning a set with `AnyKind`. ([#230](https://github.com/lsrcz/grisette/pull/230))-- [Breaking] `SafeDivision` renamed to `SafeDiv`.+- \[Breaking\] `SafeDivision` renamed to `SafeDiv`. ([#231](https://github.com/lsrcz/grisette/pull/231)) - Refined the template-haskell-based derivation mechanism. ([#238](https://github.com/lsrcz/grisette/pull/238))-- [Breaking] `GetData` is made injective by giving `Identity` wrapped type for+- \[Breaking\] `GetData` is made injective by giving `Identity` wrapped type for concrete evaluation instead of the type itself. ([#242](https://github.com/lsrcz/grisette/pull/242)) - Changed pprint for `Identity` to not to print the constructor.@@ -170,28 +222,28 @@ ([#244](https://github.com/lsrcz/grisette/pull/244)) ### Removed+ - Removed `fpMin` and `fpMax`, which is removed in IEEE754-2019. ([#235](https://github.com/lsrcz/grisette/pull/235)) - Dropped support for post-evaluation approximation. ([#241](https://github.com/lsrcz/grisette/pull/241))- -## [0.7.0.0] - 2024-07-02+## [0.7.0.0] -- 2024-07-02 ### Added+ - Added `true` and `false` in `LogicalOp`. ([#211](https://github.com/lsrcz/grisette/pull/211)) - Exported the `FP` constructs in the `Grisette` module. ([#209](https://github.com/lsrcz/grisette/pull/209)) - Added missing `AllSyms` instance for `WordN`, `IntN`, and `FP`. ([#209](https://github.com/lsrcz/grisette/pull/209))-- Added unified interfaces.- ([#210](https://github.com/lsrcz/grisette/pull/210),- [#212](https://github.com/lsrcz/grisette/pull/212),- [#213](https://github.com/lsrcz/grisette/pull/213),- [#214](https://github.com/lsrcz/grisette/pull/214),- [#215](https://github.com/lsrcz/grisette/pull/215),- [#217](https://github.com/lsrcz/grisette/pull/217))+- Added unified interfaces. ([#210](https://github.com/lsrcz/grisette/pull/210),+ [#212](https://github.com/lsrcz/grisette/pull/212),+ [#213](https://github.com/lsrcz/grisette/pull/213),+ [#214](https://github.com/lsrcz/grisette/pull/214),+ [#215](https://github.com/lsrcz/grisette/pull/215),+ [#217](https://github.com/lsrcz/grisette/pull/217)) - Added `IEEEFPRoundingMode`. ([#219](https://github.com/lsrcz/grisette/pull/219)) - Added `Show` instance for `SomeSym`.@@ -200,41 +252,42 @@ ([#221](https://github.com/lsrcz/grisette/pull/221)) ### Fixed+ - Fixed the printing of FP terms. ([#219](https://github.com/lsrcz/grisette/pull/219)) ### Changed-- [Breaking] Relaxed constraints for type classes, according to++- \[Breaking\] Relaxed constraints for type classes, according to https://github.com/haskell/core-libraries-committee/issues/10. One problem this causes is that the instances for `Union` will no longer be able to always merge the results. This is unfortunate, but should not be critical. ([#213](https://github.com/lsrcz/grisette/pull/213),- [#214](https://github.com/lsrcz/grisette/pull/214),- [#221](https://github.com/lsrcz/grisette/pull/221))-- [Breaking] Rewritten the generic derivation mechanism.+ [#214](https://github.com/lsrcz/grisette/pull/214),+ [#221](https://github.com/lsrcz/grisette/pull/221))+- \[Breaking\] Rewritten the generic derivation mechanism. ([#213](https://github.com/lsrcz/grisette/pull/213),- [#214](https://github.com/lsrcz/grisette/pull/214),- [#216](https://github.com/lsrcz/grisette/pull/216))-- [Breaking] Changed the type class hierarchy for operations for functors, e.g.- `SEq1`, as described in+ [#214](https://github.com/lsrcz/grisette/pull/214),+ [#216](https://github.com/lsrcz/grisette/pull/216))+- \[Breaking\] Changed the type class hierarchy for operations for functors,+ e.g. `SEq1`, as described in https://github.com/haskell/core-libraries-committee/issues/10. ([#216](https://github.com/lsrcz/grisette/pull/216))-- [Breaking] Renamed `UnionMergeable1` to `SymBranching`. Renamed `Union` to+- \[Breaking\] Renamed `UnionMergeable1` to `SymBranching`. Renamed `Union` to `UnionBase`, and `UnionM` to `Union`. ([#214](https://github.com/lsrcz/grisette/pull/214),- [#217](https://github.com/lsrcz/grisette/pull/217))-- [Breaking] Renamed `EvaluateSym` to `EvalSym`. Renamed `SubstituteSym` to+ [#217](https://github.com/lsrcz/grisette/pull/217))+- \[Breaking\] Renamed `EvaluateSym` to `EvalSym`. Renamed `SubstituteSym` to `SubstSym`. Renamed `ExtractSymbolics` to `ExtractSym`. ([#217](https://github.com/lsrcz/grisette/pull/217))-- [Breaking] Renamed `SEq` to `SymEq`. Renamed `SOrd` to `SymOrd`.+- \[Breaking\] Renamed `SEq` to `SymEq`. Renamed `SOrd` to `SymOrd`. ([#217](https://github.com/lsrcz/grisette/pull/217))-- [Breaking] Renamed `GPretty` to `PPrint`.+- \[Breaking\] Renamed `GPretty` to `PPrint`. ([#217](https://github.com/lsrcz/grisette/pull/217),- [#224](https://github.com/lsrcz/grisette/pull/224))-- [Breaking] Discourage the use of approximation with `approx`. `precise` is now- the default and we do not require `precise` to be used everytime we call a- solver.- ([#218](https://github.com/lsrcz/grisette/pull/218))+ [#224](https://github.com/lsrcz/grisette/pull/224))+- \[Breaking\] Discourage the use of approximation with `approx`. `precise` is+ now the default and we do not require `precise` to be used everytime we call a+ solver. ([#218](https://github.com/lsrcz/grisette/pull/218)) ## [0.6.0.0] -- 2024-06-07 @@ -262,14 +315,14 @@ ### Changed -- [Breaking] Equality test for `SomeBV` with different bit widths will now+- \[Breaking\] Equality test for `SomeBV` with different bit widths will now return false rather than crash. ([#200](https://github.com/lsrcz/grisette/pull/200))-- [Breaking] More intuitive CEGIS interface.+- \[Breaking\] More intuitive CEGIS interface. ([#201](https://github.com/lsrcz/grisette/pull/201))-- [Breaking] Changed the low-level solver interface.+- \[Breaking\] Changed the low-level solver interface. ([#206](https://github.com/lsrcz/grisette/pull/206))-- [Breaking] Changed the CEGIS interface.+- \[Breaking\] Changed the CEGIS interface. ([#206](https://github.com/lsrcz/grisette/pull/206)) - Bumped the minimum supported sbv version to 8.17. ([#207](https://github.com/lsrcz/grisette/pull/207))@@ -317,32 +370,32 @@ ### Changed -- [Breaking] Removed the `UnionLike` and `UnionPrjOp` interface, added the+- \[Breaking\] Removed the `UnionLike` and `UnionPrjOp` interface, added the `TryMerge` and `PlainUnion` interface. This allows `mrg*` operations to be used with non-union programs. ([#170](https://github.com/lsrcz/grisette/pull/170))-- [Breaking] Refined the safe operations interface using `TryMerge`.+- \[Breaking\] Refined the safe operations interface using `TryMerge`. ([#172](https://github.com/lsrcz/grisette/pull/172))-- [Breaking] Renamed `safeMinus` to `safeSub` to be more consistent.+- \[Breaking\] Renamed `safeMinus` to `safeSub` to be more consistent. ([#172](https://github.com/lsrcz/grisette/pull/172))-- [Breaking] Unifies the implementation for all symbolic non-indexed+- \[Breaking\] Unifies the implementation for all symbolic non-indexed bit-vectors. The legacy types are now type and pattern synonyms. ([#174](https://github.com/lsrcz/grisette/pull/174), [#179](https://github.com/lsrcz/grisette/pull/179), [#180](https://github.com/lsrcz/grisette/pull/180))-- [Breaking] Use functional dependency instead of type family for the `Function`- class. ([#178](https://github.com/lsrcz/grisette/pull/178))-- [Breaking] Added `Mergeable` constraints to some `mrg*` list operators+- \[Breaking\] Use functional dependency instead of type family for the+ `Function` class. ([#178](https://github.com/lsrcz/grisette/pull/178))+- \[Breaking\] Added `Mergeable` constraints to some `mrg*` list operators ([#182](https://github.com/lsrcz/grisette/pull/182))-- [Breaking] Refactored the `mrg*` constructor related template haskell code.+- \[Breaking\] Refactored the `mrg*` constructor related template haskell code. ([#185](https://github.com/lsrcz/grisette/pull/185))-- [Breaking] Dropped symbols with extra information.+- \[Breaking\] Dropped symbols with extra information. ([#188](https://github.com/lsrcz/grisette/pull/188))-- [Breaking] The `FreshIdent` is removed. It is now changed to `Identifier` and- `Symbol` types. ([#192](https://github.com/lsrcz/grisette/pull/192))+- \[Breaking\] The `FreshIdent` is removed. It is now changed to `Identifier`+ and `Symbol` types. ([#192](https://github.com/lsrcz/grisette/pull/192)) - Changed the internal representation of the terms. ([#193](https://github.com/lsrcz/grisette/pull/193))-- [Breaking] Refactored the project structures.+- \[Breaking\] Refactored the project structures. ([#194](https://github.com/lsrcz/grisette/pull/194)) ## [0.4.1.0] -- 2024-01-10@@ -383,11 +436,11 @@ ### Removed -- [Breaking] Removed the `Grisette.Lib.Mtl` module.+- \[Breaking\] Removed the `Grisette.Lib.Mtl` module. ([#132](https://github.com/lsrcz/grisette/pull/132))-- [Breaking] Removed `SymBoolOp` and `SymIntegerOp`.+- \[Breaking\] Removed `SymBoolOp` and `SymIntegerOp`. ([#146](https://github.com/lsrcz/grisette/pull/146))-- [Breaking] Removed `ExtractSymbolics` instance for `SymbolSet`.+- \[Breaking\] Removed `ExtractSymbolics` instance for `SymbolSet`. ([#146](https://github.com/lsrcz/grisette/pull/146)) ### Fixed@@ -413,33 +466,33 @@ - Reorganized the files for `MonadTrans`. ([#132](https://github.com/lsrcz/grisette/pull/132))-- [Breaking] Changed the name of `Union` constructors and patterns.+- \[Breaking\] Changed the name of `Union` constructors and patterns. ([#133](https://github.com/lsrcz/grisette/pull/133)) - The `Union` patterns, when used as constructors, now merges the result. ([#133](https://github.com/lsrcz/grisette/pull/133)) - Changed the symbolic identifier type from `String` to `Data.Text.Text`. ([#141](https://github.com/lsrcz/grisette/pull/141))-- [Breaking] `Grisette.Data.Class.BitVector.BVSignConversion` is now+- \[Breaking\] `Grisette.Data.Class.BitVector.BVSignConversion` is now `Grisette.Data.Class.SignConversion.SignConversion`. ([#142](https://github.com/lsrcz/grisette/pull/142))-- [Breaking] Moved the `ITEOp`, `LogicalOp`, and `SEq` type classes to dedicated- modules. ([#146](https://github.com/lsrcz/grisette/pull/146))-- [Breaking] Moved `Grisette.Data.Class.Evaluate` to+- \[Breaking\] Moved the `ITEOp`, `LogicalOp`, and `SEq` type classes to+ dedicated modules. ([#146](https://github.com/lsrcz/grisette/pull/146))+- \[Breaking\] Moved `Grisette.Data.Class.Evaluate` to `Grisette.Data.Class.EvaluateSym`. ([#146](https://github.com/lsrcz/grisette/pull/146))-- [Breaking] Moved `Grisette.Data.Class.Substitute` to+- \[Breaking\] Moved `Grisette.Data.Class.Substitute` to `Grisette.Data.Class.SubstituteSym`. ([#146](https://github.com/lsrcz/grisette/pull/146))-- [Breaking] Split the `Grisette.Data.Class.SafeArith` module to+- \[Breaking\] Split the `Grisette.Data.Class.SafeArith` module to `Grisette.Data.Class.SafeDivision` and `Grisette.Data.Class.SafeLinearArith`. ([#146](https://github.com/lsrcz/grisette/pull/146))-- [Breaking] Changed the API to `MonadFresh`.+- \[Breaking\] Changed the API to `MonadFresh`. ([#156](https://github.com/lsrcz/grisette/pull/156))-- [Breaking] Renamed multiple symbolic operators.+- \[Breaking\] Renamed multiple symbolic operators. ([#158](https://github.com/lsrcz/grisette/pull/158))-- [Breaking] Changed the solver interface.+- \[Breaking\] Changed the solver interface. ([#159](https://github.com/lsrcz/grisette/pull/159))-- [Breaking] Changed the CEGIS solver interface.+- \[Breaking\] Changed the CEGIS solver interface. ([#159](https://github.com/lsrcz/grisette/pull/159)) ## [0.3.1.1] -- 2023-09-29@@ -498,7 +551,7 @@ - Fixed the merging for `SomeSymIntN` and `SomeSymWordN`. ([#72](https://github.com/lsrcz/grisette/pull/72)) -## [0.2.0.0] - 2023-04-13+## [0.2.0.0] -- 2023-04-13 ### Added @@ -543,24 +596,26 @@ - Fix CEGIS crash when subsequent solver calls introduces new symbolic constant. ([#60](https://github.com/lsrcz/grisette/pull/60)) -## [0.1.0.0] - 2023-01-20+## [0.1.0.0] -- 2023-01-20 ### Added - Initial release for Grisette. -[0.11.0.0]: https://github.com/lsrcz/grisette/compare/v0.10.0.0...HEAD+[0.1.0.0]: https://github.com/lsrcz/grisette/tree/v0.1.0.0 [0.10.0.0]: https://github.com/lsrcz/grisette/compare/v0.9.0.0...v0.10.0.0-[0.9.0.0]: https://github.com/lsrcz/grisette/compare/v0.8.0.0...v0.9.0.0-[0.8.0.0]: https://github.com/lsrcz/grisette/compare/v0.7.0.0...v0.8.0.0-[0.7.0.0]: https://github.com/lsrcz/grisette/compare/v0.6.0.0...v0.7.0.0-[0.6.0.0]: https://github.com/lsrcz/grisette/compare/v0.5.0.1...v0.6.0.0-[0.5.0.1]: https://github.com/lsrcz/grisette/compare/v0.5.0.0...v0.5.0.1-[0.5.0.0]: https://github.com/lsrcz/grisette/compare/v0.4.1.0...v0.5.0.0-[0.4.1.0]: https://github.com/lsrcz/grisette/compare/v0.4.0.0...v0.4.1.0-[0.4.0.0]: https://github.com/lsrcz/grisette/compare/v0.3.1.1...v0.4.0.0-[0.3.1.1]: https://github.com/lsrcz/grisette/compare/v0.3.1.0...v0.3.1.1-[0.3.1.0]: https://github.com/lsrcz/grisette/compare/v0.3.0.0...v0.3.1.0-[0.3.0.0]: https://github.com/lsrcz/grisette/compare/v0.2.0.0...v0.3.0.0+[0.11.0.0]: https://github.com/lsrcz/grisette/compare/v0.10.0.0...v0.11.0.0+[0.12.0.0]: https://github.com/lsrcz/grisette/compare/v0.11.0.0...v0.12.0.0 [0.2.0.0]: https://github.com/lsrcz/grisette/compare/v0.1.0.0...v0.2.0.0-[0.1.0.0]: https://github.com/lsrcz/grisette/tree/v0.1.0.0+[0.3.0.0]: https://github.com/lsrcz/grisette/compare/v0.2.0.0...v0.3.0.0+[0.3.1.0]: https://github.com/lsrcz/grisette/compare/v0.3.0.0...v0.3.1.0+[0.3.1.1]: https://github.com/lsrcz/grisette/compare/v0.3.1.0...v0.3.1.1+[0.4.0.0]: https://github.com/lsrcz/grisette/compare/v0.3.1.1...v0.4.0.0+[0.4.1.0]: https://github.com/lsrcz/grisette/compare/v0.4.0.0...v0.4.1.0+[0.5.0.0]: https://github.com/lsrcz/grisette/compare/v0.4.1.0...v0.5.0.0+[0.5.0.1]: https://github.com/lsrcz/grisette/compare/v0.5.0.0...v0.5.0.1+[0.6.0.0]: https://github.com/lsrcz/grisette/compare/v0.5.0.1...v0.6.0.0+[0.7.0.0]: https://github.com/lsrcz/grisette/compare/v0.6.0.0...v0.7.0.0+[0.8.0.0]: https://github.com/lsrcz/grisette/compare/v0.7.0.0...v0.8.0.0+[0.9.0.0]: https://github.com/lsrcz/grisette/compare/v0.8.0.0...v0.9.0.0+[unreleased]: https://github.com/lsrcz/grisette/compare/v0.12.0.0...HEAD
README.md view
@@ -3,9 +3,9 @@ [](https://github.com/lsrcz/grisette/actions/workflows/test.yml) [](https://hackage.haskell.org/package/grisette) -Grisette is a symbolic evaluation library for Haskell.-By translating programs into SMT constraints, Grisette can help the development-of program reasoning tools, including verification and synthesis.+Grisette is a symbolic evaluation library for Haskell. By translating programs+into SMT constraints, Grisette can help the development of program reasoning+tools, including verification and synthesis. For a detailed description of the system, please refer to our POPL'23 paper [Grisette: Symbolic Compilation as a Functional Programming Library](https://lsrcz.github.io/files/POPL23.pdf).@@ -48,7 +48,7 @@ ```cabal library ...- build-depends: grisette >= 0.11 < 0.12+ build-depends: grisette >= 0.12 < 0.13 ``` #### Using stack@@ -59,14 +59,14 @@ ```yaml extra-deps:- - grisette-0.11.0.0+ - grisette-0.12.0.0 ``` and in your `package.yaml` file: ```yaml dependencies:- - grisette >= 0.11 < 0.12+ - grisette >= 0.12 < 0.13 ``` #### Quick start template with `stack new`@@ -78,7 +78,8 @@ ``` For more details, please see the-[template file](https://github.com/lsrcz/stack-templates/blob/main/grisette.hsfiles) and the+[template file](https://github.com/lsrcz/stack-templates/blob/main/grisette.hsfiles)+and the [documentation for stack templates](https://docs.haskellstack.org/en/stable/templates_command/). You can test your installation by running the following command:@@ -131,11 +132,12 @@ for boolean and integer expressions. We will+ - define the *syntax* and *semantics* of an arithmetic language, and - build a *verifier* to check if a given arithmetic expression is equivalent to another, and-- build a *synthesizer* to find an arithmetic expression that is equivalent to- a given expression.+- build a *synthesizer* to find an arithmetic expression that is equivalent to a+ given expression. ### Defining the Syntax @@ -203,9 +205,9 @@ ``` The introduction of `Union` allows us to represent choices of expressions, and-the following code chooses between `a + 2` or `a * 2`. A synthesizer can then pick-true or false for the `choice` variable to decide which expression to pick. If-the synthesizer picks true, the result is `a + 2`; otherwise, it is `a * 2`.+the following code chooses between `a + 2` or `a * 2`. A synthesizer can then+pick true or false for the `choice` variable to decide which expression to pick.+If the synthesizer picks true, the result is `a + 2`; otherwise, it is `a * 2`. ```haskell add2 = add (intVal "a") (intVal 2)@@ -215,6 +217,7 @@ ``` ### Defining the Semantics+ The semantics of the expressions can be defined by the following interpreter. Grisette provides various combinators for working with symbolic values. In the interpreter, the `.#` operator is very important. It conceptually@@ -242,6 +245,7 @@ to the [tutorials](tutorials) for more details. ### Get a verifier+ With the syntax and semantics defined, we can build a verifier to check if two expressions are equivalent. This can be done by checking if there exists a counter-example that falsifies the equivalence of the two expressions.@@ -264,12 +268,13 @@ different values. The counter-example is $a=0$, $b=1$, such that $a+b=1$ and $a+a=0$. -``` haskell+```haskell > solve z3 $ eval aPlusB ./= eval aPlusA Right (Model {a -> 0 :: Integer, b -> 1 :: Integer}) ``` ### Get a synthesizer+ We can also build a synthesizer using the built-in CEGIS algorithm in Grisette. Given a target expression, we can synthesize an expression using a sketch with "symbolic holes" that is equivalent to the target expression.@@ -292,9 +297,11 @@ ## Documentation -- Haddock documentation at [grisette](https://hackage.haskell.org/package/grisette).+- Haddock documentation: [HEAD version](https://lsrcz.github.io/grisette),+ [release version on Hackage](https://hackage.haskell.org/package/grisette). - A tutorial to Grisette is in the [tutorials](tutorials) directory. They are- provided as jupyter notebooks with the [IHaskell](https://github.com/IHaskell/IHaskell) kernel.+ provided as jupyter notebooks with the+ [IHaskell](https://github.com/IHaskell/IHaskell) kernel. ## License @@ -307,31 +314,32 @@ 8.10+. ### CLC proposal #10+ As the type classes provided by Grisette implements [CLC proposal #10](https://github.com/haskell/core-libraries-committee/issues/10), which requires `base-4.18.0.0` to work reliably, Grisette is fully compatible-with GHC 9.6.-You may experience instance resolution failure when using older GHCs in the-client code (Grisette itself is buildable against GHC 8.10+ with some tricks).+with GHC 9.6. You may experience instance resolution failure when using older+GHCs in the client code (Grisette itself is buildable against GHC 8.10+ with+some tricks). ### Quantifiers -Grisette currently supports universal and existential quantifiers $\forall$ and-$\exists$, but only when building with sbv >= 10.1. This also means that you+Grisette currently supports universal and existential quantifiers $\\forall$ and+$\\exists$, but only when building with sbv >= 10.1. This also means that you need to use GHC >= 9.2. ### Floating-points Grisette currently supports boolean, uninterpreted functions, bitvector, integer, and floating point theories. However, if you want to use the floating-point theory, please make sure that you have the latest libBF (>=0.6.8) and sbv +point theory, please make sure that you have the latest libBF (>=0.6.8) and sbv installed (>=10.10.6). We've detected and fixed several bugs that would prevent a sound reasoning for floating points. ### Unified interfaces -Since 0.7.0.0, Grisette provides a [unified-interface](https://hackage.haskell.org/package/grisette/docs/Grisette-Unified.html)+Since 0.7.0.0, Grisette provides a+[unified interface](https://hackage.haskell.org/package/grisette/docs/Grisette-Unified.html) to symbolic and concrete evaluations. GHC 9.0 or earlier, without the [QuickLook](https://dl.acm.org/doi/10.1145/3408971) type inference algorithm for impredicative types, may fail to resolve some constraints. You may need to
grisette.cabal view
@@ -4,34 +4,34 @@ -- -- see: https://github.com/sol/hpack -name: grisette-version: 0.11.0.0-synopsis: Symbolic evaluation as a library-description: Grisette is a reusable symbolic evaluation library for Haskell. By- translating programs into constraints, Grisette can help the development of- program reasoning tools, including verification, synthesis, and more.- .- The "Grisette" module exports all the core APIs for building a symbolic- evaluation tool. A high-level overview of the module structures are available- there.- .- A detailed introduction to Grisette is available at "Grisette.Core". More- lifted libraries are provided in @Grisette.Lib.*@ modules.- .- The "Grisette.Unified" module offers an experimental unified interface for- symbolic and concrete evaluation. This module should be imported qualified.- .- For more details, please checkout the README and - [tutorials](https://github.com/lsrcz/grisette/tree/main/tutorials).-category: Formal Methods, Theorem Provers, Symbolic Computation, SMT-homepage: https://github.com/lsrcz/grisette#readme-bug-reports: https://github.com/lsrcz/grisette/issues-author: Sirui Lu, Rastislav Bodík-maintainer: Sirui Lu (siruilu@cs.washington.edu)-copyright: 2021-2024 Sirui Lu-license: BSD3-license-file: LICENSE-build-type: Simple+name: grisette+version: 0.12.0.0+synopsis: Symbolic evaluation as a library+description: Grisette is a reusable symbolic evaluation library for Haskell. By+ translating programs into constraints, Grisette can help the development of+ program reasoning tools, including verification, synthesis, and more.+ .+ The "Grisette" module exports all the core APIs for building a symbolic+ evaluation tool. A high-level overview of the module structures are available+ there.+ .+ A detailed introduction to Grisette is available at "Grisette.Core". More+ lifted libraries are provided in @Grisette.Lib.*@ modules.+ .+ The "Grisette.Unified" module offers an experimental unified interface for+ symbolic and concrete evaluation. This module should be imported qualified.+ .+ For more details, please checkout the README and + [tutorials](https://github.com/lsrcz/grisette/tree/main/tutorials).+category: Formal Methods, Theorem Provers, Symbolic Computation, SMT+homepage: https://github.com/lsrcz/grisette#readme+bug-reports: https://github.com/lsrcz/grisette/issues+author: Sirui Lu, Rastislav Bodík+maintainer: Sirui Lu (siruilu@cs.washington.edu)+copyright: 2021-2024 Sirui Lu+license: BSD3+license-file: LICENSE+build-type: Simple tested-with: GHC == 8.10.7 , GHC == 9.0.2@@ -121,9 +121,7 @@ Grisette.Internal.SymPrim.IntBitwidth Grisette.Internal.SymPrim.ModelRep Grisette.Internal.SymPrim.Prim.Internal.Caches- Grisette.Internal.SymPrim.Prim.Internal.Instances.BVPEval Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalBitCastTerm- Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalBitwiseTerm Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalDivModIntegralTerm Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFloatingTerm Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP@@ -134,13 +132,13 @@ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalOrdTerm Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalRotateTerm Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalShiftTerm- Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim Grisette.Internal.SymPrim.Prim.Internal.PartialEval Grisette.Internal.SymPrim.Prim.Internal.Serialize Grisette.Internal.SymPrim.Prim.Internal.Term Grisette.Internal.SymPrim.Prim.Internal.Unfold Grisette.Internal.SymPrim.Prim.Internal.Utils Grisette.Internal.SymPrim.Prim.Model+ Grisette.Internal.SymPrim.Prim.Pattern Grisette.Internal.SymPrim.Prim.SomeTerm Grisette.Internal.SymPrim.Prim.Term Grisette.Internal.SymPrim.Prim.TermUtils@@ -158,33 +156,36 @@ Grisette.Internal.TH.Ctor.Common Grisette.Internal.TH.Ctor.SmartConstructor Grisette.Internal.TH.Ctor.UnifiedConstructor- Grisette.Internal.TH.GADT.BinaryOpCommon- Grisette.Internal.TH.GADT.Common- Grisette.Internal.TH.GADT.ConvertOpCommon- Grisette.Internal.TH.GADT.DeriveAllSyms- Grisette.Internal.TH.GADT.DeriveEq- Grisette.Internal.TH.GADT.DeriveEvalSym- Grisette.Internal.TH.GADT.DeriveExtractSym- Grisette.Internal.TH.GADT.DeriveGADT- Grisette.Internal.TH.GADT.DeriveHashable- Grisette.Internal.TH.GADT.DeriveMergeable- Grisette.Internal.TH.GADT.DeriveNFData- Grisette.Internal.TH.GADT.DeriveOrd- Grisette.Internal.TH.GADT.DerivePPrint- Grisette.Internal.TH.GADT.DeriveSerial- Grisette.Internal.TH.GADT.DeriveShow- Grisette.Internal.TH.GADT.DeriveSimpleMergeable- Grisette.Internal.TH.GADT.DeriveSubstSym- Grisette.Internal.TH.GADT.DeriveSymEq- Grisette.Internal.TH.GADT.DeriveSymOrd- Grisette.Internal.TH.GADT.DeriveToCon- Grisette.Internal.TH.GADT.DeriveToSym- Grisette.Internal.TH.GADT.DeriveUnifiedSimpleMergeable- Grisette.Internal.TH.GADT.DeriveUnifiedSymEq- Grisette.Internal.TH.GADT.DeriveUnifiedSymOrd- Grisette.Internal.TH.GADT.ShowPPrintCommon- Grisette.Internal.TH.GADT.UnaryOpCommon- Grisette.Internal.TH.GADT.UnifiedOpCommon+ Grisette.Internal.TH.Derivation.BinaryOpCommon+ Grisette.Internal.TH.Derivation.Common+ Grisette.Internal.TH.Derivation.ConvertOpCommon+ Grisette.Internal.TH.Derivation.Derive+ Grisette.Internal.TH.Derivation.DeriveAllSyms+ Grisette.Internal.TH.Derivation.DeriveBinary+ Grisette.Internal.TH.Derivation.DeriveCereal+ Grisette.Internal.TH.Derivation.DeriveEq+ Grisette.Internal.TH.Derivation.DeriveEvalSym+ Grisette.Internal.TH.Derivation.DeriveExtractSym+ Grisette.Internal.TH.Derivation.DeriveHashable+ Grisette.Internal.TH.Derivation.DeriveMergeable+ Grisette.Internal.TH.Derivation.DeriveNFData+ Grisette.Internal.TH.Derivation.DeriveOrd+ Grisette.Internal.TH.Derivation.DerivePPrint+ Grisette.Internal.TH.Derivation.DeriveSerial+ Grisette.Internal.TH.Derivation.DeriveShow+ Grisette.Internal.TH.Derivation.DeriveSimpleMergeable+ Grisette.Internal.TH.Derivation.DeriveSubstSym+ Grisette.Internal.TH.Derivation.DeriveSymEq+ Grisette.Internal.TH.Derivation.DeriveSymOrd+ Grisette.Internal.TH.Derivation.DeriveToCon+ Grisette.Internal.TH.Derivation.DeriveToSym+ Grisette.Internal.TH.Derivation.DeriveUnifiedSimpleMergeable+ Grisette.Internal.TH.Derivation.DeriveUnifiedSymEq+ Grisette.Internal.TH.Derivation.DeriveUnifiedSymOrd+ Grisette.Internal.TH.Derivation.SerializeCommon+ Grisette.Internal.TH.Derivation.ShowPPrintCommon+ Grisette.Internal.TH.Derivation.UnaryOpCommon+ Grisette.Internal.TH.Derivation.UnifiedOpCommon Grisette.Internal.TH.Util Grisette.Internal.Unified.BaseConstraint Grisette.Internal.Unified.BaseMonad@@ -305,7 +306,6 @@ hs-source-dirs: src ghc-options: -Wextra -Wcompat -Widentities -Wincomplete-record-updates -Wmissing-export-lists -Wmissing-home-modules -Wmissing-import-lists -Wpartial-fields -Wunused-type-patterns -Wno-x-partial -Wno-unrecognised-warning-flags- ghc-prof-options: -finfo-table-map -fdistinct-constructor-tables build-depends: QuickCheck >=2.14 && <2.16 , array >=0.5.4 && <0.6@@ -317,14 +317,14 @@ , bytestring >=0.10.12 && <0.13 , cereal >=0.5.8.1 && <0.6 , cereal-text >=0.1.0.2 && <0.2- , containers >=0.4 && <0.8+ , containers >=0.5.7 && <0.9 , deepseq >=1.4.4 && <1.6 , generic-deriving >=1.14.1 && <1.15- , hashable >=1.2.5 && <1.6+ , hashable >=1.3 && <1.6 , libBF >=0.6.3 && <0.7 , loch-th >=0.2.2 && <0.3 , mtl >=2.2.2 && <2.4- , parallel >=3.2.2.0 && <3.3+ , parallel >=3.2.2 && <3.3 , prettyprinter >=1.5.0 && <1.8 , sbv >=8.17 && <12 , stm ==2.5.*@@ -333,7 +333,7 @@ , th-abstraction >=0.4 && <0.8 , th-compat >=0.1.2 && <0.2 , th-lift-instances >=0.1.16 && <0.2- , transformers >=0.5.6 && <0.7+ , transformers >=0.5.6.2 && <0.7 , unordered-containers >=0.2.17 && <0.3 , vector >=0.12.1.2 && <0.14 default-language: Haskell2010@@ -341,6 +341,9 @@ ghc-options: -O2 else ghc-options: -O0+ if impl(ghc >= 9.2)+ ghc-prof-options: -finfo-table-map -fdistinct-constructor-tables+ else test-suite doctest type: exitcode-stdio-1.0@@ -350,7 +353,6 @@ hs-source-dirs: doctest ghc-options: -Wextra -Wcompat -Widentities -Wincomplete-record-updates -Wmissing-export-lists -Wmissing-home-modules -Wmissing-import-lists -Wpartial-fields -Wunused-type-patterns -Wno-x-partial -Wno-unrecognised-warning-flags -threaded -rtsopts -with-rtsopts=-N- ghc-prof-options: -finfo-table-map -fdistinct-constructor-tables build-depends: QuickCheck >=2.14 && <2.16 , array >=0.5.4 && <0.6@@ -362,16 +364,16 @@ , bytestring >=0.10.12 && <0.13 , cereal >=0.5.8.1 && <0.6 , cereal-text >=0.1.0.2 && <0.2- , containers >=0.4 && <0.8+ , containers >=0.5.7 && <0.9 , deepseq >=1.4.4 && <1.6- , doctest >=0.18.2 && <0.24+ , doctest >=0.18.2 && <0.25 , generic-deriving >=1.14.1 && <1.15 , grisette- , hashable >=1.2.5 && <1.6+ , hashable >=1.3 && <1.6 , libBF >=0.6.3 && <0.7 , loch-th >=0.2.2 && <0.3 , mtl >=2.2.2 && <2.4- , parallel >=3.2.2.0 && <3.3+ , parallel >=3.2.2 && <3.3 , prettyprinter >=1.5.0 && <1.8 , sbv >=8.17 && <12 , stm ==2.5.*@@ -380,7 +382,7 @@ , th-abstraction >=0.4 && <0.8 , th-compat >=0.1.2 && <0.2 , th-lift-instances >=0.1.16 && <0.2- , transformers >=0.5.6 && <0.7+ , transformers >=0.5.6.2 && <0.7 , unordered-containers >=0.2.17 && <0.3 , vector >=0.12.1.2 && <0.14 default-language: Haskell2010@@ -388,6 +390,9 @@ ghc-options: -O2 else ghc-options: -O0+ if impl(ghc >= 9.2)+ ghc-prof-options: -finfo-table-map -fdistinct-constructor-tables+ else test-suite spec type: exitcode-stdio-1.0@@ -455,6 +460,7 @@ Grisette.SymPrim.QuantifierTests Grisette.SymPrim.SomeBVTests Grisette.SymPrim.SymGeneralFunTests+ Grisette.SymPrim.SymPrimConstraintTests Grisette.SymPrim.SymPrimTests Grisette.SymPrim.TabularFunTests Grisette.TestUtil.NoMerge@@ -467,7 +473,6 @@ hs-source-dirs: test ghc-options: -Wextra -Wcompat -Widentities -Wincomplete-record-updates -Wmissing-export-lists -Wmissing-home-modules -Wmissing-import-lists -Wpartial-fields -Wunused-type-patterns -Wno-x-partial -Wno-unrecognised-warning-flags -threaded -rtsopts -with-rtsopts=-N -Wredundant-constraints- ghc-prof-options: -finfo-table-map -fdistinct-constructor-tables build-depends: HUnit ==1.6.* , QuickCheck >=2.14 && <2.16@@ -480,15 +485,15 @@ , bytestring >=0.10.12 && <0.13 , cereal >=0.5.8.1 && <0.6 , cereal-text >=0.1.0.2 && <0.2- , containers >=0.4 && <0.8+ , containers >=0.5.7 && <0.9 , deepseq >=1.4.4 && <1.6 , generic-deriving >=1.14.1 && <1.15 , grisette- , hashable >=1.2.5 && <1.6+ , hashable >=1.3 && <1.6 , libBF >=0.6.3 && <0.7 , loch-th >=0.2.2 && <0.3 , mtl >=2.2.2 && <2.4- , parallel >=3.2.2.0 && <3.3+ , parallel >=3.2.2 && <3.3 , prettyprinter >=1.5.0 && <1.8 , sbv >=8.17 && <12 , stm ==2.5.*@@ -500,7 +505,7 @@ , th-abstraction >=0.4 && <0.8 , th-compat >=0.1.2 && <0.2 , th-lift-instances >=0.1.16 && <0.2- , transformers >=0.5.6 && <0.7+ , transformers >=0.5.6.2 && <0.7 , unordered-containers >=0.2.17 && <0.3 , vector >=0.12.1.2 && <0.14 default-language: Haskell2010@@ -508,3 +513,6 @@ ghc-options: -O2 else ghc-options: -O0+ if impl(ghc >= 9.2)+ ghc-prof-options: -finfo-table-map -fdistinct-constructor-tables+ else
src/Grisette/Core.hs view
@@ -306,6 +306,8 @@ Identifier (..), Symbol (..), identifier,+ AsMetadata (..),+ pattern Metadata, withMetadata, mapMetadata, withLocation,@@ -556,13 +558,13 @@ -- deriving (Mergeable) via (Default X) -- :} --- -- Grisette also provide 'Grisette.deriveGADT' template haskell procedure to+ -- Grisette also provide 'Grisette.derive' template haskell procedure to -- derive all the instances for the classes that are relevant. This include -- 'Show', 'Mergeable', 'Mergeable1', etc. -- -- >>> :{ -- data X = X SymInteger Integer- -- deriveGADT [''X] [''Show, ''Mergeable]+ -- derive [''X] [''Show, ''Mergeable] -- :} -- -- Having the 'Mergeable' instance allows you to use the 'Union' type to@@ -593,7 +595,7 @@ -- >>> import Control.Monad.Except -- >>> :{ -- data Error = Fail- -- deriveGADT [''Error] allClasses0+ -- derive [''Error] allClasses0 -- :} -- -- >>> mrgIf "a" (throwError Fail) (return "x") :: ExceptT Error Union SymInteger@@ -1829,7 +1831,8 @@ showsSExprWithParens, ) import Grisette.Internal.Core.Data.Symbol- ( Identifier (..),+ ( AsMetadata (..),+ Identifier (..), Symbol (..), identifier, indexed,@@ -1840,6 +1843,7 @@ uniqueIdentifier, withLocation, withMetadata,+ pattern Metadata, ) import Instances.TH.Lift ()
src/Grisette/Internal/Backend/Solving.hs view
@@ -6,6 +6,7 @@ {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE ScopedTypeVariables #-}@@ -89,7 +90,7 @@ import Data.Dynamic (fromDyn, toDyn) import qualified Data.HashSet as HS import Data.IORef (modifyIORef', newIORef, readIORef, writeIORef)-import Data.List.NonEmpty (NonEmpty ((:|)))+import Data.List.NonEmpty (NonEmpty) import Data.Proxy (Proxy (Proxy)) import qualified Data.SBV as SBV import qualified Data.SBV.Control as SBVC@@ -150,15 +151,11 @@ ) import Grisette.Internal.Core.Data.MemoUtils (htmemo) import Grisette.Internal.SymPrim.GeneralFun (substTerm)-import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP- ( sbvFPBinaryTerm,- sbvFPFMATerm,- sbvFPRoundingBinaryTerm,- sbvFPRoundingUnaryTerm,- sbvFPTraitTerm,- sbvFPUnaryTerm,+import Grisette.Internal.SymPrim.Prim.Model as PM+ ( Model, )-import Grisette.Internal.SymPrim.Prim.Internal.Term+import Grisette.Internal.SymPrim.Prim.SomeTerm (SomeTerm (SomeTerm))+import Grisette.Internal.SymPrim.Prim.Term ( PEvalApplyTerm (sbvApplyTerm), PEvalBVTerm (sbvBVConcatTerm, sbvBVExtendTerm, sbvBVSelectTerm), PEvalBitCastOrTerm (sbvBitCastOr),@@ -175,6 +172,14 @@ sbvQuotIntegralTerm, sbvRemIntegralTerm ),+ PEvalFPTerm+ ( sbvFPBinaryTerm,+ sbvFPFMATerm,+ sbvFPRoundingBinaryTerm,+ sbvFPRoundingUnaryTerm,+ sbvFPTraitTerm,+ sbvFPUnaryTerm+ ), PEvalFloatingTerm (sbvFloatingUnaryTerm, sbvPowerTerm), PEvalFractionalTerm (sbvFdivTerm, sbvRecipTerm), PEvalFromIntegralTerm (sbvFromIntegralTerm),@@ -204,68 +209,62 @@ symSBVTerm, withPrim ),- Term- ( AbsNumTerm,- AddNumTerm,- AndBitsTerm,- AndTerm,- ApplyTerm,- BVConcatTerm,- BVExtendTerm,- BVSelectTerm,- BitCastOrTerm,- BitCastTerm,- ComplementBitsTerm,- ConTerm,- DistinctTerm,- DivIntegralTerm,- EqTerm,- ExistsTerm,- FPBinaryTerm,- FPFMATerm,- FPRoundingBinaryTerm,- FPRoundingUnaryTerm,- FPTraitTerm,- FPUnaryTerm,- FdivTerm,- FloatingUnaryTerm,- ForallTerm,- FromFPOrTerm,- FromIntegralTerm,- ITETerm,- LeOrdTerm,- LtOrdTerm,- ModIntegralTerm,- MulNumTerm,- NegNumTerm,- NotTerm,- OrBitsTerm,- OrTerm,- PowerTerm,- QuotIntegralTerm,- RecipTerm,- RemIntegralTerm,- RotateLeftTerm,- RotateRightTerm,- ShiftLeftTerm,- ShiftRightTerm,- SignumNumTerm,- SymTerm,- ToFPTerm,- XorBitsTerm- ),+ SymbolKind (AnyKind),+ Term, TypedConstantSymbol,- TypedSymbol,- introSupportedPrimConstraint,+ TypedSymbol (TypedSymbol), someTypedSymbol, symTerm,- withConstantSymbolSupported,- withSymbolSupported,- )-import Grisette.Internal.SymPrim.Prim.Model as PM- ( Model,+ pattern AbsNumTerm,+ pattern AddNumTerm,+ pattern AndBitsTerm,+ pattern AndTerm,+ pattern ApplyTerm,+ pattern BVConcatTerm,+ pattern BVExtendTerm,+ pattern BVSelectTerm,+ pattern BitCastOrTerm,+ pattern BitCastTerm,+ pattern ComplementBitsTerm,+ pattern ConTerm,+ pattern DistinctTerm,+ pattern DivIntegralTerm,+ pattern EqTerm,+ pattern ExistsTerm,+ pattern FPBinaryTerm,+ pattern FPFMATerm,+ pattern FPRoundingBinaryTerm,+ pattern FPRoundingUnaryTerm,+ pattern FPTraitTerm,+ pattern FPUnaryTerm,+ pattern FdivTerm,+ pattern FloatingUnaryTerm,+ pattern ForallTerm,+ pattern FromFPOrTerm,+ pattern FromIntegralTerm,+ pattern ITETerm,+ pattern LeOrdTerm,+ pattern LtOrdTerm,+ pattern ModIntegralTerm,+ pattern MulNumTerm,+ pattern NegNumTerm,+ pattern NotTerm,+ pattern OrBitsTerm,+ pattern OrTerm,+ pattern PowerTerm,+ pattern QuotIntegralTerm,+ pattern RecipTerm,+ pattern RemIntegralTerm,+ pattern RotateLeftTerm,+ pattern RotateRightTerm,+ pattern ShiftLeftTerm,+ pattern ShiftRightTerm,+ pattern SignumNumTerm,+ pattern SupportedTerm,+ pattern SymTerm,+ pattern ToFPTerm,+ pattern XorBitsTerm, )-import Grisette.Internal.SymPrim.Prim.SomeTerm (SomeTerm (SomeTerm)) import Grisette.Internal.SymPrim.SymBool (SymBool (SymBool)) -- $setup@@ -531,7 +530,7 @@ QuantifiedSymbols -> Term x -> m (QuantifiedStack -> SBVType x)- goCached qs t = introSupportedPrimConstraint t $ do+ goCached qs t@SupportedTerm = do mp <- liftIO $ readIORef mapState case lookupTerm (SomeTerm t) mp of Just x -> return (\qst -> withPrim @x $ fromDyn (x qst) undefined)@@ -542,9 +541,9 @@ QuantifiedSymbols -> Term a -> m (QuantifiedStack -> SBVType a)- goCachedImpl _ (ConTerm _ _ _ _ v) =+ goCachedImpl _ (ConTerm v) = return $ const $ conSBVTerm v- goCachedImpl qs t@(SymTerm _ _ _ _ ts) = do+ goCachedImpl qs t@(SymTerm ts) = do if isQuantifiedSymbol ts qs then withPrim @a $ do let retDyn qst =@@ -571,36 +570,34 @@ modifyIORef' mapState $ addBiMap (SomeTerm t) (toDyn g) name (someTypedSymbol ts) return $ const g- goCachedImpl qs t@(ForallTerm _ _ _ _ (ts :: TypedConstantSymbol t1) v) =- withConstantSymbolSupported ts $- withNonFuncPrim @t1 $ do- do- m <- liftIO $ readIORef mapState- let (newm, sb) =- attachNextQuantifiedSymbolInfo m ts- liftIO $ writeIORef mapState newm- let substedTerm = substTerm ts (symTerm sb) HS.empty v- r <- goCached (addQuantifiedSymbol sb qs) substedTerm- let ret = sbvForall sb r- liftIO $- modifyIORef' mapState $- addBiMapIntermediate (SomeTerm t) (toDyn . ret)- return ret- goCachedImpl qs t@(ExistsTerm _ _ _ _ (ts :: TypedConstantSymbol t1) v) =- withConstantSymbolSupported ts $- withNonFuncPrim @t1 $ do- do- m <- liftIO $ readIORef mapState- let (newm, sb) =- attachNextQuantifiedSymbolInfo m ts- liftIO $ writeIORef mapState newm- let substedTerm = substTerm ts (symTerm sb) HS.empty v- r <- goCached (addQuantifiedSymbol sb qs) substedTerm- let ret = sbvExists sb r- liftIO $- modifyIORef' mapState $- addBiMapIntermediate (SomeTerm t) (toDyn . ret)- return ret+ goCachedImpl qs t@(ForallTerm (ts :: TypedConstantSymbol t1) v) =+ withNonFuncPrim @t1 $ do+ do+ m <- liftIO $ readIORef mapState+ let (newm, sb) =+ attachNextQuantifiedSymbolInfo m ts+ liftIO $ writeIORef mapState newm+ let substedTerm = substTerm ts (symTerm sb) HS.empty v+ r <- goCached (addQuantifiedSymbol sb qs) substedTerm+ let ret = sbvForall sb r+ liftIO $+ modifyIORef' mapState $+ addBiMapIntermediate (SomeTerm t) (toDyn . ret)+ return ret+ goCachedImpl qs t@(ExistsTerm (ts :: TypedConstantSymbol t1) v) =+ withNonFuncPrim @t1 $ do+ do+ m <- liftIO $ readIORef mapState+ let (newm, sb) =+ attachNextQuantifiedSymbolInfo m ts+ liftIO $ writeIORef mapState newm+ let substedTerm = substTerm ts (symTerm sb) HS.empty v+ r <- goCached (addQuantifiedSymbol sb qs) substedTerm+ let ret = sbvExists sb r+ liftIO $+ modifyIORef' mapState $+ addBiMapIntermediate (SomeTerm t) (toDyn . ret)+ return ret goCachedImpl qs t = withPrim @a $ do r <- goCachedIntermediate qs t@@ -616,107 +613,104 @@ QuantifiedSymbols -> Term a -> m (QuantifiedStack -> SBVType a)- goCachedIntermediate qs (NotTerm _ _ _ _ t) = do+ goCachedIntermediate qs (NotTerm t) = do r <- goCached qs t return $ \qst -> SBV.sNot (r qst)- goCachedIntermediate qs (OrTerm _ _ _ _ a b) = do+ goCachedIntermediate qs (OrTerm a b) = do a' <- goCached qs a b' <- goCached qs b return $ \qst -> a' qst SBV..|| b' qst- goCachedIntermediate qs (AndTerm _ _ _ _ a b) = do+ goCachedIntermediate qs (AndTerm a b) = do a' <- goCached qs a b' <- goCached qs b return $ \qst -> a' qst SBV..&& b' qst- goCachedIntermediate qs (EqTerm _ _ _ _ (a :: Term v) b) = do+ goCachedIntermediate qs (EqTerm (a :: Term v) b) = do a' <- goCached qs a b' <- goCached qs b return $- introSupportedPrimConstraint a $- \qst -> sbvEq @v (a' qst) (b' qst)+ \qst -> sbvEq @v (a' qst) (b' qst) goCachedIntermediate qs- (DistinctTerm _ _ _ _ (args@(arg1 :| _) :: NonEmpty (Term t0))) = do+ (DistinctTerm (args :: NonEmpty (Term t0))) = do args' <- traverse (goCached qs) args- return $- introSupportedPrimConstraint arg1 $- \qst -> sbvDistinct @t0 (fmap ($ qst) args')- goCachedIntermediate qs (ITETerm _ _ _ _ c a b) = do+ return $ \qst -> sbvDistinct @t0 (fmap ($ qst) args')+ goCachedIntermediate qs (ITETerm c a b) = do c' <- goCached qs c a' <- goCached qs a b' <- goCached qs b return $ \qst -> sbvIte @a (c' qst) (a' qst) (b' qst)- goCachedIntermediate qs (AddNumTerm _ _ _ _ a b) = do+ goCachedIntermediate qs (AddNumTerm a b) = do a' <- goCached qs a b' <- goCached qs b return $ \qst -> sbvAddNumTerm @a (a' qst) (b' qst)- goCachedIntermediate qs (NegNumTerm _ _ _ _ a) = do+ goCachedIntermediate qs (NegNumTerm a) = do a' <- goCached qs a return $ sbvNegNumTerm @a . a'- goCachedIntermediate qs (MulNumTerm _ _ _ _ a b) = do+ goCachedIntermediate qs (MulNumTerm a b) = do a' <- goCached qs a b' <- goCached qs b return $ \qst -> sbvMulNumTerm @a (a' qst) (b' qst)- goCachedIntermediate qs (AbsNumTerm _ _ _ _ a) = do+ goCachedIntermediate qs (AbsNumTerm a) = do a' <- goCached qs a return $ sbvAbsNumTerm @a . a'- goCachedIntermediate qs (SignumNumTerm _ _ _ _ a) = do+ goCachedIntermediate qs (SignumNumTerm a) = do a' <- goCached qs a return $ sbvSignumNumTerm @a . a'- goCachedIntermediate qs (LtOrdTerm _ _ _ _ (a :: Term v) b) = do+ goCachedIntermediate qs (LtOrdTerm (a :: Term v) b) = do a' <- goCached qs a b' <- goCached qs b return $ \qst -> sbvLtOrdTerm @v (a' qst) (b' qst)- goCachedIntermediate qs (LeOrdTerm _ _ _ _ (a :: Term v) b) = do+ goCachedIntermediate qs (LeOrdTerm (a :: Term v) b) = do a' <- goCached qs a b' <- goCached qs b return $ \qst -> sbvLeOrdTerm @v (a' qst) (b' qst)- goCachedIntermediate qs (AndBitsTerm _ _ _ _ a b) = do+ goCachedIntermediate qs (AndBitsTerm a b) = do a' <- goCached qs a b' <- goCached qs b return $ \qst -> sbvAndBitsTerm @a (a' qst) (b' qst)- goCachedIntermediate qs (OrBitsTerm _ _ _ _ a b) = do+ goCachedIntermediate qs (OrBitsTerm a b) = do a' <- goCached qs a b' <- goCached qs b return $ \qst -> sbvOrBitsTerm @a (a' qst) (b' qst)- goCachedIntermediate qs (XorBitsTerm _ _ _ _ a b) = do+ goCachedIntermediate qs (XorBitsTerm a b) = do a' <- goCached qs a b' <- goCached qs b return $ \qst -> sbvXorBitsTerm @a (a' qst) (b' qst)- goCachedIntermediate qs (ComplementBitsTerm _ _ _ _ a) = do+ goCachedIntermediate qs (ComplementBitsTerm a) = do a' <- goCached qs a return $ sbvComplementBitsTerm @a . a'- goCachedIntermediate qs (ShiftLeftTerm _ _ _ _ a b) = do+ goCachedIntermediate qs (ShiftLeftTerm a b) = do a' <- goCached qs a b' <- goCached qs b return $ \qst -> sbvShiftLeftTerm @a (a' qst) (b' qst)- goCachedIntermediate qs (ShiftRightTerm _ _ _ _ a b) = do+ goCachedIntermediate qs (ShiftRightTerm a b) = do a' <- goCached qs a b' <- goCached qs b return $ \qst -> sbvShiftRightTerm @a (a' qst) (b' qst)- goCachedIntermediate qs (RotateLeftTerm _ _ _ _ a b) = do+ goCachedIntermediate qs (RotateLeftTerm a b) = do a' <- goCached qs a b' <- goCached qs b return $ \qst -> sbvRotateLeftTerm @a (a' qst) (b' qst)- goCachedIntermediate qs (RotateRightTerm _ _ _ _ a b) = do+ goCachedIntermediate qs (RotateRightTerm a b) = do a' <- goCached qs a b' <- goCached qs b return $ \qst -> sbvRotateRightTerm @a (a' qst) (b' qst)- goCachedIntermediate qs (ApplyTerm _ _ _ _ (f :: Term f) a) = do+ goCachedIntermediate qs (ApplyTerm (f :: Term f) a) = do l1 <- goCached qs f l2 <- goCached qs a return $ \qst -> sbvApplyTerm @f (l1 qst) (l2 qst)- goCachedIntermediate qs (BitCastTerm _ _ _ _ (a :: Term x)) = do+ goCachedIntermediate qs (BitCastTerm (a :: Term x)) = do a' <- goCached qs a return $ sbvBitCast @x @a . a' goCachedIntermediate qs- (BitCastOrTerm _ _ _ _ (d :: Term a) (a :: Term x)) = do+ (BitCastOrTerm (d :: Term a) (a :: Term x)) = do d' <- goCached qs d a' <- goCached qs a return $ \qst -> sbvBitCastOr @x @a (d' qst) (a' qst) goCachedIntermediate qs- (BVConcatTerm _ _ _ _ (a :: Term (bv l)) (b :: Term (bv r))) =+ (BVConcatTerm (a :: Term (bv l)) (b :: Term (bv r))) = do a' <- goCached qs a b' <- goCached qs b@@ -725,80 +719,80 @@ sbvBVConcatTerm @bv (Proxy @l) (Proxy @r) (a' qst) (b' qst) goCachedIntermediate qs- (BVExtendTerm _ _ _ _ signed (pr :: p r) (a :: Term (bv l))) =+ (BVExtendTerm signed (pr :: p r) (a :: Term (bv l))) = do a' <- goCached qs a return $ sbvBVExtendTerm @bv (Proxy @l) pr signed . a' goCachedIntermediate qs- (BVSelectTerm _ _ _ _ (pix :: p ix) (pw :: q w) (a :: Term (bv n))) =+ (BVSelectTerm (pix :: p ix) (pw :: q w) (a :: Term (bv n))) = do a' <- goCached qs a return $ sbvBVSelectTerm @bv pix pw (Proxy @n) . a'- goCachedIntermediate qs (DivIntegralTerm _ _ _ _ a b) = do+ goCachedIntermediate qs (DivIntegralTerm a b) = do a' <- goCached qs a b' <- goCached qs b return $ \qst -> sbvDivIntegralTerm @a (a' qst) (b' qst)- goCachedIntermediate qs (ModIntegralTerm _ _ _ _ a b) = do+ goCachedIntermediate qs (ModIntegralTerm a b) = do a' <- goCached qs a b' <- goCached qs b return $ \qst -> sbvModIntegralTerm @a (a' qst) (b' qst)- goCachedIntermediate qs (QuotIntegralTerm _ _ _ _ a b) = do+ goCachedIntermediate qs (QuotIntegralTerm a b) = do a' <- goCached qs a b' <- goCached qs b return $ \qst -> sbvQuotIntegralTerm @a (a' qst) (b' qst)- goCachedIntermediate qs (RemIntegralTerm _ _ _ _ a b) = do+ goCachedIntermediate qs (RemIntegralTerm a b) = do a' <- goCached qs a b' <- goCached qs b return $ \qst -> sbvRemIntegralTerm @a (a' qst) (b' qst)- goCachedIntermediate qs (FPTraitTerm _ _ _ _ trait a) = do+ goCachedIntermediate qs (FPTraitTerm trait (a :: Term (fp eb sb))) = do a' <- goCached qs a- return $ sbvFPTraitTerm trait . a'- goCachedIntermediate qs (FdivTerm _ _ _ _ a b) = do+ return $ sbvFPTraitTerm @fp @eb @sb trait . a'+ goCachedIntermediate qs (FdivTerm a b) = do a <- goCached qs a b <- goCached qs b return $ \qst -> sbvFdivTerm @a (a qst) (b qst)- goCachedIntermediate qs (RecipTerm _ _ _ _ a) = do+ goCachedIntermediate qs (RecipTerm a) = do a <- goCached qs a return $ sbvRecipTerm @a . a- goCachedIntermediate qs (FloatingUnaryTerm _ _ _ _ op a) = do+ goCachedIntermediate qs (FloatingUnaryTerm op a) = do a <- goCached qs a return $ sbvFloatingUnaryTerm @a op . a- goCachedIntermediate qs (PowerTerm _ _ _ _ a b) = do+ goCachedIntermediate qs (PowerTerm a b) = do a <- goCached qs a b <- goCached qs b return $ \qst -> sbvPowerTerm @a (a qst) (b qst)- goCachedIntermediate qs (FPUnaryTerm _ _ _ _ op a) = do+ goCachedIntermediate qs (FPUnaryTerm op (a :: Term (fp eb sb))) = do a <- goCached qs a- return $ sbvFPUnaryTerm op . a- goCachedIntermediate qs (FPBinaryTerm _ _ _ _ op a b) = do+ return $ sbvFPUnaryTerm @fp @eb @sb op . a+ goCachedIntermediate qs (FPBinaryTerm op (a :: Term (fp eb sb)) b) = do a <- goCached qs a b <- goCached qs b- return $ \qst -> sbvFPBinaryTerm op (a qst) (b qst)- goCachedIntermediate qs (FPRoundingUnaryTerm _ _ _ _ op round a) = do+ return $ \qst -> sbvFPBinaryTerm @fp @eb @sb op (a qst) (b qst)+ goCachedIntermediate qs (FPRoundingUnaryTerm op round (a :: Term (fp eb sb))) = do round <- goCached qs round a <- goCached qs a- return $ \qst -> sbvFPRoundingUnaryTerm op (round qst) (a qst)- goCachedIntermediate qs (FPRoundingBinaryTerm _ _ _ _ op round a b) = do+ return $ \qst -> sbvFPRoundingUnaryTerm @fp @eb @sb op (round qst) (a qst)+ goCachedIntermediate qs (FPRoundingBinaryTerm op round (a :: Term (fp eb sb)) b) = do round <- goCached qs round a <- goCached qs a b <- goCached qs b- return $ \qst -> sbvFPRoundingBinaryTerm op (round qst) (a qst) (b qst)- goCachedIntermediate qs (FPFMATerm _ _ _ _ round a b c) = do+ return $ \qst -> sbvFPRoundingBinaryTerm @fp @eb @sb op (round qst) (a qst) (b qst)+ goCachedIntermediate qs (FPFMATerm round (a :: Term (fp eb sb)) b c) = do round <- goCached qs round a <- goCached qs a b <- goCached qs b c <- goCached qs c- return $ \qst -> sbvFPFMATerm (round qst) (a qst) (b qst) (c qst)- goCachedIntermediate qs (FromIntegralTerm _ _ _ _ (b :: Term b)) = do+ return $ \qst -> sbvFPFMATerm @fp @eb @sb (round qst) (a qst) (b qst) (c qst)+ goCachedIntermediate qs (FromIntegralTerm (b :: Term b)) = do b <- goCached qs b return $ sbvFromIntegralTerm @b @a . b- goCachedIntermediate qs (FromFPOrTerm _ _ _ _ d mode arg) = do+ goCachedIntermediate qs (FromFPOrTerm d mode arg) = do d <- goCached qs d mode <- goCached qs mode arg <- goCached qs arg return $ \qst -> sbvFromFPOrTerm @a (d qst) (mode qst) (arg qst)- goCachedIntermediate qs (ToFPTerm _ _ _ _ mode (arg :: Term b) _ _) = do+ goCachedIntermediate qs (ToFPTerm mode (arg :: Term b) _ _) = do mode <- goCached qs mode arg <- goCached qs arg return $ \qst -> sbvToFPTerm @b (mode qst) (arg qst)@@ -806,7 +800,7 @@ goCachedIntermediate _ SymTerm {} = error "Should not happen" goCachedIntermediate _ ForallTerm {} = error "Should not happen" goCachedIntermediate _ ExistsTerm {} = error "Should not happen"- r <- introSupportedPrimConstraint t' $ goCached emptyQuantifiedSymbols t'+ r <- goCached emptyQuantifiedSymbols t' m <- liftIO $ readIORef mapState constraint <- liftIO $ readIORef accumulatedDummyConstraints return (m, r, constraint)@@ -859,9 +853,11 @@ assocFuncs = (\(s, v) -> (s, ([], v))) <$> assoc goSingle :: (String, ([([SBVD.CV], SBVD.CV)], SBVD.CV)) -> PM.Model -> PM.Model goSingle (name, cv) m = case findStringToSymbol name mp of- Just (SomeTypedSymbol (s :: TypedSymbol knd r)) ->- withSymbolSupported s $- insertValue s (parseSMTModelResult 0 cv :: r) m+ Just (SomeTypedSymbol (s@TypedSymbol {} :: TypedSymbol 'AnyKind r)) ->+ insertValue+ s+ (parseSMTModelResult 0 cv :: r)+ m Nothing -> error $ "BUG: Please send a bug report. The model is not consistent with the "
src/Grisette/Internal/Backend/SymBiMap.hs view
@@ -1,5 +1,7 @@ {-# LANGUAGE DataKinds #-}+{-# LANGUAGE GADTs #-} {-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE Strict #-} @@ -43,7 +45,7 @@ TypedSymbol (unTypedSymbol), castSomeTypedSymbol, typedConstantSymbol,- withConstantSymbolSupported,+ pattern SupportedConstantTypedSymbol, ) -- | A bidirectional map between symbolic Grisette terms and sbv terms.@@ -80,11 +82,11 @@ attachQuantifiedSymbolInfo :: (SExpr -> SExpr) -> TypedConstantSymbol a -> TypedConstantSymbol a-attachQuantifiedSymbolInfo info tsym =- withConstantSymbolSupported tsym $- typedConstantSymbol $- mapIdentifier (mapMetadata info) $- unTypedSymbol tsym+attachQuantifiedSymbolInfo info tsym@SupportedConstantTypedSymbol =+ typedConstantSymbol $+ mapIdentifier (mapMetadata info) $+ unTypedSymbol tsym+attachQuantifiedSymbolInfo _ _ = error "Should not happen" -- | Attach the next quantified symbol info to a symbol. attachNextQuantifiedSymbolInfo ::
src/Grisette/Internal/Core/Control/Monad/CBMCExcept.hs view
@@ -395,16 +395,14 @@ instance {-# OVERLAPPABLE #-}- ( GenSymSimple spec (m (CBMCEither a b))- ) =>+ (GenSymSimple spec (m (CBMCEither a b))) => GenSymSimple spec (CBMCExceptT a m b) where simpleFresh v = CBMCExceptT <$> simpleFresh v instance {-# OVERLAPPING #-}- ( GenSymSimple (m (CBMCEither e a)) (m (CBMCEither e a))- ) =>+ (GenSymSimple (m (CBMCEither e a)) (m (CBMCEither e a))) => GenSymSimple (CBMCExceptT e m a) (CBMCExceptT e m a) where simpleFresh (CBMCExceptT v) = CBMCExceptT <$> simpleFresh v
src/Grisette/Internal/Core/Data/Class/GenSym.hs view
@@ -92,6 +92,7 @@ import Data.Bifunctor (Bifunctor (first)) import qualified Data.ByteString as B import Data.Int (Int16, Int32, Int64, Int8)+import Data.List (groupBy, sortOn) import Data.Ratio (Ratio) import Data.String (IsString (fromString)) import qualified Data.Text as T@@ -112,7 +113,7 @@ unionBase, ) import Grisette.Internal.Core.Data.Class.Mergeable- ( Mergeable (rootStrategy),+ ( Mergeable (rootStrategy, sortIndices), Mergeable1 (liftRootStrategy), Mergeable2 (liftRootStrategy2), MergingStrategy (SimpleStrategy),@@ -456,8 +457,7 @@ m (Union a) default fresh :: (GenSymSimple spec a) =>- ( MonadFresh m- ) =>+ (MonadFresh m) => spec -> m (Union a) fresh spec = mrgSingle <$> simpleFresh spec@@ -491,8 +491,7 @@ -- >>> runFresh (simpleFresh (SimpleListSpec 2 ())) "a" :: [SymBool] -- [a@0,a@1] simpleFresh ::- ( MonadFresh m- ) =>+ (MonadFresh m) => spec -> m a @@ -507,8 +506,7 @@ class GenSymNoSpec a where freshNoSpec ::- ( MonadFresh m- ) =>+ (MonadFresh m) => m (Union (a c)) instance GenSymNoSpec U1 where@@ -530,8 +528,7 @@ where freshNoSpec :: forall m c.- ( MonadFresh m- ) =>+ (MonadFresh m) => m (Union ((a :+: b) c)) freshNoSpec = do cond :: bool <- simpleFresh ()@@ -545,8 +542,7 @@ where freshNoSpec :: forall m c.- ( MonadFresh m- ) =>+ (MonadFresh m) => m (Union ((a :*: b) c)) freshNoSpec = do l :: Union (a c) <- freshNoSpec@@ -617,8 +613,7 @@ class GenSymSameShape a where genSymSameShapeFresh ::- ( MonadFresh m- ) =>+ (MonadFresh m) => a c -> m (a c) @@ -669,6 +664,51 @@ m a derivedSameShapeSimpleFresh a = to <$> genSymSameShapeFresh (from a) +genGuardsUnion :: (MonadFresh m, Mergeable a) => [Union a] -> m (Union a)+genGuardsUnion [x] = return x+genGuardsUnion (r : rs) = do+ b <- simpleFresh ()+ res <- genGuardsUnion rs+ return $ mrgIf b r res+genGuardsUnion [] = error "chooseFresh expects at least one value"++genGuards :: (MonadFresh m, Mergeable a) => [a] -> m (Union a)+genGuards [x] = return $ mrgSingle x+genGuards (r : rs) = do+ b <- simpleFresh ()+ res <- genGuards rs+ return $ mrgIf b (mrgSingle r) res+genGuards [] = error "chooseFresh expects at least one value"++genGuardsSimple :: (MonadFresh m, SimpleMergeable a) => [a] -> m a+genGuardsSimple [x] = return x+genGuardsSimple (r : rs) = do+ b <- simpleFresh ()+ res <- genGuardsSimple rs+ return $ mrgIte b r res+genGuardsSimple [] = error "chooseFresh expects at least one value"++leveledChoose ::+ (Monad m, Mergeable b1) =>+ ([b2] -> m b2) -> ([b1] -> m b2) -> [b1] -> m b2+leveledChoose gen gen' l = go 0 choicesWithIndices+ where+ indices = sortIndices <$> l+ choicesWithIndices = sortOn snd $ zip l indices+ go i l = do+ let grouped =+ groupBy+ ( \(_, a) (_, b) ->+ (length a <= i && length b <= i) || a !! i == b !! i+ )+ l+ allChoices <- traverse (go' i) grouped+ gen allChoices+ go' i l =+ if length (snd $ head l) <= i+ then gen' $ fst <$> l+ else go (i + 1) l+ -- | Symbolically chooses one of the provided values. -- The procedure creates @n - 1@ fresh symbolic boolean variables every time it -- is evaluated, and use these variables to conditionally select one of the @n@@@ -686,20 +726,14 @@ ) => [a] -> m (Union a)-chooseFresh [x] = return $ mrgSingle x-chooseFresh (r : rs) = do- b <- simpleFresh ()- res <- chooseFresh rs- return $ mrgIf b (mrgSingle r) res-chooseFresh [] = error "chooseFresh expects at least one value"+chooseFresh = leveledChoose genGuardsUnion genGuards -- | A wrapper for `chooseFresh` that executes the `MonadFresh` context. -- A globally unique identifier should be supplied to ensure the uniqueness of -- symbolic constants in the generated symbolic values. choose :: forall a.- ( Mergeable a- ) =>+ (Mergeable a) => [a] -> Identifier -> Union a@@ -722,20 +756,14 @@ ) => [a] -> m a-chooseSimpleFresh [x] = return x-chooseSimpleFresh (r : rs) = do- b :: bool <- simpleFresh ()- res <- chooseSimpleFresh rs- return $ mrgIte b r res-chooseSimpleFresh [] = error "chooseSimpleFresh expects at least one value"+chooseSimpleFresh = leveledChoose genGuardsSimple genGuardsSimple -- | A wrapper for `chooseSimpleFresh` that executes the `MonadFresh` context. -- A globally unique identifier should be supplied to ensure the uniqueness of -- symbolic constants in the generated symbolic values. chooseSimple :: forall a.- ( SimpleMergeable a- ) =>+ (SimpleMergeable a) => [a] -> Identifier -> a@@ -760,20 +788,14 @@ ) => [Union a] -> m (Union a)-chooseUnionFresh [x] = return x-chooseUnionFresh (r : rs) = do- b <- simpleFresh ()- res <- chooseUnionFresh rs- return $ mrgIf b r res-chooseUnionFresh [] = error "chooseUnionFresh expects at least one value"+chooseUnionFresh = leveledChoose genGuardsUnion genGuardsUnion -- | A wrapper for `chooseUnionFresh` that executes the `MonadFresh` context. -- A globally unique identifier should be supplied to ensure the uniqueness of -- symbolic constants in the generated symbolic values. chooseUnion :: forall a.- ( Mergeable a- ) =>+ (Mergeable a) => [Union a] -> Identifier -> Union a@@ -1584,16 +1606,14 @@ instance {-# OVERLAPPABLE #-}- ( GenSymSimple spec (m (Maybe a))- ) =>+ (GenSymSimple spec (m (Maybe a))) => GenSymSimple spec (MaybeT m a) where simpleFresh v = MaybeT <$> simpleFresh v instance {-# OVERLAPPING #-}- ( GenSymSimple (m (Maybe a)) (m (Maybe a))- ) =>+ (GenSymSimple (m (Maybe a)) (m (Maybe a))) => GenSymSimple (MaybeT m a) (MaybeT m a) where simpleFresh (MaybeT v) = MaybeT <$> simpleFresh v@@ -1622,16 +1642,14 @@ instance {-# OVERLAPPABLE #-}- ( GenSymSimple spec (m (Either a b))- ) =>+ (GenSymSimple spec (m (Either a b))) => GenSymSimple spec (ExceptT a m b) where simpleFresh v = ExceptT <$> simpleFresh v instance {-# OVERLAPPING #-}- ( GenSymSimple (m (Either e a)) (m (Either e a))- ) =>+ (GenSymSimple (m (Either e a)) (m (Either e a))) => GenSymSimple (ExceptT e m a) (ExceptT e m a) where simpleFresh (ExceptT v) = ExceptT <$> simpleFresh v
src/Grisette/Internal/Core/Data/Class/SymFiniteBits.hs view
@@ -39,7 +39,7 @@ import Data.Word (Word16, Word32, Word64, Word8) import GHC.TypeLits (KnownNat, type (<=)) import Grisette.Internal.Core.Data.Class.BitVector- ( BV (bv, bvSelect),+ ( BV (bv, bvConcat, bvSelect), ) import Grisette.Internal.Core.Data.Class.ITEOp (ITEOp (symIte)) import Grisette.Internal.Core.Data.Class.SymEq (SymEq ((.==)))@@ -52,6 +52,7 @@ ) import Grisette.Internal.SymPrim.SymBV (SymIntN, SymWordN) import Grisette.Internal.SymPrim.SymBool (SymBool)+import Unsafe.Coerce (unsafeCoerce) -- | Set a bit in a concrete value to a specific value. setBitTo :: (Bits a) => a -> Int -> Bool -> a@@ -152,10 +153,12 @@ symFromBits bits | length bits /= finiteBitSize (undefined :: SymWordN n) = error "symFromBits: length mismatch"- | otherwise = foldl1 (.|.) lst+ | otherwise = case foldl1 bvConcat $ SomeBV <$> reverse lst of+ SomeBV r -> unsafeCoerce r+ _ -> error "symFromBits: length mismatch" where- lst :: [SymIntN n]- lst = (\(pos, b) -> symIte b (setBit 0 pos) 0) <$> zip [0 ..] bits+ lst :: [SymIntN 1]+ lst = (\b -> symIte b 1 0) <$> bits instance (KnownNat n, 1 <= n) => SymFiniteBits (SymWordN n) where symTestBit v = symTestBit (SomeBV v)@@ -163,10 +166,12 @@ symFromBits bits | length bits /= finiteBitSize (undefined :: SymWordN n) = error "symFromBits: length mismatch"- | otherwise = foldl1 (.|.) lst+ | otherwise = case foldl1 bvConcat $ SomeBV <$> reverse lst of+ SomeBV r -> unsafeCoerce r+ _ -> error "symFromBits: length mismatch" where- lst :: [SymWordN n]- lst = (\(pos, b) -> symIte b (setBit 0 pos) 0) <$> zip [0 ..] bits+ lst :: [SymWordN 1]+ lst = (\b -> symIte b 1 0) <$> bits -- | Bit-blast a symbolic value into a list of symbolic bits. The first element -- in the resulting list corresponds to the least significant bit.@@ -183,13 +188,28 @@ -- | Count the number of set bits in a symbolic value. symPopCount :: (Num a, ITEOp a, SymFiniteBits a) => a -> a--- Node: v - v + is a trick to assign the correct bit-width to the result.-symPopCount v = v - v + sum ((\b -> symIte b 1 0) <$> symBitBlast v)+symPopCount v = 0 * v + adderTree (map fromBool (symBitBlast v))+ where+ -- Convert a symbolic boolean to a numeric value (0 or 1)+ -- Node: 0 * v + is a trick to assign the correct bit-width to the result.+ fromBool b = 0 * v + symIte b 1 0 + -- Implement binary adder tree to efficiently sum values+ adderTree :: (Num a) => [a] -> a+ adderTree [] = 0+ adderTree [x] = x+ adderTree xs = adderTree (pairwiseAdd xs)++ -- Add adjacent pairs of values+ pairwiseAdd :: (Num a) => [a] -> [a]+ pairwiseAdd [] = []+ pairwiseAdd [x] = [x]+ pairwiseAdd (x : y : rest) = (x + y) : pairwiseAdd rest+ -- | Count the number of leading zeros in a symbolic value. symCountLeadingZeros :: (Num a, ITEOp a, SymFiniteBits a) => a -> a--- Node: v - v + is a trick to assign the correct bit-width to the result.-symCountLeadingZeros v = v - v + go bits rs+-- Node: 0 * v + is a trick to assign the correct bit-width to the result.+symCountLeadingZeros v = 0 * v + go bits rs where bits = reverse $ symBitBlast v rs = fromIntegral <$> [0 ..]@@ -199,8 +219,8 @@ -- | Count the number of trailing zeros in a symbolic value. symCountTrailingZeros :: (Num a, ITEOp a, SymFiniteBits a) => a -> a--- Node: v - v + is a trick to assign the correct bit-width to the result.-symCountTrailingZeros v = v - v + go bits rs+-- Node: 0 * v + is a trick to assign the correct bit-width to the result.+symCountTrailingZeros v = 0 * v + go bits rs where bits = symBitBlast v rs = fromIntegral <$> [0 ..]
src/Grisette/Internal/Core/Data/Symbol.hs view
@@ -6,10 +6,12 @@ {-# LANGUAGE GADTs #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeOperators #-}+{-# LANGUAGE ViewPatterns #-} {-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} -- |@@ -32,6 +34,8 @@ indexed, symbolIdentifier, mapIdentifier,+ AsMetadata (..),+ pattern Metadata, ) where @@ -113,6 +117,23 @@ instance IsString Identifier where fromString i = Identifier (T.pack i) $ List [] +-- | A type class for embedding a type into a metadata represented as an+-- S-expression.+class AsMetadata a where+ asMetadata :: a -> SExpr+ fromMetadata :: SExpr -> Maybe a++-- | A pattern for extracting a value from a metadata represented as an+-- S-expression.+pattern Metadata :: (AsMetadata a) => a -> SExpr+pattern Metadata m <- (fromMetadata -> Just m)+ where+ Metadata m = asMetadata m++instance AsMetadata SExpr where+ asMetadata = id+ fromMetadata = Just+ -- | Simple identifier. -- The same identifier refers to the same symbolic variable in the whole -- program.@@ -129,16 +150,17 @@ -- -- The user may need to use unique identifiers or additional metadata to -- avoid unintentional identifier collision.-withMetadata :: T.Text -> SExpr -> Identifier-withMetadata = Identifier+withMetadata :: (AsMetadata a) => T.Text -> a -> Identifier+withMetadata ident meta = Identifier ident (asMetadata meta) -- | Identifier with the file location. withLocation :: T.Text -> SpliceQ Identifier withLocation nm = [||withMetadata nm $$fileLocation||] -- | Modify the metadata of an identifier.-mapMetadata :: (SExpr -> SExpr) -> Identifier -> Identifier-mapMetadata f (Identifier i m) = Identifier i (f m)+mapMetadata ::+ (AsMetadata a) => (SExpr -> a) -> Identifier -> Identifier+mapMetadata f (Identifier i m) = Identifier i (asMetadata $ f m) identifierCount :: IORef Int identifierCount = unsafePerformIO $ newIORef 0
src/Grisette/Internal/Internal/Decl/Core/Control/Monad/Union.hs view
@@ -30,16 +30,17 @@ import Data.String (IsString (fromString)) import Grisette.Internal.Core.Data.Class.PlainUnion- ( PlainUnion (ifView, singleView),+ ( PlainUnion (ifView, singleView, toGuardedList), ) import Grisette.Internal.Core.Data.Class.Solvable ( Solvable (con, conView, sym), pattern Con, ) import Grisette.Internal.Internal.Decl.Core.Data.Class.Mergeable- ( Mergeable (rootStrategy),+ ( Mergeable (rootStrategy, sortIndices), Mergeable1 (liftRootStrategy), MergingStrategy (SimpleStrategy),+ resolveStrategy, rootStrategy1, ) import Grisette.Internal.Internal.Decl.Core.Data.Class.SimpleMergeable@@ -229,6 +230,7 @@ instance (Mergeable a) => Mergeable (Union a) where rootStrategy = rootStrategy1 {-# INLINE rootStrategy #-}+ sortIndices = fst . resolveStrategy rootStrategy . snd . head . toGuardedList instance (Mergeable a) => SimpleMergeable (Union a) where mrgIte = mrgIf
src/Grisette/Internal/Internal/Decl/Core/Data/Class/Mergeable.hs view
@@ -205,6 +205,9 @@ -- | The root merging strategy for the type. rootStrategy :: MergingStrategy a + sortIndices :: a -> [DynamicSortedIdx]+ sortIndices = fst . resolveStrategy rootStrategy+ -- | Lifting of the 'Mergeable' class to unary type constructors. class (forall a. (Mergeable a) => Mergeable (u a)) =>
src/Grisette/Internal/Internal/Decl/Core/Data/Class/SimpleMergeable.hs view
@@ -68,7 +68,8 @@ import Grisette.Internal.Internal.Decl.Core.Data.Class.TryMerge ( TryMerge (tryMergeWithStrategy), )-import Grisette.Internal.SymPrim.SymBool (SymBool)+import Grisette.Internal.SymPrim.Prim.Internal.Term (SupportedPrim (pevalITETerm))+import Grisette.Internal.SymPrim.SymBool (SymBool (SymBool)) import Grisette.Internal.Utils.Derive (Arity0, Arity1) -- $setup@@ -301,5 +302,9 @@ {-# INLINE mrgIf #-} instance SimpleMergeable SymBool where- mrgIte = symIte+ mrgIte (SymBool c) (SymBool t) (SymBool f) = SymBool $ pevalITETerm c t f {-# INLINE mrgIte #-}++instance {-# OVERLAPPABLE #-} (SimpleMergeable a) => ITEOp a where+ symIte = mrgIte+ {-# INLINE symIte #-}
src/Grisette/Internal/Internal/Decl/Core/Data/Class/SymEq.hs view
@@ -100,7 +100,7 @@ -- >>> a .== b -- (= a b) -- >>> a ./= b--- (distinct a b)+-- (! (= a b)) -- -- __Note:__ This type class can be derived for algebraic data types. -- You may need the @DerivingVia@ and @DerivingStrategies@ extensions.
src/Grisette/Internal/Internal/Impl/Core/Control/Monad/Union.hs view
@@ -414,7 +414,7 @@ abs = tryMerge . unionUnaryOp abs signum = tryMerge . unionUnaryOp signum -instance (ITEOp a, Mergeable a) => ITEOp (Union a) where+instance (Mergeable a) => ITEOp (Union a) where symIte = mrgIf instance (LogicalOp a, Mergeable a) => LogicalOp (Union a) where
src/Grisette/Internal/Internal/Impl/Core/Data/Class/EvalSym.hs view
@@ -100,7 +100,7 @@ import Grisette.Internal.SymPrim.SymInteger (SymInteger (SymInteger)) import Grisette.Internal.SymPrim.SymTabularFun (type (=~>) (SymTabularFun)) import Grisette.Internal.SymPrim.TabularFun (type (=->) (TabularFun))-import Grisette.Internal.TH.GADT.DeriveGADT (deriveGADT)+import Grisette.Internal.TH.Derivation.Derive (derive) #define CONCRETE_EVALUATESYM(type) \ instance EvalSym type where \@@ -184,7 +184,7 @@ evalSym fillDefault model (SymFP t) = SymFP $ evalTerm fillDefault model HS.empty t -deriveGADT+derive [ ''(), ''AssertionError, ''VerificationConditions,@@ -192,7 +192,7 @@ ] [''EvalSym] -deriveGADT+derive [ ''Either, ''(,), ''(,,),@@ -211,7 +211,7 @@ ] [''EvalSym, ''EvalSym1, ''EvalSym2] -deriveGADT+derive [ ''[], ''Maybe, ''Identity,
src/Grisette/Internal/Internal/Impl/Core/Data/Class/ExtractSym.hs view
@@ -106,7 +106,7 @@ import Grisette.Internal.SymPrim.SymInteger (SymInteger (SymInteger)) import Grisette.Internal.SymPrim.SymTabularFun (type (=~>) (SymTabularFun)) import Grisette.Internal.SymPrim.TabularFun (type (=->) (TabularFun))-import Grisette.Internal.TH.GADT.DeriveGADT (deriveGADT)+import Grisette.Internal.TH.Derivation.Derive (derive) -- $setup -- >>> import Grisette.Core@@ -212,7 +212,7 @@ Left HRefl -> SymbolSet <$> extractTerm HS.empty t Right HRefl -> SymbolSet <$> extractTerm HS.empty t -deriveGADT+derive [ ''(), ''AssertionError, ''VerificationConditions,@@ -220,7 +220,7 @@ ] [''ExtractSym] -deriveGADT+derive [ ''Either, ''(,), ''(,,),@@ -239,7 +239,7 @@ ] [''ExtractSym, ''ExtractSym1, ''ExtractSym2] -deriveGADT+derive [ ''[], ''Maybe, ''Identity,
src/Grisette/Internal/Internal/Impl/Core/Data/Class/Mergeable.hs view
@@ -118,7 +118,7 @@ import Grisette.Internal.SymPrim.SymInteger (SymInteger) import Grisette.Internal.SymPrim.SymTabularFun (type (=~>)) import Grisette.Internal.SymPrim.TabularFun (type (=->))-import Grisette.Internal.TH.GADT.DeriveGADT (deriveGADT)+import Grisette.Internal.TH.Derivation.Derive (derive) import Unsafe.Coerce (unsafeCoerce) #define CONCRETE_ORD_MERGEABLE(type) \@@ -276,13 +276,13 @@ instance Mergeable () where rootStrategy = SimpleStrategy $ \_ t _ -> t -deriveGADT+derive [ ''Either, ''(,) ] [''Mergeable, ''Mergeable1, ''Mergeable2] -deriveGADT+derive [ ''(,,), ''(,,,), ''(,,,,),@@ -299,7 +299,7 @@ ] [''Mergeable, ''Mergeable1, ''Mergeable2, ''Mergeable3] -deriveGADT+derive [ ''Maybe, ''Identity, ''Monoid.Dual,@@ -317,7 +317,7 @@ ] [''Mergeable, ''Mergeable1] -deriveGADT+derive [ ''AssertionError, ''VerificationConditions, ''NotRepresentableFPError,
src/Grisette/Internal/Internal/Impl/Core/Data/Class/PPrint.hs view
@@ -86,11 +86,12 @@ ValidFP, ) import Grisette.Internal.SymPrim.GeneralFun (type (-->))-import Grisette.Internal.SymPrim.Prim.Internal.Term ()+import Grisette.Internal.SymPrim.Prim.Internal.Term (Term) import Grisette.Internal.SymPrim.Prim.Model ( Model (Model), SymbolSet (SymbolSet), )+import Grisette.Internal.SymPrim.Prim.SomeTerm (SomeTerm (SomeTerm)) import Grisette.Internal.SymPrim.Prim.Term ( ModelValue, SomeTypedSymbol (SomeTypedSymbol),@@ -111,7 +112,7 @@ import Grisette.Internal.SymPrim.SymInteger (SymInteger (SymInteger)) import Grisette.Internal.SymPrim.SymTabularFun (type (=~>) (SymTabularFun)) import Grisette.Internal.SymPrim.TabularFun (type (=->))-import Grisette.Internal.TH.GADT.DeriveGADT (deriveGADT)+import Grisette.Internal.TH.Derivation.Derive (derive) #define FORMAT_SIMPLE(type) \ instance PPrint type where pformatPrec = viaShowsPrec showsPrec@@ -174,6 +175,12 @@ instance PPrint (a --> b) where pformat = viaShow +instance PPrint (Term t) where+ pformat = prettyPrintTerm++instance PPrint SomeTerm where+ pformat (SomeTerm t) = prettyPrintTerm t+ -- Prettyprint #define FORMAT_SYM_SIMPLE(symtype) \ instance PPrint symtype where \@@ -201,7 +208,7 @@ instance (ValidFP eb sb) => PPrint (SymFP eb sb) where pformat (SymFP t) = prettyPrintTerm t -deriveGADT+derive [ ''(), ''AssertionError, ''VerificationConditions,@@ -209,7 +216,7 @@ ] [''PPrint] -deriveGADT+derive [ ''Either, ''(,), ''(,,),@@ -228,7 +235,7 @@ ] [''PPrint, ''PPrint1, ''PPrint2] -deriveGADT+derive [ ''Maybe, ''Monoid.Dual, ''Monoid.First,
src/Grisette/Internal/Internal/Impl/Core/Data/Class/SimpleMergeable.hs view
@@ -42,6 +42,7 @@ import Data.Functor.Compose (Compose (Compose)) import Data.Functor.Const (Const) import Data.Functor.Product (Product)+import qualified Data.HashSet as HS import Data.Monoid (Alt, Ap, Endo (Endo)) import qualified Data.Monoid as Monoid import Data.Ord (Down)@@ -59,7 +60,6 @@ import GHC.TypeNats (KnownNat, type (<=)) import Generics.Deriving (Default (Default), Default1 (Default1)) import Grisette.Internal.Core.Control.Exception (AssertionError)-import Grisette.Internal.Core.Data.Class.ITEOp (ITEOp (symIte)) import Grisette.Internal.Core.Data.Class.Mergeable ( Mergeable (rootStrategy), Mergeable1 (liftRootStrategy),@@ -77,24 +77,28 @@ ) import Grisette.Internal.Internal.Impl.Core.Data.Class.TryMerge () import Grisette.Internal.SymPrim.FP (ValidFP)-import Grisette.Internal.SymPrim.GeneralFun (type (-->))-import Grisette.Internal.SymPrim.SymAlgReal (SymAlgReal)+import Grisette.Internal.SymPrim.GeneralFun (freshArgSymbol, substTerm, type (-->) (GeneralFun))+import Grisette.Internal.SymPrim.Prim.Internal.Term (SupportedPrim (pevalITETerm), symTerm)+import Grisette.Internal.SymPrim.Prim.SomeTerm (SomeTerm (SomeTerm))+import Grisette.Internal.SymPrim.Prim.Term (TypedConstantSymbol)+import Grisette.Internal.SymPrim.SymAlgReal (SymAlgReal (SymAlgReal)) import Grisette.Internal.SymPrim.SymBV- ( SymIntN,- SymWordN,+ ( SymIntN (SymIntN),+ SymWordN (SymWordN), )-import Grisette.Internal.SymPrim.SymFP (SymFP, SymFPRoundingMode)-import Grisette.Internal.SymPrim.SymGeneralFun (type (-~>))-import Grisette.Internal.SymPrim.SymInteger (SymInteger)-import Grisette.Internal.SymPrim.SymTabularFun (type (=~>))-import Grisette.Internal.TH.GADT.DeriveGADT (deriveGADT)+import Grisette.Internal.SymPrim.SymBool (SymBool (SymBool))+import Grisette.Internal.SymPrim.SymFP (SymFP (SymFP), SymFPRoundingMode (SymFPRoundingMode))+import Grisette.Internal.SymPrim.SymGeneralFun (type (-~>) (SymGeneralFun))+import Grisette.Internal.SymPrim.SymInteger (SymInteger (SymInteger))+import Grisette.Internal.SymPrim.SymTabularFun (type (=~>) (SymTabularFun))+import Grisette.Internal.TH.Derivation.Derive (derive) -- $setup -- >>> import Grisette.Core -- >>> import Grisette.SymPrim -- >>> import Control.Monad.Identity -deriveGADT+derive [ ''(,), ''(,,), ''(,,,),@@ -112,7 +116,7 @@ ] [''SimpleMergeable, ''SimpleMergeable1, ''SimpleMergeable2] -deriveGADT+derive [ ''Identity, ''Monoid.Dual, ''Monoid.Sum,@@ -121,7 +125,7 @@ ] [''SimpleMergeable, ''SimpleMergeable1] -deriveGADT+derive [''(), ''AssertionError] [''SimpleMergeable] @@ -532,17 +536,17 @@ #define SIMPLE_MERGEABLE_SIMPLE(symtype) \ instance SimpleMergeable symtype where \- mrgIte = symIte; \+ mrgIte (SymBool c) (symtype t) (symtype f) = symtype $ pevalITETerm c t f; \ {-# INLINE mrgIte #-} #define SIMPLE_MERGEABLE_BV(symtype) \ instance (KnownNat n, 1 <= n) => SimpleMergeable (symtype n) where \- mrgIte = symIte; \+ mrgIte (SymBool c) (symtype t) (symtype f) = symtype $ pevalITETerm c t f; \ {-# INLINE mrgIte #-} -#define SIMPLE_MERGEABLE_FUN(cop, op) \+#define SIMPLE_MERGEABLE_FUN(cop, op, cons) \ instance SimpleMergeable (op sa sb) where \- mrgIte = symIte; \+ mrgIte (SymBool c) (cons t) (cons f) = cons $ pevalITETerm c t f; \ {-# INLINE mrgIte #-} #if 1@@ -551,14 +555,25 @@ SIMPLE_MERGEABLE_SIMPLE(SymAlgReal) SIMPLE_MERGEABLE_BV(SymIntN) SIMPLE_MERGEABLE_BV(SymWordN)-SIMPLE_MERGEABLE_FUN((=->), (=~>))-SIMPLE_MERGEABLE_FUN((-->), (-~>))+SIMPLE_MERGEABLE_FUN((=->), (=~>), SymTabularFun)+SIMPLE_MERGEABLE_FUN((-->), (-~>), SymGeneralFun) #endif instance SimpleMergeable (a --> b) where- mrgIte = symIte+ mrgIte+ (SymBool c)+ (GeneralFun (ta :: TypedConstantSymbol a) a)+ (GeneralFun tb b) =+ GeneralFun argSymbol $+ pevalITETerm+ c+ (substTerm ta (symTerm argSymbol) HS.empty a)+ (substTerm tb (symTerm argSymbol) HS.empty b)+ where+ argSymbol :: TypedConstantSymbol a+ argSymbol = freshArgSymbol [SomeTerm a, SomeTerm b] {-# INLINE mrgIte #-} instance (ValidFP eb sb) => SimpleMergeable (SymFP eb sb) where- mrgIte = symIte+ mrgIte (SymBool c) (SymFP t) (SymFP f) = SymFP $ pevalITETerm c t f {-# INLINE mrgIte #-}
src/Grisette/Internal/Internal/Impl/Core/Data/Class/Solver.hs view
@@ -36,7 +36,7 @@ import Grisette.Internal.Internal.Decl.Core.Data.Class.PPrint (PPrint) import Grisette.Internal.Internal.Decl.Core.Data.Class.Solver (SolvingFailure) import Grisette.Internal.Internal.Impl.Core.Data.Class.PPrint ()-import Grisette.Internal.TH.GADT.DeriveGADT (deriveGADT)+import Grisette.Internal.TH.Derivation.Derive (derive) -- $setup -- >>> import Grisette@@ -44,7 +44,7 @@ -- >>> import Grisette.SymPrim -- >>> import Grisette.Backend -deriveGADT+derive [''SolvingFailure] [ ''Show, ''Eq,
src/Grisette/Internal/Internal/Impl/Core/Data/Class/SubstSym.hs view
@@ -99,7 +99,7 @@ import Grisette.Internal.SymPrim.SymInteger (SymInteger (SymInteger)) import Grisette.Internal.SymPrim.SymTabularFun (type (=~>) (SymTabularFun)) import Grisette.Internal.SymPrim.TabularFun (type (=->) (TabularFun))-import Grisette.Internal.TH.GADT.DeriveGADT (deriveGADT)+import Grisette.Internal.TH.Derivation.Derive (derive) #define CONCRETE_SUBSTITUTESYM(type) \ instance SubstSym type where \@@ -181,7 +181,7 @@ instance (ValidFP eb sb) => SubstSym (SymFP eb sb) where substSym sym v (SymFP t) = SymFP $ substTerm sym (underlyingTerm v) HS.empty t -deriveGADT+derive [ ''(), ''AssertionError, ''VerificationConditions,@@ -189,7 +189,7 @@ ] [''SubstSym] -deriveGADT+derive [ ''Either, ''(,), ''(,,),@@ -208,7 +208,7 @@ ] [''SubstSym, ''SubstSym1, ''SubstSym2] -deriveGADT+derive [ ''[], ''Maybe, ''Identity,
src/Grisette/Internal/Internal/Impl/Core/Data/Class/SymEq.hs view
@@ -92,7 +92,7 @@ SymFPRoundingMode (SymFPRoundingMode), ) import Grisette.Internal.SymPrim.SymInteger (SymInteger (SymInteger))-import Grisette.Internal.TH.GADT.DeriveGADT (deriveGADT)+import Grisette.Internal.TH.Derivation.Derive (derive) #define CONCRETE_SEQ(type) \ instance SymEq type where \@@ -183,7 +183,7 @@ (SymFP l) .== (SymFP r) = SymBool $ pevalEqTerm l r {-# INLINE (.==) #-} -deriveGADT+derive [ ''(), ''AssertionError, ''VerificationConditions,@@ -191,7 +191,7 @@ ] [''SymEq] -deriveGADT+derive [ ''Either, ''(,), ''(,,),@@ -210,7 +210,7 @@ ] [''SymEq, ''SymEq1, ''SymEq2] -deriveGADT+derive [ ''[], ''Maybe, ''Identity,
src/Grisette/Internal/Internal/Impl/Core/Data/Class/SymOrd.hs view
@@ -103,7 +103,7 @@ SymFPRoundingMode (SymFPRoundingMode), ) import Grisette.Internal.SymPrim.SymInteger (SymInteger (SymInteger))-import Grisette.Internal.TH.GADT.DeriveGADT (deriveGADT)+import Grisette.Internal.TH.Derivation.Derive (derive) #define CONCRETE_SORD(type) \ instance SymOrd type where \@@ -286,7 +286,7 @@ y1 <- y f x1 y1 -deriveGADT+derive [ ''(), ''AssertionError, ''VerificationConditions,@@ -294,7 +294,7 @@ ] [''SymOrd] -deriveGADT+derive [ ''Either, ''(,), ''(,,),@@ -313,7 +313,7 @@ ] [''SymOrd, ''SymOrd1, ''SymOrd2] -deriveGADT+derive [ ''Maybe, ''Identity, ''Monoid.Dual,
src/Grisette/Internal/Internal/Impl/Core/Data/Class/ToCon.hs view
@@ -107,7 +107,7 @@ import Grisette.Internal.SymPrim.SymInteger (SymInteger) import Grisette.Internal.SymPrim.SymTabularFun (type (=~>) (SymTabularFun)) import Grisette.Internal.SymPrim.TabularFun (type (=->))-import Grisette.Internal.TH.GADT.DeriveGADT (deriveGADT)+import Grisette.Internal.TH.Derivation.Derive (derive) -- $setup -- >>> import Grisette.Core@@ -247,7 +247,7 @@ _ -> Nothing toCon _ = Nothing -deriveGADT+derive [ ''Either, ''(,), ''(,,),@@ -266,7 +266,7 @@ ] [''ToCon, ''ToCon1, ''ToCon2] -deriveGADT+derive [ ''[], ''Maybe, ''Monoid.Dual,@@ -282,7 +282,7 @@ ] [''ToCon, ''ToCon1] -deriveGADT+derive [ ''(), ''AssertionError, ''VerificationConditions,
src/Grisette/Internal/Internal/Impl/Core/Data/Class/ToSym.hs view
@@ -112,7 +112,7 @@ import Grisette.Internal.SymPrim.SymInteger (SymInteger) import Grisette.Internal.SymPrim.SymTabularFun (type (=~>)) import Grisette.Internal.SymPrim.TabularFun (type (=->))-import Grisette.Internal.TH.GADT.DeriveGADT (deriveGADT)+import Grisette.Internal.TH.Derivation.Derive (derive) -- $setup -- >>> import Grisette.SymPrim@@ -258,7 +258,7 @@ liftToSym l f = l . f . toSym {-# INLINE liftToSym #-} -deriveGADT+derive [ ''Either, ''(,), ''(,,),@@ -277,7 +277,7 @@ ] [''ToSym, ''ToSym1, ''ToSym2] -deriveGADT+derive [ ''[], ''Maybe, ''Monoid.Dual,@@ -293,7 +293,7 @@ ] [''ToSym, ''ToSym1] -deriveGADT+derive [ ''(), ''AssertionError, ''VerificationConditions,
src/Grisette/Internal/Internal/Impl/SymPrim/AllSyms.hs view
@@ -60,7 +60,7 @@ import Grisette.Internal.SymPrim.AlgReal (AlgReal) import Grisette.Internal.SymPrim.BV (IntN, WordN) import Grisette.Internal.SymPrim.FP (FP, FPRoundingMode, ValidFP)-import Grisette.Internal.TH.GADT.DeriveGADT (deriveGADT)+import Grisette.Internal.TH.Derivation.Derive (derive) -- $setup -- >>> import Grisette.Core@@ -68,7 +68,7 @@ -- >>> import Grisette.Backend -- >>> import Data.Proxy -deriveGADT+derive [ ''Either, ''(,), ''(,,),@@ -86,7 +86,7 @@ ''(,,,,,,,,,,,,,,) ] [''AllSyms, ''AllSyms1, ''AllSyms2]-deriveGADT+derive [ ''[], ''Maybe, ''Identity,@@ -96,7 +96,7 @@ ''WriterStrict.WriterT ] [''AllSyms, ''AllSyms1]-deriveGADT+derive [ ''(), ''AssertionError, ''VerificationConditions
src/Grisette/Internal/Internal/Impl/Unified/Class/UnifiedSimpleMergeable.hs view
@@ -69,7 +69,7 @@ UnifiedSimpleMergeable1 (withBaseSimpleMergeable1), UnifiedSimpleMergeable2 (withBaseSimpleMergeable2), )-import Grisette.Internal.TH.GADT.DeriveGADT (deriveGADT)+import Grisette.Internal.TH.Derivation.Derive (derive) import Grisette.Internal.Unified.BaseMonad (BaseMonad) import Grisette.Internal.Unified.EvalModeTag (IsConMode) import Grisette.Internal.Unified.UnifiedBool (UnifiedBool (GetBool))@@ -256,7 +256,7 @@ withBaseSimpleMergeable2 r = r {-# INLINE withBaseSimpleMergeable2 #-} -deriveGADT+derive [ ''(,), ''(,,), ''(,,,),@@ -277,11 +277,11 @@ ''UnifiedSimpleMergeable2 ] -deriveGADT+derive [''Identity] [''UnifiedSimpleMergeable, ''UnifiedSimpleMergeable1] -deriveGADT+derive [''(), ''AssertionError] [''UnifiedSimpleMergeable]
src/Grisette/Internal/Internal/Impl/Unified/Class/UnifiedSymEq.hs view
@@ -66,10 +66,10 @@ ) import Grisette.Internal.SymPrim.BV (IntN, WordN) import Grisette.Internal.SymPrim.FP (FP, FPRoundingMode)-import Grisette.Internal.TH.GADT.Common+import Grisette.Internal.TH.Derivation.Common ( DeriveConfig (bitSizePositions, fpBitSizePositions), )-import Grisette.Internal.TH.GADT.DeriveGADT (deriveGADT, deriveGADTWith)+import Grisette.Internal.TH.Derivation.Derive (derive, deriveWith) import Grisette.Internal.Unified.EvalModeTag (EvalModeTag (S), IsConMode) import Grisette.Internal.Unified.UnifiedBool (UnifiedBool (GetBool)) import Grisette.Internal.Unified.Util (DecideEvalMode, withMode)@@ -229,13 +229,13 @@ withBaseSymEq r = withBaseSymEq @'S @v r {-# INLINE withBaseSymEq #-} -deriveGADT+derive [ ''Either, ''(,) ] [''UnifiedSymEq, ''UnifiedSymEq1, ''UnifiedSymEq2] -deriveGADT+derive [ ''[], ''Maybe, ''Identity,@@ -246,7 +246,7 @@ ] [''UnifiedSymEq, ''UnifiedSymEq1] -deriveGADT+derive [ ''Bool, ''Integer, ''Char,@@ -284,25 +284,25 @@ [''UnifiedSymEq] #if MIN_VERSION_base(4,16,0)-deriveGADT+derive [ ''(,,), ''(,,,) ] [''UnifiedSymEq, ''UnifiedSymEq1, ''UnifiedSymEq2] #else-deriveGADT+derive [ ''(,,), ''(,,,) ] [''UnifiedSymEq] #endif -deriveGADTWith+deriveWith (mempty {bitSizePositions = [0]}) [''WordN, ''IntN] [''UnifiedSymEq] -deriveGADTWith+deriveWith (mempty {fpBitSizePositions = [(0, 1)]}) [''FP] [''UnifiedSymEq]
src/Grisette/Internal/Internal/Impl/Unified/Class/UnifiedSymOrd.hs view
@@ -85,10 +85,10 @@ ) import Grisette.Internal.SymPrim.BV (IntN, WordN) import Grisette.Internal.SymPrim.FP (FP, FPRoundingMode)-import Grisette.Internal.TH.GADT.Common+import Grisette.Internal.TH.Derivation.Common ( DeriveConfig (bitSizePositions, fpBitSizePositions), )-import Grisette.Internal.TH.GADT.DeriveGADT (deriveGADT, deriveGADTWith)+import Grisette.Internal.TH.Derivation.Derive (derive, deriveWith) import Grisette.Internal.Unified.BaseMonad (BaseMonad) import Grisette.Internal.Unified.EvalModeTag ( EvalModeTag (S),@@ -363,13 +363,13 @@ withBaseSymOrd r = withBaseSymOrd @'S @v r {-# INLINE withBaseSymOrd #-} -deriveGADT+derive [ ''Either, ''(,) ] [''UnifiedSymOrd, ''UnifiedSymOrd1, ''UnifiedSymOrd2] -deriveGADT+derive [ ''[], ''Maybe, ''Identity,@@ -380,7 +380,7 @@ ] [''UnifiedSymOrd, ''UnifiedSymOrd1] -deriveGADT+derive [ ''Bool, ''Integer, ''Char,@@ -417,25 +417,25 @@ [''UnifiedSymOrd] #if MIN_VERSION_base(4,16,0)-deriveGADT+derive [ ''(,,), ''(,,,) ] [''UnifiedSymOrd, ''UnifiedSymOrd1, ''UnifiedSymOrd2] #else-deriveGADT+derive [ ''(,,), ''(,,,) ] [''UnifiedSymOrd] #endif -deriveGADTWith+deriveWith (mempty {bitSizePositions = [0]}) [''WordN, ''IntN] [''UnifiedSymOrd] -deriveGADTWith+deriveWith (mempty {fpBitSizePositions = [(0, 1)]}) [''FP] [''UnifiedSymOrd]
src/Grisette/Internal/SymPrim/FunInstanceGen.hs view
@@ -22,7 +22,6 @@ ) where -import Data.Hashable (Hashable) import qualified Data.SBV as SBV import Grisette.Internal.SymPrim.Prim.Internal.Term ( IsSymbolKind,@@ -73,7 +72,7 @@ ( plainTVInferred, plainTVSpecified, )-import Type.Reflection (TypeRep, Typeable, typeRep, type (:~~:) (HRefl))+import Type.Reflection (TypeRep, typeRep, type (:~~:) (HRefl)) instanceWithOverlapDescD :: Maybe Overlap -> Q Cxt -> Q Type -> [DecsQ] -> DecsQ@@ -219,17 +218,7 @@ |] constraints =- fmap concat- . traverse- ( \ty ->- sequence- [ [t|SupportedNonFuncPrim $ty|],- [t|Eq $ty|],- [t|Show $ty|],- [t|Hashable $ty|],- [t|Typeable $ty|]- ]- )+ fmap concat . traverse (\ty -> sequence [[t|SupportedNonFuncPrim $ty|]]) funType = foldl1 (\fty ty -> [t|$(varT funTypeName) $ty $fty|]) . reverse withPrims :: [Q Type] -> Q Exp@@ -265,5 +254,5 @@ funNamePrefix funTypeName n- | n <- [2 .. numArg]+ | n <- [2 .. numArg] ]
src/Grisette/Internal/SymPrim/GeneralFun.hs view
@@ -37,16 +37,14 @@ where #if MIN_VERSION_base(4,20,0)-import Data.Foldable (Foldable (toList)) #else-import Data.Foldable (Foldable (foldl', toList))+import Data.Foldable (Foldable (foldl')) #endif import Control.DeepSeq (NFData (rnf)) import Data.Bifunctor (Bifunctor (second)) import qualified Data.HashSet as HS import Data.Hashable (Hashable (hashWithSalt))-import Data.List.NonEmpty (NonEmpty ((:|))) import Data.Maybe (fromJust) import qualified Data.SBV as SBV import qualified Data.SBV.Dynamic as SBVD@@ -59,14 +57,7 @@ ( Symbol (IndexedSymbol), ) import Grisette.Internal.SymPrim.FunInstanceGen (supportedPrimFunUpTo)-import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP- ( pevalFPBinaryTerm,- pevalFPFMATerm,- pevalFPRoundingBinaryTerm,- pevalFPRoundingUnaryTerm,- pevalFPTraitTerm,- pevalFPUnaryTerm,- )+import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP () import Grisette.Internal.SymPrim.Prim.Internal.PartialEval (totalize2) import Grisette.Internal.SymPrim.Prim.Internal.Term ( IsSymbolKind,@@ -87,6 +78,14 @@ ( pevalDivIntegralTerm, pevalModIntegralTerm ),+ PEvalFPTerm+ ( pevalFPBinaryTerm,+ pevalFPFMATerm,+ pevalFPRoundingBinaryTerm,+ pevalFPRoundingUnaryTerm,+ pevalFPTraitTerm,+ pevalFPUnaryTerm+ ), PEvalFloatingTerm (pevalFloatingUnaryTerm, pevalPowerTerm), PEvalFractionalTerm (pevalFdivTerm, pevalRecipTerm), PEvalFromIntegralTerm (pevalFromIntegralTerm),@@ -117,56 +116,7 @@ SupportedPrimConstraint (PrimConstraint), SymRep (SymType), SymbolKind (AnyKind),- Term- ( AbsNumTerm,- AddNumTerm,- AndBitsTerm,- AndTerm,- ApplyTerm,- BVConcatTerm,- BVExtendTerm,- BVSelectTerm,- BitCastOrTerm,- BitCastTerm,- ComplementBitsTerm,- ConTerm,- DistinctTerm,- DivIntegralTerm,- EqTerm,- ExistsTerm,- FPBinaryTerm,- FPFMATerm,- FPRoundingBinaryTerm,- FPRoundingUnaryTerm,- FPTraitTerm,- FPUnaryTerm,- FdivTerm,- FloatingUnaryTerm,- ForallTerm,- FromFPOrTerm,- FromIntegralTerm,- ITETerm,- LeOrdTerm,- LtOrdTerm,- ModIntegralTerm,- MulNumTerm,- NegNumTerm,- NotTerm,- OrBitsTerm,- OrTerm,- PowerTerm,- QuotIntegralTerm,- RecipTerm,- RemIntegralTerm,- RotateLeftTerm,- RotateRightTerm,- ShiftLeftTerm,- ShiftRightTerm,- SignumNumTerm,- SymTerm,- ToFPTerm,- XorBitsTerm- ),+ Term, TypedAnySymbol, TypedConstantSymbol, TypedSymbol,@@ -175,7 +125,6 @@ eqHeteroSymbol, existsTerm, forallTerm,- introSupportedPrimConstraint, partitionCVArg, pevalAndTerm, pevalEqTerm,@@ -191,9 +140,57 @@ translateTypeError, typedAnySymbol, typedConstantSymbol,- withConstantSymbolSupported,- withSymbolSupported,+ pattern AbsNumTerm,+ pattern AddNumTerm,+ pattern AndBitsTerm,+ pattern AndTerm,+ pattern ApplyTerm,+ pattern BVConcatTerm,+ pattern BVExtendTerm,+ pattern BVSelectTerm,+ pattern BitCastOrTerm,+ pattern BitCastTerm,+ pattern ComplementBitsTerm,+ pattern ConTerm,+ pattern DistinctTerm,+ pattern DivIntegralTerm,+ pattern EqTerm,+ pattern ExistsTerm,+ pattern FPBinaryTerm,+ pattern FPFMATerm,+ pattern FPRoundingBinaryTerm,+ pattern FPRoundingUnaryTerm,+ pattern FPTraitTerm,+ pattern FPUnaryTerm,+ pattern FdivTerm,+ pattern FloatingUnaryTerm,+ pattern ForallTerm,+ pattern FromFPOrTerm,+ pattern FromIntegralTerm,+ pattern ITETerm,+ pattern LeOrdTerm,+ pattern LtOrdTerm,+ pattern ModIntegralTerm,+ pattern MulNumTerm,+ pattern NegNumTerm,+ pattern NotTerm,+ pattern OrBitsTerm,+ pattern OrTerm,+ pattern PowerTerm,+ pattern QuotIntegralTerm,+ pattern RecipTerm,+ pattern RemIntegralTerm,+ pattern RotateLeftTerm,+ pattern RotateRightTerm,+ pattern ShiftLeftTerm,+ pattern ShiftRightTerm,+ pattern SignumNumTerm,+ pattern SupportedTypedSymbol,+ pattern SymTerm,+ pattern ToFPTerm,+ pattern XorBitsTerm, )+import Grisette.Internal.SymPrim.Prim.Pattern (pattern SubTerms) import Grisette.Internal.SymPrim.Prim.SomeTerm (SomeTerm (SomeTerm), someTerm) import Language.Haskell.TH.Syntax (Lift (liftTyped)) import Type.Reflection@@ -242,9 +239,9 @@ goTyped = go . someTerm go :: SomeTerm -> HS.HashSet SomeTypedAnySymbol- go (SomeTerm (SymTerm _ _ _ _ (sym :: TypedAnySymbol a))) =+ go (SomeTerm (SymTerm (sym :: TypedAnySymbol a))) = HS.singleton $ someTypedSymbol sym- go (SomeTerm (ConTerm _ _ _ _ cv :: Term v)) =+ go (SomeTerm (ConTerm cv :: Term v)) = case (primTypeRep :: TypeRep v) of App (App gf _) _ -> case eqTypeRep (typeRep @(-->)) gf of@@ -258,78 +255,11 @@ $ go (SomeTerm tm) Nothing -> HS.empty _ -> HS.empty- go (SomeTerm (ForallTerm _ _ _ _ sym arg)) =- withConstantSymbolSupported sym $- HS.insert (someTypedSymbol $ fromJust $ castTypedSymbol sym) $- goUnary arg- go (SomeTerm (ExistsTerm _ _ _ _ sym arg)) =- withConstantSymbolSupported sym $- HS.insert (someTypedSymbol $ fromJust $ castTypedSymbol sym) $- goUnary arg- go (SomeTerm (NotTerm _ _ _ _ arg)) = goUnary arg- go (SomeTerm (OrTerm _ _ _ _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (AndTerm _ _ _ _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (EqTerm _ _ _ _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (DistinctTerm _ _ _ _ args)) =- mconcat <$> map goTyped $ toList args- go (SomeTerm (ITETerm _ _ _ _ cond arg1 arg2)) = goTernary cond arg1 arg2- go (SomeTerm (AddNumTerm _ _ _ _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (NegNumTerm _ _ _ _ arg)) = goUnary arg- go (SomeTerm (MulNumTerm _ _ _ _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (AbsNumTerm _ _ _ _ arg)) = goUnary arg- go (SomeTerm (SignumNumTerm _ _ _ _ arg)) = goUnary arg- go (SomeTerm (LtOrdTerm _ _ _ _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (LeOrdTerm _ _ _ _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (AndBitsTerm _ _ _ _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (OrBitsTerm _ _ _ _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (XorBitsTerm _ _ _ _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (ComplementBitsTerm _ _ _ _ arg)) = goUnary arg- go (SomeTerm (ShiftLeftTerm _ _ _ _ arg n)) = goBinary arg n- go (SomeTerm (ShiftRightTerm _ _ _ _ arg n)) = goBinary arg n- go (SomeTerm (RotateLeftTerm _ _ _ _ arg n)) = goBinary arg n- go (SomeTerm (RotateRightTerm _ _ _ _ arg n)) = goBinary arg n- go (SomeTerm (BitCastTerm _ _ _ _ arg)) = goUnary arg- go (SomeTerm (BitCastOrTerm _ _ _ _ d arg)) = goBinary d arg- go (SomeTerm (BVConcatTerm _ _ _ _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (BVSelectTerm _ _ _ _ _ _ arg)) = goUnary arg- go (SomeTerm (BVExtendTerm _ _ _ _ _ _ arg)) = goUnary arg- go (SomeTerm (ApplyTerm _ _ _ _ func arg)) = goBinary func arg- go (SomeTerm (DivIntegralTerm _ _ _ _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (ModIntegralTerm _ _ _ _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (QuotIntegralTerm _ _ _ _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (RemIntegralTerm _ _ _ _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (FPTraitTerm _ _ _ _ _ arg)) = goUnary arg- go (SomeTerm (FdivTerm _ _ _ _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (RecipTerm _ _ _ _ arg)) = goUnary arg- go (SomeTerm (FloatingUnaryTerm _ _ _ _ _ arg)) = goUnary arg- go (SomeTerm (PowerTerm _ _ _ _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (FPUnaryTerm _ _ _ _ _ arg)) = goUnary arg- go (SomeTerm (FPBinaryTerm _ _ _ _ _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (FPRoundingUnaryTerm _ _ _ _ _ _ arg)) = goUnary arg- go (SomeTerm (FPRoundingBinaryTerm _ _ _ _ _ _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (FPFMATerm _ _ _ _ mode arg1 arg2 arg3)) =- mconcat- [ goTyped mode,- goTyped arg1,- goTyped arg2,- goTyped arg3- ]- go (SomeTerm (FromIntegralTerm _ _ _ _ arg)) = goUnary arg- go (SomeTerm (FromFPOrTerm _ _ _ _ d mode arg)) = goTernary d mode arg- go (SomeTerm (ToFPTerm _ _ _ _ mode arg _ _)) = goBinary mode arg- goUnary :: Term a -> HS.HashSet SomeTypedAnySymbol- goUnary = goTyped- goBinary ::- Term a ->- Term b ->- HS.HashSet SomeTypedAnySymbol- goBinary a b = goTyped a <> goTyped b- goTernary ::- Term a ->- Term b ->- Term c ->- HS.HashSet SomeTypedAnySymbol- goTernary a b c = goTyped a <> goTyped b <> goTyped c+ go (SomeTerm (ForallTerm sym arg)) =+ HS.insert (someTypedSymbol $ fromJust $ castTypedSymbol sym) $ goTyped arg+ go (SomeTerm (ExistsTerm sym arg)) =+ HS.insert (someTypedSymbol $ fromJust $ castTypedSymbol sym) $ goTyped arg+ go (SomeTerm (SubTerms tms)) = mconcat <$> map go $ tms -- | Generate a fresh argument symbol that is not used as bounded or unbounded -- variables in the function body for a general symbolic function.@@ -412,9 +342,9 @@ Term b pevalGeneralFunApplyTerm = totalize2 doPevalApplyTerm applyTerm where- doPevalApplyTerm (ConTerm _ _ _ _ (GeneralFun arg tm)) v =+ doPevalApplyTerm (ConTerm (GeneralFun arg tm)) v = Just $ substTerm arg v HS.empty tm- doPevalApplyTerm (ITETerm _ _ _ _ c l r) v =+ doPevalApplyTerm (ITETerm c l r) v = return $ pevalITETerm c (pevalApplyTerm l v) (pevalApplyTerm r v) doPevalApplyTerm _ _ = Nothing @@ -479,7 +409,7 @@ HS.HashSet SomeTypedConstantSymbol -> SomeTerm -> SomeTerm- goSome _ bs c@(SomeTerm (ConTerm _ _ _ _ cv :: Term x)) =+ goSome _ bs c@(SomeTerm (ConTerm cv :: Term x)) = case (primTypeRep :: TypeRep x) of App (App gf _) _ -> case eqTypeRep gf (typeRep @(-->)) of@@ -495,118 +425,115 @@ in SomeTerm $ conTerm $ GeneralFun sym (go newmemo tm) Nothing -> c _ -> c- goSome _ bs c@(SomeTerm ((SymTerm _ _ _ _ sym) :: Term a)) =+ goSome _ bs c@(SomeTerm ((SymTerm sym) :: Term a)) = case castTypedSymbol sym of Just sym' | HS.member (someTypedSymbol sym') bs -> c _ -> SomeTerm $ subst sym- goSome _ bs (SomeTerm (ForallTerm _ _ _ _ tsym b)) =+ goSome _ bs (SomeTerm (ForallTerm tsym b)) = let newmemo = htmemo (goSome newmemo (HS.insert (someTypedSymbol tsym) bs)) {-# NOINLINE newmemo #-} in goUnary newmemo (forallTerm tsym) b- goSome _ bs (SomeTerm (ExistsTerm _ _ _ _ tsym b)) =+ goSome _ bs (SomeTerm (ExistsTerm tsym b)) = let newmemo = htmemo (goSome newmemo (HS.insert (someTypedSymbol tsym) bs)) {-# NOINLINE newmemo #-} in goUnary newmemo (existsTerm tsym) b- goSome memo _ (SomeTerm (NotTerm _ _ _ _ arg)) =+ goSome memo _ (SomeTerm (NotTerm arg)) = goUnary memo pevalNotTerm arg- goSome memo _ (SomeTerm (OrTerm _ _ _ _ arg1 arg2)) =+ goSome memo _ (SomeTerm (OrTerm arg1 arg2)) = goBinary memo pevalOrTerm arg1 arg2- goSome memo _ (SomeTerm (AndTerm _ _ _ _ arg1 arg2)) =+ goSome memo _ (SomeTerm (AndTerm arg1 arg2)) = goBinary memo pevalAndTerm arg1 arg2- goSome memo _ (SomeTerm (EqTerm _ _ _ _ arg1 arg2)) =- introSupportedPrimConstraint arg1 $- goBinary memo pevalEqTerm arg1 arg2- goSome memo _ (SomeTerm (DistinctTerm _ _ _ _ args@(arg1 :| _))) =- introSupportedPrimConstraint arg1 $- SomeTerm $- pevalDistinctTerm (fmap (go memo) args)- goSome memo _ (SomeTerm (ITETerm _ _ _ _ cond arg1 arg2)) =+ goSome memo _ (SomeTerm (EqTerm arg1 arg2)) =+ goBinary memo pevalEqTerm arg1 arg2+ goSome memo _ (SomeTerm (DistinctTerm args)) =+ SomeTerm $ pevalDistinctTerm (fmap (go memo) args)+ goSome memo _ (SomeTerm (ITETerm cond arg1 arg2)) = goTernary memo pevalITETerm cond arg1 arg2- goSome memo _ (SomeTerm (AddNumTerm _ _ _ _ arg1 arg2)) =+ goSome memo _ (SomeTerm (AddNumTerm arg1 arg2)) = goBinary memo pevalAddNumTerm arg1 arg2- goSome memo _ (SomeTerm (NegNumTerm _ _ _ _ arg)) =+ goSome memo _ (SomeTerm (NegNumTerm arg)) = goUnary memo pevalNegNumTerm arg- goSome memo _ (SomeTerm (MulNumTerm _ _ _ _ arg1 arg2)) =+ goSome memo _ (SomeTerm (MulNumTerm arg1 arg2)) = goBinary memo pevalMulNumTerm arg1 arg2- goSome memo _ (SomeTerm (AbsNumTerm _ _ _ _ arg)) =+ goSome memo _ (SomeTerm (AbsNumTerm arg)) = goUnary memo pevalAbsNumTerm arg- goSome memo _ (SomeTerm (SignumNumTerm _ _ _ _ arg)) =+ goSome memo _ (SomeTerm (SignumNumTerm arg)) = goUnary memo pevalSignumNumTerm arg- goSome memo _ (SomeTerm (LtOrdTerm _ _ _ _ arg1 arg2)) =+ goSome memo _ (SomeTerm (LtOrdTerm arg1 arg2)) = goBinary memo pevalLtOrdTerm arg1 arg2- goSome memo _ (SomeTerm (LeOrdTerm _ _ _ _ arg1 arg2)) =+ goSome memo _ (SomeTerm (LeOrdTerm arg1 arg2)) = goBinary memo pevalLeOrdTerm arg1 arg2- goSome memo _ (SomeTerm (AndBitsTerm _ _ _ _ arg1 arg2)) =+ goSome memo _ (SomeTerm (AndBitsTerm arg1 arg2)) = goBinary memo pevalAndBitsTerm arg1 arg2- goSome memo _ (SomeTerm (OrBitsTerm _ _ _ _ arg1 arg2)) =+ goSome memo _ (SomeTerm (OrBitsTerm arg1 arg2)) = goBinary memo pevalOrBitsTerm arg1 arg2- goSome memo _ (SomeTerm (XorBitsTerm _ _ _ _ arg1 arg2)) =+ goSome memo _ (SomeTerm (XorBitsTerm arg1 arg2)) = goBinary memo pevalXorBitsTerm arg1 arg2- goSome memo _ (SomeTerm (ComplementBitsTerm _ _ _ _ arg)) =+ goSome memo _ (SomeTerm (ComplementBitsTerm arg)) = goUnary memo pevalComplementBitsTerm arg- goSome memo _ (SomeTerm (ShiftLeftTerm _ _ _ _ arg n)) =+ goSome memo _ (SomeTerm (ShiftLeftTerm arg n)) = goBinary memo pevalShiftLeftTerm arg n- goSome memo _ (SomeTerm (RotateLeftTerm _ _ _ _ arg n)) =+ goSome memo _ (SomeTerm (RotateLeftTerm arg n)) = goBinary memo pevalRotateLeftTerm arg n- goSome memo _ (SomeTerm (ShiftRightTerm _ _ _ _ arg n)) =+ goSome memo _ (SomeTerm (ShiftRightTerm arg n)) = goBinary memo pevalShiftRightTerm arg n- goSome memo _ (SomeTerm (RotateRightTerm _ _ _ _ arg n)) =+ goSome memo _ (SomeTerm (RotateRightTerm arg n)) = goBinary memo pevalRotateRightTerm arg n- goSome memo _ (SomeTerm (BitCastTerm _ _ _ _ (arg :: Term a) :: Term r)) =+ goSome memo _ (SomeTerm (BitCastTerm (arg :: Term a) :: Term r)) = goUnary memo (pevalBitCastTerm @a @r) arg- goSome memo _ (SomeTerm (BitCastOrTerm _ _ _ _ (d :: term r) (arg :: Term a) :: Term r)) =+ goSome memo _ (SomeTerm (BitCastOrTerm (d :: term r) (arg :: Term a) :: Term r)) = goBinary memo (pevalBitCastOrTerm @a @r) d arg- goSome memo _ (SomeTerm (BVConcatTerm _ _ _ _ arg1 arg2)) =+ goSome memo _ (SomeTerm (BVConcatTerm arg1 arg2)) = goBinary memo pevalBVConcatTerm arg1 arg2- goSome memo _ (SomeTerm (BVSelectTerm _ _ _ _ ix w arg)) =+ goSome memo _ (SomeTerm (BVSelectTerm ix w arg)) = goUnary memo (pevalBVSelectTerm ix w) arg- goSome memo _ (SomeTerm (BVExtendTerm _ _ _ _ n signed arg)) =+ goSome memo _ (SomeTerm (BVExtendTerm n signed arg)) = goUnary memo (pevalBVExtendTerm n signed) arg- goSome memo _ (SomeTerm (ApplyTerm _ _ _ _ f arg)) =+ goSome memo _ (SomeTerm (ApplyTerm f arg)) = goBinary memo pevalApplyTerm f arg- goSome memo _ (SomeTerm (DivIntegralTerm _ _ _ _ arg1 arg2)) =+ goSome memo _ (SomeTerm (DivIntegralTerm arg1 arg2)) = goBinary memo pevalDivIntegralTerm arg1 arg2- goSome memo _ (SomeTerm (ModIntegralTerm _ _ _ _ arg1 arg2)) =+ goSome memo _ (SomeTerm (ModIntegralTerm arg1 arg2)) = goBinary memo pevalModIntegralTerm arg1 arg2- goSome memo _ (SomeTerm (QuotIntegralTerm _ _ _ _ arg1 arg2)) =+ goSome memo _ (SomeTerm (QuotIntegralTerm arg1 arg2)) = goBinary memo pevalQuotIntegralTerm arg1 arg2- goSome memo _ (SomeTerm (RemIntegralTerm _ _ _ _ arg1 arg2)) =+ goSome memo _ (SomeTerm (RemIntegralTerm arg1 arg2)) = goBinary memo pevalRemIntegralTerm arg1 arg2- goSome memo _ (SomeTerm (FPTraitTerm _ _ _ _ trait arg)) =+ goSome memo _ (SomeTerm (FPTraitTerm trait arg)) = goUnary memo (pevalFPTraitTerm trait) arg- goSome memo _ (SomeTerm (FdivTerm _ _ _ _ arg1 arg2)) =+ goSome memo _ (SomeTerm (FdivTerm arg1 arg2)) = goBinary memo pevalFdivTerm arg1 arg2- goSome memo _ (SomeTerm (RecipTerm _ _ _ _ arg)) =+ goSome memo _ (SomeTerm (RecipTerm arg)) = goUnary memo pevalRecipTerm arg- goSome memo _ (SomeTerm (FloatingUnaryTerm _ _ _ _ op arg)) =+ goSome memo _ (SomeTerm (FloatingUnaryTerm op arg)) = goUnary memo (pevalFloatingUnaryTerm op) arg- goSome memo _ (SomeTerm (PowerTerm _ _ _ _ arg1 arg2)) =+ goSome memo _ (SomeTerm (PowerTerm arg1 arg2)) = goBinary memo pevalPowerTerm arg1 arg2- goSome memo _ (SomeTerm (FPUnaryTerm _ _ _ _ op arg)) =+ goSome memo _ (SomeTerm (FPUnaryTerm op arg)) = goUnary memo (pevalFPUnaryTerm op) arg- goSome memo _ (SomeTerm (FPBinaryTerm _ _ _ _ op arg1 arg2)) =+ goSome memo _ (SomeTerm (FPBinaryTerm op arg1 arg2)) = goBinary memo (pevalFPBinaryTerm op) arg1 arg2- goSome memo _ (SomeTerm (FPRoundingUnaryTerm _ _ _ _ op mode arg)) =+ goSome memo _ (SomeTerm (FPRoundingUnaryTerm op mode arg)) = goUnary memo (pevalFPRoundingUnaryTerm op mode) arg- goSome memo _ (SomeTerm (FPRoundingBinaryTerm _ _ _ _ op mode arg1 arg2)) =+ goSome memo _ (SomeTerm (FPRoundingBinaryTerm op mode arg1 arg2)) = goBinary memo (pevalFPRoundingBinaryTerm op mode) arg1 arg2- goSome memo _ (SomeTerm (FPFMATerm _ _ _ _ mode arg1 arg2 arg3)) =+ goSome memo _ (SomeTerm (FPFMATerm mode arg1 arg2 arg3)) = SomeTerm $ pevalFPFMATerm (go memo mode) (go memo arg1) (go memo arg2) (go memo arg3)- goSome memo _ (SomeTerm (FromIntegralTerm _ _ _ _ (arg :: Term a) :: Term b)) =+ goSome memo _ (SomeTerm (FromIntegralTerm (arg :: Term a) :: Term b)) = goUnary memo (pevalFromIntegralTerm @a @b) arg- goSome memo _ (SomeTerm (FromFPOrTerm _ _ _ _ d mode arg)) =+ goSome memo _ (SomeTerm (FromFPOrTerm d mode arg)) = goTernary memo pevalFromFPOrTerm d mode arg goSome memo _- (SomeTerm (ToFPTerm _ _ _ _ mode (arg :: Term a) (_ :: p eb) (_ :: q sb))) =+ (SomeTerm (ToFPTerm mode (arg :: Term a) (_ :: p eb) (_ :: q sb))) = goBinary memo (pevalToFPTerm @a @eb @sb) mode arg goUnary memo f a = SomeTerm $ f (go memo a) goBinary memo f a b = SomeTerm $ f (go memo a) (go memo b)@@ -622,20 +549,20 @@ HS.HashSet SomeTypedConstantSymbol -> Term b -> Term b-substTerm sym a =+substTerm sym@SupportedTypedSymbol a = generalSubstSomeTerm ( \t -> if eqHeteroSymbol sym t then unsafeCoerce a- else withSymbolSupported t $ symTerm t+ else symTerm t ) supportedPrimFunUpTo [|buildGeneralFun (typedConstantSymbol "a") (conTerm defaultValue)|] [| \c t f -> case (t, f) of- ( ConTerm _ _ _ _ (GeneralFun (ta :: TypedConstantSymbol a) a),- ConTerm _ _ _ _ (GeneralFun tb b)+ ( ConTerm (GeneralFun (ta :: TypedConstantSymbol a) a),+ ConTerm (GeneralFun tb b) ) -> conTerm $ GeneralFun argSymbol $
src/Grisette/Internal/SymPrim/ModelRep.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE GADTs #-} {-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE PatternSynonyms #-} -- | -- Module : Grisette.Internal.SymPrim.ModelRep@@ -18,7 +19,7 @@ import Grisette.Internal.SymPrim.Prim.Model (Model) import Grisette.Internal.SymPrim.Prim.Term ( LinkedRep (underlyingTerm),- Term (SymTerm),+ pattern SymTerm, ) -- $setup@@ -40,5 +41,5 @@ instance ModelRep (ModelSymPair ct st) Model where buildModel (sym := val) = case underlyingTerm sym of- SymTerm _ _ _ _ symbol -> insertValue symbol val emptyModel+ SymTerm symbol -> insertValue symbol val emptyModel _ -> error "buildModel: should only use symbolic constants"
src/Grisette/Internal/SymPrim/Prim/Internal/Caches.hs view
@@ -21,8 +21,9 @@ module Grisette.Internal.SymPrim.Prim.Internal.Caches ( SomeStableName (..), Id,- Ident,+ StableIdent, Digest,+ CachedInfo (..), Interned (..), intern, haveCache,@@ -73,37 +74,48 @@ type Id = Word32 -- | The identity of a term.-type Ident = StableName Any+type StableIdent = StableName Any -- | A digest of a term. type Digest = Word32 -newtype Cache t = Cache {getCache :: A.Array Int (CacheState t)}+-- | Information about a cached term.+data CachedInfo = CachedInfo+ { cachedThreadId :: {-# UNPACK #-} !WeakThreadId,+ cachedDigest :: {-# UNPACK #-} !Digest,+ cachedId :: {-# UNPACK #-} !Id,+ cachedStableIdent :: {-# UNPACK #-} !StableIdent+ } +data Cache t = Cache+ { getCache :: A.Array Int (CacheState t),+ idSem :: MVar (),+ nextId :: M.IOVector Id+ }+ type HashTable k v = IORef (HM.HashMap k v) data CacheState t where CacheState :: { _sem :: MVar (),- _nextId :: M.IOVector Id,- _currentThread :: HashTable (Description t) (Id, Weak Ident)+ _currentThread :: HashTable (Description t) (Id, Weak StableIdent) } -> CacheState t finalizeCacheState :: CacheState t -> IO ()-finalizeCacheState (CacheState _ _ s) = do+finalizeCacheState (CacheState _ s) = do m <- readIORef s traverse_ (\(_, w) -> finalize w) m finalizeCache :: Cache t -> IO ()-finalizeCache (Cache a) = mapM_ finalizeCacheState (A.elems a)+finalizeCache (Cache a _ _) = mapM_ finalizeCacheState (A.elems a) -- | A class for interning terms. class Interned t where data Description t type Uninterned t describe :: Uninterned t -> Description t- identify :: WeakThreadId -> Digest -> Id -> Ident -> Uninterned t -> t+ identify :: CachedInfo -> Uninterned t -> t threadId :: t -> WeakThreadId descriptionDigest :: Description t -> Digest @@ -128,11 +140,13 @@ element = CacheState <$> newMVar ()- <*> M.replicate 1 0 <*> newIORef HM.empty result = do elements <- replicateM (fromIntegral cacheWidth) element- return $ Cache $ A.listArray (0, fromIntegral cacheWidth - 1) elements+ idSem <- newMVar ()+ nextId <- M.replicate 1 0+ return $+ Cache (A.listArray (0, fromIntegral cacheWidth - 1) elements) idSem nextId -- | Internal cache for memoization of term construction. Different types have -- different caches and they may share names, ids, or representations, but they@@ -177,8 +191,8 @@ cache <- readIORef cref case HM.lookup tyFingerprint cache of Just c -> do- let Cache a = unsafeCoerce c :: Cache t- let CacheState sem _ s = a A.! grp+ let Cache a _ _ = unsafeCoerce c :: Cache t+ let CacheState sem s = a A.! grp takeMVar sem current <- readIORef s case HM.lookup dt current of@@ -206,21 +220,23 @@ let !dt = describe bt :: Description t !hdt = descriptionDigest dt !r = hdt `mod` cacheWidth- CacheState sem nextId s = getCache cache A.! (fromIntegral r)+ CacheState sem s = getCache cache A.! (fromIntegral r) takeMVar sem -- print ("intern", wtid, dt, r) current <- readIORef s case HM.lookup dt current of Nothing -> do- newId0 <- M.unsafeRead nextId 0- M.unsafeWrite nextId 0 (newId0 + 1)+ takeMVar (idSem cache)+ newId0 <- M.unsafeRead (nextId cache) 0+ M.unsafeWrite (nextId cache) 0 (newId0 + 1)+ putMVar (idSem cache) () let newId = newId0 * cacheWidth + r newIdent <- makeStableName dt- let anyNewIdent = unsafeCoerce newIdent :: Ident+ let anyNewIdent = unsafeCoerce newIdent :: StableIdent identRef <- mkWeakStableNameRefWithFinalizer anyNewIdent $ reclaimTerm wtid fingerprint (fromIntegral r) dt- let !t = identify (weakThreadId tid) hdt newId anyNewIdent bt+ let !t = identify (CachedInfo (weakThreadId tid) hdt newId anyNewIdent) bt writeIORef s $ HM.insert dt (newId, identRef) current putMVar sem () return t@@ -228,21 +244,26 @@ t1 <- deRefWeak oldIdentRef case t1 of Nothing -> do- newId0 <- M.unsafeRead nextId 0- M.unsafeWrite nextId 0 (newId0 + 1)+ takeMVar (idSem cache)+ newId0 <- M.unsafeRead (nextId cache) 0+ M.unsafeWrite (nextId cache) 0 (newId0 + 1)+ putMVar (idSem cache) () let newId = newId0 * cacheWidth + r newIdent <- makeStableName dt- let anyNewIdent = unsafeCoerce newIdent :: Ident+ let anyNewIdent = unsafeCoerce newIdent :: StableIdent identRef <- mkWeakStableNameRefWithFinalizer anyNewIdent $ reclaimTerm wtid fingerprint (fromIntegral r) dt- let !term = identify (weakThreadId tid) hdt newId anyNewIdent bt+ let !term =+ identify+ (CachedInfo (weakThreadId tid) hdt newId anyNewIdent)+ bt writeIORef s $ HM.insert dt (newId, identRef) current putMVar sem () return term Just t1 -> do putMVar sem ()- return $! identify (weakThreadId tid) hdt oldId t1 bt+ return $! identify (CachedInfo (weakThreadId tid) hdt oldId t1) bt {-# NOINLINE intern #-} -- | Check if the current thread has a cache.@@ -253,10 +274,10 @@ return $ HM.member tid caches cacheStateSize :: CacheState t -> IO Int-cacheStateSize (CacheState _ _ s) = HM.size <$> readIORef s+cacheStateSize (CacheState _ s) = HM.size <$> readIORef s cacheStateLiveSize :: CacheState t -> IO Int-cacheStateLiveSize (CacheState sem _ s) = do+cacheStateLiveSize (CacheState sem s) = do takeMVar sem v <- fmap snd . HM.toList <$> readIORef s r <-@@ -270,30 +291,11 @@ putMVar sem () return r -{--dumpCacheState :: CacheState t -> IO ()-dumpCacheState (CacheState sem s) = do- takeMVar sem- v <- HM.toList <$> readIORef s- mapM_- ( \(k, (i, v)) -> do- v1 <- deRefWeak v- case v1 of- Nothing -> print (k, i, "dead")- Just r -> print (k, i, r)- )- v- putMVar sem ()--dumpCache :: Cache t -> IO ()-dumpCache (Cache a) = mapM_ dumpCacheState (A.elems a)--}- cacheSize :: Cache t -> IO Int-cacheSize (Cache a) = sum <$> mapM cacheStateSize (A.elems a)+cacheSize (Cache a _ _) = sum <$> mapM cacheStateSize (A.elems a) cacheLiveSize :: Cache t -> IO Int-cacheLiveSize (Cache a) = sum <$> mapM cacheStateLiveSize (A.elems a)+cacheLiveSize (Cache a _ _) = sum <$> mapM cacheStateLiveSize (A.elems a) -- | Get the size of the current thread's cache. threadCacheSize :: WeakThreadId -> IO Int@@ -314,15 +316,3 @@ cache <- readIORef cref sum <$> mapM cacheLiveSize (HM.elems cache) Nothing -> return 0--{---- | Dump the current thread's cache.-dumpThreadCache :: WeakThreadId -> IO ()-dumpThreadCache tid = do- caches <- readIORef termCacheCell- case HM.lookup tid caches of- Just (_, cref) -> do- cache <- readIORef cref- mapM_ dumpCache (HM.elems cache)- Nothing -> return ()--}
− src/Grisette/Internal/SymPrim/Prim/Internal/Instances/BVPEval.hs
@@ -1,601 +0,0 @@-{-# LANGUAGE AllowAmbiguousTypes #-}-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE GADTs #-}-{-# LANGUAGE KindSignatures #-}-{-# HLINT ignore "Eta reduce" #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE PatternSynonyms #-}-{-# LANGUAGE QuantifiedConstraints #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeApplications #-}-{-# LANGUAGE TypeOperators #-}-{-# LANGUAGE UndecidableInstances #-}-{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}---- |--- Module : Grisette.Internal.SymPrim.Prim.Internal.Instances.BVPEval--- Copyright : (c) Sirui Lu 2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.SymPrim.Prim.Internal.Instances.BVPEval () where--import Data.Kind (Type)-import Data.Maybe (isJust)-import Data.Proxy (Proxy (Proxy))-import qualified Data.SBV as SBV-import Data.Typeable (Typeable, type (:~:) (Refl))-import GHC.TypeNats (KnownNat, Nat, natVal, sameNat, type (+), type (-), type (<=))-import Grisette.Internal.Core.Data.Class.BitVector- ( SizedBV- ( sizedBVConcat,- sizedBVFromIntegral,- sizedBVSelect,- sizedBVSext,- sizedBVZext- ),- )-import Grisette.Internal.SymPrim.BV (IntN, WordN)-import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalBitCastTerm (doPevalBitCast)-import Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim- ( bvIsNonZeroFromGEq1,- )-import Grisette.Internal.SymPrim.Prim.Internal.Term- ( PEvalBVTerm- ( pevalBVConcatTerm,- pevalBVExtendTerm,- pevalBVSelectTerm,- sbvBVConcatTerm,- sbvBVExtendTerm,- sbvBVSelectTerm- ),- PEvalBitCastTerm (pevalBitCastTerm, sbvBitCast),- SupportedPrim,- Term- ( BVConcatTerm,- BVExtendTerm,- BVSelectTerm,- BitCastTerm,- ConTerm- ),- bitCastTerm,- bvConcatTerm,- bvExtendTerm,- bvSelectTerm,- conTerm,- pattern DynTerm,- )-import Grisette.Internal.SymPrim.Prim.Internal.Unfold- ( binaryUnfoldOnce,- unaryUnfoldOnce,- )-import Grisette.Internal.SymPrim.Prim.TermUtils (castTerm)-import Grisette.Internal.Utils.Parameterized- ( LeqProof (LeqProof),- NatRepr,- SomeNatRepr (SomeNatRepr),- SomePositiveNatRepr (SomePositiveNatRepr),- addNat,- mkNatRepr,- mkPositiveNatRepr,- natRepr,- unsafeAxiom,- unsafeKnownProof,- unsafeLeqProof,- withKnownNat,- withKnownProof,- )--pevalDefaultBVSelectTerm ::- forall (bv2 :: Nat -> Type) bv n ix w p q.- ( KnownNat n,- KnownNat ix,- KnownNat w,- 1 <= n,- 1 <= w,- ix + w <= n,- PEvalBVTerm bv,- forall x. (KnownNat x, 1 <= x) => PEvalBitCastTerm (bv2 x) (bv x),- PEvalBVTerm bv2,- Typeable bv,- SupportedPrim (bv w),- SupportedPrim (bv2 n)- ) =>- p ix ->- q w ->- Term (bv n) ->- Term (bv w)-pevalDefaultBVSelectTerm ix w =- unaryUnfoldOnce (doPevalDefaultBVSelectTerm @bv2 ix w) (bvSelectTerm ix w)--unsafePevalBVSelectTerm ::- forall bv n ix w.- (PEvalBVTerm bv) =>- NatRepr n ->- NatRepr ix ->- NatRepr w ->- Term (bv n) ->- Term (bv w)-unsafePevalBVSelectTerm n ix w term =- withKnownNat n $- withKnownNat ix $- withKnownNat w $- case ( unsafeLeqProof @1 @n,- unsafeLeqProof @1 @w,- unsafeLeqProof @(ix + w) @n- ) of- (LeqProof, LeqProof, LeqProof) -> pevalBVSelectTerm ix w term--doPevalDefaultBVSelectTerm ::- forall (bv2 :: Nat -> Type) bv n ix w p q.- ( KnownNat n,- KnownNat ix,- KnownNat w,- forall x. (KnownNat x, 1 <= x) => PEvalBitCastTerm (bv2 x) (bv x),- 1 <= n,- 1 <= w,- ix + w <= n,- PEvalBVTerm bv,- PEvalBVTerm bv2,- Typeable bv,- SupportedPrim (bv w),- SupportedPrim (bv2 n)- ) =>- p ix ->- q w ->- Term (bv n) ->- Maybe (Term (bv w))-doPevalDefaultBVSelectTerm _ _ rhs- | isJust (sameNat (Proxy @ix) (Proxy @0))- && isJust (sameNat (Proxy @w) (Proxy @n)) =- Just rhs >>= castTerm-doPevalDefaultBVSelectTerm ix w (ConTerm _ _ _ _ b) =- Just $ conTerm $ sizedBVSelect ix w b-doPevalDefaultBVSelectTerm ix w (BitCastTerm _ _ _ _ (DynTerm (b :: Term (bv2 n)))) =- Just $ pevalBitCastTerm $ pevalBVSelectTerm ix w b-doPevalDefaultBVSelectTerm- pix- pw- (BVConcatTerm _ _ _ _ (b1 :: Term (bv n1)) (b2 :: Term (bv n2)))- | ix + w <= n2 = Just $ unsafePevalBVSelectTerm n2Repr ixRepr wRepr b2- | ix >= n2 =- case mkNatRepr (ix - n2) of- SomeNatRepr ixpn2Repr ->- Just $ unsafePevalBVSelectTerm n1Repr ixpn2Repr wRepr b1- | otherwise =- case (mkNatRepr (w + ix - n2), mkNatRepr (n2 - ix)) of- (SomeNatRepr wixpn2Repr, SomeNatRepr n2pixRepr) ->- let b1Part =- unsafePevalBVSelectTerm n1Repr (natRepr @0) wixpn2Repr b1- b2Part = unsafePevalBVSelectTerm n2Repr ixRepr n2pixRepr b2- in Just $- unsafePevalBVConcatTerm- wixpn2Repr- n2pixRepr- wRepr- b1Part- b2Part- where- ixRepr = natRepr @ix- wRepr = natRepr @w- n1Repr = natRepr @n1- n2Repr = natRepr @n2- ix = natVal @ix pix- w = natVal @w pw- n2 = natVal @n2 (Proxy @n2)-doPevalDefaultBVSelectTerm- _- _- (BVSelectTerm _ _ _ _ (_ :: proxy ix1) _ (b :: Term (bv n1))) =- Just $- unsafePevalBVSelectTerm- (natRepr @n1)- (addNat (natRepr @ix) (natRepr @ix1))- (natRepr @w)- b-doPevalDefaultBVSelectTerm- pix- pw- (BVExtendTerm _ _ _ _ signed _ (b :: Term (bv n1)))- | ix + w <= n1 = Just $ unsafePevalBVSelectTerm n1Repr ixRepr wRepr b- | ix < n1 =- case mkNatRepr (n1 - ix) of- SomeNatRepr n1pixRepr ->- let bPart = unsafePevalBVSelectTerm n1Repr ixRepr n1pixRepr b- in Just $ unsafePevalBVExtendTerm n1pixRepr wRepr signed bPart- | otherwise = Nothing- where- ixRepr = natRepr @ix- wRepr = natRepr @w- n1Repr = natRepr @n1- ix = natVal @ix pix- w = natVal @w pw- n1 = natVal @n1 (Proxy @n1)-doPevalDefaultBVSelectTerm _ _ _ = Nothing--pevalDefaultBVExtendTerm ::- forall proxy l r bv.- ( PEvalBVTerm bv,- KnownNat l,- KnownNat r,- 1 <= l,- 1 <= r,- l <= r,- Typeable bv,- forall n. (KnownNat n, 1 <= n) => SupportedPrim (bv n)- ) =>- Bool ->- proxy r ->- Term (bv l) ->- Term (bv r)-pevalDefaultBVExtendTerm signed p =- unaryUnfoldOnce (doPevalDefaultBVExtendTerm signed p) (bvExtendTerm signed p)--unsafePevalBVExtendTerm ::- forall bv l r.- (PEvalBVTerm bv) =>- NatRepr l ->- NatRepr r ->- Bool ->- Term (bv l) ->- Term (bv r)-unsafePevalBVExtendTerm lRepr rRepr signed v =- case (unsafeLeqProof @1 @l, unsafeLeqProof @1 @r, unsafeLeqProof @l @r) of- (LeqProof, LeqProof, LeqProof) ->- withKnownNat lRepr $- withKnownNat rRepr $- pevalBVExtendTerm signed (Proxy @r) v--doPevalDefaultBVExtendTerm ::- forall proxy l r bv.- ( PEvalBVTerm bv,- KnownNat l,- KnownNat r,- 1 <= l,- 1 <= r,- l <= r,- Typeable bv,- forall n. (KnownNat n, 1 <= n) => SupportedPrim (bv n)- ) =>- Bool ->- proxy r ->- Term (bv l) ->- Maybe (Term (bv r))-doPevalDefaultBVExtendTerm signed p (ConTerm _ _ _ _ b) =- Just $ conTerm $ if signed then sizedBVSext p b else sizedBVZext p b-doPevalDefaultBVExtendTerm _ _ b- | isJust $ sameNat (Proxy @l) (Proxy @r) =- Just b >>= castTerm-doPevalDefaultBVExtendTerm False pr b =- case (mkPositiveNatRepr $ r - l) of- SomePositiveNatRepr (rplRepr :: NatRepr lpr) ->- Just $- unsafePevalBVConcatTerm- rplRepr- lRepr- rRepr- (conTerm $ sizedBVFromIntegral 0)- b- where- lRepr = natRepr @l- rRepr = natRepr @r- l = natVal @l (Proxy @l)- r = natVal @r pr-doPevalDefaultBVExtendTerm True p (BVExtendTerm _ _ _ _ True _ (b :: Term (bv l1))) =- case unsafeLeqProof @l1 @r of- LeqProof -> Just $ pevalBVExtendTerm True p b-doPevalDefaultBVExtendTerm _ _ _ = Nothing--pevalDefaultBVConcatTerm ::- forall bv a b.- ( KnownNat a,- KnownNat b,- 1 <= a,- 1 <= b,- PEvalBVTerm bv,- forall n. (KnownNat n, 1 <= n) => SupportedPrim (bv n)- ) =>- Term (bv a) ->- Term (bv b) ->- Term (bv (a + b))-pevalDefaultBVConcatTerm =- withKnownNat (addNat (natRepr @a) (natRepr @b)) $- case (unsafeLeqProof @1 @(a + b)) of- LeqProof ->- binaryUnfoldOnce doPevalDefaultBVConcatTerm bvConcatTerm--unsafeBVConcatTerm ::- forall bv n1 n2 r.- (PEvalBVTerm bv, forall n. (KnownNat n, 1 <= n) => SupportedPrim (bv n)) =>- NatRepr n1 ->- NatRepr n2 ->- NatRepr r ->- Term (bv n1) ->- Term (bv n2) ->- Term (bv r)-unsafeBVConcatTerm n1Repr n2Repr rRepr lhs rhs =- case ( unsafeAxiom :: (n1 + n2) :~: r,- unsafeLeqProof @1 @r,- unsafeLeqProof @1 @n1,- unsafeLeqProof @1 @n2- ) of- (Refl, LeqProof, LeqProof, LeqProof) ->- withKnownNat n1Repr $- withKnownNat n2Repr $- withKnownNat rRepr $- bvConcatTerm lhs rhs--unsafePevalBVConcatTerm ::- forall bv n1 n2 r.- (PEvalBVTerm bv) =>- NatRepr n1 ->- NatRepr n2 ->- NatRepr r ->- Term (bv n1) ->- Term (bv n2) ->- Term (bv r)-unsafePevalBVConcatTerm n1Repr n2Repr rRepr lhs rhs =- case ( unsafeAxiom :: (n1 + n2) :~: r,- unsafeLeqProof @1 @r,- unsafeLeqProof @1 @n1,- unsafeLeqProof @1 @n2- ) of- (Refl, LeqProof, LeqProof, LeqProof) ->- withKnownNat n1Repr $- withKnownNat n2Repr $- withKnownNat rRepr $- pevalBVConcatTerm lhs rhs--doPevalDefaultBVConcatTerm ::- forall bv l r.- ( KnownNat l,- KnownNat r,- KnownNat (l + r),- 1 <= l,- 1 <= r,- 1 <= (l + r),- PEvalBVTerm bv,- forall n. (KnownNat n, 1 <= n) => SupportedPrim (bv n)- ) =>- Term (bv l) ->- Term (bv r) ->- Maybe (Term (bv (l + r)))--- 1. [c1 c2] -> c1c2-doPevalDefaultBVConcatTerm (ConTerm _ _ _ _ v) (ConTerm _ _ _ _ v') =- withKnownNat (addNat (natRepr @l) (natRepr @r)) $- Just $- conTerm $- sizedBVConcat v v'--- 2. [c1 (c2 ?)] -> (c1c2 ?)-doPevalDefaultBVConcatTerm- (ConTerm _ _ _ _ vl)- (BVConcatTerm _ _ _ _ (ConTerm _ _ _ _ (vrl :: bv rl)) (rr :: Term (bv rr))) =- case unsafeLeqProof @1 @(l + rl) of- LeqProof ->- Just $- withKnownNat lRlRepr $- unsafeBVConcatTerm- lRlRepr- (natRepr @rr)- (addNat (natRepr @l) (natRepr @r))- (conTerm $ sizedBVConcat vl vrl)- rr- where- lRlRepr = addNat (natRepr @l) (natRepr @rl)--- 3. [c1 (s c2)] -> (c1 (s c2))-doPevalDefaultBVConcatTerm (ConTerm {}) (BVConcatTerm _ _ _ _ _ ConTerm {}) = Nothing--- 4. [(c s) ?) -> (c [s ?])-doPevalDefaultBVConcatTerm- (BVConcatTerm _ _ _ _ (ll@ConTerm {} :: Term (bv ll)) (lr :: Term (bv lr)))- r =- Just $ unsafeBVConcatTerm llRepr lrRRepr lRRepr ll rhs- where- llRepr = natRepr @ll- lrRepr = natRepr @lr- lRepr = natRepr @l- rRepr = natRepr @r- lrRRepr = addNat lrRepr rRepr- lRRepr = addNat lRepr rRepr- rhs :: Term (bv (lr + r))- rhs = unsafePevalBVConcatTerm lrRepr rRepr lrRRepr lr r--- 5. [? (c1 (s2 c2))] -> (([? c1] s2) c2)-doPevalDefaultBVConcatTerm- l- ( BVConcatTerm- _- _- _- _- (rl@ConTerm {} :: Term (bv rl))- (BVConcatTerm _ _ _ _ (rrl :: Term (bv rrl)) (rrr@ConTerm {} :: Term (bv rrr)))- ) =- Just $ unsafeBVConcatTerm lRlRrlRepr rrrRepr lRRepr lRlRrl rrr- where- lRepr = natRepr @l- rlRepr = natRepr @rl- rrlRepr = natRepr @rrl- rrrRepr = natRepr @rrr- lRlRepr = addNat lRepr rlRepr- rRepr = natRepr @r- lRRepr = addNat lRepr rRepr- lRl = unsafePevalBVConcatTerm lRepr rlRepr lRlRepr l rl- lRlRrlRepr = addNat lRlRepr rrlRepr- lRlRrl = unsafeBVConcatTerm lRlRepr rrlRepr lRlRrlRepr lRl rrl--- 6. [(s1 c1) c2] -> (s1 c1c2)-doPevalDefaultBVConcatTerm- (BVConcatTerm _ _ _ _ (ll :: Term (bv ll)) ((ConTerm _ _ _ _ vlr) :: Term (bv lr)))- (ConTerm _ _ _ _ vr) =- Just $ unsafeBVConcatTerm llRepr lrRRepr lRRepr ll rhs- where- llRepr = natRepr @ll- lrRepr = natRepr @lr- lRepr = natRepr @l- rRepr = natRepr @r- lrRRepr = addNat lrRepr rRepr- lRRepr = addNat lRepr rRepr- rhs :: Term (bv (lr + r))- rhs = case unsafeLeqProof @1 @(lr + r) of- LeqProof ->- withKnownNat lrRRepr $ conTerm $ sizedBVConcat vlr vr--- 7. [(s1 c1) (c2 s2)] -> (s1 (c1c2 s2))-doPevalDefaultBVConcatTerm- (BVConcatTerm _ _ _ _ (ll :: Term (bv ll)) ((ConTerm _ _ _ _ vlr) :: Term (bv lr)))- (BVConcatTerm _ _ _ _ ((ConTerm _ _ _ _ vrl) :: Term (bv rl)) (rr :: Term (bv rr))) =- Just $ unsafeBVConcatTerm llRepr lrRlRrRepr lRRepr ll lrRlRR- where- lRepr = natRepr @l- rRepr = natRepr @r- llRepr = natRepr @ll- lrRepr = natRepr @lr- rlRepr = natRepr @rl- rrRepr = natRepr @rr- lRRepr = addNat lRepr rRepr- lrRlRepr :: NatRepr (lr + rl)- lrRlRepr = addNat lrRepr rlRepr- lrRlRrRepr :: NatRepr ((lr + rl) + rr)- lrRlRrRepr = addNat lrRlRepr rrRepr- lrRl :: Term (bv (lr + rl))- lrRl = case unsafeLeqProof @1 @(lr + rl) of- LeqProof -> withKnownNat lrRlRepr $ conTerm $ sizedBVConcat vlr vrl- lrRlRR :: Term (bv ((lr + rl) + rr))- lrRlRR = unsafeBVConcatTerm lrRlRepr rrRepr lrRlRrRepr lrRl rr--- 8. [?notc (s2 c)] -> ((s1 s2) c)-doPevalDefaultBVConcatTerm- l- (BVConcatTerm _ _ _ _ (rl :: Term (bv rl)) (rr@ConTerm {} :: Term (bv rr))) =- Just $- unsafeBVConcatTerm- lRlRepr- (natRepr @rr)- (addNat (natRepr @l) (natRepr @r))- lhs- rr- where- lRepr = natRepr @l- rlRepr = natRepr @rl- lRlRepr = addNat lRepr rlRepr- lhs :: Term (bv (l + rl))- lhs = unsafeBVConcatTerm lRepr rlRepr lRlRepr l rl-doPevalDefaultBVConcatTerm _ _ = Nothing--instance PEvalBVTerm WordN where- pevalBVSelectTerm = pevalDefaultBVSelectTerm @IntN- pevalBVConcatTerm = pevalDefaultBVConcatTerm- pevalBVExtendTerm = pevalDefaultBVExtendTerm- sbvBVConcatTerm pl pr l r =- bvIsNonZeroFromGEq1 pl $- bvIsNonZeroFromGEq1 pr $- l SBV.# r- sbvBVSelectTerm (pix :: p0 ix) (pw :: p1 w) (pn :: p2 n) bv =- bvIsNonZeroFromGEq1 (Proxy @n) $- bvIsNonZeroFromGEq1 (Proxy @w) $- sbvDefaultBVSelectTerm pix pw pn bv- sbvBVExtendTerm (_ :: p0 l) (_ :: p1 r) signed bv =- withKnownProof- (unsafeKnownProof @(r - l) (natVal (Proxy @r) - natVal (Proxy @l)))- $ case (unsafeLeqProof @(l + 1) @r, unsafeLeqProof @1 @(r - l)) of- (LeqProof, LeqProof) ->- bvIsNonZeroFromGEq1 (Proxy @r) $- bvIsNonZeroFromGEq1 (Proxy @l) $- bvIsNonZeroFromGEq1 (Proxy @(r - l)) $- if signed then SBV.signExtend bv else SBV.zeroExtend bv--instance PEvalBVTerm IntN where- pevalBVSelectTerm = pevalDefaultBVSelectTerm @WordN- pevalBVConcatTerm = pevalDefaultBVConcatTerm- pevalBVExtendTerm = pevalDefaultBVExtendTerm- sbvBVConcatTerm (pl :: p l) (pr :: q r) l r =- bvIsNonZeroFromGEq1 pl $- bvIsNonZeroFromGEq1 pr $- withKnownNat (addNat (natRepr @l) (natRepr @r)) $- case unsafeLeqProof @1 @(l + r) of- LeqProof ->- bvIsNonZeroFromGEq1 (Proxy @(l + r)) $- sbvBitCast @(WordN (l + r)) @(IntN (l + r)) $- (sbvBitCast @(IntN l) @(WordN l) l)- SBV.# (sbvBitCast @(IntN r) @(WordN r) r)- sbvBVSelectTerm (pix :: p0 ix) (pw :: p1 w) (pn :: p2 n) bv =- bvIsNonZeroFromGEq1 (Proxy @n) $- bvIsNonZeroFromGEq1 (Proxy @w) $- sbvDefaultBVSelectTerm pix pw pn bv- sbvBVExtendTerm (_ :: p0 l) (_ :: p1 r) signed bv =- withKnownProof- (unsafeKnownProof @(r - l) (natVal (Proxy @r) - natVal (Proxy @l)))- $ case (unsafeLeqProof @(l + 1) @r, unsafeLeqProof @1 @(r - l)) of- (LeqProof, LeqProof) ->- bvIsNonZeroFromGEq1 (Proxy @r) $- bvIsNonZeroFromGEq1 (Proxy @l) $- bvIsNonZeroFromGEq1 (Proxy @(r - l)) $- if signed- then SBV.signExtend bv- else- SBV.sFromIntegral- ( SBV.zeroExtend- (SBV.sFromIntegral bv :: SBV.SBV (SBV.WordN l)) ::- SBV.SBV (SBV.WordN r)- )--sbvDefaultBVSelectTerm ::- ( KnownNat ix,- KnownNat w,- KnownNat n,- 1 <= n,- 1 <= w,- (ix + w) <= n,- SBV.SymVal (bv n)- ) =>- p1 ix ->- p2 w ->- p3 n ->- SBV.SBV (bv n) ->- SBV.SBV (bv w)-sbvDefaultBVSelectTerm (_ :: p0 ix) (_ :: p1 w) (_ :: p2 n) bv =- withKnownProof- ( unsafeKnownProof @(w + ix - 1)- (natVal (Proxy @w) + natVal (Proxy @ix) - 1)- )- $ case ( unsafeAxiom @(w + ix - 1 - ix + 1) @w,- unsafeLeqProof @(((w + ix) - 1) + 1) @n,- unsafeLeqProof @ix @(w + ix - 1)- ) of- (Refl, LeqProof, LeqProof) ->- bvIsNonZeroFromGEq1 (Proxy @n) $- bvIsNonZeroFromGEq1 (Proxy @w) $- SBV.bvExtract (Proxy @(w + ix - 1)) (Proxy @ix) bv--instance (KnownNat n, 1 <= n) => PEvalBitCastTerm (WordN n) (IntN n) where- pevalBitCastTerm = unaryUnfoldOnce doPevalBitCastBV bitCastTerm- where- doPevalBitCastBV :: Term (WordN n) -> Maybe (Term (IntN n))- doPevalBitCastBV- (BVConcatTerm _ _ _ _ (l :: Term (WordN l)) (r :: Term (WordN r))) =- Just $- pevalBVConcatTerm- (pevalBitCastTerm @(WordN l) @(IntN l) l)- (pevalBitCastTerm @(WordN r) @(IntN r) r)- doPevalBitCastBV (BVExtendTerm _ _ _ _ signed pr (b :: Term (WordN l))) =- Just $- pevalBVExtendTerm signed pr $- pevalBitCastTerm @(WordN l) @(IntN l) b- doPevalBitCastBV v = doPevalBitCast v- sbvBitCast = bvIsNonZeroFromGEq1 (Proxy @n) SBV.sFromIntegral--instance (KnownNat n, 1 <= n) => PEvalBitCastTerm (IntN n) (WordN n) where- pevalBitCastTerm = unaryUnfoldOnce doPevalBitCastBV bitCastTerm- where- doPevalBitCastBV :: Term (IntN n) -> Maybe (Term (WordN n))- doPevalBitCastBV- (BVConcatTerm _ _ _ _ (l :: Term (IntN l)) (r :: Term (IntN r))) =- Just $- pevalBVConcatTerm- (pevalBitCastTerm @(IntN l) @(WordN l) l)- (pevalBitCastTerm @(IntN r) @(WordN r) r)- doPevalBitCastBV (BVExtendTerm _ _ _ _ signed pr (b :: Term (IntN l))) =- Just $- pevalBVExtendTerm signed pr $- pevalBitCastTerm @(IntN l) @(WordN l) b- doPevalBitCastBV v = doPevalBitCast v- sbvBitCast = bvIsNonZeroFromGEq1 (Proxy @n) SBV.sFromIntegral
src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalBitCastTerm.hs view
@@ -30,17 +30,18 @@ ) import Grisette.Internal.SymPrim.BV (IntN, WordN) import Grisette.Internal.SymPrim.FP (FP, ValidFP, withValidFPProofs)-import Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim () import Grisette.Internal.SymPrim.Prim.Internal.Term ( PEvalBitCastOrTerm (pevalBitCastOrTerm, sbvBitCastOr), PEvalBitCastTerm (pevalBitCastTerm, sbvBitCast), SupportedPrim,- Term (BitCastTerm, ConTerm),+ Term, bitCastOrTerm, bitCastTerm, conTerm,- introSupportedPrimConstraint,+ pattern BitCastTerm,+ pattern ConTerm, pattern DynTerm,+ pattern SupportedTerm, ) import Grisette.Internal.SymPrim.Prim.Internal.Unfold ( binaryUnfoldOnce,@@ -49,14 +50,14 @@ doPevalBitCastSameType :: forall x b. (SupportedPrim b) => Term x -> Maybe (Term b)-doPevalBitCastSameType (BitCastTerm _ _ _ _ (DynTerm (b :: Term b))) = Just b-doPevalBitCastSameType (BitCastTerm _ _ _ _ x) = doPevalBitCastSameType x+doPevalBitCastSameType (BitCastTerm (DynTerm (b :: Term b))) = Just b+doPevalBitCastSameType (BitCastTerm x) = doPevalBitCastSameType x doPevalBitCastSameType _ = Nothing -- | Partially evaluate a bitcast term. If no reduction is performed, return -- Nothing. doPevalBitCast :: (PEvalBitCastTerm a b, SupportedPrim b) => Term a -> Maybe (Term b)-doPevalBitCast (ConTerm _ _ _ _ v) = Just $ conTerm $ bitCast v+doPevalBitCast (ConTerm v) = Just $ conTerm $ bitCast v doPevalBitCast t = doPevalBitCastSameType t pevalBitCastGeneral ::@@ -71,7 +72,7 @@ Term b -> Term a -> Maybe (Term b)-doPevalBitCastOr (ConTerm _ _ _ _ d) (ConTerm _ _ _ _ v) =+doPevalBitCastOr (ConTerm d) (ConTerm v) = Just $ conTerm $ bitCastOr d v doPevalBitCastOr _ _ = Nothing @@ -81,9 +82,8 @@ Term b -> Term a -> Term b-pevalBitCastOr d a =- introSupportedPrimConstraint d $- binaryUnfoldOnce doPevalBitCastOr bitCastOrTerm d a+pevalBitCastOr d@SupportedTerm =+ binaryUnfoldOnce doPevalBitCastOr bitCastOrTerm d instance PEvalBitCastTerm Bool (IntN 1) where pevalBitCastTerm = pevalBitCastGeneral
− src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalBitwiseTerm.hs
@@ -1,118 +0,0 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE GADTs #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeApplications #-}-{-# LANGUAGE TypeOperators #-}-{-# LANGUAGE UndecidableInstances #-}-{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}--{-# HLINT ignore "Eta reduce" #-}---- |--- Module : Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalBitwiseTerm--- Copyright : (c) Sirui Lu 2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalBitwiseTerm () where--import Data.Bits (Bits (complement, xor, zeroBits, (.&.), (.|.)))-import GHC.TypeLits (KnownNat, type (<=))-import Grisette.Internal.SymPrim.BV (IntN, WordN)-import Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim ()-import Grisette.Internal.SymPrim.Prim.Internal.Term- ( PEvalBitwiseTerm- ( pevalAndBitsTerm,- pevalComplementBitsTerm,- pevalOrBitsTerm,- pevalXorBitsTerm,- withSbvBitwiseTermConstraint- ),- SupportedPrim (withPrim),- Term (ComplementBitsTerm, ConTerm),- andBitsTerm,- complementBitsTerm,- conTerm,- orBitsTerm,- xorBitsTerm,- )-import Grisette.Internal.SymPrim.Prim.Internal.Unfold- ( binaryUnfoldOnce,- unaryUnfoldOnce,- )--pevalDefaultAndBitsTerm ::- (Bits a, SupportedPrim a, PEvalBitwiseTerm a) => Term a -> Term a -> Term a-pevalDefaultAndBitsTerm = binaryUnfoldOnce doPevalAndBitsTerm andBitsTerm- where- doPevalAndBitsTerm (ConTerm _ _ _ _ a) (ConTerm _ _ _ _ b) =- Just $ conTerm (a .&. b)- doPevalAndBitsTerm (ConTerm _ _ _ _ a) b- | a == zeroBits = Just $ conTerm zeroBits- | a == complement zeroBits = Just b- doPevalAndBitsTerm a (ConTerm _ _ _ _ b)- | b == zeroBits = Just $ conTerm zeroBits- | b == complement zeroBits = Just a- doPevalAndBitsTerm a b | a == b = Just a- doPevalAndBitsTerm _ _ = Nothing--pevalDefaultOrBitsTerm ::- (Bits a, SupportedPrim a, PEvalBitwiseTerm a) => Term a -> Term a -> Term a-pevalDefaultOrBitsTerm = binaryUnfoldOnce doPevalOrBitsTerm orBitsTerm- where- doPevalOrBitsTerm (ConTerm _ _ _ _ a) (ConTerm _ _ _ _ b) = Just $ conTerm (a .|. b)- doPevalOrBitsTerm (ConTerm _ _ _ _ a) b- | a == zeroBits = Just b- | a == complement zeroBits = Just $ conTerm $ complement zeroBits- doPevalOrBitsTerm a (ConTerm _ _ _ _ b)- | b == zeroBits = Just a- | b == complement zeroBits = Just $ conTerm $ complement zeroBits- doPevalOrBitsTerm a b | a == b = Just a- doPevalOrBitsTerm _ _ = Nothing--pevalDefaultXorBitsTerm ::- (PEvalBitwiseTerm a, SupportedPrim a, Bits a) => Term a -> Term a -> Term a-pevalDefaultXorBitsTerm = binaryUnfoldOnce doPevalXorBitsTerm xorBitsTerm- where- doPevalXorBitsTerm (ConTerm _ _ _ _ a) (ConTerm _ _ _ _ b) =- Just $ conTerm (a `xor` b)- doPevalXorBitsTerm (ConTerm _ _ _ _ a) b- | a == zeroBits = Just b- | a == complement zeroBits = Just $ pevalComplementBitsTerm b- doPevalXorBitsTerm a (ConTerm _ _ _ _ b)- | b == zeroBits = Just a- | b == complement zeroBits = Just $ pevalComplementBitsTerm a- doPevalXorBitsTerm a b | a == b = Just $ conTerm zeroBits- doPevalXorBitsTerm (ComplementBitsTerm _ _ _ _ i) (ComplementBitsTerm _ _ _ _ j) =- Just $ pevalXorBitsTerm i j- doPevalXorBitsTerm (ComplementBitsTerm _ _ _ _ i) j =- Just $ pevalComplementBitsTerm $ pevalXorBitsTerm i j- doPevalXorBitsTerm i (ComplementBitsTerm _ _ _ _ j) =- Just $ pevalComplementBitsTerm $ pevalXorBitsTerm i j- doPevalXorBitsTerm _ _ = Nothing--pevalDefaultComplementBitsTerm ::- (Bits a, SupportedPrim a, PEvalBitwiseTerm a) => Term a -> Term a-pevalDefaultComplementBitsTerm =- unaryUnfoldOnce doPevalComplementBitsTerm complementBitsTerm- where- doPevalComplementBitsTerm (ConTerm _ _ _ _ a) = Just $ conTerm $ complement a- doPevalComplementBitsTerm (ComplementBitsTerm _ _ _ _ a) = Just a- doPevalComplementBitsTerm _ = Nothing--instance (KnownNat n, 1 <= n) => PEvalBitwiseTerm (WordN n) where- pevalAndBitsTerm = pevalDefaultAndBitsTerm- pevalOrBitsTerm = pevalDefaultOrBitsTerm- pevalXorBitsTerm = pevalDefaultXorBitsTerm- pevalComplementBitsTerm = pevalDefaultComplementBitsTerm- withSbvBitwiseTermConstraint r = withPrim @(WordN n) r--instance (KnownNat n, 1 <= n) => PEvalBitwiseTerm (IntN n) where- pevalAndBitsTerm = pevalDefaultAndBitsTerm- pevalOrBitsTerm = pevalDefaultOrBitsTerm- pevalXorBitsTerm = pevalDefaultXorBitsTerm- pevalComplementBitsTerm = pevalDefaultComplementBitsTerm- withSbvBitwiseTermConstraint r = withPrim @(IntN n) r
src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalDivModIntegralTerm.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE DataKinds #-} {-# LANGUAGE GADTs #-}+{-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE ScopedTypeVariables #-} {-# HLINT ignore "Eta reduce" #-} {-# LANGUAGE TypeApplications #-}@@ -27,7 +28,6 @@ import GHC.TypeNats (KnownNat, type (<=)) import Grisette.Internal.SymPrim.BV (IntN, WordN)-import Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim () import Grisette.Internal.SymPrim.Prim.Internal.Term ( PEvalDivModIntegralTerm ( pevalDivIntegralTerm,@@ -37,28 +37,28 @@ withSbvDivModIntegralTermConstraint ), SupportedPrim (withPrim),- Term (ConTerm),+ Term, conTerm, divIntegralTerm,- introSupportedPrimConstraint, modIntegralTerm, quotIntegralTerm, remIntegralTerm,+ pattern ConTerm,+ pattern SupportedTerm, ) import Grisette.Internal.SymPrim.Prim.Internal.Unfold (binaryUnfoldOnce) -- | Default partial evaluation of division operation for integral types. pevalDefaultDivIntegralTerm :: (PEvalDivModIntegralTerm a, Integral a) => Term a -> Term a -> Term a-pevalDefaultDivIntegralTerm l r =- introSupportedPrimConstraint l $- binaryUnfoldOnce doPevalDefaultDivIntegralTerm divIntegralTerm l r+pevalDefaultDivIntegralTerm l@SupportedTerm r =+ binaryUnfoldOnce doPevalDefaultDivIntegralTerm divIntegralTerm l r doPevalDefaultDivIntegralTerm :: (PEvalDivModIntegralTerm a, Integral a) => Term a -> Term a -> Maybe (Term a)-doPevalDefaultDivIntegralTerm (ConTerm _ _ _ _ a) (ConTerm _ _ _ _ b)+doPevalDefaultDivIntegralTerm (ConTerm a) (ConTerm b) | b /= 0 = Just $ conTerm $ a `div` b-doPevalDefaultDivIntegralTerm a (ConTerm _ _ _ _ 1) = Just a+doPevalDefaultDivIntegralTerm a (ConTerm 1) = Just a doPevalDefaultDivIntegralTerm _ _ = Nothing -- | Default partial evaluation of division operation for bounded integral@@ -68,80 +68,78 @@ Term a -> Term a -> Term a-pevalDefaultDivBoundedIntegralTerm l r =- introSupportedPrimConstraint l $- binaryUnfoldOnce doPevalDefaultDivBoundedIntegralTerm divIntegralTerm l r+pevalDefaultDivBoundedIntegralTerm l@SupportedTerm r =+ binaryUnfoldOnce doPevalDefaultDivBoundedIntegralTerm divIntegralTerm l r doPevalDefaultDivBoundedIntegralTerm :: (PEvalDivModIntegralTerm a, Bounded a, Integral a) => Term a -> Term a -> Maybe (Term a)-doPevalDefaultDivBoundedIntegralTerm (ConTerm _ _ _ _ a) (ConTerm _ _ _ _ b)+doPevalDefaultDivBoundedIntegralTerm (ConTerm a) (ConTerm b) | b /= 0 && (b /= -1 || a /= minBound) = Just $ conTerm $ a `div` b-doPevalDefaultDivBoundedIntegralTerm a (ConTerm _ _ _ _ 1) = Just a+doPevalDefaultDivBoundedIntegralTerm a (ConTerm 1) = Just a doPevalDefaultDivBoundedIntegralTerm _ _ = Nothing -- | Default partial evaluation of modulo operation for integral types. pevalDefaultModIntegralTerm :: (PEvalDivModIntegralTerm a, Integral a) => Term a -> Term a -> Term a-pevalDefaultModIntegralTerm l r =- introSupportedPrimConstraint l $- binaryUnfoldOnce doPevalDefaultModIntegralTerm modIntegralTerm l r+pevalDefaultModIntegralTerm l@SupportedTerm r =+ binaryUnfoldOnce doPevalDefaultModIntegralTerm modIntegralTerm l r doPevalDefaultModIntegralTerm :: (PEvalDivModIntegralTerm a, Integral a) => Term a -> Term a -> Maybe (Term a)-doPevalDefaultModIntegralTerm (ConTerm _ _ _ _ a) (ConTerm _ _ _ _ b)+doPevalDefaultModIntegralTerm (ConTerm a) (ConTerm b) | b /= 0 = Just $ conTerm $ a `mod` b-doPevalDefaultModIntegralTerm _ (ConTerm _ _ _ _ 1) = Just $ conTerm 0-doPevalDefaultModIntegralTerm _ (ConTerm _ _ _ _ (-1)) = Just $ conTerm 0+doPevalDefaultModIntegralTerm _ (ConTerm 1) = Just $ conTerm 0+doPevalDefaultModIntegralTerm _ (ConTerm (-1)) = Just $ conTerm 0 doPevalDefaultModIntegralTerm _ _ = Nothing -- | Default partial evaluation of quotient operation for integral types. pevalDefaultQuotIntegralTerm :: (PEvalDivModIntegralTerm a, Integral a) => Term a -> Term a -> Term a-pevalDefaultQuotIntegralTerm l r =- introSupportedPrimConstraint l $- binaryUnfoldOnce doPevalDefaultQuotIntegralTerm quotIntegralTerm l r+pevalDefaultQuotIntegralTerm l@SupportedTerm r =+ binaryUnfoldOnce doPevalDefaultQuotIntegralTerm quotIntegralTerm l r doPevalDefaultQuotIntegralTerm :: (PEvalDivModIntegralTerm a, Integral a) => Term a -> Term a -> Maybe (Term a)-doPevalDefaultQuotIntegralTerm (ConTerm _ _ _ _ a) (ConTerm _ _ _ _ b)+doPevalDefaultQuotIntegralTerm (ConTerm a) (ConTerm b) | b /= 0 = Just $ conTerm $ a `quot` b-doPevalDefaultQuotIntegralTerm a (ConTerm _ _ _ _ 1) = Just a+doPevalDefaultQuotIntegralTerm a (ConTerm 1) = Just a doPevalDefaultQuotIntegralTerm _ _ = Nothing -- | Default partial evaluation of quotient operation for bounded integral -- types. pevalDefaultQuotBoundedIntegralTerm ::- (PEvalDivModIntegralTerm a, Bounded a, Integral a) => Term a -> Term a -> Term a-pevalDefaultQuotBoundedIntegralTerm l r =- introSupportedPrimConstraint l $- binaryUnfoldOnce doPevalDefaultQuotBoundedIntegralTerm quotIntegralTerm l r+ (PEvalDivModIntegralTerm a, Bounded a, Integral a) =>+ Term a ->+ Term a ->+ Term a+pevalDefaultQuotBoundedIntegralTerm l@SupportedTerm r =+ binaryUnfoldOnce doPevalDefaultQuotBoundedIntegralTerm quotIntegralTerm l r doPevalDefaultQuotBoundedIntegralTerm :: (PEvalDivModIntegralTerm a, Bounded a, Integral a) => Term a -> Term a -> Maybe (Term a)-doPevalDefaultQuotBoundedIntegralTerm (ConTerm _ _ _ _ a) (ConTerm _ _ _ _ b)+doPevalDefaultQuotBoundedIntegralTerm (ConTerm a) (ConTerm b) | b /= 0 && (b /= -1 || a /= minBound) = Just $ conTerm $ a `quot` b-doPevalDefaultQuotBoundedIntegralTerm a (ConTerm _ _ _ _ 1) = Just a+doPevalDefaultQuotBoundedIntegralTerm a (ConTerm 1) = Just a doPevalDefaultQuotBoundedIntegralTerm _ _ = Nothing -- | Default partial evaluation of remainder operation for integral types. pevalDefaultRemIntegralTerm :: (PEvalDivModIntegralTerm a, Integral a) => Term a -> Term a -> Term a-pevalDefaultRemIntegralTerm l r =- introSupportedPrimConstraint l $- binaryUnfoldOnce doPevalDefaultRemIntegralTerm remIntegralTerm l r+pevalDefaultRemIntegralTerm l@SupportedTerm r =+ binaryUnfoldOnce doPevalDefaultRemIntegralTerm remIntegralTerm l r doPevalDefaultRemIntegralTerm :: (PEvalDivModIntegralTerm a, Integral a) => Term a -> Term a -> Maybe (Term a)-doPevalDefaultRemIntegralTerm (ConTerm _ _ _ _ a) (ConTerm _ _ _ _ b)+doPevalDefaultRemIntegralTerm (ConTerm a) (ConTerm b) | b /= 0 = Just $ conTerm $ a `rem` b-doPevalDefaultRemIntegralTerm _ (ConTerm _ _ _ _ 1) = Just $ conTerm 0-doPevalDefaultRemIntegralTerm _ (ConTerm _ _ _ _ (-1)) = Just $ conTerm 0+doPevalDefaultRemIntegralTerm _ (ConTerm 1) = Just $ conTerm 0+doPevalDefaultRemIntegralTerm _ (ConTerm (-1)) = Just $ conTerm 0 doPevalDefaultRemIntegralTerm _ _ = Nothing instance PEvalDivModIntegralTerm Integer where
src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalFP.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE PatternSynonyms #-} -- | -- Module : Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP@@ -8,21 +9,7 @@ -- Maintainer : siruilu@cs.washington.edu -- Stability : Experimental -- Portability : GHC only-module Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP- ( pevalFPTraitTerm,- sbvFPTraitTerm,- pevalFPUnaryTerm,- sbvFPUnaryTerm,- pevalFPBinaryTerm,- sbvFPBinaryTerm,- pevalFPRoundingUnaryTerm,- sbvFPRoundingUnaryTerm,- pevalFPRoundingBinaryTerm,- sbvFPRoundingBinaryTerm,- pevalFPFMATerm,- sbvFPFMATerm,- )-where+module Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP () where import qualified Data.SBV as SBV import Grisette.Internal.Core.Data.Class.IEEEFP@@ -43,7 +30,7 @@ fpSub ), )-import Grisette.Internal.SymPrim.FP (FP, FPRoundingMode, ValidFP)+import Grisette.Internal.SymPrim.FP (FP, ValidFP) import Grisette.Internal.SymPrim.Prim.Internal.Term ( FPBinaryOp (FPMaximum, FPMaximumNumber, FPMinimum, FPMinimumNumber, FPRem), FPRoundingBinaryOp (FPAdd, FPDiv, FPMul, FPSub),@@ -63,8 +50,20 @@ FPIsZero ), FPUnaryOp (FPAbs, FPNeg),- SupportedPrim,- Term (ConTerm),+ PEvalFPTerm+ ( pevalFPBinaryTerm,+ pevalFPFMATerm,+ pevalFPRoundingBinaryTerm,+ pevalFPRoundingUnaryTerm,+ pevalFPTraitTerm,+ pevalFPUnaryTerm,+ sbvFPBinaryTerm,+ sbvFPFMATerm,+ sbvFPRoundingBinaryTerm,+ sbvFPRoundingUnaryTerm,+ sbvFPTraitTerm,+ sbvFPUnaryTerm+ ), conTerm, fpBinaryTerm, fpFMATerm,@@ -72,120 +71,129 @@ fpRoundingUnaryTerm, fpTraitTerm, fpUnaryTerm,+ pattern ConTerm, ) import Grisette.Internal.SymPrim.Prim.Internal.Unfold (unaryUnfoldOnce) --- | Partially evaluate a floating-point trait term.-pevalFPTraitTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- FPTrait ->- Term (FP eb sb) ->- Term Bool-pevalFPTraitTerm trait = unaryUnfoldOnce doPevalFPTraitTerm (fpTraitTerm trait)- where- doPevalFPTraitTerm (ConTerm _ _ _ _ a) = case trait of- FPIsNaN -> Just $ conTerm $ isNaN a- FPIsPositive ->- Just $- conTerm $- not (isNaN a) && a >= 0 && not (isNegativeZero a)- FPIsNegative ->- Just $ conTerm $ not (isNaN a) && (a < 0 || isNegativeZero a)- FPIsInfinite -> Just $ conTerm $ isInfinite a- FPIsPositiveInfinite -> Just $ conTerm $ isInfinite a && a > 0- FPIsNegativeInfinite -> Just $ conTerm $ isInfinite a && a < 0- FPIsPositiveZero ->- Just $ conTerm $ a == 0 && not (isNegativeZero a)- FPIsNegativeZero -> Just $ conTerm $ isNegativeZero a- FPIsZero -> Just $ conTerm $ a == 0- FPIsNormal ->- Just $- conTerm $- not (a == 0 || isNaN a || isInfinite a || isDenormalized a)- FPIsSubnormal -> Just $ conTerm $ isDenormalized a- FPIsPoint -> Just $ conTerm $ not (isNaN a || isInfinite a)- doPevalFPTraitTerm _ = Nothing+instance PEvalFPTerm FP where+ pevalFPTraitTerm trait =+ unaryUnfoldOnce doPevalFPTraitTerm (fpTraitTerm trait)+ where+ doPevalFPTraitTerm (ConTerm a) = case trait of+ FPIsNaN -> Just $ conTerm $ isNaN a+ FPIsPositive ->+ Just $+ conTerm $+ not (isNaN a) && a >= 0 && not (isNegativeZero a)+ FPIsNegative ->+ Just $ conTerm $ not (isNaN a) && (a < 0 || isNegativeZero a)+ FPIsInfinite -> Just $ conTerm $ isInfinite a+ FPIsPositiveInfinite -> Just $ conTerm $ isInfinite a && a > 0+ FPIsNegativeInfinite -> Just $ conTerm $ isInfinite a && a < 0+ FPIsPositiveZero ->+ Just $ conTerm $ a == 0 && not (isNegativeZero a)+ FPIsNegativeZero -> Just $ conTerm $ isNegativeZero a+ FPIsZero -> Just $ conTerm $ a == 0+ FPIsNormal ->+ Just $+ conTerm $+ not (a == 0 || isNaN a || isInfinite a || isDenormalized a)+ FPIsSubnormal -> Just $ conTerm $ isDenormalized a+ FPIsPoint -> Just $ conTerm $ not (isNaN a || isInfinite a)+ doPevalFPTraitTerm _ = Nothing+ pevalFPUnaryTerm = fpUnaryTerm+ {-# INLINE pevalFPUnaryTerm #-}+ pevalFPBinaryTerm bop (ConTerm l) (ConTerm r) =+ case bop of+ FPMaximum -> conTerm $ fpMaximum l r+ FPMaximumNumber -> conTerm $ fpMaximumNumber l r+ FPMinimum -> conTerm $ fpMinimum l r+ FPMinimumNumber -> conTerm $ fpMinimumNumber l r+ FPRem -> conTerm $ fpRem l r+ pevalFPBinaryTerm FPMaximum l r | l == r = l+ pevalFPBinaryTerm FPMaximumNumber l r | l == r = l+ pevalFPBinaryTerm FPMinimum l r | l == r = l+ pevalFPBinaryTerm FPMinimumNumber l r | l == r = l+ pevalFPBinaryTerm bop l r = fpBinaryTerm bop l r+ {-# INLINE pevalFPBinaryTerm #-}+ pevalFPRoundingUnaryTerm uop (ConTerm rd) (ConTerm l) =+ case uop of+ FPSqrt -> conTerm $ fpSqrt rd l+ FPRoundToIntegral -> conTerm $ fpRoundToIntegral rd l+ pevalFPRoundingUnaryTerm uop rd l = fpRoundingUnaryTerm uop rd l+ {-# INLINE pevalFPRoundingUnaryTerm #-}+ pevalFPRoundingBinaryTerm bop (ConTerm rd) (ConTerm l) (ConTerm r) =+ case bop of+ FPAdd -> conTerm $ fpAdd rd l r+ FPSub -> conTerm $ fpSub rd l r+ FPMul -> conTerm $ fpMul rd l r+ FPDiv -> conTerm $ fpDiv rd l r+ pevalFPRoundingBinaryTerm bop rd l r = fpRoundingBinaryTerm bop rd l r+ {-# INLINE pevalFPRoundingBinaryTerm #-}+ pevalFPFMATerm (ConTerm rd) (ConTerm x) (ConTerm y) (ConTerm z) =+ conTerm $ fpFMA rd x y z+ pevalFPFMATerm rd x y z = fpFMATerm rd x y z+ {-# INLINE pevalFPFMATerm #-} --- Workaround for https://github.com/GaloisInc/libBF-hs/pull/32, which affects--- the correctness of the Ord instance for 'Data.SBV.FloatingPoint'.-goodFpIsPositive ::- (ValidFP eb sb) =>- SBV.SFloatingPoint eb sb ->- SBV.SBool-goodFpIsPositive x =- SBV.sNot (SBV.fpIsNaN x) SBV..&& SBV.fpIsPositive x-{-# INLINE goodFpIsPositive #-}+ sbvFPTraitTerm FPIsNaN = SBV.fpIsNaN+ sbvFPTraitTerm FPIsPositive = goodFpIsPositive+ sbvFPTraitTerm FPIsNegative = goodFpIsNegative+ sbvFPTraitTerm FPIsInfinite = SBV.fpIsInfinite+ sbvFPTraitTerm FPIsPositiveInfinite = \f ->+ SBV.fpIsInfinite f SBV..&& goodFpIsPositive f+ sbvFPTraitTerm FPIsNegativeInfinite = \f ->+ SBV.fpIsInfinite f SBV..&& goodFpIsNegative f+ sbvFPTraitTerm FPIsPositiveZero =+ \f -> SBV.fpIsZero f SBV..&& goodFpIsPositive f+ sbvFPTraitTerm FPIsNegativeZero =+ \f -> SBV.fpIsZero f SBV..&& goodFpIsNegative f+ sbvFPTraitTerm FPIsZero = SBV.fpIsZero+ sbvFPTraitTerm FPIsNormal = SBV.fpIsNormal+ sbvFPTraitTerm FPIsSubnormal = SBV.fpIsSubnormal+ sbvFPTraitTerm FPIsPoint = SBV.fpIsPoint -goodFpIsNegative ::- (ValidFP eb sb) =>- SBV.SFloatingPoint eb sb ->- SBV.SBool-goodFpIsNegative x = SBV.sNot (SBV.fpIsNaN x) SBV..&& SBV.fpIsNegative x-{-# INLINE goodFpIsNegative #-}+ sbvFPUnaryTerm FPAbs = SBV.fpAbs+ sbvFPUnaryTerm FPNeg = SBV.fpNeg+ {-# INLINE sbvFPUnaryTerm #-} --- | Lowering an floating-point trait term to sbv.-sbvFPTraitTerm ::- (ValidFP eb sb) =>- FPTrait ->- SBV.SFloatingPoint eb sb ->- SBV.SBool-sbvFPTraitTerm FPIsNaN = SBV.fpIsNaN-sbvFPTraitTerm FPIsPositive = goodFpIsPositive-sbvFPTraitTerm FPIsNegative = goodFpIsNegative-sbvFPTraitTerm FPIsInfinite = SBV.fpIsInfinite-sbvFPTraitTerm FPIsPositiveInfinite = \f ->- SBV.fpIsInfinite f SBV..&& goodFpIsPositive f-sbvFPTraitTerm FPIsNegativeInfinite = \f ->- SBV.fpIsInfinite f SBV..&& goodFpIsNegative f-sbvFPTraitTerm FPIsPositiveZero =- \f -> SBV.fpIsZero f SBV..&& goodFpIsPositive f-sbvFPTraitTerm FPIsNegativeZero =- \f -> SBV.fpIsZero f SBV..&& goodFpIsNegative f-sbvFPTraitTerm FPIsZero = SBV.fpIsZero-sbvFPTraitTerm FPIsNormal = SBV.fpIsNormal-sbvFPTraitTerm FPIsSubnormal = SBV.fpIsSubnormal-sbvFPTraitTerm FPIsPoint = SBV.fpIsPoint+ sbvFPBinaryTerm FPRem x y = SBV.fpRem x y+ sbvFPBinaryTerm FPMinimum x y =+ SBV.ite (SBV.fpIsNaN x SBV..|| SBV.fpIsNaN y) SBV.nan $+ SBV.ite (sbvCmpHandleNegZero x y) x y+ sbvFPBinaryTerm FPMinimumNumber x y =+ SBV.ite (SBV.fpIsNaN x) y $+ SBV.ite (SBV.fpIsNaN y) x $+ SBV.ite (sbvCmpHandleNegZero x y) x y+ sbvFPBinaryTerm FPMaximum x y =+ SBV.ite (SBV.fpIsNaN x SBV..|| SBV.fpIsNaN y) SBV.nan $+ SBV.ite (sbvCmpHandleNegZero x y) y x+ sbvFPBinaryTerm FPMaximumNumber x y =+ SBV.ite (SBV.fpIsNaN x) y $+ SBV.ite (SBV.fpIsNaN y) x $+ SBV.ite (sbvCmpHandleNegZero x y) y x+ {-# INLINE sbvFPBinaryTerm #-} --- | Partially evaluate a floating-point unary term.-pevalFPUnaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- FPUnaryOp ->- Term (FP eb sb) ->- Term (FP eb sb)-pevalFPUnaryTerm = fpUnaryTerm-{-# INLINE pevalFPUnaryTerm #-}+ sbvFPRoundingUnaryTerm FPSqrt = SBV.fpSqrt+ sbvFPRoundingUnaryTerm FPRoundToIntegral = SBV.fpRoundToIntegral+ {-# INLINE sbvFPRoundingUnaryTerm #-} --- | Lowering an floating-point unary term to sbv.-sbvFPUnaryTerm ::- (ValidFP eb sb) =>- FPUnaryOp ->- SBV.SFloatingPoint eb sb ->- SBV.SFloatingPoint eb sb-sbvFPUnaryTerm FPAbs = SBV.fpAbs-sbvFPUnaryTerm FPNeg = SBV.fpNeg-{-# INLINE sbvFPUnaryTerm #-}+ sbvFPRoundingBinaryTerm FPAdd = SBV.fpAdd+ sbvFPRoundingBinaryTerm FPSub = SBV.fpSub+ sbvFPRoundingBinaryTerm FPMul = SBV.fpMul+ sbvFPRoundingBinaryTerm FPDiv = SBV.fpDiv+ {-# INLINE sbvFPRoundingBinaryTerm #-} --- | Partially evaluate a floating-point binary term.-pevalFPBinaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- FPBinaryOp ->- Term (FP eb sb) ->- Term (FP eb sb) ->- Term (FP eb sb)-pevalFPBinaryTerm bop (ConTerm _ _ _ _ l) (ConTerm _ _ _ _ r) =- case bop of- FPMaximum -> conTerm $ fpMaximum l r- FPMaximumNumber -> conTerm $ fpMaximumNumber l r- FPMinimum -> conTerm $ fpMinimum l r- FPMinimumNumber -> conTerm $ fpMinimumNumber l r- FPRem -> conTerm $ fpRem l r-pevalFPBinaryTerm FPMaximum l r | l == r = l-pevalFPBinaryTerm FPMaximumNumber l r | l == r = l-pevalFPBinaryTerm FPMinimum l r | l == r = l-pevalFPBinaryTerm FPMinimumNumber l r | l == r = l-pevalFPBinaryTerm bop l r = fpBinaryTerm bop l r-{-# INLINE pevalFPBinaryTerm #-}+ sbvFPFMATerm = SBV.fpFMA+ {-# INLINE sbvFPFMATerm #-} +goodFpIsPositive :: (ValidFP eb sb) => SBV.SFloatingPoint eb sb -> SBV.SBool+goodFpIsPositive x = SBV.sNot (SBV.fpIsNaN x) SBV..&& SBV.fpIsPositive x+{-# INLINE goodFpIsPositive #-}++goodFpIsNegative :: (ValidFP eb sb) => SBV.SFloatingPoint eb sb -> SBV.SBool+goodFpIsNegative x = SBV.sNot (SBV.fpIsNaN x) SBV..&& SBV.fpIsNegative x+{-# INLINE goodFpIsNegative #-}+ sbvCmpHandleNegZero :: (ValidFP eb sb) => SBV.SFloatingPoint eb sb ->@@ -196,111 +204,4 @@ (SBV.fpIsZero x SBV..&& SBV.fpIsZero y) (SBV.fpIsNegativeZero x) (x SBV..< y)---- | Lowering an floating-point binary term to sbv.-sbvFPBinaryTerm ::- (ValidFP eb sb) =>- FPBinaryOp ->- SBV.SFloatingPoint eb sb ->- SBV.SFloatingPoint eb sb ->- SBV.SFloatingPoint eb sb-sbvFPBinaryTerm FPRem x y = SBV.fpRem x y-sbvFPBinaryTerm FPMinimum x y =- SBV.ite (SBV.fpIsNaN x SBV..|| SBV.fpIsNaN y) SBV.nan $- SBV.ite (sbvCmpHandleNegZero x y) x y-sbvFPBinaryTerm FPMinimumNumber x y =- SBV.ite (SBV.fpIsNaN x) y $- SBV.ite (SBV.fpIsNaN y) x $- SBV.ite (sbvCmpHandleNegZero x y) x y-sbvFPBinaryTerm FPMaximum x y =- SBV.ite (SBV.fpIsNaN x SBV..|| SBV.fpIsNaN y) SBV.nan $- SBV.ite (sbvCmpHandleNegZero x y) y x-sbvFPBinaryTerm FPMaximumNumber x y =- SBV.ite (SBV.fpIsNaN x) y $- SBV.ite (SBV.fpIsNaN y) x $- SBV.ite (sbvCmpHandleNegZero x y) y x-{-# INLINE sbvFPBinaryTerm #-}---- | Partially evaluate a floating-point rounding unary term.-pevalFPRoundingUnaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- FPRoundingUnaryOp ->- Term FPRoundingMode ->- Term (FP eb sb) ->- Term (FP eb sb)-pevalFPRoundingUnaryTerm uop (ConTerm _ _ _ _ rd) (ConTerm _ _ _ _ l) =- case uop of- FPSqrt -> conTerm $ fpSqrt rd l- FPRoundToIntegral -> conTerm $ fpRoundToIntegral rd l-pevalFPRoundingUnaryTerm uop rd l = fpRoundingUnaryTerm uop rd l-{-# INLINE pevalFPRoundingUnaryTerm #-}---- | Lowering an floating-point rounding unary term to sbv.-sbvFPRoundingUnaryTerm ::- (ValidFP eb sb) =>- FPRoundingUnaryOp ->- SBV.SRoundingMode ->- SBV.SFloatingPoint eb sb ->- SBV.SFloatingPoint eb sb-sbvFPRoundingUnaryTerm FPSqrt = SBV.fpSqrt-sbvFPRoundingUnaryTerm FPRoundToIntegral = SBV.fpRoundToIntegral-{-# INLINE sbvFPRoundingUnaryTerm #-}---- | Partially evaluate a floating-point rounding binary term.-pevalFPRoundingBinaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- FPRoundingBinaryOp ->- Term FPRoundingMode ->- Term (FP eb sb) ->- Term (FP eb sb) ->- Term (FP eb sb)-pevalFPRoundingBinaryTerm bop (ConTerm _ _ _ _ rd) (ConTerm _ _ _ _ l) (ConTerm _ _ _ _ r) =- case bop of- FPAdd -> conTerm $ fpAdd rd l r- FPSub -> conTerm $ fpSub rd l r- FPMul -> conTerm $ fpMul rd l r- FPDiv -> conTerm $ fpDiv rd l r-pevalFPRoundingBinaryTerm bop rd l r = fpRoundingBinaryTerm bop rd l r-{-# INLINE pevalFPRoundingBinaryTerm #-}---- | Lowering an floating-point rounding binary term to sbv.-sbvFPRoundingBinaryTerm ::- (ValidFP eb sb) =>- FPRoundingBinaryOp ->- SBV.SRoundingMode ->- SBV.SFloatingPoint eb sb ->- SBV.SFloatingPoint eb sb ->- SBV.SFloatingPoint eb sb-sbvFPRoundingBinaryTerm FPAdd = SBV.fpAdd-sbvFPRoundingBinaryTerm FPSub = SBV.fpSub-sbvFPRoundingBinaryTerm FPMul = SBV.fpMul-sbvFPRoundingBinaryTerm FPDiv = SBV.fpDiv-{-# INLINE sbvFPRoundingBinaryTerm #-}---- | Partially evaluate a floating-point fused multiply-add term.-pevalFPFMATerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- Term FPRoundingMode ->- Term (FP eb sb) ->- Term (FP eb sb) ->- Term (FP eb sb) ->- Term (FP eb sb)-pevalFPFMATerm- (ConTerm _ _ _ _ rd)- (ConTerm _ _ _ _ x)- (ConTerm _ _ _ _ y)- (ConTerm _ _ _ _ z) =- conTerm $ fpFMA rd x y z-pevalFPFMATerm rd x y z = fpFMATerm rd x y z-{-# INLINE pevalFPFMATerm #-}---- | Lowering an floating-point fused multiply-add term to sbv.-sbvFPFMATerm ::- (ValidFP eb sb) =>- SBV.SRoundingMode ->- SBV.SFloatingPoint eb sb ->- SBV.SFloatingPoint eb sb ->- SBV.SFloatingPoint eb sb ->- SBV.SFloatingPoint eb sb-sbvFPFMATerm = SBV.fpFMA-{-# INLINE sbvFPFMATerm #-}+{-# INLINE sbvCmpHandleNegZero #-}
src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalFloatingTerm.hs view
@@ -16,7 +16,6 @@ import Grisette.Internal.SymPrim.AlgReal (AlgReal) import Grisette.Internal.SymPrim.FP (FP, ValidFP)-import Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim () import Grisette.Internal.SymPrim.Prim.Internal.Term ( FloatingUnaryOp (FloatingAcosh, FloatingAsinh, FloatingAtanh, FloatingSqrt), PEvalFloatingTerm
src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalFractionalTerm.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE UndecidableInstances #-}@@ -17,7 +18,6 @@ import Grisette.Internal.SymPrim.AlgReal (AlgReal) import Grisette.Internal.SymPrim.FP (FP, ValidFP)-import Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim () import Grisette.Internal.SymPrim.Prim.Internal.Term ( PEvalFractionalTerm ( pevalFdivTerm,@@ -25,11 +25,12 @@ withSbvFractionalTermConstraint ), SupportedPrim (withPrim),- Term (ConTerm),+ Term, conTerm, fdivTerm,- introSupportedPrimConstraint, recipTerm,+ pattern ConTerm,+ pattern SupportedTerm, ) import Grisette.Internal.SymPrim.Prim.Internal.Unfold ( binaryUnfoldOnce,@@ -45,26 +46,24 @@ pevalDefaultFdivTerm :: (PEvalFractionalTerm a, Eq a) => Term a -> Term a -> Term a-pevalDefaultFdivTerm l r =- introSupportedPrimConstraint l $- binaryUnfoldOnce doPevalDefaultFdivTerm fdivTerm l r+pevalDefaultFdivTerm l@SupportedTerm r =+ binaryUnfoldOnce doPevalDefaultFdivTerm fdivTerm l r doPevalDefaultFdivTerm :: (PEvalFractionalTerm a, Eq a) => Term a -> Term a -> Maybe (Term a)-doPevalDefaultFdivTerm (ConTerm _ _ _ _ a) (ConTerm _ _ _ _ b)+doPevalDefaultFdivTerm (ConTerm a) (ConTerm b) | b /= 0 = Just $ conTerm $ a / b-doPevalDefaultFdivTerm a (ConTerm _ _ _ _ 1) = Just a+doPevalDefaultFdivTerm a (ConTerm 1) = Just a doPevalDefaultFdivTerm _ _ = Nothing pevalDefaultRecipTerm :: (PEvalFractionalTerm a, Eq a) => Term a -> Term a-pevalDefaultRecipTerm l =- introSupportedPrimConstraint l $- unaryUnfoldOnce doPevalDefaultRecipTerm recipTerm l+pevalDefaultRecipTerm l@SupportedTerm =+ unaryUnfoldOnce doPevalDefaultRecipTerm recipTerm l doPevalDefaultRecipTerm :: (PEvalFractionalTerm a, Eq a) => Term a -> Maybe (Term a)-doPevalDefaultRecipTerm (ConTerm _ _ _ _ n) | n /= 0 = Just $ conTerm $ recip n+doPevalDefaultRecipTerm (ConTerm n) | n /= 0 = Just $ conTerm $ recip n doPevalDefaultRecipTerm _ = Nothing instance PEvalFractionalTerm AlgReal where
src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalFromIntegralTerm.hs view
@@ -2,6 +2,7 @@ {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeOperators #-}@@ -24,16 +25,15 @@ import Grisette.Internal.SymPrim.AlgReal (AlgReal) import Grisette.Internal.SymPrim.BV (IntN, WordN) import Grisette.Internal.SymPrim.FP (FP, ValidFP)-import Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim- ( bvIsNonZeroFromGEq1,- ) import Grisette.Internal.SymPrim.Prim.Internal.Term ( PEvalFromIntegralTerm (pevalFromIntegralTerm, sbvFromIntegralTerm), SupportedNonFuncPrim (withNonFuncPrim), SupportedPrim,- Term (ConTerm),+ Term,+ bvIsNonZeroFromGEq1, conTerm, fromIntegralTerm,+ pattern ConTerm, ) import Grisette.Internal.SymPrim.Prim.Internal.Unfold (unaryUnfoldOnce) @@ -42,7 +42,7 @@ pevalFromIntegralTermGeneric = unaryUnfoldOnce doPEvalFromIntegralTerm fromIntegralTerm where- doPEvalFromIntegralTerm (ConTerm _ _ _ _ a) = Just $ conTerm $ fromIntegral a+ doPEvalFromIntegralTerm (ConTerm a) = Just $ conTerm $ fromIntegral a doPEvalFromIntegralTerm _ = Nothing instance PEvalFromIntegralTerm Integer Integer where
src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalIEEEFPConvertibleTerm.hs view
@@ -4,6 +4,7 @@ {-# LANGUAGE GADTs #-} {-# LANGUAGE InstanceSigs #-} {-# LANGUAGE KindSignatures #-}+{-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeOperators #-}@@ -50,9 +51,6 @@ FPRoundingMode (RNA, RNE, RTN, RTP, RTZ), ValidFP, )-import Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim- ( bvIsNonZeroFromGEq1,- ) import Grisette.Internal.SymPrim.Prim.Internal.Term ( PEvalIEEEFPConvertibleTerm ( pevalFromFPOrTerm,@@ -62,10 +60,12 @@ ), SBVRep (SBVType), SupportedPrim (conSBVTerm),- Term (ConTerm),+ Term,+ bvIsNonZeroFromGEq1, conTerm, fromFPOrTerm, toFPTerm,+ pattern ConTerm, ) import Grisette.Internal.SymPrim.Prim.Internal.Unfold (binaryUnfoldOnce) @@ -143,9 +143,9 @@ Term FPRoundingMode -> Term (FP eb sb) -> Term a-generalPevalFromFPOrTerm (ConTerm _ _ _ _ d) (ConTerm _ _ _ _ rd) (ConTerm _ _ _ _ f) =+generalPevalFromFPOrTerm (ConTerm d) (ConTerm rd) (ConTerm f) = conTerm $ fromFPOr d rd f-generalPevalFromFPOrTerm d _ (ConTerm _ _ _ _ f) | fpIsNaN f || fpIsInfinite f = d+generalPevalFromFPOrTerm d _ (ConTerm f) | fpIsNaN f || fpIsInfinite f = d generalPevalFromFPOrTerm d rd f = fromFPOrTerm d rd f algRealPevalFromFPOrTerm ::@@ -157,9 +157,9 @@ Term FPRoundingMode -> Term (FP eb sb) -> Term AlgReal-algRealPevalFromFPOrTerm (ConTerm _ _ _ _ d) _ (ConTerm _ _ _ _ f) =+algRealPevalFromFPOrTerm (ConTerm d) _ (ConTerm f) = conTerm $ fromFPOr d RNE f-algRealPevalFromFPOrTerm d _ (ConTerm _ _ _ _ f) | fpIsNaN f || fpIsInfinite f = d+algRealPevalFromFPOrTerm d _ (ConTerm f) | fpIsNaN f || fpIsInfinite f = d algRealPevalFromFPOrTerm d _ f = fromFPOrTerm d (conTerm RNE) f generalDoPevalToFPTerm ::@@ -170,7 +170,7 @@ Term FPRoundingMode -> Term a -> Maybe (Term (FP eb sb))-generalDoPevalToFPTerm (ConTerm _ _ _ _ rd) (ConTerm _ _ _ _ f) =+generalDoPevalToFPTerm (ConTerm rd) (ConTerm f) = Just $ conTerm $ toFP rd f generalDoPevalToFPTerm _ _ = Nothing @@ -192,9 +192,9 @@ Term FPRoundingMode -> Term (FP eb1 sb1) -> Maybe (Term (FP eb sb))-fpDoPevalToFPTerm (ConTerm _ _ _ _ rd) (ConTerm _ _ _ _ f) =+fpDoPevalToFPTerm (ConTerm rd) (ConTerm f) = Just $ conTerm $ toFP rd f-fpDoPevalToFPTerm _ (ConTerm _ _ _ _ f)+fpDoPevalToFPTerm _ (ConTerm f) | fpIsNaN f = Just $ conTerm fpNaN | fpIsPositiveInfinite f = Just $ conTerm fpPositiveInfinite | fpIsNegativeInfinite f = Just $ conTerm fpNegativeInfinite
src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalNumTerm.hs view
@@ -4,7 +4,6 @@ {-# LANGUAGE ScopedTypeVariables #-} {-# HLINT ignore "Eta reduce" #-} {-# LANGUAGE TypeApplications #-}-{-# LANGUAGE TypeOperators #-} {-# LANGUAGE UndecidableInstances #-} {-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} @@ -16,20 +15,10 @@ -- Maintainer : siruilu@cs.washington.edu -- Stability : Experimental -- Portability : GHC only-module Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalNumTerm- ( pevalDefaultAddNumTerm,- pevalDefaultNegNumTerm,- )-where+module Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalNumTerm () where -import Control.Monad (msum)-import Data.Bits (Bits)-import Data.SBV (Bits (isSigned))-import GHC.TypeLits (KnownNat, type (<=)) import Grisette.Internal.SymPrim.AlgReal (AlgReal)-import Grisette.Internal.SymPrim.BV (IntN, WordN) import Grisette.Internal.SymPrim.FP (FP, ValidFP)-import Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim () import Grisette.Internal.SymPrim.Prim.Internal.Term ( PEvalNumTerm ( pevalAbsNumTerm,@@ -40,194 +29,23 @@ withSbvNumTermConstraint ), SupportedPrim (withPrim),- Term (AbsNumTerm, AddNumTerm, ConTerm, MulNumTerm, NegNumTerm), absNumTerm, addNumTerm,- conTerm,- introSupportedPrimConstraint,+ doPevalNoOverflowAbsNumTerm,+ doPevalNoOverflowSignumNumTerm, mulNumTerm, negNumTerm,- pevalSubNumTerm,+ pevalDefaultAddNumTerm,+ pevalDefaultMulNumTerm,+ pevalDefaultNegNumTerm, signumNumTerm, ) import Grisette.Internal.SymPrim.Prim.Internal.Unfold- ( binaryUnfoldOnce,- generalBinaryUnfolded,+ ( generalBinaryUnfolded, generalUnaryUnfolded, unaryUnfoldOnce, ) --- | Default partial evaluation of addition of numerical terms.-pevalDefaultAddNumTerm :: (PEvalNumTerm a, Eq a) => Term a -> Term a -> Term a-pevalDefaultAddNumTerm l r =- introSupportedPrimConstraint l $- binaryUnfoldOnce- doPevalDefaultAddNumTerm- (\a b -> normalizeAddNum $ addNumTerm a b)- l- r--doPevalDefaultAddNumTerm ::- (PEvalNumTerm a, Eq a) => Term a -> Term a -> Maybe (Term a)-doPevalDefaultAddNumTerm (ConTerm _ _ _ _ a) (ConTerm _ _ _ _ b) = Just $ conTerm $ a + b-doPevalDefaultAddNumTerm l@(ConTerm _ _ _ _ a) b = case (a, b) of- (0, k) -> Just k- (l1, AddNumTerm _ _ _ _ (ConTerm _ _ _ _ j) k) ->- Just $ pevalAddNumTerm (conTerm $ l1 + j) k- _ -> doPevalDefaultAddNumTermNoCon l b-doPevalDefaultAddNumTerm a r@(ConTerm {}) = doPevalDefaultAddNumTerm r a-doPevalDefaultAddNumTerm l r = doPevalDefaultAddNumTermNoCon l r--doPevalDefaultAddNumTermNoCon ::- (PEvalNumTerm a) => Term a -> Term a -> Maybe (Term a)-doPevalDefaultAddNumTermNoCon (AddNumTerm _ _ _ _ i@ConTerm {} j) k =- Just $ pevalAddNumTerm i $ pevalAddNumTerm j k-doPevalDefaultAddNumTermNoCon i (AddNumTerm _ _ _ _ j@ConTerm {} k) =- Just $ pevalAddNumTerm j $ pevalAddNumTerm i k-doPevalDefaultAddNumTermNoCon (NegNumTerm _ _ _ _ i) (NegNumTerm _ _ _ _ j) =- Just $ pevalNegNumTerm $ pevalAddNumTerm i j-doPevalDefaultAddNumTermNoCon- (MulNumTerm _ _ _ _ (ConTerm _ _ _ _ i) j)- (MulNumTerm _ _ _ _ (ConTerm _ _ _ _ k) l)- | j == l = Just $ pevalMulNumTerm (conTerm $ i + k) j-doPevalDefaultAddNumTermNoCon- (MulNumTerm _ _ _ _ i@ConTerm {} j)- (MulNumTerm _ _ _ _ k@(ConTerm {}) l)- | i == k = Just $ pevalMulNumTerm i (pevalAddNumTerm j l)-doPevalDefaultAddNumTermNoCon _ _ = Nothing--normalizeAddNum :: (PEvalNumTerm a) => Term a -> Term a-normalizeAddNum (AddNumTerm _ _ _ _ l r@(ConTerm {})) = addNumTerm r l-normalizeAddNum v = v---- | Default partial evaluation of negation of numerical terms.-pevalDefaultNegNumTerm :: (PEvalNumTerm a, Eq a) => Term a -> Term a-pevalDefaultNegNumTerm l =- introSupportedPrimConstraint l $- unaryUnfoldOnce doPevalDefaultNegNumTerm negNumTerm l--doPevalDefaultNegNumTerm :: (PEvalNumTerm a) => Term a -> Maybe (Term a)-doPevalDefaultNegNumTerm (ConTerm _ _ _ _ a) = Just $ conTerm $ -a-doPevalDefaultNegNumTerm (NegNumTerm _ _ _ _ v) = Just v-doPevalDefaultNegNumTerm (AddNumTerm _ _ _ _ (ConTerm _ _ _ _ l) r) =- Just $ pevalSubNumTerm (conTerm $ -l) r-doPevalDefaultNegNumTerm (AddNumTerm _ _ _ _ (NegNumTerm _ _ _ _ l) r) =- Just $ pevalAddNumTerm l (pevalNegNumTerm r)-doPevalDefaultNegNumTerm (AddNumTerm _ _ _ _ l (NegNumTerm _ _ _ _ r)) =- Just $ pevalAddNumTerm (pevalNegNumTerm l) r-doPevalDefaultNegNumTerm (MulNumTerm _ _ _ _ (ConTerm _ _ _ _ l) r) =- Just $ pevalMulNumTerm (conTerm $ -l) r-doPevalDefaultNegNumTerm (MulNumTerm _ _ _ _ (NegNumTerm {}) _) =- error "Should not happen"-doPevalDefaultNegNumTerm (MulNumTerm _ _ _ _ _ (NegNumTerm {})) =- error "Should not happen"-doPevalDefaultNegNumTerm (AddNumTerm _ _ _ _ _ ConTerm {}) = error "Should not happen"-doPevalDefaultNegNumTerm _ = Nothing---- Mul-pevalDefaultMulNumTerm :: (PEvalNumTerm a, Eq a) => Term a -> Term a -> Term a-pevalDefaultMulNumTerm l r =- introSupportedPrimConstraint l $- binaryUnfoldOnce- doPevalDefaultMulNumTerm- (\a b -> normalizeMulNum $ mulNumTerm a b)- l- r--normalizeMulNum :: (PEvalNumTerm a) => Term a -> Term a-normalizeMulNum (MulNumTerm _ _ _ _ l r@(ConTerm {})) = mulNumTerm r l-normalizeMulNum v = v--doPevalDefaultMulNumTerm ::- (PEvalNumTerm a, Eq a) => Term a -> Term a -> Maybe (Term a)-doPevalDefaultMulNumTerm (ConTerm _ _ _ _ a) (ConTerm _ _ _ _ b) =- Just $ conTerm $ a * b-doPevalDefaultMulNumTerm l@(ConTerm _ _ _ _ a) b = case (a, b) of- (0, _) -> Just $ conTerm 0- (1, k) -> Just k- (-1, k) -> Just $ pevalNegNumTerm k- (l1, MulNumTerm _ _ _ _ (ConTerm _ _ _ _ j) k) ->- Just $ pevalMulNumTerm (conTerm $ l1 * j) k- (l1, AddNumTerm _ _ _ _ (ConTerm _ _ _ _ j) k) ->- Just $ pevalAddNumTerm (conTerm $ l1 * j) (pevalMulNumTerm (conTerm l1) k)- (l1, NegNumTerm _ _ _ _ j) -> Just (pevalMulNumTerm (conTerm $ -l1) j)- (_, MulNumTerm _ _ _ _ _ ConTerm {}) -> error "Should not happen"- (_, AddNumTerm _ _ _ _ _ ConTerm {}) -> error "Should not happen"- _ -> doPevalDefaultMulNumTermNoCon l b-doPevalDefaultMulNumTerm a r@(ConTerm {}) = doPevalDefaultMulNumTerm r a-doPevalDefaultMulNumTerm l r = doPevalDefaultMulNumTermNoCon l r--doPevalDefaultMulNumTermNoCon ::- (PEvalNumTerm a) => Term a -> Term a -> Maybe (Term a)-doPevalDefaultMulNumTermNoCon (MulNumTerm _ _ _ _ i@ConTerm {} j) k =- Just $ pevalMulNumTerm i $ pevalMulNumTerm j k-doPevalDefaultMulNumTermNoCon i (MulNumTerm _ _ _ _ j@ConTerm {} k) =- Just $ pevalMulNumTerm j $ pevalMulNumTerm i k-doPevalDefaultMulNumTermNoCon (NegNumTerm _ _ _ _ i) j =- Just $ pevalNegNumTerm $ pevalMulNumTerm i j-doPevalDefaultMulNumTermNoCon i (NegNumTerm _ _ _ _ j) =- Just $ pevalNegNumTerm $ pevalMulNumTerm i j-doPevalDefaultMulNumTermNoCon i j@ConTerm {} = Just $ pevalMulNumTerm j i-doPevalDefaultMulNumTermNoCon (MulNumTerm _ _ _ _ _ ConTerm {}) _ =- error "Should not happen"-doPevalDefaultMulNumTermNoCon _ (MulNumTerm _ _ _ _ _ ConTerm {}) =- error "Should not happen"-doPevalDefaultMulNumTermNoCon _ _ = Nothing---- Abs-pevalBitsAbsNumTerm :: (PEvalNumTerm a, Bits a) => Term a -> Term a-pevalBitsAbsNumTerm l =- introSupportedPrimConstraint l $- unaryUnfoldOnce doPevalBitsAbsNumTerm absNumTerm l--doPevalGeneralAbsNumTerm :: (PEvalNumTerm a) => Term a -> Maybe (Term a)-doPevalGeneralAbsNumTerm (ConTerm _ _ _ _ a) = Just $ conTerm $ abs a-doPevalGeneralAbsNumTerm (NegNumTerm _ _ _ _ v) = Just $ pevalAbsNumTerm v-doPevalGeneralAbsNumTerm t@(AbsNumTerm {}) = Just t-doPevalGeneralAbsNumTerm _ = Nothing--doPevalBitsAbsNumTerm ::- forall a. (PEvalNumTerm a, Bits a) => Term a -> Maybe (Term a)-doPevalBitsAbsNumTerm t =- msum- [ if isSigned (undefined :: a) then Nothing else Just t,- doPevalGeneralAbsNumTerm t- ]--doPevalNoOverflowAbsNumTerm :: (PEvalNumTerm a) => Term a -> Maybe (Term a)-doPevalNoOverflowAbsNumTerm t =- msum- [ doPevalGeneralAbsNumTerm t,- case t of- MulNumTerm _ _ _ _ l r ->- Just $ pevalMulNumTerm (pevalAbsNumTerm l) $ pevalAbsNumTerm r- _ -> Nothing- ]---- Signum--pevalGeneralSignumNumTerm :: (PEvalNumTerm a) => Term a -> Term a-pevalGeneralSignumNumTerm l =- introSupportedPrimConstraint l $- unaryUnfoldOnce doPevalGeneralSignumNumTerm signumNumTerm l--doPevalGeneralSignumNumTerm :: (PEvalNumTerm a) => Term a -> Maybe (Term a)-doPevalGeneralSignumNumTerm (ConTerm _ _ _ _ a) = Just $ conTerm $ signum a-doPevalGeneralSignumNumTerm _ = Nothing--doPevalNoOverflowSignumNumTerm :: (PEvalNumTerm a) => Term a -> Maybe (Term a)-doPevalNoOverflowSignumNumTerm t =- msum- [ doPevalGeneralSignumNumTerm t,- case t of- NegNumTerm _ _ _ _ v -> Just $ pevalNegNumTerm $ pevalSignumNumTerm v- MulNumTerm _ _ _ _ l r ->- Just $- pevalMulNumTerm (pevalSignumNumTerm l) $- pevalSignumNumTerm r- _ -> Nothing- ]- instance PEvalNumTerm Integer where pevalAddNumTerm = pevalDefaultAddNumTerm pevalNegNumTerm = pevalDefaultNegNumTerm@@ -236,22 +54,6 @@ pevalSignumNumTerm = unaryUnfoldOnce doPevalNoOverflowSignumNumTerm signumNumTerm withSbvNumTermConstraint r = r--instance (KnownNat n, 1 <= n) => PEvalNumTerm (WordN n) where- pevalAddNumTerm = pevalDefaultAddNumTerm- pevalNegNumTerm = pevalDefaultNegNumTerm- pevalMulNumTerm = pevalDefaultMulNumTerm- pevalAbsNumTerm = pevalBitsAbsNumTerm- pevalSignumNumTerm = pevalGeneralSignumNumTerm- withSbvNumTermConstraint r = withPrim @(WordN n) r--instance (KnownNat n, 1 <= n) => PEvalNumTerm (IntN n) where- pevalAddNumTerm = pevalDefaultAddNumTerm- pevalNegNumTerm = pevalDefaultNegNumTerm- pevalMulNumTerm = pevalDefaultMulNumTerm- pevalAbsNumTerm = pevalBitsAbsNumTerm- pevalSignumNumTerm = pevalGeneralSignumNumTerm- withSbvNumTermConstraint r = withPrim @(IntN n) r instance (ValidFP eb sb) => PEvalNumTerm (FP eb sb) where pevalAddNumTerm = generalBinaryUnfolded (+) addNumTerm
src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalOrdTerm.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE DataKinds #-} {-# LANGUAGE GADTs #-}+{-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeOperators #-}@@ -44,11 +45,13 @@ withSbvOrdTermConstraint ), SupportedPrim (conSBVTerm, withPrim),- Term (AddNumTerm, ConTerm),+ Term, conTerm, leOrdTerm, ltOrdTerm, pevalSubNumTerm,+ pattern AddNumTerm,+ pattern ConTerm, ) import Grisette.Internal.SymPrim.Prim.Internal.Unfold (binaryUnfoldOnce) @@ -58,7 +61,7 @@ doPevalGeneralLtOrdTerm :: (PEvalOrdTerm a, Ord a) => Term a -> Term a -> Maybe (Term Bool)-doPevalGeneralLtOrdTerm (ConTerm _ _ _ _ a) (ConTerm _ _ _ _ b) = Just $ conTerm $ a < b+doPevalGeneralLtOrdTerm (ConTerm a) (ConTerm b) = Just $ conTerm $ a < b doPevalGeneralLtOrdTerm _ _ = Nothing -- | General partially evaluation of less than or equal to operation.@@ -67,7 +70,7 @@ doPevalGeneralLeOrdTerm :: (PEvalOrdTerm a, Ord a) => Term a -> Term a -> Maybe (Term Bool)-doPevalGeneralLeOrdTerm (ConTerm _ _ _ _ a) (ConTerm _ _ _ _ b) = Just $ conTerm $ a <= b+doPevalGeneralLeOrdTerm (ConTerm a) (ConTerm b) = Just $ conTerm $ a <= b doPevalGeneralLeOrdTerm _ _ = Nothing instance PEvalOrdTerm Integer where@@ -77,18 +80,18 @@ msum [ doPevalGeneralLtOrdTerm l r, case (l, r) of- (ConTerm _ _ _ _ l, AddNumTerm _ _ _ _ (ConTerm _ _ _ _ j) k) ->+ (ConTerm l, AddNumTerm (ConTerm j) k) -> Just $ pevalLtOrdTerm (conTerm $ l - j) k- (AddNumTerm _ _ _ _ (ConTerm _ _ _ _ i) j, ConTerm _ _ _ _ k) ->+ (AddNumTerm (ConTerm i) j, ConTerm k) -> Just $ pevalLtOrdTerm j (conTerm $ k - i)- ((AddNumTerm _ _ _ _ (ConTerm _ _ _ _ j) k), l) ->+ ((AddNumTerm (ConTerm j) k), l) -> Just $ pevalLtOrdTerm (conTerm j) (pevalSubNumTerm l k)- (j, (AddNumTerm _ _ _ _ (ConTerm _ _ _ _ k) l)) ->+ (j, (AddNumTerm (ConTerm k) l)) -> Just $ pevalLtOrdTerm (conTerm $ -k) (pevalSubNumTerm l j)- (l, ConTerm _ _ _ _ r) ->+ (l, ConTerm r) -> Just $ pevalLtOrdTerm (conTerm $ -r) (pevalNegNumTerm l) _ -> Nothing ]@@ -98,15 +101,15 @@ msum [ doPevalGeneralLeOrdTerm l r, case (l, r) of- (ConTerm _ _ _ _ l, AddNumTerm _ _ _ _ (ConTerm _ _ _ _ j) k) ->+ (ConTerm l, AddNumTerm (ConTerm j) k) -> Just $ pevalLeOrdTerm (conTerm $ l - j) k- (AddNumTerm _ _ _ _ (ConTerm _ _ _ _ i) j, ConTerm _ _ _ _ k) ->+ (AddNumTerm (ConTerm i) j, ConTerm k) -> Just $ pevalLeOrdTerm j (conTerm $ k - i)- (AddNumTerm _ _ _ _ (ConTerm _ _ _ _ j) k, l) ->+ (AddNumTerm (ConTerm j) k, l) -> Just $ pevalLeOrdTerm (conTerm j) (pevalSubNumTerm l k)- (j, AddNumTerm _ _ _ _ (ConTerm _ _ _ _ k) l) ->+ (j, AddNumTerm (ConTerm k) l) -> Just $ pevalLeOrdTerm (conTerm $ -k) (pevalSubNumTerm l j)- (l, ConTerm _ _ _ _ r) ->+ (l, ConTerm r) -> Just $ pevalLeOrdTerm (conTerm $ -r) (pevalNegNumTerm l) _ -> Nothing ]@@ -136,9 +139,9 @@ [ ( conSBVTerm @FPRoundingMode a, conSBVTerm @FPRoundingMode b )- | a <- allFPRoundingMode,- b <- allFPRoundingMode,- a < b+ | a <- allFPRoundingMode,+ b <- allFPRoundingMode,+ a < b ] fpRoundingModeLeTable :: [(SBV.SRoundingMode, SBV.SRoundingMode)]@@ -146,9 +149,9 @@ [ ( conSBVTerm @FPRoundingMode a, conSBVTerm @FPRoundingMode b )- | a <- allFPRoundingMode,- b <- allFPRoundingMode,- a <= b+ | a <- allFPRoundingMode,+ b <- allFPRoundingMode,+ a <= b ] sbvTableLookup ::
src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalRotateTerm.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE DataKinds #-} {-# LANGUAGE GADTs #-}+{-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-}@@ -26,7 +27,6 @@ import GHC.TypeLits (KnownNat, type (<=)) import Grisette.Internal.Core.Data.Class.SymRotate (SymRotate (symRotate)) import Grisette.Internal.SymPrim.BV (IntN, WordN)-import Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim (bvIsNonZeroFromGEq1) import Grisette.Internal.SymPrim.Prim.Internal.Term ( PEvalRotateTerm ( pevalRotateLeftTerm,@@ -36,11 +36,13 @@ withSbvRotateTermConstraint ), SupportedNonFuncPrim (withNonFuncPrim),- Term (ConTerm),+ Term,+ bvIsNonZeroFromGEq1, conTerm,- introSupportedPrimConstraint, rotateLeftTerm, rotateRightTerm,+ pattern ConTerm,+ pattern SupportedTerm, ) import Grisette.Internal.SymPrim.Prim.Internal.Unfold (unaryUnfoldOnce) @@ -51,12 +53,11 @@ Term a -> Term a -> Term a-pevalFiniteBitsSymRotateRotateLeftTerm t n =- introSupportedPrimConstraint t $- unaryUnfoldOnce- (`doPevalFiniteBitsSymRotateRotateLeftTerm` n)- (`rotateLeftTerm` n)- t+pevalFiniteBitsSymRotateRotateLeftTerm t@SupportedTerm n =+ unaryUnfoldOnce+ (`doPevalFiniteBitsSymRotateRotateLeftTerm` n)+ (`rotateLeftTerm` n)+ t doPevalFiniteBitsSymRotateRotateLeftTerm :: forall a.@@ -64,12 +65,12 @@ Term a -> Term a -> Maybe (Term a)-doPevalFiniteBitsSymRotateRotateLeftTerm (ConTerm _ _ _ _ a) (ConTerm _ _ _ _ n)+doPevalFiniteBitsSymRotateRotateLeftTerm (ConTerm a) (ConTerm n) | n >= 0 = Just $ conTerm $ symRotate a n -- Just $ conTerm $ rotateL a (fromIntegral n)-doPevalFiniteBitsSymRotateRotateLeftTerm x (ConTerm _ _ _ _ 0) = Just x--- doPevalFiniteBitsSymRotateRotateLeftTerm (RotateLeftTerm _ x (ConTerm _ _ _ _ n)) (ConTerm _ _ _ _ n1)+doPevalFiniteBitsSymRotateRotateLeftTerm x (ConTerm 0) = Just x+-- doPevalFiniteBitsSymRotateRotateLeftTerm (RotateLeftTerm _ x (ConTerm n)) (ConTerm n1) -- | n >= 0 && n1 >= 0 = Just $ pevalFiniteBitsSymRotateRotateLeftTerm x (conTerm $ n + n1)-doPevalFiniteBitsSymRotateRotateLeftTerm x (ConTerm _ _ _ _ n)+doPevalFiniteBitsSymRotateRotateLeftTerm x (ConTerm n) | n >= 0 && (fromIntegral n :: Integer) >= fromIntegral bs = Just $ pevalFiniteBitsSymRotateRotateLeftTerm@@ -86,12 +87,11 @@ Term a -> Term a -> Term a-pevalFiniteBitsSymRotateRotateRightTerm t n =- introSupportedPrimConstraint t $- unaryUnfoldOnce- (`doPevalFiniteBitsSymRotateRotateRightTerm` n)- (`rotateRightTerm` n)- t+pevalFiniteBitsSymRotateRotateRightTerm t@SupportedTerm n =+ unaryUnfoldOnce+ (`doPevalFiniteBitsSymRotateRotateRightTerm` n)+ (`rotateRightTerm` n)+ t doPevalFiniteBitsSymRotateRotateRightTerm :: forall a.@@ -99,7 +99,7 @@ Term a -> Term a -> Maybe (Term a)-doPevalFiniteBitsSymRotateRotateRightTerm (ConTerm _ _ _ _ a) (ConTerm _ _ _ _ n)+doPevalFiniteBitsSymRotateRotateRightTerm (ConTerm a) (ConTerm n) | n >= 0 = Just . conTerm $ rotateR@@ -108,10 +108,10 @@ (fromIntegral n :: Integer) `mod` fromIntegral (finiteBitSize n) )-doPevalFiniteBitsSymRotateRotateRightTerm x (ConTerm _ _ _ _ 0) = Just x--- doPevalFiniteBitsSymRotateRotateRightTerm (RotateRightTerm _ x (ConTerm _ _ _ _ n)) (ConTerm _ _ _ _ n1)+doPevalFiniteBitsSymRotateRotateRightTerm x (ConTerm 0) = Just x+-- doPevalFiniteBitsSymRotateRotateRightTerm (RotateRightTerm _ x (ConTerm n)) (ConTerm n1) -- | n >= 0 && n1 >= 0 = Just $ pevalFiniteBitsSymRotateRotateRightTerm x (conTerm $ n + n1)-doPevalFiniteBitsSymRotateRotateRightTerm x (ConTerm _ _ _ _ n)+doPevalFiniteBitsSymRotateRotateRightTerm x (ConTerm n) | n >= 0 && (fromIntegral n :: Integer) >= fromIntegral bs = Just $ pevalFiniteBitsSymRotateRotateRightTerm
src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalShiftTerm.hs view
@@ -1,5 +1,7 @@ {-# LANGUAGE DataKinds #-} {-# LANGUAGE GADTs #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE QuantifiedConstraints #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-}@@ -22,91 +24,179 @@ import Data.Bits (Bits (isSigned, shiftR, zeroBits), FiniteBits (finiteBitSize)) import Data.Proxy (Proxy (Proxy))-import GHC.TypeLits (KnownNat, type (<=))+import Data.Typeable ((:~:) (Refl))+import GHC.TypeLits (KnownNat, type (+), type (<=)) import Grisette.Internal.Core.Data.Class.SymShift (SymShift (symShift)) import Grisette.Internal.SymPrim.BV (IntN, WordN)-import Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim (bvIsNonZeroFromGEq1) import Grisette.Internal.SymPrim.Prim.Internal.Term- ( PEvalShiftTerm (pevalShiftLeftTerm, pevalShiftRightTerm, withSbvShiftTermConstraint),+ ( PEvalBVTerm (pevalBVConcatTerm, pevalBVExtendTerm),+ PEvalShiftTerm+ ( pevalShiftLeftTerm,+ pevalShiftRightTerm,+ withSbvShiftTermConstraint+ ), SupportedNonFuncPrim (withNonFuncPrim), SupportedPrim,- Term (ConTerm),+ Term,+ bvIsNonZeroFromGEq1, conTerm,- introSupportedPrimConstraint, shiftLeftTerm, shiftRightTerm,+ unsafePevalBVSelectTerm,+ pattern ConTerm,+ pattern SupportedTerm, ) import Grisette.Internal.SymPrim.Prim.Internal.Unfold (unaryUnfoldOnce)+import Grisette.Internal.Utils.Parameterized+ ( LeqProof (LeqProof),+ NatRepr,+ SomePositiveNatRepr (SomePositiveNatRepr),+ mkPositiveNatRepr,+ natRepr,+ subNat,+ unsafeAxiom,+ unsafeLeqProof,+ ) -- | Partial evaluation of symbolic shift left term for finite bits types. pevalFiniteBitsSymShiftShiftLeftTerm ::- forall a.- (Integral a, SymShift a, FiniteBits a, PEvalShiftTerm a) =>- Term a ->- Term a ->- Term a-pevalFiniteBitsSymShiftShiftLeftTerm t n =- introSupportedPrimConstraint t $- unaryUnfoldOnce- (`doPevalFiniteBitsSymShiftShiftLeftTerm` n)- (`shiftLeftTerm` n)- t+ forall bv n.+ ( forall m. (KnownNat m, 1 <= m) => Integral (bv m),+ forall m. (KnownNat m, 1 <= m) => SymShift (bv m),+ forall m. (KnownNat m, 1 <= m) => SupportedPrim (bv m),+ forall m. (KnownNat m, 1 <= m) => PEvalShiftTerm (bv m),+ PEvalBVTerm bv,+ KnownNat n,+ 1 <= n+ ) =>+ Term (bv n) ->+ Term (bv n) ->+ Term (bv n)+pevalFiniteBitsSymShiftShiftLeftTerm t@SupportedTerm n =+ unaryUnfoldOnce+ (`doPevalFiniteBitsSymShiftShiftLeftTerm` n)+ (`shiftLeftTerm` n)+ t doPevalFiniteBitsSymShiftShiftLeftTerm ::- forall a.- (Integral a, SymShift a, FiniteBits a, SupportedPrim a) =>- Term a ->- Term a ->- Maybe (Term a)-doPevalFiniteBitsSymShiftShiftLeftTerm (ConTerm _ _ _ _ a) (ConTerm _ _ _ _ n)+ forall bv n.+ ( forall m. (KnownNat m, 1 <= m) => Integral (bv m),+ forall m. (KnownNat m, 1 <= m) => SymShift (bv m),+ forall m. (KnownNat m, 1 <= m) => SupportedPrim (bv m),+ forall m. (KnownNat m, 1 <= m) => PEvalShiftTerm (bv m),+ PEvalBVTerm bv,+ KnownNat n,+ 1 <= n+ ) =>+ Term (bv n) ->+ Term (bv n) ->+ Maybe (Term (bv n))+doPevalFiniteBitsSymShiftShiftLeftTerm (ConTerm a) (ConTerm n) | n >= 0 = if (fromIntegral n :: Integer) >= fromIntegral (finiteBitSize n) then Just $ conTerm zeroBits else Just $ conTerm $ symShift a n-doPevalFiniteBitsSymShiftShiftLeftTerm x (ConTerm _ _ _ _ 0) = Just x+doPevalFiniteBitsSymShiftShiftLeftTerm x (ConTerm 0) = Just x -- TODO: Need to handle the overflow case.--- doPevalShiftLeftTerm (ShiftLeftTerm _ x (ConTerm _ _ _ _ n)) (ConTerm _ _ _ _ n1)+-- doPevalShiftLeftTerm (ShiftLeftTerm _ x (ConTerm n)) (ConTerm n1) -- | n >= 0 && n1 >= 0 = Just $ pevalShiftLeftTerm x (conTerm $ n + n1)-doPevalFiniteBitsSymShiftShiftLeftTerm _ (ConTerm _ _ _ _ n)- | n >= 0 && (fromIntegral n :: Integer) >= fromIntegral (finiteBitSize n) =+doPevalFiniteBitsSymShiftShiftLeftTerm _ (ConTerm n)+ | n > 0 && (fromIntegral n :: Integer) >= fromIntegral (finiteBitSize n) = Just $ conTerm zeroBits+doPevalFiniteBitsSymShiftShiftLeftTerm x (ConTerm shiftAmount)+ | shiftAmount > 0 =+ case (namount, nremaining) of+ ( SomePositiveNatRepr (_ :: NatRepr amount),+ SomePositiveNatRepr (nremaining :: NatRepr remaining)+ ) ->+ case ( unsafeLeqProof @remaining @n,+ unsafeAxiom @(remaining + amount) @n+ ) of+ (LeqProof, Refl) ->+ Just $+ pevalBVConcatTerm+ (unsafePevalBVSelectTerm nn (natRepr @0) nremaining x)+ (conTerm zeroBits :: Term (bv amount))+ where+ nn = natRepr @n+ namount = mkPositiveNatRepr $ fromIntegral shiftAmount+ nremaining =+ mkPositiveNatRepr $+ fromIntegral (finiteBitSize shiftAmount) - fromIntegral shiftAmount doPevalFiniteBitsSymShiftShiftLeftTerm _ _ = Nothing -- | Partial evaluation of symbolic shift right term for finite bits types. pevalFiniteBitsSymShiftShiftRightTerm ::- forall a.- (Integral a, SymShift a, FiniteBits a, PEvalShiftTerm a) =>- Term a ->- Term a ->- Term a-pevalFiniteBitsSymShiftShiftRightTerm t n =- introSupportedPrimConstraint t $- unaryUnfoldOnce- (`doPevalFiniteBitsSymShiftShiftRightTerm` n)- (`shiftRightTerm` n)- t+ forall bv n.+ ( forall m. (KnownNat m, 1 <= m) => Integral (bv m),+ forall m. (KnownNat m, 1 <= m) => SymShift (bv m),+ forall m. (KnownNat m, 1 <= m) => SupportedPrim (bv m),+ forall m. (KnownNat m, 1 <= m) => PEvalShiftTerm (bv m),+ PEvalBVTerm bv,+ KnownNat n,+ 1 <= n+ ) =>+ Term (bv n) ->+ Term (bv n) ->+ Term (bv n)+pevalFiniteBitsSymShiftShiftRightTerm t@SupportedTerm n =+ unaryUnfoldOnce+ (`doPevalFiniteBitsSymShiftShiftRightTerm` n)+ (`shiftRightTerm` n)+ t doPevalFiniteBitsSymShiftShiftRightTerm ::- forall a.- (Integral a, SymShift a, FiniteBits a, SupportedPrim a) =>- Term a ->- Term a ->- Maybe (Term a)-doPevalFiniteBitsSymShiftShiftRightTerm (ConTerm _ _ _ _ a) (ConTerm _ _ _ _ n)+ forall bv n.+ ( forall m. (KnownNat m, 1 <= m) => Integral (bv m),+ forall m. (KnownNat m, 1 <= m) => SymShift (bv m),+ forall m. (KnownNat m, 1 <= m) => SupportedPrim (bv m),+ forall m. (KnownNat m, 1 <= m) => PEvalShiftTerm (bv m),+ PEvalBVTerm bv,+ KnownNat n,+ 1 <= n+ ) =>+ Term (bv n) ->+ Term (bv n) ->+ Maybe (Term (bv n))+doPevalFiniteBitsSymShiftShiftRightTerm (ConTerm a) (ConTerm n) | n >= 0 && not (isSigned a) = if (fromIntegral n :: Integer) >= fromIntegral (finiteBitSize n) then Just $ conTerm zeroBits else Just $ conTerm $ shiftR a (fromIntegral n)-doPevalFiniteBitsSymShiftShiftRightTerm (ConTerm _ _ _ _ a) (ConTerm _ _ _ _ n)+doPevalFiniteBitsSymShiftShiftRightTerm (ConTerm a) (ConTerm n) -- if n >= 0 then -n must be in the range | n >= 0 = Just $ conTerm $ symShift a (-n)-doPevalFiniteBitsSymShiftShiftRightTerm x (ConTerm _ _ _ _ 0) = Just x--- doPevalFiniteBitsSymShiftShiftRightTerm (ShiftRightTerm _ x (ConTerm _ _ _ _ n)) (ConTerm _ _ _ _ n1)+doPevalFiniteBitsSymShiftShiftRightTerm x (ConTerm 0) = Just x+-- doPevalFiniteBitsSymShiftShiftRightTerm (ShiftRightTerm _ x (ConTerm n)) (ConTerm n1) -- | n >= 0 && n1 >= 0 = Just $ pevalFiniteBitsSymShiftShiftRightTerm x (conTerm $ n + n1)-doPevalFiniteBitsSymShiftShiftRightTerm _ (ConTerm _ _ _ _ n)- | not (isSigned n)- && (fromIntegral n :: Integer) >= fromIntegral (finiteBitSize n) =+doPevalFiniteBitsSymShiftShiftRightTerm x (ConTerm shiftAmount)+ | not (isSigned shiftAmount)+ && (fromIntegral shiftAmount :: Integer) >= fromIntegral (finiteBitSize shiftAmount) = Just $ conTerm zeroBits+ | isSigned shiftAmount+ && (fromIntegral shiftAmount :: Integer) >= fromIntegral (finiteBitSize shiftAmount) =+ Just $ pevalBVExtendTerm True nn $ unsafePevalBVSelectTerm nn nnp1 none x+ where+ nn = natRepr @n+ none = natRepr @1+ nnp1 = subNat nn none+doPevalFiniteBitsSymShiftShiftRightTerm x (ConTerm shiftAmount)+ | shiftAmount > 0 =+ case (namount, nremaining) of+ ( SomePositiveNatRepr namount,+ SomePositiveNatRepr (nremaining :: NatRepr remaining)+ ) ->+ case unsafeLeqProof @remaining @n of+ LeqProof ->+ Just $+ pevalBVExtendTerm (isSigned shiftAmount) nn $+ unsafePevalBVSelectTerm nn namount nremaining x+ where+ nn = natRepr @n+ namount = mkPositiveNatRepr $ fromIntegral shiftAmount+ nremaining =+ mkPositiveNatRepr $+ fromIntegral (finiteBitSize shiftAmount) - fromIntegral shiftAmount doPevalFiniteBitsSymShiftShiftRightTerm _ _ = Nothing instance (KnownNat n, 1 <= n) => PEvalShiftTerm (IntN n) where
− src/Grisette/Internal/SymPrim/Prim/Internal/Instances/SupportedPrim.hs
@@ -1,413 +0,0 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE GADTs #-}-{-# LANGUAGE InstanceSigs #-}-{-# HLINT ignore "Eta reduce" #-}-{-# LANGUAGE RankNTypes #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeApplications #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE TypeOperators #-}-{-# LANGUAGE UndecidableInstances #-}-{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}---- |--- Module : Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim--- Copyright : (c) Sirui Lu 2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim- ( bvIsNonZeroFromGEq1,- )-where--import Data.Coerce (coerce)-import Data.Hashable (Hashable (hashWithSalt))-import Data.List.NonEmpty (NonEmpty ((:|)), toList)-import Data.Proxy (Proxy (Proxy))-import Data.SBV (BVIsNonZero)-import qualified Data.SBV as SBV-import Data.Type.Equality ((:~:) (Refl), type (:~~:) (HRefl))-import GHC.TypeNats (KnownNat, type (<=))-import Grisette.Internal.Core.Data.Class.IEEEFP- ( fpIsNegativeZero,- fpIsPositiveZero,- )-import Grisette.Internal.SymPrim.AlgReal (AlgReal, fromSBVAlgReal, toSBVAlgReal)-import Grisette.Internal.SymPrim.BV (IntN, WordN)-import Grisette.Internal.SymPrim.FP- ( FP (FP),- FPRoundingMode (RNA, RNE, RTN, RTP, RTZ),- ValidFP,- )-import Grisette.Internal.SymPrim.Prim.Internal.Term- ( IsSymbolKind (decideSymbolKind),- NonFuncSBVRep (NonFuncSBVBaseType),- SBVRep- ( SBVType- ),- SupportedNonFuncPrim- ( conNonFuncSBVTerm,- symNonFuncSBVTerm,- withNonFuncPrim- ),- SupportedPrim- ( castTypedSymbol,- conSBVTerm,- defaultValue,- funcDummyConstraint,- hashConWithSalt,- parseSMTModelResult,- pevalDistinctTerm,- pevalEqTerm,- pevalITETerm,- pformatCon,- sameCon,- sbvDistinct,- sbvEq,- sbvIte,- symSBVName,- symSBVTerm,- withPrim- ),- SupportedPrimConstraint- ( PrimConstraint- ),- Term (ConTerm),- TypedSymbol (unTypedSymbol),- conTerm,- distinctTerm,- eqTerm,- parseScalarSMTModelResult,- pevalDefaultEqTerm,- pevalITEBasicTerm,- pevalNotTerm,- sbvFresh,- typedAnySymbol,- typedConstantSymbol,- )-import Grisette.Internal.Utils.Parameterized (unsafeAxiom)--defaultValueForInteger :: Integer-defaultValueForInteger = 0---- Basic Integer-instance SBVRep Integer where- type SBVType Integer = SBV.SBV Integer--instance SupportedPrimConstraint Integer where- type PrimConstraint Integer = (Integral (NonFuncSBVBaseType Integer))--pairwiseHasConcreteEqual :: (SupportedNonFuncPrim a) => [Term a] -> Bool-pairwiseHasConcreteEqual [] = False-pairwiseHasConcreteEqual [_] = False-pairwiseHasConcreteEqual (x : xs) =- go x xs || pairwiseHasConcreteEqual xs- where- go _ [] = False- go x (y : ys) = x == y || go x ys--getAllConcrete :: [Term a] -> Maybe [a]-getAllConcrete [] = return []-getAllConcrete (ConTerm _ _ _ _ x : xs) = (x :) <$> getAllConcrete xs-getAllConcrete _ = Nothing--checkConcreteDistinct :: (Eq t) => [t] -> Bool-checkConcreteDistinct [] = True-checkConcreteDistinct (x : xs) = check0 x xs && checkConcreteDistinct xs- where- check0 _ [] = True- check0 x (y : ys) = x /= y && check0 x ys--pevalGeneralDistinct ::- (SupportedNonFuncPrim a) => NonEmpty (Term a) -> Term Bool-pevalGeneralDistinct (_ :| []) = conTerm True-pevalGeneralDistinct (a :| [b]) = pevalNotTerm $ pevalEqTerm a b-pevalGeneralDistinct l | pairwiseHasConcreteEqual $ toList l = conTerm False-pevalGeneralDistinct l =- case getAllConcrete (toList l) of- Nothing -> distinctTerm l- Just xs -> conTerm $ checkConcreteDistinct xs--instance SupportedPrim Integer where- pformatCon = show- defaultValue = defaultValueForInteger- pevalITETerm = pevalITEBasicTerm- pevalEqTerm = pevalDefaultEqTerm- pevalDistinctTerm = pevalGeneralDistinct- conSBVTerm n = fromInteger n- symSBVName symbol _ = show symbol- symSBVTerm name = sbvFresh name- parseSMTModelResult _ = parseScalarSMTModelResult id- castTypedSymbol ::- forall knd knd'.- (IsSymbolKind knd') =>- TypedSymbol knd Integer ->- Maybe (TypedSymbol knd' Integer)- castTypedSymbol s =- case decideSymbolKind @knd' of- Left HRefl -> Just $ typedConstantSymbol $ unTypedSymbol s- Right HRefl -> Just $ typedAnySymbol $ unTypedSymbol s- funcDummyConstraint _ = SBV.sTrue--instance NonFuncSBVRep Integer where- type NonFuncSBVBaseType Integer = Integer--instance SupportedNonFuncPrim Integer where- conNonFuncSBVTerm = conSBVTerm- symNonFuncSBVTerm = symSBVTerm @Integer- withNonFuncPrim r = r---- Signed BV-instance (KnownNat w, 1 <= w) => SupportedPrimConstraint (IntN w) where- type PrimConstraint (IntN w) = (KnownNat w, 1 <= w, BVIsNonZero w)--instance (KnownNat w, 1 <= w) => SBVRep (IntN w) where- type SBVType (IntN w) = SBV.SBV (SBV.IntN w)--instance (KnownNat w, 1 <= w) => SupportedPrim (IntN w) where- sbvDistinct = withPrim @(IntN w) $ SBV.distinct . toList- sbvEq = withPrim @(IntN w) (SBV..==)- pformatCon = show- defaultValue = 0- pevalITETerm = pevalITEBasicTerm- pevalEqTerm = pevalDefaultEqTerm- pevalDistinctTerm = pevalGeneralDistinct- conSBVTerm n = bvIsNonZeroFromGEq1 (Proxy @w) $ fromIntegral n- symSBVName symbol _ = show symbol- symSBVTerm name = bvIsNonZeroFromGEq1 (Proxy @w) $ sbvFresh name- withPrim r = bvIsNonZeroFromGEq1 (Proxy @w) r- {-# INLINE withPrim #-}- parseSMTModelResult _ cv =- withPrim @(IntN w) $- parseScalarSMTModelResult (\(x :: SBV.IntN w) -> fromIntegral x) cv- castTypedSymbol ::- forall knd knd'.- (IsSymbolKind knd') =>- TypedSymbol knd (IntN w) ->- Maybe (TypedSymbol knd' (IntN w))- castTypedSymbol s =- case decideSymbolKind @knd' of- Left HRefl -> Just $ typedConstantSymbol $ unTypedSymbol s- Right HRefl -> Just $ typedAnySymbol $ unTypedSymbol s- funcDummyConstraint _ = SBV.sTrue---- | Construct the 'SBV.BVIsNonZero' constraint from the proof that the width is--- at least 1.-bvIsNonZeroFromGEq1 ::- forall w r proxy.- (1 <= w) =>- proxy w ->- ((SBV.BVIsNonZero w) => r) ->- r-bvIsNonZeroFromGEq1 _ r1 = case unsafeAxiom :: w :~: 1 of- Refl -> r1-{-# INLINE bvIsNonZeroFromGEq1 #-}--instance (KnownNat w, 1 <= w) => NonFuncSBVRep (IntN w) where- type NonFuncSBVBaseType (IntN w) = SBV.IntN w--instance (KnownNat w, 1 <= w) => SupportedNonFuncPrim (IntN w) where- conNonFuncSBVTerm = conSBVTerm- symNonFuncSBVTerm = symSBVTerm @(IntN w)- withNonFuncPrim r = bvIsNonZeroFromGEq1 (Proxy @w) r---- Unsigned BV-instance (KnownNat w, 1 <= w) => SupportedPrimConstraint (WordN w) where- type PrimConstraint (WordN w) = (KnownNat w, 1 <= w, BVIsNonZero w)--instance (KnownNat w, 1 <= w) => SBVRep (WordN w) where- type SBVType (WordN w) = SBV.SBV (SBV.WordN w)--instance (KnownNat w, 1 <= w) => SupportedPrim (WordN w) where- sbvDistinct = withPrim @(WordN w) $ SBV.distinct . toList- sbvEq = withPrim @(WordN w) (SBV..==)- pformatCon = show- defaultValue = 0- pevalITETerm = pevalITEBasicTerm- pevalEqTerm = pevalDefaultEqTerm- pevalDistinctTerm = pevalGeneralDistinct- conSBVTerm n = bvIsNonZeroFromGEq1 (Proxy @w) $ fromIntegral n- symSBVName symbol _ = show symbol- symSBVTerm name = bvIsNonZeroFromGEq1 (Proxy @w) $ sbvFresh name- withPrim r = bvIsNonZeroFromGEq1 (Proxy @w) r- {-# INLINE withPrim #-}- parseSMTModelResult _ cv =- withPrim @(IntN w) $- parseScalarSMTModelResult (\(x :: SBV.WordN w) -> fromIntegral x) cv- castTypedSymbol ::- forall knd knd'.- (IsSymbolKind knd') =>- TypedSymbol knd (WordN w) ->- Maybe (TypedSymbol knd' (WordN w))- castTypedSymbol s =- case decideSymbolKind @knd' of- Left HRefl -> Just $ typedConstantSymbol $ unTypedSymbol s- Right HRefl -> Just $ typedAnySymbol $ unTypedSymbol s- funcDummyConstraint _ = SBV.sTrue--instance (KnownNat w, 1 <= w) => NonFuncSBVRep (WordN w) where- type NonFuncSBVBaseType (WordN w) = SBV.WordN w--instance (KnownNat w, 1 <= w) => SupportedNonFuncPrim (WordN w) where- conNonFuncSBVTerm = conSBVTerm- symNonFuncSBVTerm = symSBVTerm @(WordN w)- withNonFuncPrim r = bvIsNonZeroFromGEq1 (Proxy @w) r---- FP-instance (ValidFP eb sb) => SupportedPrimConstraint (FP eb sb) where- type PrimConstraint (FP eb sb) = ValidFP eb sb--instance (ValidFP eb sb) => SBVRep (FP eb sb) where- type SBVType (FP eb sb) = SBV.SBV (SBV.FloatingPoint eb sb)--instance (ValidFP eb sb) => SupportedPrim (FP eb sb) where- sameCon a b- | isNaN a = isNaN b- | fpIsPositiveZero a = fpIsPositiveZero b- | fpIsNegativeZero a = fpIsNegativeZero b- | otherwise = a == b- hashConWithSalt s a- | isNaN a = hashWithSalt s (2654435761 :: Int)- | otherwise = hashWithSalt s a- defaultValue = 0- pevalITETerm = pevalITEBasicTerm- pevalEqTerm (ConTerm _ _ _ _ l) (ConTerm _ _ _ _ r) = conTerm $ l == r- pevalEqTerm l@ConTerm {} r = pevalEqTerm r l- pevalEqTerm l r = eqTerm l r- pevalDistinctTerm (_ :| []) = conTerm True- pevalDistinctTerm (a :| [b]) = pevalNotTerm $ pevalEqTerm a b- pevalDistinctTerm l =- case getAllConcrete (toList l) of- Nothing -> distinctTerm l- Just xs | any isNaN xs -> distinctTerm l- Just xs -> conTerm $ checkConcreteDistinct xs- conSBVTerm (FP fp) = SBV.literal fp- symSBVName symbol _ = show symbol- symSBVTerm name = sbvFresh name- parseSMTModelResult _ cv =- withPrim @(FP eb sb) $- parseScalarSMTModelResult (\(x :: SBV.FloatingPoint eb sb) -> coerce x) cv- funcDummyConstraint _ = SBV.sTrue-- -- Workaround for sbv#702.- sbvIte = withPrim @(FP eb sb) $ \c a b ->- case (SBV.unliteral a, SBV.unliteral b) of- (Just a', Just b')- | isInfinite a' && isInfinite b' ->- let correspondingZero x = if x > 0 then 0 else -0- in 1- / sbvIte @(FP eb sb)- c- (conSBVTerm @(FP eb sb) $ correspondingZero a')- (conSBVTerm @(FP eb sb) $ correspondingZero b')- _ -> SBV.ite c a b- castTypedSymbol ::- forall knd knd'.- (IsSymbolKind knd') =>- TypedSymbol knd (FP eb sb) ->- Maybe (TypedSymbol knd' (FP eb sb))- castTypedSymbol s =- case decideSymbolKind @knd' of- Left HRefl -> Just $ typedConstantSymbol $ unTypedSymbol s- Right HRefl -> Just $ typedAnySymbol $ unTypedSymbol s--instance (ValidFP eb sb) => NonFuncSBVRep (FP eb sb) where- type NonFuncSBVBaseType (FP eb sb) = SBV.FloatingPoint eb sb--instance (ValidFP eb sb) => SupportedNonFuncPrim (FP eb sb) where- conNonFuncSBVTerm = conSBVTerm- symNonFuncSBVTerm = symSBVTerm @(FP eb sb)- withNonFuncPrim r = r---- FPRoundingMode-instance SupportedPrimConstraint FPRoundingMode--instance SBVRep FPRoundingMode where- type SBVType FPRoundingMode = SBV.SBV SBV.RoundingMode--instance SupportedPrim FPRoundingMode where- defaultValue = RNE- pevalITETerm = pevalITEBasicTerm- pevalEqTerm (ConTerm _ _ _ _ l) (ConTerm _ _ _ _ r) = conTerm $ l == r- pevalEqTerm l@ConTerm {} r = pevalEqTerm r l- pevalEqTerm l r = eqTerm l r- pevalDistinctTerm = pevalGeneralDistinct- conSBVTerm RNE = SBV.sRNE- conSBVTerm RNA = SBV.sRNA- conSBVTerm RTP = SBV.sRTP- conSBVTerm RTN = SBV.sRTN- conSBVTerm RTZ = SBV.sRTZ- symSBVName symbol _ = show symbol- symSBVTerm name = sbvFresh name- parseSMTModelResult _ cv =- withPrim @(FPRoundingMode) $- parseScalarSMTModelResult- ( \(x :: SBV.RoundingMode) -> case x of- SBV.RoundNearestTiesToEven -> RNE- SBV.RoundNearestTiesToAway -> RNA- SBV.RoundTowardPositive -> RTP- SBV.RoundTowardNegative -> RTN- SBV.RoundTowardZero -> RTZ- )- cv- castTypedSymbol ::- forall knd knd'.- (IsSymbolKind knd') =>- TypedSymbol knd FPRoundingMode ->- Maybe (TypedSymbol knd' FPRoundingMode)- castTypedSymbol s =- case decideSymbolKind @knd' of- Left HRefl -> Just $ typedConstantSymbol $ unTypedSymbol s- Right HRefl -> Just $ typedAnySymbol $ unTypedSymbol s- funcDummyConstraint _ = SBV.sTrue--instance NonFuncSBVRep FPRoundingMode where- type NonFuncSBVBaseType FPRoundingMode = SBV.RoundingMode--instance SupportedNonFuncPrim FPRoundingMode where- conNonFuncSBVTerm = conSBVTerm- symNonFuncSBVTerm = symSBVTerm @FPRoundingMode- withNonFuncPrim r = r---- AlgReal--instance SupportedPrimConstraint AlgReal--instance SBVRep AlgReal where- type SBVType AlgReal = SBV.SBV SBV.AlgReal--instance SupportedPrim AlgReal where- defaultValue = 0- pevalITETerm = pevalITEBasicTerm- pevalEqTerm (ConTerm _ _ _ _ l) (ConTerm _ _ _ _ r) = conTerm $ l == r- pevalEqTerm l@ConTerm {} r = pevalEqTerm r l- pevalEqTerm l r = eqTerm l r- pevalDistinctTerm = pevalGeneralDistinct- conSBVTerm = SBV.literal . toSBVAlgReal- symSBVName symbol _ = show symbol- symSBVTerm name = sbvFresh name- parseSMTModelResult _ cv =- withPrim @AlgReal $- parseScalarSMTModelResult fromSBVAlgReal cv- castTypedSymbol ::- forall knd knd'.- (IsSymbolKind knd') =>- TypedSymbol knd AlgReal ->- Maybe (TypedSymbol knd' AlgReal)- castTypedSymbol s =- case decideSymbolKind @knd' of- Left HRefl -> Just $ typedConstantSymbol $ unTypedSymbol s- Right HRefl -> Just $ typedAnySymbol $ unTypedSymbol s- funcDummyConstraint _ = SBV.sTrue--instance NonFuncSBVRep AlgReal where- type NonFuncSBVBaseType AlgReal = SBV.AlgReal--instance SupportedNonFuncPrim AlgReal where- conNonFuncSBVTerm = conSBVTerm- symNonFuncSBVTerm = symSBVTerm @AlgReal- withNonFuncPrim r = r
src/Grisette/Internal/SymPrim/Prim/Internal/Serialize.hs view
@@ -57,9 +57,7 @@ ) import Grisette.Internal.SymPrim.GeneralFun (type (-->) (GeneralFun)) import Grisette.Internal.SymPrim.Prim.Internal.Caches (Id)-import Grisette.Internal.SymPrim.Prim.Internal.Instances.BVPEval () import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalBitCastTerm ()-import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalBitwiseTerm () import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalDivModIntegralTerm () import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFloatingTerm () import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFractionalTerm ()@@ -69,7 +67,6 @@ import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalOrdTerm () import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalRotateTerm () import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalShiftTerm ()-import Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim () import Grisette.Internal.SymPrim.Prim.Internal.Term ( FPBinaryOp, FPRoundingBinaryOp,@@ -93,56 +90,7 @@ SomeTypedSymbol (SomeTypedSymbol), SupportedNonFuncPrim, SupportedPrim (primTypeRep, withPrim),- Term- ( AbsNumTerm,- AddNumTerm,- AndBitsTerm,- AndTerm,- ApplyTerm,- BVConcatTerm,- BVExtendTerm,- BVSelectTerm,- BitCastOrTerm,- BitCastTerm,- ComplementBitsTerm,- ConTerm,- DistinctTerm,- DivIntegralTerm,- EqTerm,- ExistsTerm,- FPBinaryTerm,- FPFMATerm,- FPRoundingBinaryTerm,- FPRoundingUnaryTerm,- FPTraitTerm,- FPUnaryTerm,- FdivTerm,- FloatingUnaryTerm,- ForallTerm,- FromFPOrTerm,- FromIntegralTerm,- ITETerm,- LeOrdTerm,- LtOrdTerm,- ModIntegralTerm,- MulNumTerm,- NegNumTerm,- NotTerm,- OrBitsTerm,- OrTerm,- PowerTerm,- QuotIntegralTerm,- RecipTerm,- RemIntegralTerm,- RotateLeftTerm,- RotateRightTerm,- ShiftLeftTerm,- ShiftRightTerm,- SignumNumTerm,- SymTerm,- ToFPTerm,- XorBitsTerm- ),+ Term, TypedAnySymbol, TypedConstantSymbol, TypedSymbol (TypedSymbol),@@ -173,7 +121,6 @@ fpUnaryTerm, fromFPOrTerm, fromIntegralTerm,- introSupportedPrimConstraint, iteTerm, leOrdTerm, ltOrdTerm,@@ -196,8 +143,56 @@ symTerm, termId, toFPTerm,- withSupportedPrimTypeable, xorBitsTerm,+ pattern AbsNumTerm,+ pattern AddNumTerm,+ pattern AndBitsTerm,+ pattern AndTerm,+ pattern ApplyTerm,+ pattern BVConcatTerm,+ pattern BVExtendTerm,+ pattern BVSelectTerm,+ pattern BitCastOrTerm,+ pattern BitCastTerm,+ pattern ComplementBitsTerm,+ pattern ConTerm,+ pattern DistinctTerm,+ pattern DivIntegralTerm,+ pattern EqTerm,+ pattern ExistsTerm,+ pattern FPBinaryTerm,+ pattern FPFMATerm,+ pattern FPRoundingBinaryTerm,+ pattern FPRoundingUnaryTerm,+ pattern FPTraitTerm,+ pattern FPUnaryTerm,+ pattern FdivTerm,+ pattern FloatingUnaryTerm,+ pattern ForallTerm,+ pattern FromFPOrTerm,+ pattern FromIntegralTerm,+ pattern ITETerm,+ pattern LeOrdTerm,+ pattern LtOrdTerm,+ pattern ModIntegralTerm,+ pattern MulNumTerm,+ pattern NegNumTerm,+ pattern NotTerm,+ pattern OrBitsTerm,+ pattern OrTerm,+ pattern PowerTerm,+ pattern QuotIntegralTerm,+ pattern RecipTerm,+ pattern RemIntegralTerm,+ pattern RotateLeftTerm,+ pattern RotateRightTerm,+ pattern ShiftLeftTerm,+ pattern ShiftRightTerm,+ pattern SignumNumTerm,+ pattern SupportedTerm,+ pattern SymTerm,+ pattern ToFPTerm,+ pattern XorBitsTerm, ) import Grisette.Internal.SymPrim.Prim.SomeTerm ( SomeTerm (SomeTerm),@@ -900,11 +895,10 @@ f $ t :| fmap (unsafeCastTerm t) ts where unsafeCastTerm :: Term a -> SomeTerm -> Term a- unsafeCastTerm t (SomeTerm b) =- introSupportedPrimConstraint t $- case castTerm b of- Just r -> r- Nothing -> error "asSameTypeNonEmptyTermList: type mismatch"+ unsafeCastTerm _ (SomeTerm b) =+ case castTerm b of+ Just r -> r+ Nothing -> error "asSameTypeNonEmptyTermList: type mismatch" asNumTypeTerm :: (HasCallStack) =>@@ -1043,11 +1037,10 @@ asSameType :: (HasCallStack) => Term a -> SomeTerm -> (Term a -> r) -> r-asSameType (t1 :: Term a) (SomeTerm (t2 :: Term b)) f =- introSupportedPrimConstraint t1 $- case eqTypeRep (primTypeRep @a) (primTypeRep @b) of- Just HRefl -> f t2- Nothing -> error "asSameType: type mismatch"+asSameType (SupportedTerm :: Term a) (SomeTerm (t2 :: Term b)) f =+ case eqTypeRep (primTypeRep @a) (primTypeRep @b) of+ Just HRefl -> f t2+ Nothing -> error "asSameType: type mismatch" asFPRoundingTerm :: (HasCallStack) => SomeTerm -> (Term FPRoundingMode -> r) -> r@@ -1302,39 +1295,37 @@ Term a -> KnownType -> SomeTerm-constructFromIntegralTerm' ta retType =+constructFromIntegralTerm' ta@SupportedTerm retType = case witnessKnownType retType of KnownTypeWitness (_ :: Proxy b) -> do let tb = primTypeRep @b- introSupportedPrimConstraint ta $- withPrim @a $- withPrim @b $- case ( eqTypeRep tb (typeRep @Integer),- eqTypeRep tb (typeRep @AlgReal),- tb- ) of- (Just HRefl, _, _) -> someTerm (fromIntegralTerm ta :: Term b)- (_, Just HRefl, _) -> someTerm (fromIntegralTerm ta :: Term b)- (_, _, App tw@Con {} _) ->- case ( eqTypeRep tw (typeRep @WordN),- eqTypeRep tw (typeRep @IntN)- ) of- (Just HRefl, _) -> someTerm (fromIntegralTerm ta :: Term b)- (_, Just HRefl) -> someTerm (fromIntegralTerm ta :: Term b)- _ -> err- (_, _, App (App tw@Con {} _) _) ->- case eqTypeRep tw (typeRep @FP) of- Just HRefl -> someTerm (fromIntegralTerm ta :: Term b)- _ -> err- _ -> err+ withPrim @a $+ withPrim @b $+ case ( eqTypeRep tb (typeRep @Integer),+ eqTypeRep tb (typeRep @AlgReal),+ tb+ ) of+ (Just HRefl, _, _) -> someTerm (fromIntegralTerm ta :: Term b)+ (_, Just HRefl, _) -> someTerm (fromIntegralTerm ta :: Term b)+ (_, _, App tw@Con {} _) ->+ case ( eqTypeRep tw (typeRep @WordN),+ eqTypeRep tw (typeRep @IntN)+ ) of+ (Just HRefl, _) -> someTerm (fromIntegralTerm ta :: Term b)+ (_, Just HRefl) -> someTerm (fromIntegralTerm ta :: Term b)+ _ -> err+ (_, _, App (App tw@Con {} _) _) ->+ case eqTypeRep tw (typeRep @FP) of+ Just HRefl -> someTerm (fromIntegralTerm ta :: Term b)+ _ -> err+ _ -> err where err :: SomeTerm err =- introSupportedPrimConstraint ta $- error $- "constructFromIntegralTerm: unsupported type: "- <> show (primTypeRep @a)- <> show retType+ error $+ "constructFromIntegralTerm: unsupported type: "+ <> show (primTypeRep @a)+ <> show retType constructFromIntegralTerm :: (HasCallStack) => SomeTerm -> KnownType -> SomeTerm@@ -1356,7 +1347,7 @@ err = error $ "constructFromIntegralTerm: unsupported type: " <> show tra knownTypeTermId :: Term a -> (KnownType, Id)-knownTypeTermId t = introSupportedPrimConstraint t (knownType t, termId t)+knownTypeTermId t@SupportedTerm = (knownType t, termId t) statefulDeserializeSomeTerm :: (MonadGet m) =>@@ -1659,7 +1650,7 @@ then return () else do case tm of- ConTerm _ _ _ _ (v :: v) -> do+ ConTerm (v :: v) -> do serialize ktTmId putWord8 conTermTag let kt = knownType (Proxy @v)@@ -1672,100 +1663,100 @@ Nothing -> error "serializeSingleSomeTerm: should not happen: type mismatch"- SymTerm _ _ _ _ (v :: TypedAnySymbol v) -> do+ SymTerm (v :: TypedAnySymbol v) -> do serialize ktTmId putWord8 symTermTag serialize $ someTypedSymbol v- ForallTerm _ _ _ _ ts t -> serializeQuantified ktTmId forallTermTag ts t- ExistsTerm _ _ _ _ ts t -> serializeQuantified ktTmId existsTermTag ts t- NotTerm _ _ _ _ t -> do+ ForallTerm ts t -> serializeQuantified ktTmId forallTermTag ts t+ ExistsTerm ts t -> serializeQuantified ktTmId existsTermTag ts t+ NotTerm t -> do serializeSingleSomeTerm $ someTerm t serialize ktTmId putWord8 notTermTag serialize $ knownTypeTermId t- OrTerm _ _ _ _ t1 t2 -> serializeBinary ktTmId orTermTag t1 t2- AndTerm _ _ _ _ t1 t2 -> serializeBinary ktTmId andTermTag t1 t2- EqTerm _ _ _ _ t1 t2 -> serializeBinary ktTmId eqTermTag t1 t2- DistinctTerm _ _ _ _ ts -> do+ OrTerm t1 t2 -> serializeBinary ktTmId orTermTag t1 t2+ AndTerm t1 t2 -> serializeBinary ktTmId andTermTag t1 t2+ EqTerm t1 t2 -> serializeBinary ktTmId eqTermTag t1 t2+ DistinctTerm ts -> do traverse_ (serializeSingleSomeTerm . someTerm) ts serialize ktTmId putWord8 distinctTermTag serialize $ fmap knownTypeTermId ts- ITETerm _ _ _ _ t1 t2 t3 -> serializeTernary ktTmId iteTermTag t1 t2 t3- AddNumTerm _ _ _ _ t1 t2 -> serializeBinary ktTmId addNumTermTag t1 t2- NegNumTerm _ _ _ _ t -> serializeUnary ktTmId negNumTermTag t- MulNumTerm _ _ _ _ t1 t2 -> serializeBinary ktTmId mulNumTermTag t1 t2- AbsNumTerm _ _ _ _ t -> serializeUnary ktTmId absNumTermTag t- SignumNumTerm _ _ _ _ t -> serializeUnary ktTmId signumNumTermTag t- LtOrdTerm _ _ _ _ t1 t2 -> serializeBinary ktTmId ltOrdTermTag t1 t2- LeOrdTerm _ _ _ _ t1 t2 -> serializeBinary ktTmId leOrdTermTag t1 t2- AndBitsTerm _ _ _ _ t1 t2 -> serializeBinary ktTmId andBitsTermTag t1 t2- OrBitsTerm _ _ _ _ t1 t2 -> serializeBinary ktTmId orBitsTermTag t1 t2- XorBitsTerm _ _ _ _ t1 t2 -> serializeBinary ktTmId xorBitsTermTag t1 t2- ComplementBitsTerm _ _ _ _ t ->+ ITETerm t1 t2 t3 -> serializeTernary ktTmId iteTermTag t1 t2 t3+ AddNumTerm t1 t2 -> serializeBinary ktTmId addNumTermTag t1 t2+ NegNumTerm t -> serializeUnary ktTmId negNumTermTag t+ MulNumTerm t1 t2 -> serializeBinary ktTmId mulNumTermTag t1 t2+ AbsNumTerm t -> serializeUnary ktTmId absNumTermTag t+ SignumNumTerm t -> serializeUnary ktTmId signumNumTermTag t+ LtOrdTerm t1 t2 -> serializeBinary ktTmId ltOrdTermTag t1 t2+ LeOrdTerm t1 t2 -> serializeBinary ktTmId leOrdTermTag t1 t2+ AndBitsTerm t1 t2 -> serializeBinary ktTmId andBitsTermTag t1 t2+ OrBitsTerm t1 t2 -> serializeBinary ktTmId orBitsTermTag t1 t2+ XorBitsTerm t1 t2 -> serializeBinary ktTmId xorBitsTermTag t1 t2+ ComplementBitsTerm t -> serializeUnary ktTmId complementBitsTermTag t- ShiftLeftTerm _ _ _ _ t1 t2 ->+ ShiftLeftTerm t1 t2 -> serializeBinary ktTmId shiftLeftTermTag t1 t2- ShiftRightTerm _ _ _ _ t1 t2 ->+ ShiftRightTerm t1 t2 -> serializeBinary ktTmId shiftRightTermTag t1 t2- RotateLeftTerm _ _ _ _ t1 t2 ->+ RotateLeftTerm t1 t2 -> serializeBinary ktTmId rotateLeftTermTag t1 t2- RotateRightTerm _ _ _ _ t1 t2 ->+ RotateRightTerm t1 t2 -> serializeBinary ktTmId rotateRightTermTag t1 t2- BitCastTerm _ _ _ _ t -> do+ BitCastTerm t -> do serializeSingleSomeTerm $ someTerm t serialize ktTmId serialize bitCastTermTag let kt = knownType (Proxy @t) serializeKnownType kt serialize $ knownTypeTermId t- BitCastOrTerm _ _ _ _ d t -> serializeBinary ktTmId bitCastOrTermTag d t- BVConcatTerm _ _ _ _ t1 t2 -> serializeBinary ktTmId bvConcatTermTag t1 t2- BVSelectTerm _ _ _ _ ix w t -> do+ BitCastOrTerm d t -> serializeBinary ktTmId bitCastOrTermTag d t+ BVConcatTerm t1 t2 -> serializeBinary ktTmId bvConcatTermTag t1 t2+ BVSelectTerm ix w t -> do serializeSingleSomeTerm $ someTerm t serialize ktTmId serialize bvSelectTermTag serialize $ natVal ix serialize $ natVal w serialize $ knownTypeTermId t- BVExtendTerm _ _ _ _ signed r t -> do+ BVExtendTerm signed r t -> do serializeSingleSomeTerm $ someTerm t serialize ktTmId serialize bvExtendTermTag serialize signed serialize $ natVal r serialize $ knownTypeTermId t- ApplyTerm _ _ _ _ f ts -> serializeBinary ktTmId applyTermTag f ts- DivIntegralTerm _ _ _ _ t1 t2 ->+ ApplyTerm f ts -> serializeBinary ktTmId applyTermTag f ts+ DivIntegralTerm t1 t2 -> serializeBinary ktTmId divIntegralTermTag t1 t2- ModIntegralTerm _ _ _ _ t1 t2 ->+ ModIntegralTerm t1 t2 -> serializeBinary ktTmId modIntegralTermTag t1 t2- QuotIntegralTerm _ _ _ _ t1 t2 ->+ QuotIntegralTerm t1 t2 -> serializeBinary ktTmId quotIntegralTermTag t1 t2- RemIntegralTerm _ _ _ _ t1 t2 ->+ RemIntegralTerm t1 t2 -> serializeBinary ktTmId remIntegralTermTag t1 t2- FPTraitTerm _ _ _ _ trait t -> do+ FPTraitTerm trait t -> do serializeSingleSomeTerm $ someTerm t serialize ktTmId serialize fpTraitTermTag serialize trait serialize $ knownTypeTermId t- FdivTerm _ _ _ _ t1 t2 -> serializeBinary ktTmId fdivTermTag t1 t2- RecipTerm _ _ _ _ t -> serializeUnary ktTmId recipTermTag t- FloatingUnaryTerm _ _ _ _ op t -> do+ FdivTerm t1 t2 -> serializeBinary ktTmId fdivTermTag t1 t2+ RecipTerm t -> serializeUnary ktTmId recipTermTag t+ FloatingUnaryTerm op t -> do serializeSingleSomeTerm $ someTerm t serialize ktTmId serialize floatingUnaryTermTag serialize op serialize $ knownTypeTermId t- PowerTerm _ _ _ _ t1 t2 -> serializeBinary ktTmId powerTermTag t1 t2- FPUnaryTerm _ _ _ _ op t -> do+ PowerTerm t1 t2 -> serializeBinary ktTmId powerTermTag t1 t2+ FPUnaryTerm op t -> do serializeSingleSomeTerm $ someTerm t serialize ktTmId serialize fpUnaryTermTag serialize op serialize $ knownTypeTermId t- FPBinaryTerm _ _ _ _ op t1 t2 -> do+ FPBinaryTerm op t1 t2 -> do serializeSingleSomeTerm $ someTerm t1 serializeSingleSomeTerm $ someTerm t2 serialize ktTmId@@ -1773,7 +1764,7 @@ serialize op serialize $ knownTypeTermId t1 serialize $ knownTypeTermId t2- FPRoundingUnaryTerm _ _ _ _ op rd t -> do+ FPRoundingUnaryTerm op rd t -> do serializeSingleSomeTerm $ someTerm rd serializeSingleSomeTerm $ someTerm t serialize ktTmId@@ -1781,7 +1772,7 @@ serialize op serialize $ knownTypeTermId rd serialize $ knownTypeTermId t- FPRoundingBinaryTerm _ _ _ _ op rd t1 t2 -> do+ FPRoundingBinaryTerm op rd t1 t2 -> do serializeSingleSomeTerm $ someTerm rd serializeSingleSomeTerm $ someTerm t1 serializeSingleSomeTerm $ someTerm t2@@ -1791,7 +1782,7 @@ serialize $ knownTypeTermId rd serialize $ knownTypeTermId t1 serialize $ knownTypeTermId t2- FPFMATerm _ _ _ _ rd t1 t2 t3 -> do+ FPFMATerm rd t1 t2 t3 -> do serializeSingleSomeTerm $ someTerm rd serializeSingleSomeTerm $ someTerm t1 serializeSingleSomeTerm $ someTerm t2@@ -1802,16 +1793,16 @@ serialize $ knownTypeTermId t1 serialize $ knownTypeTermId t2 serialize $ knownTypeTermId t3- FromIntegralTerm _ _ _ _ t -> do+ FromIntegralTerm t -> do serializeSingleSomeTerm $ someTerm t serialize ktTmId serialize fromIntegralTermTag let kt = knownType (Proxy @t) serializeKnownType kt serialize $ knownTypeTermId t- FromFPOrTerm _ _ _ _ d rd t ->+ FromFPOrTerm d rd t -> serializeTernary ktTmId fromFPOrTermTag d rd t- ToFPTerm _ _ _ _ rd t eb sb -> do+ ToFPTerm rd t eb sb -> do serializeSingleSomeTerm $ someTerm rd serializeSingleSomeTerm $ someTerm t serialize ktTmId@@ -1879,7 +1870,7 @@ serialize = serializeSomeTerm . someTerm deserialize = do SomeTerm tm <- deserialize- withSupportedPrimTypeable @a $ case castTerm tm of+ case castTerm tm of Just r -> return r Nothing -> fail "deserialize Term: type mismatch"
src/Grisette/Internal/SymPrim/Prim/Internal/Term.hs view
@@ -8,5553 +8,8410 @@ {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DeriveLift #-} {-# HLINT ignore "Eta reduce" #-}-{-# LANGUAGE DerivingStrategies #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE FunctionalDependencies #-}-{-# LANGUAGE GADTs #-}-{-# LANGUAGE GeneralizedNewtypeDeriving #-}-{-# LANGUAGE InstanceSigs #-}-{-# LANGUAGE LambdaCase #-}-{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE PatternSynonyms #-}-{-# LANGUAGE QuantifiedConstraints #-}-{-# LANGUAGE RankNTypes #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE StandaloneDeriving #-}-{-# LANGUAGE Strict #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeApplications #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE TypeOperators #-}-{-# LANGUAGE UndecidableInstances #-}-{-# LANGUAGE ViewPatterns #-}-{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}-{-# OPTIONS_GHC -funbox-strict-fields #-}---- |--- Module : Grisette.Internal.SymPrim.Prim.Internal.Term--- Copyright : (c) Sirui Lu 2021-2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.SymPrim.Prim.Internal.Term- ( -- * Supported primitive types- SupportedPrimConstraint (..),- SupportedPrim (..),- withSupportedPrimTypeable,- SymRep (..),- ConRep (..),- LinkedRep (..),-- -- * Partial evaluation for the terms- PEvalApplyTerm (..),- PEvalBitwiseTerm (..),- PEvalShiftTerm (..),- PEvalRotateTerm (..),- PEvalNumTerm (..),- pevalSubNumTerm,- PEvalOrdTerm (..),- pevalGtOrdTerm,- pevalGeOrdTerm,- pevalNEqTerm,- PEvalDivModIntegralTerm (..),- PEvalBitCastTerm (..),- PEvalBitCastOrTerm (..),- PEvalBVTerm (..),- PEvalFractionalTerm (..),- PEvalFloatingTerm (..),- PEvalFromIntegralTerm (..),- PEvalIEEEFPConvertibleTerm (..),-- -- * Typed symbols- SymbolKind (..),- TypedSymbol (TypedSymbol, unTypedSymbol),- typedConstantSymbol,- typedAnySymbol,- TypedConstantSymbol,- TypedAnySymbol,- SomeTypedSymbol (..),- SomeTypedConstantSymbol,- SomeTypedAnySymbol,- IsSymbolKind (..),- showUntyped,- withSymbolSupported,- withConstantSymbolSupported,- someTypedSymbol,- eqHeteroSymbol,- castSomeTypedSymbol,- withSymbolKind,-- -- * Terms- FPTrait (..),- FPUnaryOp (..),- FPBinaryOp (..),- FPRoundingUnaryOp (..),- FPRoundingBinaryOp (..),- FloatingUnaryOp (..),- Term (..),- defaultValueDynamic,- pattern DynTerm,- toCurThread,- termId,- termIdent,- typeHashId,- introSupportedPrimConstraint,- pformatTerm,- ModelValue (..),- toModelValue,- unsafeFromModelValue,-- -- * Interning- UTerm (..),- prettyPrintTerm,- forallTerm,- existsTerm,- conTerm,- symTerm,- ssymTerm,- isymTerm,- notTerm,- orTerm,- andTerm,- eqTerm,- distinctTerm,- iteTerm,- addNumTerm,- negNumTerm,- mulNumTerm,- absNumTerm,- signumNumTerm,- ltOrdTerm,- leOrdTerm,- andBitsTerm,- orBitsTerm,- xorBitsTerm,- complementBitsTerm,- shiftLeftTerm,- shiftRightTerm,- rotateLeftTerm,- rotateRightTerm,- bitCastTerm,- bitCastOrTerm,- bvConcatTerm,- bvSelectTerm,- bvExtendTerm,- bvsignExtendTerm,- bvzeroExtendTerm,- applyTerm,- divIntegralTerm,- modIntegralTerm,- quotIntegralTerm,- remIntegralTerm,- fpTraitTerm,- fdivTerm,- recipTerm,- floatingUnaryTerm,- powerTerm,- fpUnaryTerm,- fpBinaryTerm,- fpRoundingUnaryTerm,- fpRoundingBinaryTerm,- fpFMATerm,- fromIntegralTerm,- fromFPOrTerm,- toFPTerm,-- -- * Support for boolean type- trueTerm,- falseTerm,- pattern BoolConTerm,- pattern TrueTerm,- pattern FalseTerm,- pattern BoolTerm,- pevalNotTerm,- pevalOrTerm,- pevalAndTerm,- pevalImplyTerm,- pevalXorTerm,- pevalITEBasic,- pevalITEBasicTerm,- pevalDefaultEqTerm,- NonFuncPrimConstraint,- NonFuncSBVRep (..),- SupportedNonFuncPrim (..),- SBVRep (..),- SBVFreshMonad (..),- translateTypeError,- parseSMTModelResultError,- partitionCVArg,- parseScalarSMTModelResult,- )-where--#if MIN_VERSION_prettyprinter(1,7,0)-import Prettyprinter- ( column,- pageWidth,- Doc,- PageWidth(Unbounded, AvailablePerLine),- Pretty(pretty),- )-#else-import Data.Text.Prettyprint.Doc- ( column,- pageWidth,- Doc,- PageWidth(Unbounded, AvailablePerLine),- Pretty(pretty),- )-#endif--#if !MIN_VERSION_sbv(10,0,0)-#define SMTDefinable Uninterpreted-#endif--#if MIN_VERSION_sbv(11,0,0)-import qualified Data.SBV as SBVTC-#endif--#if MIN_VERSION_base(4,15,0)-import Language.Haskell.TH (Code, Quote)-#else-import Language.Haskell.TH (TExpQ)-#endif--import Control.DeepSeq (NFData (rnf))-import Control.Monad (msum)-import Control.Monad.IO.Class (MonadIO)-import qualified Control.Monad.RWS.Lazy as Lazy-import qualified Control.Monad.RWS.Strict as Strict-import Control.Monad.Reader (MonadTrans (lift), ReaderT)-import qualified Control.Monad.State.Lazy as Lazy-import qualified Control.Monad.State.Strict as Strict-import qualified Control.Monad.Writer.Lazy as Lazy-import qualified Control.Monad.Writer.Strict as Strict-import Data.Atomics (atomicModifyIORefCAS_)-import qualified Data.Binary as Binary-import Data.Bits (Bits)-import Data.Bytes.Serial (Serial (deserialize, serialize))-import qualified Data.HashMap.Strict as HM-import Data.Hashable (Hashable (hashWithSalt))-import Data.IORef (IORef, newIORef, readIORef)-import Data.Kind (Constraint, Type)-import Data.List.NonEmpty (NonEmpty ((:|)), toList)-import Data.Maybe (fromMaybe)-import qualified Data.SBV as SBV-import qualified Data.SBV.Dynamic as SBVD-import qualified Data.SBV.Trans as SBVT-import qualified Data.SBV.Trans.Control as SBVTC-import qualified Data.Serialize as Cereal-import Data.String (IsString (fromString))-import Data.Typeable (Proxy (Proxy), cast, typeRepFingerprint)-import GHC.Exts (Any, sortWith)-import GHC.Fingerprint (Fingerprint)-import GHC.Generics (Generic)-import GHC.IO (unsafePerformIO)-import GHC.Stack (HasCallStack)-import GHC.TypeNats (KnownNat, Nat, type (+), type (<=))-import Grisette.Internal.Core.Data.Class.BitCast (BitCast, BitCastOr)-import Grisette.Internal.Core.Data.Class.BitVector- ( SizedBV,- )-import Grisette.Internal.Core.Data.Symbol- ( Identifier,- Symbol (IndexedSymbol, SimpleSymbol),- )-import Grisette.Internal.SymPrim.FP (FP, FPRoundingMode, ValidFP)-import Grisette.Internal.SymPrim.Prim.Internal.Caches- ( Digest,- Id,- Ident,- Interned- ( Description,- Uninterned,- describe,- descriptionDigest,- identify,- threadId- ),- intern,- )-import Grisette.Internal.SymPrim.Prim.Internal.Utils- ( WeakThreadId,- myWeakThreadId,- )-import Language.Haskell.TH.Syntax (Lift (liftTyped))-import Type.Reflection- ( SomeTypeRep (SomeTypeRep),- TypeRep,- Typeable,- eqTypeRep,- someTypeRep,- typeRep,- withTypeable,- type (:~~:) (HRefl),- )-import Unsafe.Coerce (unsafeCoerce)---- $setup--- >>> import Grisette.Core--- >>> import Grisette.SymPrim---- | Monads that supports generating sbv fresh variables.-class (MonadIO m) => SBVFreshMonad m where- sbvFresh :: (SBV.SymVal a) => String -> m (SBV.SBV a)--instance (MonadIO m) => SBVFreshMonad (SBVT.SymbolicT m) where- sbvFresh = SBVT.free- {-# INLINE sbvFresh #-}--instance (MonadIO m) => SBVFreshMonad (SBVTC.QueryT m) where- sbvFresh = SBVTC.freshVar- {-# INLINE sbvFresh #-}--instance (SBVFreshMonad m) => SBVFreshMonad (ReaderT r m) where- sbvFresh = lift . sbvFresh- {-# INLINE sbvFresh #-}--instance (SBVFreshMonad m, Monoid w) => SBVFreshMonad (Lazy.WriterT w m) where- sbvFresh = lift . sbvFresh- {-# INLINE sbvFresh #-}--instance (SBVFreshMonad m, Monoid w) => SBVFreshMonad (Lazy.RWST r w s m) where- sbvFresh = lift . sbvFresh- {-# INLINE sbvFresh #-}--instance (SBVFreshMonad m) => SBVFreshMonad (Lazy.StateT s m) where- sbvFresh = lift . sbvFresh- {-# INLINE sbvFresh #-}--instance (SBVFreshMonad m, Monoid w) => SBVFreshMonad (Strict.WriterT w m) where- sbvFresh = lift . sbvFresh- {-# INLINE sbvFresh #-}--instance (SBVFreshMonad m, Monoid w) => SBVFreshMonad (Strict.RWST r w s m) where- sbvFresh = lift . sbvFresh- {-# INLINE sbvFresh #-}--instance (SBVFreshMonad m) => SBVFreshMonad (Strict.StateT s m) where- sbvFresh = lift . sbvFresh- {-# INLINE sbvFresh #-}---- | Error message for unsupported types.-translateTypeError :: (HasCallStack) => Maybe String -> TypeRep a -> b-translateTypeError Nothing ta =- error $- "Don't know how to translate the type " ++ show ta ++ " to SMT"-translateTypeError (Just reason) ta =- error $- "Don't know how to translate the type " ++ show ta ++ " to SMT: " <> reason---- | Type class for resolving the base type for the SBV type for the primitive--- type.-class (SupportedPrim a, Ord a) => NonFuncSBVRep a where- type NonFuncSBVBaseType a---- | Type class for resolving the constraint for a supported non-function--- primitive type.-type NonFuncPrimConstraint a =- ( SBV.SymVal (NonFuncSBVBaseType a),- SBV.EqSymbolic (SBVType a),- SBV.Mergeable (SBVType a),- SBV.SMTDefinable (SBVType a),- SBV.Mergeable (SBVType a),- SBVType a ~ SBV.SBV (NonFuncSBVBaseType a),- PrimConstraint a- )---- | Indicates that a type is supported, can be represented as a symbolic term,--- is not a function type, and can be lowered to an SBV term.-class (NonFuncSBVRep a) => SupportedNonFuncPrim a where- conNonFuncSBVTerm :: a -> SBV.SBV (NonFuncSBVBaseType a)- symNonFuncSBVTerm ::- (SBVFreshMonad m) => String -> m (SBV.SBV (NonFuncSBVBaseType a))- withNonFuncPrim :: ((NonFuncPrimConstraint a) => r) -> r---- | Partition the list of CVs for models for functions.-partitionCVArg ::- forall a.- (SupportedNonFuncPrim a) =>- [([SBVD.CV], SBVD.CV)] ->- [(a, [([SBVD.CV], SBVD.CV)])]-partitionCVArg cv =- partitionOrdCVArg $- parseFirstCVArg cv- where- parseFirstCVArg ::- forall a.- (SupportedNonFuncPrim a) =>- [([SBVD.CV], SBVD.CV)] ->- [(a, [([SBVD.CV], SBVD.CV)])]- parseFirstCVArg =- fmap- ( \case- (x : xs, v) ->- (parseSMTModelResult 0 ([], x), [(xs, v)])- _ -> error "impossible"- )- partitionOrdCVArg ::- forall a.- (SupportedNonFuncPrim a) =>- [(a, [([SBVD.CV], SBVD.CV)])] ->- [(a, [([SBVD.CV], SBVD.CV)])]- partitionOrdCVArg v = go sorted- where- sorted = sortWith fst v :: [(a, [([SBVD.CV], SBVD.CV)])]- go (x : x1 : xs) =- if fst x == fst x1- then go $ (fst x, snd x ++ snd x1) : xs- else x : go (x1 : xs)- go x = x---- | Parse the scalar model result.-parseScalarSMTModelResult ::- forall v r.- (SBV.SatModel r, Typeable v) =>- (r -> v) ->- ([([SBVD.CV], SBVD.CV)], SBVD.CV) ->- v-parseScalarSMTModelResult convert cvs@([], v) = case SBV.parseCVs [v] of- Just (x, _) -> convert x- Nothing -> parseSMTModelResultError (typeRep @v) cvs-parseScalarSMTModelResult _ cv = parseSMTModelResultError (typeRep @v) cv---- | Type class for resolving the SBV type for the primitive type.-class SBVRep t where- type SBVType t---- | Type class for resolving the constraint for a supported primitive type.-class SupportedPrimConstraint t where- type PrimConstraint t :: Constraint- type PrimConstraint _ = ()---- | Indicates that a type is supported, can be represented as a symbolic term,--- and can be lowered to an SBV term.-class- ( Lift t,- NFData t,- SupportedPrimConstraint t,- SBVRep t- ) =>- SupportedPrim t- where- primTypeRep :: TypeRep t- default primTypeRep :: (Typeable t) => TypeRep t- primTypeRep = typeRep- sameCon :: t -> t -> Bool- default sameCon :: (Eq t) => t -> t -> Bool- sameCon = (==)- hashConWithSalt :: Int -> t -> Int- default hashConWithSalt :: (Hashable t) => Int -> t -> Int- hashConWithSalt = hashWithSalt- pformatCon :: t -> String- default pformatCon :: (Show t) => t -> String- pformatCon = show- defaultValue :: t- pevalITETerm :: Term Bool -> Term t -> Term t -> Term t- pevalEqTerm :: Term t -> Term t -> Term Bool- pevalDistinctTerm :: NonEmpty (Term t) -> Term Bool- conSBVTerm :: t -> SBVType t- symSBVName :: TypedSymbol 'AnyKind t -> Int -> String- symSBVTerm :: (SBVFreshMonad m) => String -> m (SBVType t)- default withPrim ::- ( PrimConstraint t,- SBV.SMTDefinable (SBVType t),- SBV.Mergeable (SBVType t),- Typeable (SBVType t)- ) =>- ( ( PrimConstraint t,- SBV.SMTDefinable (SBVType t),- SBV.Mergeable (SBVType t),- Typeable (SBVType t)- ) =>- a- ) ->- a- withPrim ::- ( ( PrimConstraint t,- SBV.SMTDefinable (SBVType t),- SBV.Mergeable (SBVType t),- Typeable (SBVType t)- ) =>- a- ) ->- a- withPrim i = i- {-# INLINE withPrim #-}- sbvIte :: SBV.SBV Bool -> SBVType t -> SBVType t -> SBVType t- sbvIte = withPrim @t SBV.ite- sbvEq :: SBVType t -> SBVType t -> SBV.SBV Bool- default sbvEq ::- (SBVT.EqSymbolic (SBVType t)) => SBVType t -> SBVType t -> SBV.SBV Bool- sbvEq = (SBV..==)- sbvDistinct :: NonEmpty (SBVType t) -> SBV.SBV Bool- default sbvDistinct ::- (SBVT.EqSymbolic (SBVType t)) => NonEmpty (SBVType t) -> SBV.SBV Bool- sbvDistinct = SBV.distinct . toList- parseSMTModelResult :: Int -> ([([SBVD.CV], SBVD.CV)], SBVD.CV) -> t- castTypedSymbol ::- (IsSymbolKind knd') => TypedSymbol knd t -> Maybe (TypedSymbol knd' t)- funcDummyConstraint :: SBVType t -> SBV.SBV Bool---- | The default value in a dynamic t'ModelValue'.-defaultValueDynamic ::- forall t proxy. (SupportedPrim t) => proxy t -> ModelValue-defaultValueDynamic _ = toModelValue (defaultValue @t)---- | A value with its type information.-data ModelValue where- ModelValue :: forall v. (SupportedPrim v) => v -> ModelValue--instance NFData ModelValue where- rnf (ModelValue v) = rnf v--instance Lift ModelValue where- liftTyped (ModelValue v) = [||ModelValue v||]--instance Show ModelValue where- show (ModelValue (v :: v)) = pformatCon v ++ " :: " ++ show (primTypeRep @v)--instance Eq ModelValue where- (ModelValue (v1 :: v1)) == (ModelValue (v2 :: v2)) =- case eqTypeRep (primTypeRep @v1) (primTypeRep @v2) of- Just HRefl -> sameCon v1 v2- _ -> False--instance Hashable ModelValue where- s `hashWithSalt` (ModelValue (v :: v)) =- (s `hashWithSalt` (primTypeRep @v)) `hashConWithSalt` v---- | Convert from a model value. Crashes if the types does not match.-unsafeFromModelValue :: forall a. (Typeable a) => ModelValue -> a-unsafeFromModelValue (ModelValue (v :: v)) =- case eqTypeRep (primTypeRep @v) (typeRep @a) of- Just HRefl -> v- _ ->- error $- "Bad model value type, expected type: "- ++ show (typeRep @a)- ++ ", but got: "- ++ show (primTypeRep @v)---- | Convert to a model value.-toModelValue :: forall a. (SupportedPrim a) => a -> ModelValue-toModelValue = ModelValue---- | Cast a typed symbol to a different kind. Check if the kind is compatible.-castSomeTypedSymbol ::- (IsSymbolKind knd') => SomeTypedSymbol knd -> Maybe (SomeTypedSymbol knd')-castSomeTypedSymbol (SomeTypedSymbol s@TypedSymbol {}) =- SomeTypedSymbol <$> castTypedSymbol s-{-# INLINE castSomeTypedSymbol #-}---- | Error message for failure to parse the SBV model result.-parseSMTModelResultError ::- (HasCallStack) => TypeRep a -> ([([SBVD.CV], SBVD.CV)], SBVD.CV) -> a-parseSMTModelResultError ty cv =- error $- "BUG: cannot parse SBV model value \""- <> show cv- <> "\" to Grisette model value with the type "- <> show ty---- | Partial evaluation for inequality terms.-pevalNEqTerm :: (SupportedPrim a) => Term a -> Term a -> Term Bool-pevalNEqTerm l r = pevalNotTerm $ pevalEqTerm l r-{-# INLINE pevalNEqTerm #-}---- | Type family to resolve the concrete type associated with a symbolic type.-class ConRep sym where- type ConType sym---- | Type family to resolve the symbolic type associated with a concrete type.-class (SupportedPrim con) => SymRep con where- type SymType con---- | One-to-one mapping between symbolic types and concrete types.-class- (ConRep sym, SymRep con, sym ~ SymType con, con ~ ConType sym) =>- LinkedRep con sym- | con -> sym,- sym -> con- where- underlyingTerm :: sym -> Term con- wrapTerm :: Term con -> sym---- | Partial evaluation and lowering for function application terms.-class PEvalApplyTerm f a b | f -> a b where- pevalApplyTerm :: Term f -> Term a -> Term b- sbvApplyTerm :: SBVType f -> SBVType a -> SBVType b---- | Partial evaluation and lowering for bitwise operation terms.-class PEvalBitwiseTerm t where- pevalAndBitsTerm :: Term t -> Term t -> Term t- pevalOrBitsTerm :: Term t -> Term t -> Term t- pevalXorBitsTerm :: Term t -> Term t -> Term t- pevalComplementBitsTerm :: Term t -> Term t- withSbvBitwiseTermConstraint :: (((Bits (SBVType t)) => r)) -> r- sbvAndBitsTerm :: SBVType t -> SBVType t -> SBVType t- sbvAndBitsTerm = withSbvBitwiseTermConstraint @t (SBV..&.)- sbvOrBitsTerm :: SBVType t -> SBVType t -> SBVType t- sbvOrBitsTerm = withSbvBitwiseTermConstraint @t (SBV..|.)- sbvXorBitsTerm :: SBVType t -> SBVType t -> SBVType t- sbvXorBitsTerm = withSbvBitwiseTermConstraint @t SBV.xor- sbvComplementBitsTerm :: SBVType t -> SBVType t- sbvComplementBitsTerm = withSbvBitwiseTermConstraint @t SBV.complement---- | Partial evaluation and lowering for symbolic shifting terms.-class PEvalShiftTerm t where- pevalShiftLeftTerm :: Term t -> Term t -> Term t- pevalShiftRightTerm :: Term t -> Term t -> Term t- withSbvShiftTermConstraint ::- (((SBV.SIntegral (NonFuncSBVBaseType t)) => r)) -> r- sbvShiftLeftTerm :: SBVType t -> SBVType t -> SBVType t- default sbvShiftLeftTerm ::- (SupportedNonFuncPrim t) => SBVType t -> SBVType t -> SBVType t- sbvShiftLeftTerm l r =- withNonFuncPrim @t $ withSbvShiftTermConstraint @t $ SBV.sShiftLeft l r- default sbvShiftRightTerm ::- (SupportedNonFuncPrim t) => SBVType t -> SBVType t -> SBVType t- sbvShiftRightTerm :: SBVType t -> SBVType t -> SBVType t- sbvShiftRightTerm l r =- withNonFuncPrim @t $ withSbvShiftTermConstraint @t $ SBV.sShiftRight l r---- | Partial evaluation and lowering for symbolic rotate terms.-class PEvalRotateTerm t where- pevalRotateLeftTerm :: Term t -> Term t -> Term t- pevalRotateRightTerm :: Term t -> Term t -> Term t- withSbvRotateTermConstraint ::- (((SBV.SIntegral (NonFuncSBVBaseType t)) => r)) -> r- sbvRotateLeftTerm :: SBVType t -> SBVType t -> SBVType t- default sbvRotateLeftTerm ::- (SupportedNonFuncPrim t) => SBVType t -> SBVType t -> SBVType t- sbvRotateLeftTerm l r =- withNonFuncPrim @t $ withSbvRotateTermConstraint @t $ SBV.sRotateLeft l r- sbvRotateRightTerm :: SBVType t -> SBVType t -> SBVType t- default sbvRotateRightTerm ::- (SupportedNonFuncPrim t) => SBVType t -> SBVType t -> SBVType t- sbvRotateRightTerm l r =- withNonFuncPrim @t $ withSbvRotateTermConstraint @t $ SBV.sRotateRight l r---- | Partial evaluation and lowering for number terms.-class (Num t) => PEvalNumTerm t where- pevalAddNumTerm :: Term t -> Term t -> Term t- pevalNegNumTerm :: Term t -> Term t- pevalMulNumTerm :: Term t -> Term t -> Term t- pevalAbsNumTerm :: Term t -> Term t- pevalSignumNumTerm :: Term t -> Term t- withSbvNumTermConstraint :: (((Num (SBVType t)) => r)) -> r- sbvAddNumTerm ::- SBVType t ->- SBVType t ->- SBVType t- sbvAddNumTerm l r = withSbvNumTermConstraint @t $ l + r- sbvNegNumTerm ::- SBVType t ->- SBVType t- sbvNegNumTerm l = withSbvNumTermConstraint @t $ -l- sbvMulNumTerm ::- SBVType t ->- SBVType t ->- SBVType t- sbvMulNumTerm l r = withSbvNumTermConstraint @t $ l * r- sbvAbsNumTerm ::- SBVType t ->- SBVType t- sbvAbsNumTerm l = withSbvNumTermConstraint @t $ abs l- sbvSignumNumTerm ::- SBVType t ->- SBVType t- sbvSignumNumTerm l = withSbvNumTermConstraint @t $ signum l---- | Partial evaluation for subtraction terms.-pevalSubNumTerm :: (PEvalNumTerm a) => Term a -> Term a -> Term a-pevalSubNumTerm l r = pevalAddNumTerm l (pevalNegNumTerm r)---- | Partial evaluation and lowering for comparison terms.-class PEvalOrdTerm t where- pevalLtOrdTerm :: Term t -> Term t -> Term Bool- pevalLeOrdTerm :: Term t -> Term t -> Term Bool- withSbvOrdTermConstraint :: (((SBV.OrdSymbolic (SBVType t)) => r)) -> r- sbvLtOrdTerm ::- SBVType t ->- SBVType t ->- SBV.SBV Bool- sbvLtOrdTerm l r = withSbvOrdTermConstraint @t $ l SBV..< r- sbvLeOrdTerm :: SBVType t -> SBVType t -> SBV.SBV Bool- sbvLeOrdTerm l r = withSbvOrdTermConstraint @t $ l SBV..<= r---- | Partial evaluation for greater than terms.-pevalGtOrdTerm :: (PEvalOrdTerm a) => Term a -> Term a -> Term Bool-pevalGtOrdTerm = flip pevalLtOrdTerm-{-# INLINE pevalGtOrdTerm #-}---- | Partial evaluation for greater than or equal to terms.-pevalGeOrdTerm :: (PEvalOrdTerm a) => Term a -> Term a -> Term Bool-pevalGeOrdTerm = flip pevalLeOrdTerm-{-# INLINE pevalGeOrdTerm #-}---- | Partial evaluation and lowering for integer division and modulo terms.-class PEvalDivModIntegralTerm t where- pevalDivIntegralTerm :: Term t -> Term t -> Term t- pevalModIntegralTerm :: Term t -> Term t -> Term t- pevalQuotIntegralTerm :: Term t -> Term t -> Term t- pevalRemIntegralTerm :: Term t -> Term t -> Term t- withSbvDivModIntegralTermConstraint ::- (((SBV.SDivisible (SBVType t)) => r)) -> r- sbvDivIntegralTerm :: SBVType t -> SBVType t -> SBVType t- sbvDivIntegralTerm l r =- withSbvDivModIntegralTermConstraint @t $ l `SBV.sDiv` r- sbvModIntegralTerm :: SBVType t -> SBVType t -> SBVType t- sbvModIntegralTerm l r =- withSbvDivModIntegralTermConstraint @t $ l `SBV.sMod` r- sbvQuotIntegralTerm :: SBVType t -> SBVType t -> SBVType t- sbvQuotIntegralTerm l r =- withSbvDivModIntegralTermConstraint @t $ l `SBV.sQuot` r- sbvRemIntegralTerm :: SBVType t -> SBVType t -> SBVType t- sbvRemIntegralTerm l r =- withSbvDivModIntegralTermConstraint @t $ l `SBV.sRem` r---- | Partial evaluation and lowering for bitcast terms.-class (BitCast a b) => PEvalBitCastTerm a b where- pevalBitCastTerm :: Term a -> Term b- sbvBitCast :: SBVType a -> SBVType b---- | Partial evaluation and lowering for bitcast or default value terms.-class- (BitCastOr a b) =>- PEvalBitCastOrTerm a b- where- pevalBitCastOrTerm :: Term b -> Term a -> Term b- sbvBitCastOr :: SBVType b -> SBVType a -> SBVType b---- | Partial evaluation and lowering for bit-vector terms.-class (SizedBV bv) => PEvalBVTerm bv where- pevalBVConcatTerm ::- (KnownNat l, KnownNat r, 1 <= l, 1 <= r) =>- Term (bv l) ->- Term (bv r) ->- Term (bv (l + r))- pevalBVExtendTerm ::- (KnownNat l, KnownNat r, 1 <= l, 1 <= r, l <= r) =>- Bool ->- proxy r ->- Term (bv l) ->- Term (bv r)- pevalBVSelectTerm ::- (KnownNat n, KnownNat ix, KnownNat w, 1 <= n, 1 <= w, ix + w <= n) =>- p ix ->- q w ->- Term (bv n) ->- Term (bv w)- sbvBVConcatTerm ::- (KnownNat l, KnownNat r, 1 <= l, 1 <= r) =>- p1 l ->- p2 r ->- SBVType (bv l) ->- SBVType (bv r) ->- SBVType (bv (l + r))- sbvBVExtendTerm ::- (KnownNat l, KnownNat r, 1 <= l, 1 <= r, l <= r) =>- p1 l ->- p2 r ->- Bool ->- SBVType (bv l) ->- SBVType (bv r)- sbvBVSelectTerm ::- ( KnownNat ix,- KnownNat w,- KnownNat n,- 1 <= n,- 1 <= w,- ix + w <= n- ) =>- p1 ix ->- p2 w ->- p3 n ->- SBVType (bv n) ->- SBVType (bv w)---- | Partial evaluation and lowering for fractional terms.-class (Fractional t) => PEvalFractionalTerm t where- pevalFdivTerm :: Term t -> Term t -> Term t- pevalRecipTerm :: Term t -> Term t- withSbvFractionalTermConstraint ::- (((Fractional (SBVType t)) => r)) ->- r- sbvFdivTerm ::- SBVType t ->- SBVType t ->- SBVType t- sbvFdivTerm l r = withSbvFractionalTermConstraint @t $ l / r- sbvRecipTerm ::- SBVType t ->- SBVType t- sbvRecipTerm l = withSbvFractionalTermConstraint @t $ recip l---- | Unary floating point operations.-data FloatingUnaryOp- = FloatingExp- | FloatingLog- | FloatingSqrt- | FloatingSin- | FloatingCos- | FloatingTan- | FloatingAsin- | FloatingAcos- | FloatingAtan- | FloatingSinh- | FloatingCosh- | FloatingTanh- | FloatingAsinh- | FloatingAcosh- | FloatingAtanh- deriving (Eq, Ord, Generic, Hashable, Lift, NFData, Serial)--instance Cereal.Serialize FloatingUnaryOp where- put = serialize- get = deserialize--instance Binary.Binary FloatingUnaryOp where- put = serialize- get = deserialize--instance Show FloatingUnaryOp where- show FloatingExp = "exp"- show FloatingLog = "log"- show FloatingSqrt = "sqrt"- show FloatingSin = "sin"- show FloatingCos = "cos"- show FloatingTan = "tan"- show FloatingAsin = "asin"- show FloatingAcos = "acos"- show FloatingAtan = "atan"- show FloatingSinh = "sinh"- show FloatingCosh = "cosh"- show FloatingTanh = "tanh"- show FloatingAsinh = "asinh"- show FloatingAcosh = "acosh"- show FloatingAtanh = "atanh"---- | Partial evaluation and lowering for floating point terms.-class PEvalFloatingTerm t where- pevalFloatingUnaryTerm :: FloatingUnaryOp -> Term t -> Term t- pevalPowerTerm :: Term t -> Term t -> Term t- withSbvFloatingTermConstraint ::- (((Floating (SBVType t)) => r)) ->- r- sbvPowerTerm ::- SBVType t ->- SBVType t ->- SBVType t- sbvPowerTerm = withSbvFloatingTermConstraint @t (**)- sbvFloatingUnaryTerm ::- FloatingUnaryOp ->- SBVType t ->- SBVType t- sbvFloatingUnaryTerm op l =- withSbvFloatingTermConstraint @t $- case op of- FloatingExp -> exp l- FloatingLog -> log l- FloatingSqrt -> sqrt l- FloatingSin -> sin l- FloatingCos -> cos l- FloatingTan -> tan l- FloatingAsin -> asin l- FloatingAcos -> acos l- FloatingAtan -> atan l- FloatingSinh -> sinh l- FloatingCosh -> cosh l- FloatingTanh -> tanh l- FloatingAsinh -> asinh l- FloatingAcosh -> acosh l- FloatingAtanh -> atanh l---- | Partial evaluation and lowering for integral terms.-class (Integral a, Num b) => PEvalFromIntegralTerm a b where- pevalFromIntegralTerm :: Term a -> Term b- sbvFromIntegralTerm :: SBVType a -> SBVType b---- | Partial evaluation and lowering for converting from and to IEEE floating--- point terms.-class PEvalIEEEFPConvertibleTerm a where- pevalFromFPOrTerm ::- (ValidFP eb sb) =>- Term a ->- Term FPRoundingMode ->- Term (FP eb sb) ->- Term a- pevalToFPTerm ::- (ValidFP eb sb) => Term FPRoundingMode -> Term a -> Term (FP eb sb)- sbvFromFPOrTerm ::- (ValidFP eb sb) =>- SBVType a ->- SBVType FPRoundingMode ->- SBVType (FP eb sb) ->- SBVType a- sbvToFPTerm ::- (ValidFP eb sb) =>- SBVType FPRoundingMode ->- SBVType a ->- SBVType (FP eb sb)---- Typed Symbols---- | The kind of a symbol.------ All symbols are 'AnyKind', and all symbols other than general/tabular--- functions are 'ConstantKind'.-data SymbolKind = ConstantKind | AnyKind---- | Decision procedure for symbol kinds.-class IsSymbolKind (ty :: SymbolKind) where- type SymbolKindConstraint ty :: Type -> Constraint- decideSymbolKind :: Either (ty :~~: 'ConstantKind) (ty :~~: 'AnyKind)--instance IsSymbolKind 'ConstantKind where- type SymbolKindConstraint 'ConstantKind = SupportedNonFuncPrim- decideSymbolKind = Left HRefl--instance IsSymbolKind 'AnyKind where- type SymbolKindConstraint 'AnyKind = SupportedPrim- decideSymbolKind = Right HRefl---- | A typed symbol is a symbol that is associated with a type. Note that the--- same symbol bodies with different types are considered different symbols--- and can coexist in a term.------ Simple symbols can be created with the @OverloadedStrings@ extension:------ >>> "a" :: TypedSymbol 'AnyKind Bool--- a :: Bool-data TypedSymbol (knd :: SymbolKind) t where- TypedSymbol ::- ( SupportedPrim t,- SymbolKindConstraint knd t,- IsSymbolKind knd- ) =>- {unTypedSymbol :: Symbol} ->- TypedSymbol knd t---- | Create a typed symbol with constant kinds.-typedConstantSymbol ::- forall t. (SupportedNonFuncPrim t) => Symbol -> TypedSymbol 'ConstantKind t-typedConstantSymbol = typedConstantSymbol' getPhantomNonFuncDict-{-# INLINE typedConstantSymbol #-}--{-# NOINLINE typedConstantSymbol' #-}-typedConstantSymbol' ::- forall t. PhantomNonFuncDict t -> Symbol -> TypedSymbol 'ConstantKind t-typedConstantSymbol' PhantomNonFuncDict symbol = TypedSymbol symbol---- | Create a typed symbol with any kinds.-typedAnySymbol ::- forall t. (SupportedPrim t) => Symbol -> TypedSymbol 'AnyKind t-typedAnySymbol = typedAnySymbol' getPhantomDict-{-# INLINE typedAnySymbol #-}--{-# NOINLINE typedAnySymbol' #-}-typedAnySymbol' ::- forall t. PhantomDict t -> Symbol -> TypedSymbol 'AnyKind t-typedAnySymbol' PhantomDict symbol = TypedSymbol symbol---- | Constant symbol-type TypedConstantSymbol = TypedSymbol 'ConstantKind---- | Any symbol-type TypedAnySymbol = TypedSymbol 'AnyKind--instance Eq (TypedSymbol knd t) where- TypedSymbol x == TypedSymbol y = x == y--instance Ord (TypedSymbol knd t) where- TypedSymbol x <= TypedSymbol y = x <= y--instance Lift (TypedSymbol knd t) where- liftTyped (TypedSymbol x) = [||TypedSymbol x||]--instance Show (TypedSymbol knd t) where- show (TypedSymbol symbol) = show symbol ++ " :: " ++ show (primTypeRep @t)---- | Show a typed symbol without the type information.-showUntyped :: TypedSymbol knd t -> String-showUntyped (TypedSymbol symbol) = show symbol--instance Hashable (TypedSymbol knd t) where- s `hashWithSalt` TypedSymbol x = s `hashWithSalt` x--instance NFData (TypedSymbol knd t) where- rnf (TypedSymbol str) = rnf str--instance- ( SupportedPrim t,- SymbolKindConstraint knd t,- IsSymbolKind knd- ) =>- IsString (TypedSymbol knd t)- where- fromString = TypedSymbol . fromString---- | Introduce the 'SupportedPrim' constraint from the t'TypedSymbol'.-withSymbolSupported ::- forall knd t a.- TypedSymbol knd t ->- ((SupportedPrim t, Typeable t) => a) ->- a-withSymbolSupported (TypedSymbol _) a =- withSupportedPrimTypeable @t $ a-{-# INLINE withSymbolSupported #-}---- | Introduce the 'SupportedPrim' constraint from the t'TypedSymbol'.-withConstantSymbolSupported ::- forall t a.- TypedSymbol 'ConstantKind t ->- ((SupportedNonFuncPrim t, Typeable t) => a) ->- a-withConstantSymbolSupported (TypedSymbol _) a =- withSupportedPrimTypeable @t $ a-{-# INLINE withConstantSymbolSupported #-}---- | Introduce the 'IsSymbolKind' constraint from the t'TypedSymbol'.-withSymbolKind :: TypedSymbol knd t -> ((IsSymbolKind knd) => a) -> a-withSymbolKind (TypedSymbol _) a = a-{-# INLINE withSymbolKind #-}---- | A non-indexed symbol. Type information are checked at runtime.-data SomeTypedSymbol knd where- SomeTypedSymbol ::- forall knd t.- TypedSymbol knd t ->- SomeTypedSymbol knd---- | Non-indexed constant symbol-type SomeTypedConstantSymbol = SomeTypedSymbol 'ConstantKind---- | Non-indexed any symbol-type SomeTypedAnySymbol = SomeTypedSymbol 'AnyKind--instance NFData (SomeTypedSymbol knd) where- rnf (SomeTypedSymbol s) = rnf s- {-# INLINE rnf #-}--instance Lift (SomeTypedSymbol knd) where- liftTyped (SomeTypedSymbol s) = [||SomeTypedSymbol s||]--instance Eq (SomeTypedSymbol knd) where- (SomeTypedSymbol (s1 :: TypedSymbol knd a))- == (SomeTypedSymbol (s2 :: TypedSymbol knd b)) =- withSymbolSupported s1 $- withSymbolSupported s2 $- case eqTypeRep (primTypeRep @a) (primTypeRep @b) of- Just HRefl -> s1 == s2- _ -> False- {-# INLINE (==) #-}--instance Ord (SomeTypedSymbol knd) where- (SomeTypedSymbol (s1 :: TypedSymbol knd a))- <= (SomeTypedSymbol (s2 :: TypedSymbol knd b)) =- withSymbolSupported s1 $- withSymbolSupported s2 $- let t1 = primTypeRep @a- t2 = primTypeRep @b- in SomeTypeRep t1 < SomeTypeRep t2- || ( case eqTypeRep t1 t2 of- Just HRefl -> s1 <= s2- _ -> False- )--instance Hashable (SomeTypedSymbol knd) where- hashWithSalt s (SomeTypedSymbol s1) = s `hashWithSalt` s1- {-# INLINE hashWithSalt #-}--instance Show (SomeTypedSymbol knd) where- show (SomeTypedSymbol s) = show s---- | Construct a t'SomeTypedSymbol' from a t'TypedSymbol'.-someTypedSymbol :: forall knd t. TypedSymbol knd t -> SomeTypedSymbol knd-someTypedSymbol s@(TypedSymbol _) = SomeTypedSymbol s-{-# INLINE someTypedSymbol #-}---- Terms---- | Traits for IEEE floating point numbers.-data FPTrait- = FPIsNaN- | FPIsPositive- | FPIsNegative- | FPIsPositiveInfinite- | FPIsNegativeInfinite- | FPIsInfinite- | FPIsPositiveZero- | FPIsNegativeZero- | FPIsZero- | FPIsNormal- | FPIsSubnormal- | FPIsPoint- deriving (Eq, Ord, Generic, Hashable, Lift, NFData, Serial)--instance Cereal.Serialize FPTrait where- put = serialize- get = deserialize--instance Binary.Binary FPTrait where- put = serialize- get = deserialize--instance Show FPTrait where- show FPIsNaN = "is_nan"- show FPIsPositive = "is_pos"- show FPIsNegative = "is_neg"- show FPIsPositiveInfinite = "is_pos_inf"- show FPIsNegativeInfinite = "is_neg_inf"- show FPIsInfinite = "is_inf"- show FPIsPositiveZero = "is_pos_zero"- show FPIsNegativeZero = "is_neg_zero"- show FPIsZero = "is_zero"- show FPIsNormal = "is_normal"- show FPIsSubnormal = "is_subnormal"- show FPIsPoint = "is_point"---- | Unary floating point operations.-data FPUnaryOp = FPAbs | FPNeg- deriving (Eq, Ord, Generic, Hashable, Lift, NFData, Serial)--instance Cereal.Serialize FPUnaryOp where- put = serialize- get = deserialize--instance Binary.Binary FPUnaryOp where- put = serialize- get = deserialize--instance Show FPUnaryOp where- show FPAbs = "fp.abs"- show FPNeg = "fp.neg"---- | Binary floating point operations.-data FPBinaryOp- = FPRem- | FPMinimum- | FPMinimumNumber- | FPMaximum- | FPMaximumNumber- deriving (Eq, Ord, Generic, Hashable, Lift, NFData, Serial)--instance Cereal.Serialize FPBinaryOp where- put = serialize- get = deserialize--instance Binary.Binary FPBinaryOp where- put = serialize- get = deserialize--instance Show FPBinaryOp where- show FPRem = "fp.rem"- show FPMinimum = "fp.minimum"- show FPMinimumNumber = "fp.minimumNumber"- show FPMaximum = "fp.maximum"- show FPMaximumNumber = "fp.maximumNumber"---- | Unary floating point operations with rounding modes.-data FPRoundingUnaryOp = FPSqrt | FPRoundToIntegral- deriving (Eq, Ord, Generic, Hashable, Lift, NFData, Serial)--instance Cereal.Serialize FPRoundingUnaryOp where- put = serialize- get = deserialize--instance Binary.Binary FPRoundingUnaryOp where- put = serialize- get = deserialize--instance Show FPRoundingUnaryOp where- show FPSqrt = "fp.sqrt"- show FPRoundToIntegral = "fp.roundToIntegral"---- | Binary floating point operations with rounding modes.-data FPRoundingBinaryOp = FPAdd | FPSub | FPMul | FPDiv- deriving (Eq, Ord, Generic, Hashable, Lift, NFData, Serial)--instance Cereal.Serialize FPRoundingBinaryOp where- put = serialize- get = deserialize--instance Binary.Binary FPRoundingBinaryOp where- put = serialize- get = deserialize--instance Show FPRoundingBinaryOp where- show FPAdd = "fp.add"- show FPSub = "fp.sub"- show FPMul = "fp.mul"- show FPDiv = "fp.div"---- | Internal representation for Grisette symbolic terms.-data Term t where- ConTerm ::- (SupportedPrim t) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !t ->- Term t- SymTerm ::- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(TypedSymbol 'AnyKind t) ->- Term t- ForallTerm ::- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(TypedSymbol 'ConstantKind t) ->- !(Term Bool) ->- Term Bool- ExistsTerm ::- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(TypedSymbol 'ConstantKind t) ->- !(Term Bool) ->- Term Bool- NotTerm ::- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term Bool) ->- Term Bool- OrTerm ::- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term Bool) ->- !(Term Bool) ->- Term Bool- AndTerm ::- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term Bool) ->- !(Term Bool) ->- Term Bool- EqTerm ::- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term t) ->- !(Term t) ->- Term Bool- DistinctTerm ::- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(NonEmpty (Term t)) ->- Term Bool- ITETerm ::- (SupportedPrim t) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term Bool) ->- !(Term t) ->- !(Term t) ->- Term t- AddNumTerm ::- (SupportedPrim t, PEvalNumTerm t) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term t) ->- !(Term t) ->- Term t- NegNumTerm ::- (SupportedPrim t, PEvalNumTerm t) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term t) ->- Term t- MulNumTerm ::- (SupportedPrim t, PEvalNumTerm t) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term t) ->- !(Term t) ->- Term t- AbsNumTerm ::- (SupportedPrim t, PEvalNumTerm t) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term t) ->- Term t- SignumNumTerm ::- (SupportedPrim t, PEvalNumTerm t) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term t) ->- Term t- LtOrdTerm ::- (SupportedPrim t, PEvalOrdTerm t) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term t) ->- !(Term t) ->- Term Bool- LeOrdTerm ::- (SupportedPrim t, PEvalOrdTerm t) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term t) ->- !(Term t) ->- Term Bool- AndBitsTerm ::- (SupportedPrim t, PEvalBitwiseTerm t) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term t) ->- !(Term t) ->- Term t- OrBitsTerm ::- (SupportedPrim t, PEvalBitwiseTerm t) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term t) ->- !(Term t) ->- Term t- XorBitsTerm ::- (SupportedPrim t, PEvalBitwiseTerm t) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term t) ->- !(Term t) ->- Term t- ComplementBitsTerm ::- (SupportedPrim t, PEvalBitwiseTerm t) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term t) ->- Term t- ShiftLeftTerm ::- (SupportedPrim t, PEvalShiftTerm t) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term t) ->- !(Term t) ->- Term t- ShiftRightTerm ::- (SupportedPrim t, PEvalShiftTerm t) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term t) ->- !(Term t) ->- Term t- RotateLeftTerm ::- (SupportedPrim t, PEvalRotateTerm t) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term t) ->- !(Term t) ->- Term t- RotateRightTerm ::- (SupportedPrim t, PEvalRotateTerm t) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term t) ->- !(Term t) ->- Term t- BitCastTerm ::- (SupportedPrim b, PEvalBitCastTerm a b) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term a) ->- Term b- BitCastOrTerm ::- (SupportedPrim b, PEvalBitCastOrTerm a b) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term b) ->- !(Term a) ->- Term b- BVConcatTerm ::- ( PEvalBVTerm bv,- KnownNat l,- KnownNat r,- KnownNat (l + r),- 1 <= l,- 1 <= r,- 1 <= l + r,- SupportedPrim (bv (l + r))- ) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term (bv l)) ->- !(Term (bv r)) ->- Term (bv (l + r))- BVSelectTerm ::- ( PEvalBVTerm bv,- KnownNat n,- KnownNat ix,- KnownNat w,- 1 <= n,- 1 <= w,- ix + w <= n,- SupportedPrim (bv w)- ) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Proxy ix) ->- !(Proxy w) ->- !(Term (bv n)) ->- Term (bv w)- BVExtendTerm ::- ( PEvalBVTerm bv,- KnownNat l,- KnownNat r,- 1 <= l,- 1 <= r,- l <= r,- SupportedPrim (bv r)- ) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !Bool ->- !(Proxy r) ->- !(Term (bv l)) ->- Term (bv r)- ApplyTerm ::- (PEvalApplyTerm f a b, SupportedPrim b) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term f) ->- !(Term a) ->- Term b- DivIntegralTerm ::- (SupportedPrim t, PEvalDivModIntegralTerm t) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term t) ->- !(Term t) ->- Term t- ModIntegralTerm ::- (SupportedPrim t, PEvalDivModIntegralTerm t) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term t) ->- !(Term t) ->- Term t- QuotIntegralTerm ::- (SupportedPrim t, PEvalDivModIntegralTerm t) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term t) ->- !(Term t) ->- Term t- RemIntegralTerm ::- (SupportedPrim t, PEvalDivModIntegralTerm t) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term t) ->- !(Term t) ->- Term t- FPTraitTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !FPTrait ->- !(Term (FP eb sb)) ->- Term Bool- FdivTerm ::- (SupportedPrim t, PEvalFractionalTerm t) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term t) ->- !(Term t) ->- Term t- RecipTerm ::- (SupportedPrim t, PEvalFractionalTerm t) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term t) ->- Term t- FloatingUnaryTerm ::- (SupportedPrim t, PEvalFloatingTerm t) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !FloatingUnaryOp ->- !(Term t) ->- Term t- PowerTerm ::- (SupportedPrim t, PEvalFloatingTerm t) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term t) ->- !(Term t) ->- Term t- FPUnaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !FPUnaryOp ->- !(Term (FP eb sb)) ->- Term (FP eb sb)- FPBinaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !FPBinaryOp ->- !(Term (FP eb sb)) ->- !(Term (FP eb sb)) ->- Term (FP eb sb)- FPRoundingUnaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !FPRoundingUnaryOp ->- !(Term FPRoundingMode) ->- !(Term (FP eb sb)) ->- Term (FP eb sb)- FPRoundingBinaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !FPRoundingBinaryOp ->- !(Term FPRoundingMode) ->- !(Term (FP eb sb)) ->- !(Term (FP eb sb)) ->- Term (FP eb sb)- FPFMATerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term FPRoundingMode) ->- !(Term (FP eb sb)) ->- !(Term (FP eb sb)) ->- !(Term (FP eb sb)) ->- Term (FP eb sb)- FromIntegralTerm ::- (PEvalFromIntegralTerm a b, SupportedPrim b) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term a) ->- Term b- FromFPOrTerm ::- ( PEvalIEEEFPConvertibleTerm a,- ValidFP eb sb,- SupportedPrim a- ) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term a) ->- !(Term FPRoundingMode) ->- !(Term (FP eb sb)) ->- Term a- ToFPTerm ::- ( PEvalIEEEFPConvertibleTerm a,- ValidFP eb sb,- SupportedPrim (FP eb sb)- ) =>- WeakThreadId ->- {-# UNPACK #-} !Digest ->- Id ->- Ident ->- !(Term FPRoundingMode) ->- !(Term a) ->- Proxy eb ->- Proxy sb ->- Term (FP eb sb)---- | Pattern for term with dynamic typing.-pattern DynTerm :: forall a b. (SupportedPrim a) => Term a -> Term b-pattern DynTerm x <-- ( ( \v ->- introSupportedPrimConstraint v $- withSupportedPrimTypeable @a $- cast v- ) ->- Just x- )---- | The identity of the term.-termIdent :: Term t -> Ident-termIdent (ConTerm _ _ _ i _) = i-termIdent (SymTerm _ _ _ i _) = i-termIdent (ForallTerm _ _ _ i _ _) = i-termIdent (ExistsTerm _ _ _ i _ _) = i-termIdent (NotTerm _ _ _ i _) = i-termIdent (OrTerm _ _ _ i _ _) = i-termIdent (AndTerm _ _ _ i _ _) = i-termIdent (EqTerm _ _ _ i _ _) = i-termIdent (DistinctTerm _ _ _ i _) = i-termIdent (ITETerm _ _ _ i _ _ _) = i-termIdent (AddNumTerm _ _ _ i _ _) = i-termIdent (NegNumTerm _ _ _ i _) = i-termIdent (MulNumTerm _ _ _ i _ _) = i-termIdent (AbsNumTerm _ _ _ i _) = i-termIdent (SignumNumTerm _ _ _ i _) = i-termIdent (LtOrdTerm _ _ _ i _ _) = i-termIdent (LeOrdTerm _ _ _ i _ _) = i-termIdent (AndBitsTerm _ _ _ i _ _) = i-termIdent (OrBitsTerm _ _ _ i _ _) = i-termIdent (XorBitsTerm _ _ _ i _ _) = i-termIdent (ComplementBitsTerm _ _ _ i _) = i-termIdent (ShiftLeftTerm _ _ _ i _ _) = i-termIdent (ShiftRightTerm _ _ _ i _ _) = i-termIdent (RotateLeftTerm _ _ _ i _ _) = i-termIdent (RotateRightTerm _ _ _ i _ _) = i-termIdent (BitCastTerm _ _ _ i _) = i-termIdent (BitCastOrTerm _ _ _ i _ _) = i-termIdent (BVConcatTerm _ _ _ i _ _) = i-termIdent (BVSelectTerm _ _ _ i _ _ _) = i-termIdent (BVExtendTerm _ _ _ i _ _ _) = i-termIdent (ApplyTerm _ _ _ i _ _) = i-termIdent (DivIntegralTerm _ _ _ i _ _) = i-termIdent (ModIntegralTerm _ _ _ i _ _) = i-termIdent (QuotIntegralTerm _ _ _ i _ _) = i-termIdent (RemIntegralTerm _ _ _ i _ _) = i-termIdent (FPTraitTerm _ _ _ i _ _) = i-termIdent (FdivTerm _ _ _ i _ _) = i-termIdent (RecipTerm _ _ _ i _) = i-termIdent (FloatingUnaryTerm _ _ _ i _ _) = i-termIdent (PowerTerm _ _ _ i _ _) = i-termIdent (FPUnaryTerm _ _ _ i _ _) = i-termIdent (FPBinaryTerm _ _ _ i _ _ _) = i-termIdent (FPRoundingUnaryTerm _ _ _ i _ _ _) = i-termIdent (FPRoundingBinaryTerm _ _ _ i _ _ _ _) = i-termIdent (FPFMATerm _ _ _ i _ _ _ _) = i-termIdent (FromIntegralTerm _ _ _ i _) = i-termIdent (FromFPOrTerm _ _ _ i _ _ _) = i-termIdent (ToFPTerm _ _ _ i _ _ _ _) = i-{-# INLINE termIdent #-}---- | Return the ID of a term.-termId :: Term t -> Id-termId t = case hashId t of- HashId _ i -> i-{-# INLINE termId #-}--baseHash :: Term t -> Digest-baseHash t = case hashId t of- HashId h _ -> h-{-# INLINE baseHash #-}--data HashId = HashId {-# UNPACK #-} !Digest Id deriving (Show)--instance Eq HashId where- HashId _ l == HashId _ r = l == r- {-# INLINE (==) #-}--instance Hashable HashId where- hashWithSalt s (HashId i _) = hashWithSalt s i- {-# INLINE hashWithSalt #-}--eqHashId :: HashId -> HashId -> Bool-eqHashId = (==)-{-# INLINE eqHashId #-}--data TypeHashId = TypeHashId {-# UNPACK #-} !Fingerprint {-# UNPACK #-} !HashId- deriving (Show)--instance Eq TypeHashId where- TypeHashId l li == TypeHashId r ri = l == r && li == ri- {-# INLINE (==) #-}--instance Hashable TypeHashId where- hashWithSalt s (TypeHashId tp i) = s `hashWithSalt` tp `hashWithSalt` i- {-# INLINE hashWithSalt #-}--hashId :: Term t -> HashId-hashId t = case typeHashId t of- TypeHashId _ hi -> hi-{-# INLINE hashId #-}--typeFingerprint :: forall t. (SupportedPrim t) => Fingerprint-typeFingerprint = typeRepFingerprint $ SomeTypeRep $ primTypeRep @t-{-# INLINE typeFingerprint #-}---- | Return the ID and the type representation of a term.-typeHashId :: forall t. Term t -> TypeHashId-typeHashId (ConTerm _ ha i _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (SymTerm _ ha i _ TypedSymbol {}) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (ForallTerm _ ha i _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (ExistsTerm _ ha i _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (NotTerm _ ha i _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (OrTerm _ ha i _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (AndTerm _ ha i _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (EqTerm _ ha i _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (DistinctTerm _ ha i _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (ITETerm _ ha i _ _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (AddNumTerm _ ha i _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (NegNumTerm _ ha i _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (MulNumTerm _ ha i _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (AbsNumTerm _ ha i _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (SignumNumTerm _ ha i _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (LtOrdTerm _ ha i _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (LeOrdTerm _ ha i _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (AndBitsTerm _ ha i _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (OrBitsTerm _ ha i _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (XorBitsTerm _ ha i _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (ComplementBitsTerm _ ha i _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (ShiftLeftTerm _ ha i _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (ShiftRightTerm _ ha i _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (RotateLeftTerm _ ha i _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (RotateRightTerm _ ha i _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (BitCastTerm _ ha i _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (BitCastOrTerm _ ha i _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (BVConcatTerm _ ha i _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (BVSelectTerm _ ha i _ _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (BVExtendTerm _ ha i _ _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (ApplyTerm _ ha i _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (DivIntegralTerm _ ha i _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (ModIntegralTerm _ ha i _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (QuotIntegralTerm _ ha i _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (RemIntegralTerm _ ha i _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (FPTraitTerm _ ha i _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (FdivTerm _ ha i _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (RecipTerm _ ha i _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (FloatingUnaryTerm _ ha i _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (PowerTerm _ ha i _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (FPUnaryTerm _ ha i _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (FPBinaryTerm _ ha i _ _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (FPRoundingUnaryTerm _ ha i _ _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (FPRoundingBinaryTerm _ ha i _ _ _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (FPFMATerm _ ha i _ _ _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (FromIntegralTerm _ ha i _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (FromFPOrTerm _ ha i _ _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i-typeHashId (ToFPTerm _ ha i _ _ _ _ _) = TypeHashId (typeFingerprint @t) $ HashId ha i---- {-# NOINLINE typeHashId #-}--introSupportedPrimConstraint0 :: forall t a. Term t -> ((SupportedPrim t) => a) -> a-introSupportedPrimConstraint0 ConTerm {} x = x-introSupportedPrimConstraint0 (SymTerm _ _ _ _ t) x = withSymbolSupported t x-introSupportedPrimConstraint0 ForallTerm {} x = x-introSupportedPrimConstraint0 ExistsTerm {} x = x-introSupportedPrimConstraint0 NotTerm {} x = x-introSupportedPrimConstraint0 OrTerm {} x = x-introSupportedPrimConstraint0 AndTerm {} x = x-introSupportedPrimConstraint0 EqTerm {} x = x-introSupportedPrimConstraint0 DistinctTerm {} x = x-introSupportedPrimConstraint0 ITETerm {} x = x-introSupportedPrimConstraint0 AddNumTerm {} x = x-introSupportedPrimConstraint0 NegNumTerm {} x = x-introSupportedPrimConstraint0 MulNumTerm {} x = x-introSupportedPrimConstraint0 AbsNumTerm {} x = x-introSupportedPrimConstraint0 SignumNumTerm {} x = x-introSupportedPrimConstraint0 LtOrdTerm {} x = x-introSupportedPrimConstraint0 LeOrdTerm {} x = x-introSupportedPrimConstraint0 AndBitsTerm {} x = x-introSupportedPrimConstraint0 OrBitsTerm {} x = x-introSupportedPrimConstraint0 XorBitsTerm {} x = x-introSupportedPrimConstraint0 ComplementBitsTerm {} x = x-introSupportedPrimConstraint0 ShiftLeftTerm {} x = x-introSupportedPrimConstraint0 RotateLeftTerm {} x = x-introSupportedPrimConstraint0 ShiftRightTerm {} x = x-introSupportedPrimConstraint0 RotateRightTerm {} x = x-introSupportedPrimConstraint0 BitCastTerm {} x = x-introSupportedPrimConstraint0 BitCastOrTerm {} x = x-introSupportedPrimConstraint0 BVConcatTerm {} x = x-introSupportedPrimConstraint0 BVSelectTerm {} x = x-introSupportedPrimConstraint0 BVExtendTerm {} x = x-introSupportedPrimConstraint0 ApplyTerm {} x = x-introSupportedPrimConstraint0 DivIntegralTerm {} x = x-introSupportedPrimConstraint0 ModIntegralTerm {} x = x-introSupportedPrimConstraint0 QuotIntegralTerm {} x = x-introSupportedPrimConstraint0 RemIntegralTerm {} x = x-introSupportedPrimConstraint0 FPTraitTerm {} x = x-introSupportedPrimConstraint0 FdivTerm {} x = x-introSupportedPrimConstraint0 RecipTerm {} x = x-introSupportedPrimConstraint0 FloatingUnaryTerm {} x = x-introSupportedPrimConstraint0 PowerTerm {} x = x-introSupportedPrimConstraint0 FPUnaryTerm {} x = x-introSupportedPrimConstraint0 FPBinaryTerm {} x = x-introSupportedPrimConstraint0 FPRoundingUnaryTerm {} x = x-introSupportedPrimConstraint0 FPRoundingBinaryTerm {} x = x-introSupportedPrimConstraint0 FPFMATerm {} x = x-introSupportedPrimConstraint0 FromIntegralTerm {} x = x-introSupportedPrimConstraint0 FromFPOrTerm {} x = x-introSupportedPrimConstraint0 ToFPTerm {} x = x---- | Introduce the 'SupportedPrim' constraint from a term.-introSupportedPrimConstraint ::- forall t a. Term t -> ((SupportedPrim t, Typeable t) => a) -> a-introSupportedPrimConstraint t a =- introSupportedPrimConstraint0 t $ withSupportedPrimTypeable @t $ a-{-# INLINE introSupportedPrimConstraint #-}---- | Introduce the 'Typeable' constraint from 'SupportedPrim'.-withSupportedPrimTypeable ::- forall a b. (SupportedPrim a) => ((Typeable a) => b) -> b-withSupportedPrimTypeable = withTypeable (primTypeRep @a)-{-# INLINE withSupportedPrimTypeable #-}---- {-# INLINE introSupportedPrimConstraint #-}---- | Pretty-print a term.-pformatTerm :: forall t. Term t -> String-pformatTerm (ConTerm _ _ _ _ t) = pformatCon t-pformatTerm (SymTerm _ _ _ _ sym) = showUntyped sym-pformatTerm (ForallTerm _ _ _ _ sym arg) = "(forall " ++ show sym ++ " " ++ pformatTerm arg ++ ")"-pformatTerm (ExistsTerm _ _ _ _ sym arg) = "(exists " ++ show sym ++ " " ++ pformatTerm arg ++ ")"-pformatTerm (NotTerm _ _ _ _ arg) = "(! " ++ pformatTerm arg ++ ")"-pformatTerm (OrTerm _ _ _ _ arg1 arg2) = "(|| " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"-pformatTerm (AndTerm _ _ _ _ arg1 arg2) = "(&& " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"-pformatTerm (EqTerm _ _ _ _ arg1 arg2) = "(= " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"-pformatTerm (DistinctTerm _ _ _ _ args) = "(distinct " ++ unwords (map pformatTerm $ toList args) ++ ")"-pformatTerm (ITETerm _ _ _ _ cond arg1 arg2) = "(ite " ++ pformatTerm cond ++ " " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"-pformatTerm (AddNumTerm _ _ _ _ arg1 arg2) = "(+ " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"-pformatTerm (NegNumTerm _ _ _ _ arg) = "(- " ++ pformatTerm arg ++ ")"-pformatTerm (MulNumTerm _ _ _ _ arg1 arg2) = "(* " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"-pformatTerm (AbsNumTerm _ _ _ _ arg) = "(abs " ++ pformatTerm arg ++ ")"-pformatTerm (SignumNumTerm _ _ _ _ arg) = "(signum " ++ pformatTerm arg ++ ")"-pformatTerm (LtOrdTerm _ _ _ _ arg1 arg2) = "(< " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"-pformatTerm (LeOrdTerm _ _ _ _ arg1 arg2) = "(<= " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"-pformatTerm (AndBitsTerm _ _ _ _ arg1 arg2) = "(& " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"-pformatTerm (OrBitsTerm _ _ _ _ arg1 arg2) = "(| " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"-pformatTerm (XorBitsTerm _ _ _ _ arg1 arg2) = "(^ " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"-pformatTerm (ComplementBitsTerm _ _ _ _ arg) = "(~ " ++ pformatTerm arg ++ ")"-pformatTerm (ShiftLeftTerm _ _ _ _ arg n) = "(shl " ++ pformatTerm arg ++ " " ++ pformatTerm n ++ ")"-pformatTerm (ShiftRightTerm _ _ _ _ arg n) = "(shr " ++ pformatTerm arg ++ " " ++ pformatTerm n ++ ")"-pformatTerm (RotateLeftTerm _ _ _ _ arg n) = "(rotl " ++ pformatTerm arg ++ " " ++ pformatTerm n ++ ")"-pformatTerm (RotateRightTerm _ _ _ _ arg n) = "(rotr " ++ pformatTerm arg ++ " " ++ pformatTerm n ++ ")"-pformatTerm (BitCastTerm _ _ _ _ arg) = "(bitcast " ++ pformatTerm arg ++ ")"-pformatTerm (BitCastOrTerm _ _ _ _ d arg) = "(bitcast_or " ++ pformatTerm d ++ " " ++ pformatTerm arg ++ ")"-pformatTerm (BVConcatTerm _ _ _ _ arg1 arg2) = "(bvconcat " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"-pformatTerm (BVSelectTerm _ _ _ _ (_ :: Proxy ix) (_ :: Proxy w) arg) =- "(bvselect " ++ show (typeRep @ix) ++ " " ++ show (typeRep @w) ++ " " ++ pformatTerm arg ++ ")"-pformatTerm (BVExtendTerm _ _ _ _ signed (_ :: Proxy n) arg) =- (if signed then "(bvsext " else "(bvzext ") ++ show (typeRep @n) ++ " " ++ pformatTerm arg ++ ")"-pformatTerm (ApplyTerm _ _ _ _ func arg) = "(apply " ++ pformatTerm func ++ " " ++ pformatTerm arg ++ ")"-pformatTerm (DivIntegralTerm _ _ _ _ arg1 arg2) = "(div " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"-pformatTerm (ModIntegralTerm _ _ _ _ arg1 arg2) = "(mod " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"-pformatTerm (QuotIntegralTerm _ _ _ _ arg1 arg2) = "(quot " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"-pformatTerm (RemIntegralTerm _ _ _ _ arg1 arg2) = "(rem " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"-pformatTerm (FPTraitTerm _ _ _ _ trait arg) = "(" ++ show trait ++ " " ++ pformatTerm arg ++ ")"-pformatTerm (FdivTerm _ _ _ _ arg1 arg2) = "(fdiv " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"-pformatTerm (RecipTerm _ _ _ _ arg) = "(recip " ++ pformatTerm arg ++ ")"-pformatTerm (FloatingUnaryTerm _ _ _ _ op arg) = "(" ++ show op ++ " " ++ pformatTerm arg ++ ")"-pformatTerm (PowerTerm _ _ _ _ arg1 arg2) = "(** " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"-pformatTerm (FPUnaryTerm _ _ _ _ op arg) = "(" ++ show op ++ " " ++ pformatTerm arg ++ ")"-pformatTerm (FPBinaryTerm _ _ _ _ op arg1 arg2) = "(" ++ show op ++ " " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"-pformatTerm (FPRoundingUnaryTerm _ _ _ _ op mode arg) = "(" ++ show op ++ " " ++ pformatTerm mode ++ " " ++ pformatTerm arg ++ ")"-pformatTerm (FPRoundingBinaryTerm _ _ _ _ op mode arg1 arg2) =- "(" ++ show op ++ " " ++ pformatTerm mode ++ " " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"-pformatTerm (FPFMATerm _ _ _ _ mode arg1 arg2 arg3) =- "(fp.fma " ++ pformatTerm mode ++ " " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ " " ++ pformatTerm arg3 ++ ")"-pformatTerm (FromIntegralTerm _ _ _ _ arg) = "(from_integral " ++ pformatTerm arg ++ ")"-pformatTerm (FromFPOrTerm _ _ _ _ d r arg) = "(from_fp_or " ++ pformatTerm d ++ " " ++ pformatTerm r ++ " " ++ pformatTerm arg ++ ")"-pformatTerm (ToFPTerm _ _ _ _ r arg _ _) = "(to_fp " ++ pformatTerm r ++ " " ++ pformatTerm arg ++ ")"---- {-# INLINE pformatTerm #-}--instance NFData (Term a) where- rnf i = rnf (termId i) `seq` rnf (termIdent i)- {-# INLINE rnf #-}--#if MIN_VERSION_base(4,15,0)-type CODE x = forall qq. Quote qq => Code qq (x)-#else-type CODE x = TExpQ x-#endif--instance Lift (Term t) where- liftTyped (ConTerm _ _ _ _ v) = [||conTerm v||]- liftTyped (SymTerm _ _ _ _ t) = [||symTerm t||]- liftTyped (ForallTerm _ _ _ _ t1 t2) = [||forallTerm t1 t2||]- liftTyped (ExistsTerm _ _ _ _ t1 t2) = [||existsTerm t1 t2||]- liftTyped (NotTerm _ _ _ _ t) = [||notTerm t||]- liftTyped (OrTerm _ _ _ _ t1 t2) = [||orTerm t1 t2||]- liftTyped (AndTerm _ _ _ _ t1 t2) = [||andTerm t1 t2||]- liftTyped (EqTerm _ _ _ _ t1 t2) = [||eqTerm t1 t2||]- liftTyped (DistinctTerm _ _ _ _ t) = [||distinctTerm t||]- liftTyped (ITETerm _ _ _ _ t1 t2 t3) = [||iteTerm t1 t2 t3||]- liftTyped (AddNumTerm _ _ _ _ t1 t2) = [||addNumTerm t1 t2||]- liftTyped (NegNumTerm _ _ _ _ t) = [||negNumTerm t||]- liftTyped (MulNumTerm _ _ _ _ t1 t2) = [||mulNumTerm t1 t2||]- liftTyped (AbsNumTerm _ _ _ _ t) = [||absNumTerm t||]- liftTyped (SignumNumTerm _ _ _ _ t) = [||signumNumTerm t||]- liftTyped (LtOrdTerm _ _ _ _ t1 t2) = [||ltOrdTerm t1 t2||]- liftTyped (LeOrdTerm _ _ _ _ t1 t2) = [||leOrdTerm t1 t2||]- liftTyped (AndBitsTerm _ _ _ _ t1 t2) = [||andBitsTerm t1 t2||]- liftTyped (OrBitsTerm _ _ _ _ t1 t2) = [||orBitsTerm t1 t2||]- liftTyped (XorBitsTerm _ _ _ _ t1 t2) = [||xorBitsTerm t1 t2||]- liftTyped (ComplementBitsTerm _ _ _ _ t) = [||complementBitsTerm t||]- liftTyped (ShiftLeftTerm _ _ _ _ t1 t2) = [||shiftLeftTerm t1 t2||]- liftTyped (ShiftRightTerm _ _ _ _ t1 t2) = [||shiftRightTerm t1 t2||]- liftTyped (RotateLeftTerm _ _ _ _ t1 t2) = [||rotateLeftTerm t1 t2||]- liftTyped (RotateRightTerm _ _ _ _ t1 t2) = [||rotateRightTerm t1 t2||]- liftTyped (BitCastTerm _ _ _ _ t) = [||bitCastTerm t||]- liftTyped (BitCastOrTerm _ _ _ _ t1 t2) = [||bitCastOrTerm t1 t2||]- liftTyped (BVConcatTerm _ _ _ _ t1 t2) = [||bvConcatTerm t1 t2||]- liftTyped (BVSelectTerm _ _ _ _ (_ :: p ix) (_ :: q w) t3) =- let pix = [||Proxy||] :: CODE (Proxy ix)- pw = [||Proxy||] :: CODE (Proxy w)- in [||bvSelectTerm $$pix $$pw t3||]- liftTyped (BVExtendTerm _ _ _ _ b (_ :: p r) t2) =- let pr = [||Proxy||] :: CODE (Proxy r)- in [||bvExtendTerm b $$pr t2||]- liftTyped (ApplyTerm _ _ _ _ t1 t2) = [||applyTerm t1 t2||]- liftTyped (DivIntegralTerm _ _ _ _ t1 t2) = [||divIntegralTerm t1 t2||]- liftTyped (ModIntegralTerm _ _ _ _ t1 t2) = [||modIntegralTerm t1 t2||]- liftTyped (QuotIntegralTerm _ _ _ _ t1 t2) = [||quotIntegralTerm t1 t2||]- liftTyped (RemIntegralTerm _ _ _ _ t1 t2) = [||remIntegralTerm t1 t2||]- liftTyped (FPTraitTerm _ _ _ _ t1 t2) = [||fpTraitTerm t1 t2||]- liftTyped (FdivTerm _ _ _ _ t1 t2) = [||fdivTerm t1 t2||]- liftTyped (RecipTerm _ _ _ _ t) = [||recipTerm t||]- liftTyped (FloatingUnaryTerm _ _ _ _ t1 t2) = [||floatingUnaryTerm t1 t2||]- liftTyped (PowerTerm _ _ _ _ t1 t2) = [||powerTerm t1 t2||]- liftTyped (FPUnaryTerm _ _ _ _ t1 t2) = [||fpUnaryTerm t1 t2||]- liftTyped (FPBinaryTerm _ _ _ _ t1 t2 t3) = [||fpBinaryTerm t1 t2 t3||]- liftTyped (FPRoundingUnaryTerm _ _ _ _ t1 t2 t3) =- [||fpRoundingUnaryTerm t1 t2 t3||]- liftTyped (FPRoundingBinaryTerm _ _ _ _ t1 t2 t3 t4) =- [||fpRoundingBinaryTerm t1 t2 t3 t4||]- liftTyped (FPFMATerm _ _ _ _ t1 t2 t3 t4) = [||fpFMATerm t1 t2 t3 t4||]- liftTyped (FromIntegralTerm _ _ _ _ t) = [||fromIntegralTerm t||]- liftTyped (FromFPOrTerm _ _ _ _ t1 t2 t3) = [||fromFPOrTerm t1 t2 t3||]- liftTyped (ToFPTerm _ _ _ _ t1 t2 _ _) =- [||toFPTerm t1 t2||]--instance Show (Term ty) where- show (ConTerm tid _ i _ v) =- "ConTerm{tid=" ++ show tid ++ ", id=" ++ show i ++ ", v=" ++ pformatCon v ++ "}"- show (SymTerm tid _ i _ name@TypedSymbol {}) =- "SymTerm{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", name="- ++ show name- ++ ", type="- ++ show (primTypeRep @ty)- ++ "}"- show (ForallTerm tid _ i _ sym arg) =- "Forall{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", sym="- ++ show sym- ++ ", arg="- ++ show arg- ++ "}"- show (ExistsTerm tid _ i _ sym arg) =- "Exists{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", sym="- ++ show sym- ++ ", arg="- ++ show arg- ++ "}"- show (NotTerm tid _ i _ arg) =- "Not{tid=" ++ show tid ++ ", id=" ++ show i ++ ", arg=" ++ show arg ++ "}"- show (OrTerm tid _ i _ arg1 arg2) =- "Or{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", arg1="- ++ show arg1- ++ ", arg2="- ++ show arg2- ++ "}"- show (AndTerm tid _ i _ arg1 arg2) =- "And{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", arg1="- ++ show arg1- ++ ", arg2="- ++ show arg2- ++ "}"- show (EqTerm tid _ i _ arg1 arg2) =- "Eqv{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", arg1="- ++ show arg1- ++ ", arg2="- ++ show arg2- ++ "}"- show (DistinctTerm tid _ i _ args) =- "Distinct{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", args="- ++ show args- ++ "}"- show (ITETerm tid _ i _ cond l r) =- "ITE{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", cond="- ++ show cond- ++ ", then="- ++ show l- ++ ", else="- ++ show r- ++ "}"- show (AddNumTerm tid _ i _ arg1 arg2) =- "AddNum{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", arg1="- ++ show arg1- ++ ", arg2="- ++ show arg2- ++ "}"- show (NegNumTerm tid _ i _ arg) =- "NegNum{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", arg="- ++ show arg- ++ "}"- show (MulNumTerm tid _ i _ arg1 arg2) =- "MulNum{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", arg1="- ++ show arg1- ++ ", arg2="- ++ show arg2- ++ "}"- show (AbsNumTerm tid _ i _ arg) =- "AbsNum{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", arg="- ++ show arg- ++ "}"- show (SignumNumTerm tid _ i _ arg) =- "SignumNum{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", arg="- ++ show arg- ++ "}"- show (LtOrdTerm tid _ i _ arg1 arg2) =- "LTNum{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", arg1="- ++ show arg1- ++ ", arg2="- ++ show arg2- ++ "}"- show (LeOrdTerm tid _ i _ arg1 arg2) =- "LENum{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", arg1="- ++ show arg1- ++ ", arg2="- ++ show arg2- ++ "}"- show (AndBitsTerm tid _ i _ arg1 arg2) =- "AndBits{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", arg1="- ++ show arg1- ++ ", arg2="- ++ show arg2- ++ "}"- show (OrBitsTerm tid _ i _ arg1 arg2) =- "OrBits{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", arg1="- ++ show arg1- ++ ", arg2="- ++ show arg2- ++ "}"- show (XorBitsTerm tid _ i _ arg1 arg2) =- "XorBits{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", arg1="- ++ show arg1- ++ ", arg2="- ++ show arg2- ++ "}"- show (ComplementBitsTerm tid _ i _ arg) =- "ComplementBits{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", arg="- ++ show arg- ++ "}"- show (ShiftLeftTerm tid _ i _ arg n) =- "ShiftLeft{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", arg="- ++ show arg- ++ ", n="- ++ show n- ++ "}"- show (ShiftRightTerm tid _ i _ arg n) =- "ShiftRight{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", arg="- ++ show arg- ++ ", n="- ++ show n- ++ "}"- show (RotateLeftTerm tid _ i _ arg n) =- "RotateLeft{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", arg="- ++ show arg- ++ ", n="- ++ show n- ++ "}"- show (RotateRightTerm tid _ i _ arg n) =- "RotateRight{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", arg="- ++ show arg- ++ ", n="- ++ show n- ++ "}"- show (BitCastTerm tid _ i _ arg) =- "BitCast{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", arg="- ++ show arg- ++ "}"- show (BitCastOrTerm tid _ i _ d arg) =- "BitCastOr{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", default="- ++ show d- ++ ", arg="- ++ show arg- ++ "}"- show (BVConcatTerm tid _ i _ arg1 arg2) =- "BVConcat{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", arg1="- ++ show arg1- ++ ", arg2="- ++ show arg2- ++ "}"- show (BVSelectTerm tid _ i _ ix w arg) =- "BVSelect{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", ix="- ++ show ix- ++ ", w="- ++ show w- ++ ", arg="- ++ show arg- ++ "}"- show (BVExtendTerm tid _ i _ signed n arg) =- "BVExtend{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", signed="- ++ show signed- ++ ", n="- ++ show n- ++ ", arg="- ++ show arg- ++ "}"- show (ApplyTerm tid _ i _ f arg) =- "Apply{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", f="- ++ show f- ++ ", arg="- ++ show arg- ++ "}"- show (DivIntegralTerm tid _ i _ arg1 arg2) =- "DivIntegral{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", arg1="- ++ show arg1- ++ ", arg2="- ++ show arg2- ++ "}"- show (ModIntegralTerm tid _ i _ arg1 arg2) =- "ModIntegral{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", arg1="- ++ show arg1- ++ ", arg2="- ++ show arg2- ++ "}"- show (QuotIntegralTerm tid _ i _ arg1 arg2) =- "QuotIntegral{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", arg1="- ++ show arg1- ++ ", arg2="- ++ show arg2- ++ "}"- show (RemIntegralTerm tid _ i _ arg1 arg2) =- "RemIntegral{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", arg1="- ++ show arg1- ++ ", arg2="- ++ show arg2- ++ "}"- show (FPTraitTerm tid _ i _ trait arg) =- "FPTrait{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", trait="- ++ show trait- ++ ", arg="- ++ show arg- ++ "}"- show (FdivTerm tid _ i _ arg1 arg2) =- "Fdiv{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", arg1="- ++ show arg1- ++ ", arg2="- ++ show arg2- ++ "}"- show (RecipTerm tid _ i _ arg) =- "Recip{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", arg="- ++ show arg- ++ "}"- show (FloatingUnaryTerm tid _ i _ op arg) =- "FloatingUnary{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", op="- ++ show op- ++ ", arg="- ++ show arg- ++ "}"- show (PowerTerm tid _ i _ arg1 arg2) =- "Power{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", arg1="- ++ show arg1- ++ ", arg2="- ++ show arg2- ++ "}"- show (FPUnaryTerm tid _ i _ op arg) =- "FPUnary{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", op="- ++ show op- ++ ", arg="- ++ show arg- ++ "}"- show (FPBinaryTerm tid _ i _ op arg1 arg2) =- "FPBinary{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", op="- ++ show op- ++ ", arg1="- ++ show arg1- ++ ", arg2="- ++ show arg2- ++ "}"- show (FPRoundingUnaryTerm tid _ i _ op mode arg) =- "FPRoundingUnary{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", op="- ++ show op- ++ ", mode="- ++ show mode- ++ ", arg="- ++ show arg- ++ "}"- show (FPRoundingBinaryTerm tid _ i _ op mode arg1 arg2) =- "FPRoundingBinary{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", op="- ++ show op- ++ ", mode="- ++ show mode- ++ ", arg1="- ++ show arg1- ++ ", arg2="- ++ show arg2- ++ "}"- show (FPFMATerm tid _ i _ mode arg1 arg2 arg3) =- "FPFMA{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", mode="- ++ show mode- ++ ", arg1="- ++ show arg1- ++ ", arg2="- ++ show arg2- ++ ", arg3="- ++ show arg3- ++ "}"- show (FromIntegralTerm tid _ i _ arg) =- "FromIntegral{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", arg="- ++ show arg- ++ "}"- show (FromFPOrTerm tid _ i _ d mode arg) =- "FromFPTerm{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", default="- ++ show d- ++ ", mode="- ++ show mode- ++ ", arg="- ++ show arg- ++ "}"- show (ToFPTerm tid _ i _ mode arg _ _) =- "ToFPTerm{tid="- ++ show tid- ++ ", id="- ++ show i- ++ ", mode="- ++ show mode- ++ ", arg="- ++ show arg- ++ "}"---- {-# INLINE show #-}---- | Pretty-print a term, possibly eliding parts of it.-prettyPrintTerm :: Term t -> Doc ann-prettyPrintTerm v =- column- ( \c ->- pageWidth $ \case- AvailablePerLine i r ->- if fromIntegral (c + len) > fromIntegral i * r- then "..."- else pretty formatted- Unbounded -> pretty formatted- )- where- formatted = introSupportedPrimConstraint v $ pformatTerm v- len = length formatted--instance (SupportedPrim t) => Eq (Term t) where- a == b =- if threadId a == threadId b- then termId a == termId b- else unsafePerformIO $ do- tid <- myWeakThreadId- a' <- toCurThreadImpl tid a- b' <- toCurThreadImpl tid b- return $ a' == b'--instance (SupportedPrim t) => Hashable (Term t) where- hashWithSalt s t = hashWithSalt s $ baseHash t- {-# INLINE hashWithSalt #-}---- | Term without identity (before internalizing).-data UTerm t where- UConTerm :: (SupportedPrim t) => !t -> UTerm t- USymTerm :: !(TypedSymbol 'AnyKind t) -> UTerm t- UForallTerm ::- !(TypedSymbol 'ConstantKind t) ->- !(Term Bool) ->- UTerm Bool- UExistsTerm ::- !(TypedSymbol 'ConstantKind t) ->- !(Term Bool) ->- UTerm Bool- UNotTerm :: !(Term Bool) -> UTerm Bool- UOrTerm :: !(Term Bool) -> !(Term Bool) -> UTerm Bool- UAndTerm :: !(Term Bool) -> !(Term Bool) -> UTerm Bool- UEqTerm :: !(Term t) -> !(Term t) -> UTerm Bool- UDistinctTerm :: !(NonEmpty (Term t)) -> UTerm Bool- UITETerm ::- (SupportedPrim t) =>- !(Term Bool) ->- !(Term t) ->- !(Term t) ->- UTerm t- UAddNumTerm :: (SupportedPrim t, PEvalNumTerm t) => !(Term t) -> !(Term t) -> UTerm t- UNegNumTerm :: (SupportedPrim t, PEvalNumTerm t) => !(Term t) -> UTerm t- UMulNumTerm :: (SupportedPrim t, PEvalNumTerm t) => !(Term t) -> !(Term t) -> UTerm t- UAbsNumTerm :: (SupportedPrim t, PEvalNumTerm t) => !(Term t) -> UTerm t- USignumNumTerm :: (SupportedPrim t, PEvalNumTerm t) => !(Term t) -> UTerm t- ULtOrdTerm :: (SupportedPrim t, PEvalOrdTerm t) => !(Term t) -> !(Term t) -> UTerm Bool- ULeOrdTerm :: (SupportedPrim t, PEvalOrdTerm t) => !(Term t) -> !(Term t) -> UTerm Bool- UAndBitsTerm :: (SupportedPrim t, PEvalBitwiseTerm t) => !(Term t) -> !(Term t) -> UTerm t- UOrBitsTerm :: (SupportedPrim t, PEvalBitwiseTerm t) => !(Term t) -> !(Term t) -> UTerm t- UXorBitsTerm :: (SupportedPrim t, PEvalBitwiseTerm t) => !(Term t) -> !(Term t) -> UTerm t- UComplementBitsTerm :: (SupportedPrim t, PEvalBitwiseTerm t) => !(Term t) -> UTerm t- UShiftLeftTerm ::- (SupportedPrim t, PEvalShiftTerm t) => !(Term t) -> !(Term t) -> UTerm t- UShiftRightTerm ::- (SupportedPrim t, PEvalShiftTerm t) => !(Term t) -> !(Term t) -> UTerm t- URotateLeftTerm ::- (SupportedPrim t, PEvalRotateTerm t) => !(Term t) -> !(Term t) -> UTerm t- URotateRightTerm ::- (SupportedPrim t, PEvalRotateTerm t) => !(Term t) -> !(Term t) -> UTerm t- UBitCastTerm ::- (SupportedPrim b, PEvalBitCastTerm a b) =>- !(Term a) ->- UTerm b- UBitCastOrTerm ::- (SupportedPrim b, PEvalBitCastOrTerm a b) =>- !(Term b) ->- !(Term a) ->- UTerm b- UBVConcatTerm ::- ( PEvalBVTerm bv,- KnownNat l,- KnownNat r,- KnownNat (l + r),- 1 <= l,- 1 <= r,- 1 <= l + r,- SupportedPrim (bv (l + r))- ) =>- !(Term (bv l)) ->- !(Term (bv r)) ->- UTerm (bv (l + r))- UBVSelectTerm ::- ( PEvalBVTerm bv,- KnownNat n,- KnownNat ix,- KnownNat w,- 1 <= n,- 1 <= w,- ix + w <= n,- SupportedPrim (bv w)- ) =>- !(Proxy ix) ->- !(Proxy w) ->- !(Term (bv n)) ->- UTerm (bv w)- UBVExtendTerm ::- ( PEvalBVTerm bv,- KnownNat l,- KnownNat r,- 1 <= l,- 1 <= r,- l <= r,- SupportedPrim (bv r)- ) =>- !Bool ->- !(Proxy r) ->- !(Term (bv l)) ->- UTerm (bv r)- UApplyTerm ::- (PEvalApplyTerm f a b, SupportedPrim b) =>- Term f ->- Term a ->- UTerm b- UDivIntegralTerm ::- (SupportedPrim t, PEvalDivModIntegralTerm t) =>- !(Term t) ->- !(Term t) ->- UTerm t- UModIntegralTerm ::- (SupportedPrim t, PEvalDivModIntegralTerm t) =>- !(Term t) ->- !(Term t) ->- UTerm t- UQuotIntegralTerm ::- (SupportedPrim t, PEvalDivModIntegralTerm t) =>- !(Term t) ->- !(Term t) ->- UTerm t- URemIntegralTerm ::- (SupportedPrim t, PEvalDivModIntegralTerm t) =>- !(Term t) ->- !(Term t) ->- UTerm t- UFPTraitTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- !FPTrait ->- !(Term (FP eb sb)) ->- UTerm Bool- UFdivTerm ::- (SupportedPrim t, PEvalFractionalTerm t) =>- !(Term t) ->- !(Term t) ->- UTerm t- URecipTerm :: (SupportedPrim t, PEvalFractionalTerm t) => !(Term t) -> UTerm t- UFloatingUnaryTerm ::- (SupportedPrim t, PEvalFloatingTerm t) =>- !FloatingUnaryOp ->- !(Term t) ->- UTerm t- UPowerTerm ::- (SupportedPrim t, PEvalFloatingTerm t) => !(Term t) -> !(Term t) -> UTerm t- UFPUnaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- !FPUnaryOp ->- !(Term (FP eb sb)) ->- UTerm (FP eb sb)- UFPBinaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- !FPBinaryOp ->- !(Term (FP eb sb)) ->- !(Term (FP eb sb)) ->- UTerm (FP eb sb)- UFPRoundingUnaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- !FPRoundingUnaryOp ->- !(Term FPRoundingMode) ->- !(Term (FP eb sb)) ->- UTerm (FP eb sb)- UFPRoundingBinaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- !FPRoundingBinaryOp ->- !(Term FPRoundingMode) ->- !(Term (FP eb sb)) ->- !(Term (FP eb sb)) ->- UTerm (FP eb sb)- UFPFMATerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- !(Term FPRoundingMode) ->- !(Term (FP eb sb)) ->- !(Term (FP eb sb)) ->- !(Term (FP eb sb)) ->- UTerm (FP eb sb)- UFromIntegralTerm ::- (PEvalFromIntegralTerm a b, SupportedPrim b) =>- !(Term a) ->- UTerm b- UFromFPOrTerm ::- ( PEvalIEEEFPConvertibleTerm a,- SupportedPrim a,- ValidFP eb sb- ) =>- Term a ->- !(Term FPRoundingMode) ->- !(Term (FP eb sb)) ->- UTerm a- UToFPTerm ::- ( PEvalIEEEFPConvertibleTerm a,- ValidFP eb sb,- SupportedPrim (FP eb sb)- ) =>- !(Term FPRoundingMode) ->- !(Term a) ->- Proxy eb ->- Proxy sb ->- UTerm (FP eb sb)---- | Compare two t'TypedSymbol's for equality.-eqHeteroSymbol :: forall ta a tb b. TypedSymbol ta a -> TypedSymbol tb b -> Bool-eqHeteroSymbol (TypedSymbol taga) (TypedSymbol tagb) =- case eqTypeRep (primTypeRep @a) (primTypeRep @b) of- Just HRefl -> taga == tagb- Nothing -> False-{-# INLINE eqHeteroSymbol #-}--preHashConDescription :: (SupportedPrim t) => t -> Digest-preHashConDescription = fromIntegral . hashConWithSalt 0-{-# INLINE preHashConDescription #-}--preHashSymDescription :: TypedSymbol 'AnyKind t -> Digest-preHashSymDescription = fromIntegral . hashWithSalt 1-{-# INLINE preHashSymDescription #-}--preHashForallDescription ::- TypedSymbol 'ConstantKind t -> HashId -> Digest-preHashForallDescription sym h =- fromIntegral- ( 2- `hashWithSalt` sym- `hashWithSalt` h- )-{-# INLINE preHashForallDescription #-}--preHashExistsDescription ::- TypedSymbol 'ConstantKind t -> HashId -> Digest-preHashExistsDescription sym h =- fromIntegral- ( 3- `hashWithSalt` sym- `hashWithSalt` h- )-{-# INLINE preHashExistsDescription #-}--preHashNotDescription :: HashId -> Digest-preHashNotDescription = fromIntegral . hashWithSalt 7-{-# INLINE preHashNotDescription #-}--preHashOrDescription :: HashId -> HashId -> Digest-preHashOrDescription h1 h2 =- fromIntegral (8 `hashWithSalt` h1 `hashWithSalt` h2)-{-# INLINE preHashOrDescription #-}--preHashAndDescription :: HashId -> HashId -> Digest-preHashAndDescription h1 h2 =- fromIntegral (9 `hashWithSalt` h1 `hashWithSalt` h2)-{-# INLINE preHashAndDescription #-}--preHashEqDescription :: Fingerprint -> HashId -> HashId -> Digest-preHashEqDescription tp h1 h2 =- fromIntegral (10 `hashWithSalt` tp `hashWithSalt` h1 `hashWithSalt` h2)-{-# INLINE preHashEqDescription #-}--preHashDistinctDescription :: Fingerprint -> NonEmpty HashId -> Digest-preHashDistinctDescription tp hs =- fromIntegral (11 `hashWithSalt` tp `hashWithSalt` hs)-{-# INLINE preHashDistinctDescription #-}--preHashITEDescription :: HashId -> HashId -> HashId -> Digest-preHashITEDescription h1 h2 h3 =- fromIntegral (12 `hashWithSalt` h1 `hashWithSalt` h2 `hashWithSalt` h3)-{-# INLINE preHashITEDescription #-}--preHashAddNumDescription :: HashId -> HashId -> Digest-preHashAddNumDescription h1 h2 =- fromIntegral (13 `hashWithSalt` h1 `hashWithSalt` h2)-{-# INLINE preHashAddNumDescription #-}--preHashNegNumDescription :: HashId -> Digest-preHashNegNumDescription =- fromIntegral . hashWithSalt 14-{-# INLINE preHashNegNumDescription #-}--preHashMulNumDescription :: HashId -> HashId -> Digest-preHashMulNumDescription h1 h2 =- fromIntegral (15 `hashWithSalt` h1 `hashWithSalt` h2)-{-# INLINE preHashMulNumDescription #-}--preHashAbsNumDescription :: HashId -> Digest-preHashAbsNumDescription = fromIntegral . hashWithSalt 16-{-# INLINE preHashAbsNumDescription #-}--preHashSignumNumDescription :: HashId -> Digest-preHashSignumNumDescription = fromIntegral . hashWithSalt 17-{-# INLINE preHashSignumNumDescription #-}--preHashLtOrdDescription :: Fingerprint -> HashId -> HashId -> Digest-preHashLtOrdDescription tp h1 h2 =- fromIntegral (18 `hashWithSalt` tp `hashWithSalt` h1 `hashWithSalt` h2)-{-# INLINE preHashLtOrdDescription #-}--preHashLeOrdDescription :: Fingerprint -> HashId -> HashId -> Digest-preHashLeOrdDescription tp h1 h2 =- fromIntegral (19 `hashWithSalt` tp `hashWithSalt` h1 `hashWithSalt` h2)-{-# INLINE preHashLeOrdDescription #-}--preHashAndBitsDescription :: HashId -> HashId -> Digest-preHashAndBitsDescription h1 h2 =- fromIntegral (20 `hashWithSalt` h1 `hashWithSalt` h2)-{-# INLINE preHashAndBitsDescription #-}--preHashOrBitsDescription :: HashId -> HashId -> Digest-preHashOrBitsDescription h1 h2 =- fromIntegral (21 `hashWithSalt` h1 `hashWithSalt` h2)-{-# INLINE preHashOrBitsDescription #-}--preHashXorBitsDescription :: HashId -> HashId -> Digest-preHashXorBitsDescription h1 h2 =- fromIntegral (22 `hashWithSalt` h1 `hashWithSalt` h2)-{-# INLINE preHashXorBitsDescription #-}--preHashComplementBitsDescription :: HashId -> Digest-preHashComplementBitsDescription = fromIntegral . hashWithSalt 23-{-# INLINE preHashComplementBitsDescription #-}--preHashShiftLeftDescription :: HashId -> HashId -> Digest-preHashShiftLeftDescription h1 h2 =- fromIntegral (24 `hashWithSalt` h1 `hashWithSalt` h2)-{-# INLINE preHashShiftLeftDescription #-}--preHashShiftRightDescription :: HashId -> HashId -> Digest-preHashShiftRightDescription h1 h2 =- fromIntegral (25 `hashWithSalt` h1 `hashWithSalt` h2)-{-# INLINE preHashShiftRightDescription #-}--preHashRotateLeftDescription :: HashId -> HashId -> Digest-preHashRotateLeftDescription h1 h2 =- fromIntegral (26 `hashWithSalt` h1 `hashWithSalt` h2)-{-# INLINE preHashRotateLeftDescription #-}--preHashRotateRightDescription :: HashId -> HashId -> Digest-preHashRotateRightDescription h1 h2 =- fromIntegral (27 `hashWithSalt` h1 `hashWithSalt` h2)-{-# INLINE preHashRotateRightDescription #-}--preHashBVConcatDescription :: TypeHashId -> TypeHashId -> Digest-preHashBVConcatDescription h1 h2 =- fromIntegral- ( 28- `hashWithSalt` h1- `hashWithSalt` h2- )--preHashBVSelectDescription :: Fingerprint -> TypeHashId -> Digest-preHashBVSelectDescription tp h =- fromIntegral (29 `hashWithSalt` tp `hashWithSalt` h)--preHashBVExtendDescription :: Bool -> TypeHashId -> Digest-preHashBVExtendDescription signed h =- fromIntegral (30 `hashWithSalt` signed `hashWithSalt` h)--preHashBitCastDescription :: TypeHashId -> Digest-preHashBitCastDescription = fromIntegral . hashWithSalt 31-{-# INLINE preHashBitCastDescription #-}--preHashBitCastOrDescription :: HashId -> TypeHashId -> Digest-preHashBitCastOrDescription h1 h2 =- fromIntegral (32 `hashWithSalt` h1 `hashWithSalt` h2)-{-# INLINE preHashBitCastOrDescription #-}--preHashApplyDescription :: TypeHashId -> TypeHashId -> Digest-preHashApplyDescription h1 h2 =- fromIntegral (33 `hashWithSalt` h1 `hashWithSalt` h2)-{-# INLINE preHashApplyDescription #-}--preHashDivIntegralDescription :: HashId -> HashId -> Digest-preHashDivIntegralDescription h1 h2 =- fromIntegral (34 `hashWithSalt` h1 `hashWithSalt` h2)-{-# INLINE preHashDivIntegralDescription #-}--preHashModIntegralDescription :: HashId -> HashId -> Digest-preHashModIntegralDescription h1 h2 =- fromIntegral (35 `hashWithSalt` h1 `hashWithSalt` h2)-{-# INLINE preHashModIntegralDescription #-}--preHashQuotIntegralDescription :: HashId -> HashId -> Digest-preHashQuotIntegralDescription h1 h2 =- fromIntegral (36 `hashWithSalt` h1 `hashWithSalt` h2)-{-# INLINE preHashQuotIntegralDescription #-}--preHashRemIntegralDescription :: HashId -> HashId -> Digest-preHashRemIntegralDescription h1 h2 =- fromIntegral (37 `hashWithSalt` h1 `hashWithSalt` h2)-{-# INLINE preHashRemIntegralDescription #-}--preHashFPTraitDescription :: FPTrait -> TypeHashId -> Digest-preHashFPTraitDescription trait h =- fromIntegral (38 `hashWithSalt` trait `hashWithSalt` h)-{-# INLINE preHashFPTraitDescription #-}--preHashFdivDescription :: HashId -> HashId -> Digest-preHashFdivDescription h1 h2 =- fromIntegral (39 `hashWithSalt` h1 `hashWithSalt` h2)-{-# INLINE preHashFdivDescription #-}--preHashRecipDescription :: HashId -> Digest-preHashRecipDescription = fromIntegral . hashWithSalt 40-{-# INLINE preHashRecipDescription #-}--preHashFloatingUnaryDescription :: FloatingUnaryOp -> HashId -> Digest-preHashFloatingUnaryDescription op h =- fromIntegral (41 `hashWithSalt` op `hashWithSalt` h)-{-# INLINE preHashFloatingUnaryDescription #-}--preHashPowerDescription :: HashId -> HashId -> Digest-preHashPowerDescription h1 h2 =- fromIntegral (42 `hashWithSalt` h1 `hashWithSalt` h2)-{-# INLINE preHashPowerDescription #-}--preHashFPUnaryDescription :: FPUnaryOp -> HashId -> Digest-preHashFPUnaryDescription op h =- fromIntegral (43 `hashWithSalt` op `hashWithSalt` h)-{-# INLINE preHashFPUnaryDescription #-}--preHashFPBinaryDescription :: FPBinaryOp -> HashId -> HashId -> Digest-preHashFPBinaryDescription op h1 h2 =- fromIntegral (44 `hashWithSalt` op `hashWithSalt` h1 `hashWithSalt` h2)-{-# INLINE preHashFPBinaryDescription #-}--preHashFPRoundingUnaryDescription ::- FPRoundingUnaryOp -> HashId -> HashId -> Digest-preHashFPRoundingUnaryDescription op mode h =- fromIntegral (45 `hashWithSalt` op `hashWithSalt` mode `hashWithSalt` h)-{-# INLINE preHashFPRoundingUnaryDescription #-}--preHashFPRoundingBinaryDescription ::- FPRoundingBinaryOp -> HashId -> HashId -> HashId -> Digest-preHashFPRoundingBinaryDescription op mode h1 h2 =- fromIntegral- ( 46- `hashWithSalt` op- `hashWithSalt` mode- `hashWithSalt` h1- `hashWithSalt` h2- )--preHashFPFMADescription ::- HashId -> HashId -> HashId -> HashId -> Digest-preHashFPFMADescription mode h1 h2 h3 =- fromIntegral- ( 47- `hashWithSalt` mode- `hashWithSalt` h1- `hashWithSalt` h2- `hashWithSalt` h3- )-{-# INLINE preHashFPFMADescription #-}--preHashFromIntegralDescription :: TypeHashId -> Digest-preHashFromIntegralDescription = fromIntegral . hashWithSalt 48-{-# INLINE preHashFromIntegralDescription #-}--preHashFromFPOrDescription ::- HashId -> HashId -> TypeHashId -> Digest-preHashFromFPOrDescription h1 h2 h3 =- fromIntegral (49 `hashWithSalt` h1 `hashWithSalt` h2 `hashWithSalt` h3)-{-# INLINE preHashFromFPOrDescription #-}--preHashToFPTermDescription :: HashId -> TypeHashId -> Digest-preHashToFPTermDescription h1 h2 =- fromIntegral (50 `hashWithSalt` h1 `hashWithSalt` h2)-{-# INLINE preHashToFPTermDescription #-}--instance Interned (Term t) where- type Uninterned (Term t) = UTerm t- data Description (Term t) where- DConTerm ::- (t -> t -> Bool) -> {-# UNPACK #-} !Digest -> t -> Description (Term t)- DSymTerm ::- {-# UNPACK #-} !Digest ->- TypedSymbol 'AnyKind t ->- Description (Term t)- DForallTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !(TypedSymbol 'ConstantKind t) ->- {-# UNPACK #-} !HashId ->- Description (Term Bool)- DExistsTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !(TypedSymbol 'ConstantKind t) ->- {-# UNPACK #-} !HashId ->- Description (Term Bool)- DNotTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !HashId ->- Description (Term Bool)- DOrTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !HashId ->- Description (Term Bool)- DAndTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !HashId ->- Description (Term Bool)- DEqTerm ::- {-# UNPACK #-} !Digest ->- Fingerprint ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !HashId ->- Description (Term Bool)- DDistinctTerm ::- {-# UNPACK #-} !Digest ->- Fingerprint ->- !(NonEmpty HashId) ->- Description (Term Bool)- DITETerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !HashId ->- Description (Term t)- DAddNumTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !HashId ->- Description (Term t)- DNegNumTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !HashId ->- Description (Term t)- DMulNumTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !HashId ->- Description (Term t)- DAbsNumTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !HashId ->- Description (Term t)- DSignumNumTerm ::- {-# UNPACK #-} !Digest -> {-# UNPACK #-} !HashId -> Description (Term t)- DLtOrdTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !Fingerprint ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !HashId ->- Description (Term Bool)- DLeOrdTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !Fingerprint ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !HashId ->- Description (Term Bool)- DAndBitsTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !HashId ->- Description (Term t)- DOrBitsTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !HashId ->- Description (Term t)- DXorBitsTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !HashId ->- Description (Term t)- DComplementBitsTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !HashId ->- Description (Term t)- DShiftLeftTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !HashId ->- Description (Term t)- DShiftRightTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !HashId ->- Description (Term t)- DRotateLeftTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !HashId ->- Description (Term t)- DRotateRightTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !HashId ->- Description (Term t)- DBVConcatTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !TypeHashId ->- {-# UNPACK #-} !TypeHashId ->- Description (Term t)- DBitCastTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !TypeHashId ->- Description (Term b)- DBitCastOrTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !TypeHashId ->- Description (Term b)- DBVSelectTerm ::- forall bv (w :: Nat).- {-# UNPACK #-} !Digest ->- !Fingerprint ->- {-# UNPACK #-} !TypeHashId ->- Description (Term (bv w))- DBVExtendTerm ::- forall bv (r :: Nat).- {-# UNPACK #-} !Digest ->- !Bool ->- !(Proxy r) ->- {-# UNPACK #-} !TypeHashId ->- Description (Term (bv r))- DApplyTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !TypeHashId ->- {-# UNPACK #-} !TypeHashId ->- Description (Term b)- DDivIntegralTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !HashId ->- Description (Term a)- DModIntegralTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !HashId ->- Description (Term a)- DQuotIntegralTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !HashId ->- Description (Term a)- DRemIntegralTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !HashId ->- Description (Term a)- DFPTraitTerm ::- {-# UNPACK #-} !Digest ->- FPTrait ->- {-# UNPACK #-} !TypeHashId ->- Description (Term Bool)- DFdivTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !HashId ->- Description (Term a)- DRecipTerm ::- {-# UNPACK #-} !Digest -> {-# UNPACK #-} !HashId -> Description (Term a)- DFloatingUnaryTerm ::- {-# UNPACK #-} !Digest ->- FloatingUnaryOp ->- {-# UNPACK #-} !HashId ->- Description (Term a)- DPowerTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !HashId ->- Description (Term a)- DFPUnaryTerm ::- {-# UNPACK #-} !Digest ->- FPUnaryOp ->- {-# UNPACK #-} !HashId ->- Description (Term (FP eb sb))- DFPBinaryTerm ::- {-# UNPACK #-} !Digest ->- FPBinaryOp ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !HashId ->- Description (Term (FP eb sb))- DFPRoundingUnaryTerm ::- {-# UNPACK #-} !Digest ->- FPRoundingUnaryOp ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !HashId ->- Description (Term (FP eb sb))- DFPRoundingBinaryTerm ::- {-# UNPACK #-} !Digest ->- FPRoundingBinaryOp ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !HashId ->- Description (Term (FP eb sb))- DFPFMATerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !HashId ->- Description (Term (FP eb sb))- DFromIntegralTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !TypeHashId ->- Description (Term b)- DFromFPOrTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !TypeHashId ->- Description (Term a)- DToFPTerm ::- {-# UNPACK #-} !Digest ->- {-# UNPACK #-} !HashId ->- {-# UNPACK #-} !TypeHashId ->- Description (Term (FP eb sb))-- describe (UConTerm v) = DConTerm sameCon (preHashConDescription v) v- describe ((USymTerm name) :: UTerm t) =- DSymTerm @t (preHashSymDescription name) name- describe (UForallTerm (sym :: TypedSymbol 'ConstantKind arg) arg) =- let argHashId = hashId arg- in DForallTerm (preHashForallDescription sym argHashId) sym argHashId- describe (UExistsTerm (sym :: TypedSymbol 'ConstantKind arg) arg) =- let argHashId = hashId arg- in DExistsTerm (preHashExistsDescription sym argHashId) sym argHashId- describe (UNotTerm arg) =- let argHashId = hashId arg- in DNotTerm (preHashNotDescription argHashId) argHashId- describe (UOrTerm arg1 arg2) =- let arg1HashId = hashId arg1- arg2HashId = hashId arg2- in DOrTerm- (preHashOrDescription arg1HashId arg2HashId)- arg1HashId- arg2HashId- describe (UAndTerm arg1 arg2) =- let arg1HashId = hashId arg1- arg2HashId = hashId arg2- in DAndTerm- (preHashAndDescription arg1HashId arg2HashId)- arg1HashId- arg2HashId- describe (UEqTerm (arg1 :: Term arg) arg2) = do- let fingerprint =- introSupportedPrimConstraint arg1 $ typeFingerprint @arg- arg1HashId = hashId arg1- arg2HashId = hashId arg2- in DEqTerm- (preHashEqDescription fingerprint arg1HashId arg2HashId)- fingerprint- arg1HashId- arg2HashId- describe (UDistinctTerm args@((arg1 :: Term arg) :| _)) =- let fingerprint =- introSupportedPrimConstraint arg1 $ typeFingerprint @arg- argsHashId = hashId <$> args- in DDistinctTerm- (preHashDistinctDescription fingerprint argsHashId)- fingerprint- argsHashId- describe (UITETerm cond (l :: Term arg) r) =- let condHashId = hashId cond- lHashId = hashId l- rHashId = hashId r- in DITETerm- (preHashITEDescription condHashId lHashId rHashId)- condHashId- lHashId- rHashId- describe (UAddNumTerm arg1 arg2) =- let arg1HashId = hashId arg1- arg2HashId = hashId arg2- in DAddNumTerm- (preHashAddNumDescription arg1HashId arg2HashId)- arg1HashId- arg2HashId- describe (UNegNumTerm arg) =- let argHashId = hashId arg- in DNegNumTerm (preHashNegNumDescription argHashId) argHashId- describe (UMulNumTerm arg1 arg2) =- let arg1HashId = hashId arg1- arg2HashId = hashId arg2- in DMulNumTerm- (preHashMulNumDescription arg1HashId arg2HashId)- arg1HashId- arg2HashId- describe (UAbsNumTerm arg) =- let argHashId = hashId arg- in DAbsNumTerm (preHashAbsNumDescription argHashId) argHashId- describe (USignumNumTerm arg) =- let argHashId = hashId arg- in DSignumNumTerm (preHashSignumNumDescription argHashId) argHashId- describe (ULtOrdTerm (arg1 :: Term arg) arg2) =- let tr = typeFingerprint @arg- arg1HashId = hashId arg1- arg2HashId = hashId arg2- in DLtOrdTerm- (preHashLtOrdDescription tr arg1HashId arg2HashId)- tr- arg1HashId- arg2HashId- describe (ULeOrdTerm (arg1 :: Term arg) arg2) =- let tr = typeFingerprint @arg- arg1HashId = hashId arg1- arg2HashId = hashId arg2- in DLeOrdTerm- (preHashLeOrdDescription tr arg1HashId arg2HashId)- tr- arg1HashId- arg2HashId- describe (UAndBitsTerm arg1 arg2) =- let arg1HashId = hashId arg1- arg2HashId = hashId arg2- in DAndBitsTerm- (preHashAndBitsDescription arg1HashId arg2HashId)- arg1HashId- arg2HashId- describe (UOrBitsTerm arg1 arg2) =- let arg1HashId = hashId arg1- arg2HashId = hashId arg2- in DOrBitsTerm- (preHashOrBitsDescription arg1HashId arg2HashId)- arg1HashId- arg2HashId- describe (UXorBitsTerm arg1 arg2) =- let arg1HashId = hashId arg1- arg2HashId = hashId arg2- in DXorBitsTerm- (preHashXorBitsDescription arg1HashId arg2HashId)- arg1HashId- arg2HashId- describe (UComplementBitsTerm arg) =- let argHashId = hashId arg- in DComplementBitsTerm- (preHashComplementBitsDescription argHashId)- argHashId- describe (UShiftLeftTerm arg n) =- let argHashId = hashId arg- nHashId = hashId n- in DShiftLeftTerm- (preHashShiftLeftDescription argHashId nHashId)- argHashId- nHashId- describe (UShiftRightTerm arg n) =- let argHashId = hashId arg- nHashId = hashId n- in DShiftRightTerm- (preHashShiftRightDescription argHashId nHashId)- argHashId- nHashId- describe (URotateLeftTerm arg n) =- let argHashId = hashId arg- nHashId = hashId n- in DRotateLeftTerm- (preHashRotateLeftDescription argHashId nHashId)- argHashId- nHashId- describe (URotateRightTerm arg n) =- let argHashId = hashId arg- nHashId = hashId n- in DRotateRightTerm- (preHashRotateRightDescription argHashId nHashId)- argHashId- nHashId- describe (UBitCastTerm (arg :: Term a)) =- let argHashId = typeHashId arg- in DBitCastTerm (preHashBitCastDescription argHashId) argHashId- describe (UBitCastOrTerm d (arg :: Term a)) =- let dHashId = hashId d- argHashId = typeHashId arg- in DBitCastOrTerm- (preHashBitCastOrDescription dHashId argHashId)- dHashId- argHashId- describe (UBVConcatTerm (arg1 :: Term bv1) (arg2 :: Term bv2)) =- let arg1HashId = typeHashId arg1- arg2HashId = typeHashId arg2- in DBVConcatTerm- (preHashBVConcatDescription arg1HashId arg2HashId)- arg1HashId- arg2HashId- describe (UBVSelectTerm (ix :: Proxy ix) _ (arg :: Term arg)) =- let ixFingerprint = typeRepFingerprint $ someTypeRep ix- argHashId = typeHashId arg- in DBVSelectTerm- (preHashBVSelectDescription ixFingerprint argHashId)- ixFingerprint- argHashId- describe (UBVExtendTerm signed (n :: Proxy n) (arg :: Term arg)) =- let argHashId = typeHashId arg- in DBVExtendTerm- (preHashBVExtendDescription signed argHashId)- signed- n- argHashId- describe (UApplyTerm (f :: Term f) (arg :: Term a)) =- let fHashId = typeHashId f- argHashId = typeHashId arg- in DApplyTerm- (preHashApplyDescription fHashId argHashId)- fHashId- argHashId- describe (UDivIntegralTerm arg1 arg2) =- let arg1HashId = hashId arg1- arg2HashId = hashId arg2- in DDivIntegralTerm- (preHashDivIntegralDescription arg1HashId arg2HashId)- arg1HashId- arg2HashId- describe (UModIntegralTerm arg1 arg2) =- let arg1HashId = hashId arg1- arg2HashId = hashId arg2- in DModIntegralTerm- (preHashModIntegralDescription arg1HashId arg2HashId)- arg1HashId- arg2HashId- describe (UQuotIntegralTerm arg1 arg2) =- let arg1HashId = hashId arg1- arg2HashId = hashId arg2- in DQuotIntegralTerm- (preHashQuotIntegralDescription arg1HashId arg2HashId)- arg1HashId- arg2HashId- describe (URemIntegralTerm arg1 arg2) =- let arg1HashId = hashId arg1- arg2HashId = hashId arg2- in DRemIntegralTerm- (preHashRemIntegralDescription arg1HashId arg2HashId)- arg1HashId- arg2HashId- describe (UFPTraitTerm trait (arg :: Term arg)) =- let argHashId = typeHashId arg- in DFPTraitTerm- (preHashFPTraitDescription trait argHashId)- trait- argHashId- describe (UFdivTerm arg1 arg2) =- let arg1HashId = hashId arg1- arg2HashId = hashId arg2- in DFdivTerm- (preHashFdivDescription arg1HashId arg2HashId)- arg1HashId- arg2HashId- describe (URecipTerm arg) =- let argHashId = hashId arg- in DRecipTerm (preHashRecipDescription argHashId) argHashId- describe (UFloatingUnaryTerm op arg) =- let argHashId = hashId arg- in DFloatingUnaryTerm- (preHashFloatingUnaryDescription op argHashId)- op- argHashId- describe (UPowerTerm arg1 arg2) =- let arg1HashId = hashId arg1- arg2HashId = hashId arg2- in DPowerTerm- (preHashPowerDescription arg1HashId arg2HashId)- arg1HashId- arg2HashId- describe (UFPUnaryTerm op arg) =- let argHashId = hashId arg- in DFPUnaryTerm- (preHashFPUnaryDescription op argHashId)- op- argHashId- describe (UFPBinaryTerm op arg1 arg2) =- let arg1HashId = hashId arg1- arg2HashId = hashId arg2- in DFPBinaryTerm- (preHashFPBinaryDescription op arg1HashId arg2HashId)- op- arg1HashId- arg2HashId- describe (UFPRoundingUnaryTerm op mode arg) =- let modeHashId = hashId mode- argHashId = hashId arg- in DFPRoundingUnaryTerm- (preHashFPRoundingUnaryDescription op modeHashId argHashId)- op- modeHashId- argHashId- describe (UFPRoundingBinaryTerm op mode arg1 arg2) =- let modeHashId = hashId mode- arg1HashId = hashId arg1- arg2HashId = hashId arg2- in DFPRoundingBinaryTerm- ( preHashFPRoundingBinaryDescription- op- modeHashId- arg1HashId- arg2HashId- )- op- modeHashId- arg1HashId- arg2HashId- describe (UFPFMATerm mode arg1 arg2 arg3) =- let modeHashId = hashId mode- arg1HashId = hashId arg1- arg2HashId = hashId arg2- arg3HashId = hashId arg3- in DFPFMATerm- (preHashFPFMADescription modeHashId arg1HashId arg2HashId arg3HashId)- modeHashId- arg1HashId- arg2HashId- arg3HashId- describe (UFromIntegralTerm (arg :: Term a)) =- let argHashId = typeHashId arg- in DFromIntegralTerm (preHashFromIntegralDescription argHashId) argHashId- describe (UFromFPOrTerm d mode (arg :: Term a)) =- let dHashId = hashId d- modeHashId = hashId mode- argHashId = typeHashId arg- in DFromFPOrTerm- (preHashFromFPOrDescription dHashId modeHashId argHashId)- dHashId- modeHashId- argHashId- describe (UToFPTerm mode (arg :: Term a) _ _) =- let modeHashId = hashId mode- argHashId = typeHashId arg- in DToFPTerm- (preHashToFPTermDescription modeHashId argHashId)- modeHashId- argHashId-- -- {-# INLINE describe #-}-- identify tid ha i ident = go- where- go (UConTerm v) = goPhantomCon tid ha i ident getPhantomDict v- go (USymTerm v) = SymTerm tid ha i ident v- go (UForallTerm sym arg) = ForallTerm tid ha i ident sym arg- go (UExistsTerm sym arg) = ExistsTerm tid ha i ident sym arg- go (UNotTerm arg) = NotTerm tid ha i ident arg- go (UOrTerm arg1 arg2) = OrTerm tid ha i ident arg1 arg2- go (UAndTerm arg1 arg2) = AndTerm tid ha i ident arg1 arg2- go (UEqTerm arg1 arg2) = EqTerm tid ha i ident arg1 arg2- go (UDistinctTerm args) = DistinctTerm tid ha i ident args- -- ITE is propagated- go (UITETerm cond l r) = ITETerm tid ha i ident cond l r- go (UAddNumTerm arg1 arg2) = AddNumTerm tid ha i ident arg1 arg2- go (UNegNumTerm arg) = NegNumTerm tid ha i ident arg- go (UMulNumTerm arg1 arg2) = MulNumTerm tid ha i ident arg1 arg2- go (UAbsNumTerm arg) = AbsNumTerm tid ha i ident arg- go (USignumNumTerm arg) = SignumNumTerm tid ha i ident arg- go (ULtOrdTerm arg1 arg2) = LtOrdTerm tid ha i ident arg1 arg2- go (ULeOrdTerm arg1 arg2) = LeOrdTerm tid ha i ident arg1 arg2- go (UAndBitsTerm arg1 arg2) = AndBitsTerm tid ha i ident arg1 arg2- go (UOrBitsTerm arg1 arg2) = OrBitsTerm tid ha i ident arg1 arg2- go (UXorBitsTerm arg1 arg2) = XorBitsTerm tid ha i ident arg1 arg2- go (UComplementBitsTerm arg) = ComplementBitsTerm tid ha i ident arg- go (UShiftLeftTerm arg n) = ShiftLeftTerm tid ha i ident arg n- go (UShiftRightTerm arg n) = ShiftRightTerm tid ha i ident arg n- go (URotateLeftTerm arg n) = RotateLeftTerm tid ha i ident arg n- go (URotateRightTerm arg n) = RotateRightTerm tid ha i ident arg n- go (UBitCastTerm arg) = goPhantomBitCast tid ha i ident getPhantomDict arg- go (UBitCastOrTerm d arg) = BitCastOrTerm tid ha i ident d arg- go (UBVConcatTerm arg1 arg2) =- goPhantomBVConcat tid ha i ident getPhantomDict arg1 arg2- go (UBVSelectTerm ix w arg) =- goPhantomBVSelect tid ha i ident getPhantomDict ix w arg- go (UBVExtendTerm signed n arg) =- goPhantomBVExtend tid ha i ident getPhantomDict signed n arg- go (UApplyTerm f arg) = goPhantomApply tid ha i ident getPhantomDict f arg- go (UDivIntegralTerm arg1 arg2) = DivIntegralTerm tid ha i ident arg1 arg2- go (UModIntegralTerm arg1 arg2) = ModIntegralTerm tid ha i ident arg1 arg2- go (UQuotIntegralTerm arg1 arg2) = QuotIntegralTerm tid ha i ident arg1 arg2- go (URemIntegralTerm arg1 arg2) = RemIntegralTerm tid ha i ident arg1 arg2- go (UFPTraitTerm trait arg) =- goPhantomFPTrait tid ha i ident getPhantomDict trait arg- go (UFdivTerm arg1 arg2) = FdivTerm tid ha i ident arg1 arg2- go (URecipTerm arg) = RecipTerm tid ha i ident arg- go (UFloatingUnaryTerm op arg) = FloatingUnaryTerm tid ha i ident op arg- go (UPowerTerm arg1 arg2) = PowerTerm tid ha i ident arg1 arg2- go (UFPUnaryTerm op arg) = goPhantomFPUnary tid ha i ident getPhantomDict op arg- go (UFPBinaryTerm op arg1 arg2) =- goPhantomFPBinary tid ha i ident getPhantomDict op arg1 arg2- go (UFPRoundingUnaryTerm op mode arg) =- goPhantomFPRoundingUnary tid ha i ident getPhantomDict op mode arg- go (UFPRoundingBinaryTerm op mode arg1 arg2) =- goPhantomFPRoundingBinary tid ha i ident getPhantomDict op mode arg1 arg2- go (UFPFMATerm mode arg1 arg2 arg3) =- goPhantomFPFMA tid ha i ident getPhantomDict mode arg1 arg2 arg3- go (UFromIntegralTerm arg) =- goPhantomFromIntegral tid ha i ident getPhantomDict arg- go (UFromFPOrTerm d mode arg) = FromFPOrTerm tid ha i ident d mode arg- go (UToFPTerm mode arg _ _) =- goPhantomToFP tid ha i ident getPhantomDict mode arg- {-# INLINE go #-}-- -- {-# INLINE identify #-}- threadId = termThreadId- {-# INLINE threadId #-}-- descriptionDigest (DConTerm _ h _) = h- descriptionDigest (DSymTerm h _) = h- descriptionDigest (DForallTerm h _ _) = h- descriptionDigest (DExistsTerm h _ _) = h- descriptionDigest (DNotTerm h _) = h- descriptionDigest (DOrTerm h _ _) = h- descriptionDigest (DAndTerm h _ _) = h- descriptionDigest (DEqTerm h _ _ _) = h- descriptionDigest (DDistinctTerm h _ _) = h- descriptionDigest (DITETerm h _ _ _) = h- descriptionDigest (DAddNumTerm h _ _) = h- descriptionDigest (DNegNumTerm h _) = h- descriptionDigest (DMulNumTerm h _ _) = h- descriptionDigest (DAbsNumTerm h _) = h- descriptionDigest (DSignumNumTerm h _) = h- descriptionDigest (DLtOrdTerm h _ _ _) = h- descriptionDigest (DLeOrdTerm h _ _ _) = h- descriptionDigest (DAndBitsTerm h _ _) = h- descriptionDigest (DOrBitsTerm h _ _) = h- descriptionDigest (DXorBitsTerm h _ _) = h- descriptionDigest (DComplementBitsTerm h _) = h- descriptionDigest (DShiftLeftTerm h _ _) = h- descriptionDigest (DShiftRightTerm h _ _) = h- descriptionDigest (DRotateLeftTerm h _ _) = h- descriptionDigest (DRotateRightTerm h _ _) = h- descriptionDigest (DBitCastTerm h _) = h- descriptionDigest (DBitCastOrTerm h _ _) = h- descriptionDigest (DBVConcatTerm h _ _) = h- descriptionDigest (DBVSelectTerm h _ _) = h- descriptionDigest (DBVExtendTerm h _ _ _) = h- descriptionDigest (DDivIntegralTerm h _ _) = h- descriptionDigest (DModIntegralTerm h _ _) = h- descriptionDigest (DQuotIntegralTerm h _ _) = h- descriptionDigest (DRemIntegralTerm h _ _) = h- descriptionDigest (DApplyTerm h _ _) = h- descriptionDigest (DFPTraitTerm h _ _) = h- descriptionDigest (DFdivTerm h _ _) = h- descriptionDigest (DRecipTerm h _) = h- descriptionDigest (DFloatingUnaryTerm h _ _) = h- descriptionDigest (DPowerTerm h _ _) = h- descriptionDigest (DFPUnaryTerm h _ _) = h- descriptionDigest (DFPBinaryTerm h _ _ _) = h- descriptionDigest (DFPRoundingUnaryTerm h _ _ _) = h- descriptionDigest (DFPRoundingBinaryTerm h _ _ _ _) = h- descriptionDigest (DFPFMATerm h _ _ _ _) = h- descriptionDigest (DFromIntegralTerm h _) = h- descriptionDigest (DFromFPOrTerm h _ _ _) = h- descriptionDigest (DToFPTerm h _ _) = h---- {-# INLINE descriptionDigest #-}-{-# NOINLINE goPhantomCon #-}-goPhantomCon ::- WeakThreadId ->- Digest ->- Id ->- Ident ->- PhantomDict t ->- t ->- Term t-goPhantomCon tid ha i ident PhantomDict v = ConTerm tid ha i ident v--{-# NOINLINE goPhantomBitCast #-}-goPhantomBitCast ::- (PEvalBitCastTerm a t) =>- WeakThreadId ->- Digest ->- Id ->- Ident ->- PhantomDict t ->- Term a ->- Term t-goPhantomBitCast tid ha i ident PhantomDict arg = BitCastTerm tid ha i ident arg--{-# NOINLINE goPhantomBVConcat #-}-goPhantomBVConcat ::- ( PEvalBVTerm bv,- KnownNat l,- KnownNat r,- KnownNat (l + r),- 1 <= l,- 1 <= r,- 1 <= l + r- ) =>- WeakThreadId ->- Digest ->- Id ->- Ident ->- PhantomDict (bv (l + r)) ->- Term (bv l) ->- Term (bv r) ->- Term (bv (l + r))-goPhantomBVConcat tid ha i ident PhantomDict arg1 arg2 =- BVConcatTerm tid ha i ident arg1 arg2--{-# NOINLINE goPhantomBVSelect #-}-goPhantomBVSelect ::- ( PEvalBVTerm bv,- KnownNat n,- KnownNat ix,- KnownNat w,- 1 <= n,- 1 <= w,- ix + w <= n- ) =>- WeakThreadId ->- Digest ->- Id ->- Ident ->- PhantomDict (bv w) ->- Proxy ix ->- Proxy w ->- Term (bv n) ->- Term (bv w)-goPhantomBVSelect tid ha i ident PhantomDict ix w arg =- BVSelectTerm tid ha i ident ix w arg--{-# NOINLINE goPhantomBVExtend #-}-goPhantomBVExtend ::- ( PEvalBVTerm bv,- KnownNat l,- KnownNat r,- 1 <= l,- 1 <= r,- l <= r- ) =>- WeakThreadId ->- Digest ->- Id ->- Ident ->- PhantomDict (bv r) ->- Bool ->- Proxy r ->- Term (bv l) ->- Term (bv r)-goPhantomBVExtend tid ha i ident PhantomDict signed n arg =- BVExtendTerm tid ha i ident signed n arg--{-# NOINLINE goPhantomApply #-}-goPhantomApply ::- (PEvalApplyTerm f a t) =>- WeakThreadId ->- Digest ->- Id ->- Ident ->- PhantomDict t ->- Term f ->- Term a ->- Term t-goPhantomApply tid ha i ident PhantomDict f arg = ApplyTerm tid ha i ident f arg--{-# NOINLINE goPhantomFPTrait #-}-goPhantomFPTrait ::- (ValidFP eb sb) =>- WeakThreadId ->- Digest ->- Id ->- Ident ->- PhantomDict (FP eb sb) ->- FPTrait ->- Term (FP eb sb) ->- Term Bool-goPhantomFPTrait tid ha i ident PhantomDict trait arg = FPTraitTerm tid ha i ident trait arg--{-# NOINLINE goPhantomFPUnary #-}-goPhantomFPUnary ::- (ValidFP eb sb) =>- WeakThreadId ->- Digest ->- Id ->- Ident ->- PhantomDict (FP eb sb) ->- FPUnaryOp ->- Term (FP eb sb) ->- Term (FP eb sb)-goPhantomFPUnary tid ha i ident PhantomDict op arg = FPUnaryTerm tid ha i ident op arg--{-# NOINLINE goPhantomFPBinary #-}-goPhantomFPBinary ::- (ValidFP eb sb) =>- WeakThreadId ->- Digest ->- Id ->- Ident ->- PhantomDict (FP eb sb) ->- FPBinaryOp ->- Term (FP eb sb) ->- Term (FP eb sb) ->- Term (FP eb sb)-goPhantomFPBinary tid ha i ident PhantomDict op arg1 arg2 =- FPBinaryTerm tid ha i ident op arg1 arg2--{-# NOINLINE goPhantomFPRoundingUnary #-}-goPhantomFPRoundingUnary ::- (ValidFP eb sb) =>- WeakThreadId ->- Digest ->- Id ->- Ident ->- PhantomDict (FP eb sb) ->- FPRoundingUnaryOp ->- Term FPRoundingMode ->- Term (FP eb sb) ->- Term (FP eb sb)-goPhantomFPRoundingUnary tid ha i ident PhantomDict op mode arg =- FPRoundingUnaryTerm tid ha i ident op mode arg--{-# NOINLINE goPhantomFPRoundingBinary #-}-goPhantomFPRoundingBinary ::- (ValidFP eb sb) =>- WeakThreadId ->- Digest ->- Id ->- Ident ->- PhantomDict (FP eb sb) ->- FPRoundingBinaryOp ->- Term FPRoundingMode ->- Term (FP eb sb) ->- Term (FP eb sb) ->- Term (FP eb sb)-goPhantomFPRoundingBinary tid ha i ident PhantomDict op mode arg1 arg2 =- FPRoundingBinaryTerm tid ha i ident op mode arg1 arg2--{-# NOINLINE goPhantomFPFMA #-}-goPhantomFPFMA ::- (ValidFP eb sb) =>- WeakThreadId ->- Digest ->- Id ->- Ident ->- PhantomDict (FP eb sb) ->- Term FPRoundingMode ->- Term (FP eb sb) ->- Term (FP eb sb) ->- Term (FP eb sb) ->- Term (FP eb sb)-goPhantomFPFMA tid ha i ident PhantomDict mode arg1 arg2 arg3 =- FPFMATerm tid ha i ident mode arg1 arg2 arg3--{-# NOINLINE goPhantomFromIntegral #-}-goPhantomFromIntegral ::- (PEvalFromIntegralTerm a b) =>- WeakThreadId ->- Digest ->- Id ->- Ident ->- PhantomDict b ->- Term a ->- Term b-goPhantomFromIntegral tid ha i ident PhantomDict arg = FromIntegralTerm tid ha i ident arg--{-# NOINLINE goPhantomToFP #-}-goPhantomToFP ::- forall a eb sb.- (ValidFP eb sb, PEvalIEEEFPConvertibleTerm a) =>- WeakThreadId ->- Digest ->- Id ->- Ident ->- PhantomDict (FP eb sb) ->- Term FPRoundingMode ->- Term a ->- Term (FP eb sb)-goPhantomToFP tid ha i ident PhantomDict mode arg =- ToFPTerm tid ha i ident mode arg (Proxy @eb) (Proxy @sb)--termThreadId :: Term t -> WeakThreadId-termThreadId (ConTerm tid _ _ _ _) = tid-termThreadId (SymTerm tid _ _ _ _) = tid-termThreadId (ForallTerm tid _ _ _ _ _) = tid-termThreadId (ExistsTerm tid _ _ _ _ _) = tid-termThreadId (NotTerm tid _ _ _ _) = tid-termThreadId (OrTerm tid _ _ _ _ _) = tid-termThreadId (AndTerm tid _ _ _ _ _) = tid-termThreadId (EqTerm tid _ _ _ _ _) = tid-termThreadId (DistinctTerm tid _ _ _ _) = tid-termThreadId (ITETerm tid _ _ _ _ _ _) = tid-termThreadId (AddNumTerm tid _ _ _ _ _) = tid-termThreadId (NegNumTerm tid _ _ _ _) = tid-termThreadId (MulNumTerm tid _ _ _ _ _) = tid-termThreadId (AbsNumTerm tid _ _ _ _) = tid-termThreadId (SignumNumTerm tid _ _ _ _) = tid-termThreadId (LtOrdTerm tid _ _ _ _ _) = tid-termThreadId (LeOrdTerm tid _ _ _ _ _) = tid-termThreadId (AndBitsTerm tid _ _ _ _ _) = tid-termThreadId (OrBitsTerm tid _ _ _ _ _) = tid-termThreadId (XorBitsTerm tid _ _ _ _ _) = tid-termThreadId (ComplementBitsTerm tid _ _ _ _) = tid-termThreadId (ShiftLeftTerm tid _ _ _ _ _) = tid-termThreadId (ShiftRightTerm tid _ _ _ _ _) = tid-termThreadId (RotateLeftTerm tid _ _ _ _ _) = tid-termThreadId (RotateRightTerm tid _ _ _ _ _) = tid-termThreadId (BitCastTerm tid _ _ _ _) = tid-termThreadId (BitCastOrTerm tid _ _ _ _ _) = tid-termThreadId (BVConcatTerm tid _ _ _ _ _) = tid-termThreadId (BVSelectTerm tid _ _ _ _ _ _) = tid-termThreadId (BVExtendTerm tid _ _ _ _ _ _) = tid-termThreadId (ApplyTerm tid _ _ _ _ _) = tid-termThreadId (DivIntegralTerm tid _ _ _ _ _) = tid-termThreadId (ModIntegralTerm tid _ _ _ _ _) = tid-termThreadId (QuotIntegralTerm tid _ _ _ _ _) = tid-termThreadId (RemIntegralTerm tid _ _ _ _ _) = tid-termThreadId (FPTraitTerm tid _ _ _ _ _) = tid-termThreadId (FdivTerm tid _ _ _ _ _) = tid-termThreadId (RecipTerm tid _ _ _ _) = tid-termThreadId (FloatingUnaryTerm tid _ _ _ _ _) = tid-termThreadId (PowerTerm tid _ _ _ _ _) = tid-termThreadId (FPUnaryTerm tid _ _ _ _ _) = tid-termThreadId (FPBinaryTerm tid _ _ _ _ _ _) = tid-termThreadId (FPRoundingUnaryTerm tid _ _ _ _ _ _) = tid-termThreadId (FPRoundingBinaryTerm tid _ _ _ _ _ _ _) = tid-termThreadId (FPFMATerm tid _ _ _ _ _ _ _) = tid-termThreadId (FromIntegralTerm tid _ _ _ _) = tid-termThreadId (FromFPOrTerm tid _ _ _ _ _ _) = tid-termThreadId (ToFPTerm tid _ _ _ _ _ _ _) = tid---- {-# INLINE termThreadId #-}--instance Eq (Description (Term t)) where- DConTerm eqFunc _ l == DConTerm _ _ r =- eqFunc l r- DSymTerm _ ls == DSymTerm _ rs = ls == rs- DForallTerm _ ls li == DForallTerm _ rs ri =- eqHeteroSymbol ls rs && eqHashId li ri- DExistsTerm _ ls li == DExistsTerm _ rs ri =- eqHeteroSymbol ls rs && eqHashId li ri- DNotTerm _ li == DNotTerm _ ri = eqHashId li ri- DOrTerm _ li1 li2 == DOrTerm _ ri1 ri2 = eqHashId li1 ri1 && eqHashId li2 ri2- DAndTerm _ li1 li2 == DAndTerm _ ri1 ri2 = eqHashId li1 ri1 && eqHashId li2 ri2- DEqTerm _ lfp li1 li2 == DEqTerm _ rfp ri1 ri2 = lfp == rfp && eqHashId li1 ri1 && eqHashId li2 ri2- DDistinctTerm _ lfp li == DDistinctTerm _ rfp ri =- lfp == rfp- && length li == length ri- && and (zipWith eqHashId (toList li) (toList ri))- DITETerm _ lc li1 li2 == DITETerm _ rc ri1 ri2 = eqHashId lc rc && eqHashId li1 ri1 && eqHashId li2 ri2- DAddNumTerm _ li1 li2 == DAddNumTerm _ ri1 ri2 = eqHashId li1 ri1 && eqHashId li2 ri2- DNegNumTerm _ li == DNegNumTerm _ ri = eqHashId li ri- DMulNumTerm _ li1 li2 == DMulNumTerm _ ri1 ri2 = eqHashId li1 ri1 && eqHashId li2 ri2- DAbsNumTerm _ li == DAbsNumTerm _ ri = eqHashId li ri- DSignumNumTerm _ li == DSignumNumTerm _ ri = eqHashId li ri- DLtOrdTerm _ lrep li1 li2 == DLtOrdTerm _ rrep ri1 ri2 = lrep == rrep && eqHashId li1 ri1 && eqHashId li2 ri2- DLeOrdTerm _ lrep li1 li2 == DLeOrdTerm _ rrep ri1 ri2 = lrep == rrep && eqHashId li1 ri1 && eqHashId li2 ri2- DAndBitsTerm _ li1 li2 == DAndBitsTerm _ ri1 ri2 = eqHashId li1 ri1 && eqHashId li2 ri2- DOrBitsTerm _ li1 li2 == DOrBitsTerm _ ri1 ri2 = eqHashId li1 ri1 && eqHashId li2 ri2- DXorBitsTerm _ li1 li2 == DXorBitsTerm _ ri1 ri2 = eqHashId li1 ri1 && eqHashId li2 ri2- DComplementBitsTerm _ li == DComplementBitsTerm _ ri = eqHashId li ri- DShiftLeftTerm _ li ln == DShiftLeftTerm _ ri rn = eqHashId li ri && eqHashId ln rn- DShiftRightTerm _ li ln == DShiftRightTerm _ ri rn = eqHashId li ri && eqHashId ln rn- DRotateLeftTerm _ li ln == DRotateLeftTerm _ ri rn = eqHashId li ri && eqHashId ln rn- DRotateRightTerm _ li ln == DRotateRightTerm _ ri rn = eqHashId li ri && eqHashId ln rn- DBitCastTerm _ li == DBitCastTerm _ ri = li == ri- DBitCastOrTerm _ ld li == DBitCastOrTerm _ rd ri = ld == rd && li == ri- DBVConcatTerm _ li1 li2 == DBVConcatTerm _ ri1 ri2 = li1 == ri1 && li2 == ri2- DBVSelectTerm _ lix li == DBVSelectTerm _ rix ri =- lix == rix && li == ri- DBVExtendTerm _ lIsSigned _ li == DBVExtendTerm _ rIsSigned _ ri =- lIsSigned == rIsSigned- && li == ri- DApplyTerm _ lf li == DApplyTerm _ rf ri = lf == rf && li == ri- DDivIntegralTerm _ li1 li2 == DDivIntegralTerm _ ri1 ri2 = eqHashId li1 ri1 && eqHashId li2 ri2- DModIntegralTerm _ li1 li2 == DModIntegralTerm _ ri1 ri2 = eqHashId li1 ri1 && eqHashId li2 ri2- DQuotIntegralTerm _ li1 li2 == DQuotIntegralTerm _ ri1 ri2 = eqHashId li1 ri1 && eqHashId li2 ri2- DRemIntegralTerm _ li1 li2 == DRemIntegralTerm _ ri1 ri2 = eqHashId li1 ri1 && eqHashId li2 ri2- DFPTraitTerm _ lt li == DFPTraitTerm _ rt ri = lt == rt && li == ri- DFdivTerm _ li1 li2 == DFdivTerm _ ri1 ri2 = eqHashId li1 ri1 && eqHashId li2 ri2- DRecipTerm _ li == DRecipTerm _ ri = eqHashId li ri- DFloatingUnaryTerm _ lop li == DFloatingUnaryTerm _ rop ri = lop == rop && eqHashId li ri- DPowerTerm _ li1 li2 == DPowerTerm _ ri1 ri2 = eqHashId li1 ri1 && eqHashId li2 ri2- DFPUnaryTerm _ lop li == DFPUnaryTerm _ rop ri = lop == rop && eqHashId li ri- DFPBinaryTerm _ lop li1 li2 == DFPBinaryTerm _ rop ri1 ri2 = lop == rop && eqHashId li1 ri1 && eqHashId li2 ri2- DFPRoundingUnaryTerm _ lop lmode li == DFPRoundingUnaryTerm _ rop rmode ri =- lop == rop && eqHashId lmode rmode && eqHashId li ri- DFPRoundingBinaryTerm _ lop lmode li1 li2 == DFPRoundingBinaryTerm _ rop rmode ri1 ri2 =- lop == rop && eqHashId lmode rmode && eqHashId li1 ri1 && eqHashId li2 ri2- DFPFMATerm _ lmode li1 li2 li3 == DFPFMATerm _ rmode ri1 ri2 ri3 =- eqHashId lmode rmode && eqHashId li1 ri1 && eqHashId li2 ri2 && eqHashId li3 ri3- DFromIntegralTerm _ li == DFromIntegralTerm _ ri = li == ri- DFromFPOrTerm _ ld li lai == DFromFPOrTerm _ rd ri rai = eqHashId ld rd && eqHashId li ri && lai == rai- DToFPTerm _ li lai == DToFPTerm _ ri rai = eqHashId li ri && lai == rai- _ == _ = False---- {-# INLINE (==) #-}--instance Hashable (Description (Term t)) where- hashWithSalt s = hashWithSalt s . descriptionDigest- {-# INLINE hashWithSalt #-}--fullReconstructTerm1 ::- forall a b.- (Term a -> IO (Term b)) ->- Term a ->- IO (Term b)-fullReconstructTerm1 f x = fullReconstructTerm x >>= f-{-# INLINE fullReconstructTerm1 #-}--fullReconstructTerm2 ::- forall a b c.- (Term a -> Term b -> IO (Term c)) ->- Term a ->- Term b ->- IO (Term c)-fullReconstructTerm2 f x y = do- rx <- fullReconstructTerm x- ry <- fullReconstructTerm y- f rx ry-{-# INLINE fullReconstructTerm2 #-}--fullReconstructTerm3 ::- forall a b c d.- (Term a -> Term b -> Term c -> IO (Term d)) ->- Term a ->- Term b ->- Term c ->- IO (Term d)-fullReconstructTerm3 f x y z = do- rx <- fullReconstructTerm x- ry <- fullReconstructTerm y- rz <- fullReconstructTerm z- f rx ry rz-{-# INLINE fullReconstructTerm3 #-}--fullReconstructTerm :: forall t. Term t -> IO (Term t)-fullReconstructTerm (ConTerm _ _ _ _ i) = curThreadConTerm i-fullReconstructTerm (SymTerm _ _ _ _ sym) = curThreadSymTerm sym-fullReconstructTerm (ForallTerm _ _ _ _ sym arg) =- fullReconstructTerm1 (curThreadForallTerm sym) arg-fullReconstructTerm (ExistsTerm _ _ _ _ sym arg) =- fullReconstructTerm1 (curThreadExistsTerm sym) arg-fullReconstructTerm (NotTerm _ _ _ _ arg) =- fullReconstructTerm1 curThreadNotTerm arg-fullReconstructTerm (OrTerm _ _ _ _ arg1 arg2) =- fullReconstructTerm2 curThreadOrTerm arg1 arg2-fullReconstructTerm (AndTerm _ _ _ _ arg1 arg2) =- fullReconstructTerm2 curThreadAndTerm arg1 arg2-fullReconstructTerm (EqTerm _ _ _ _ arg1 arg2) =- fullReconstructTerm2 curThreadEqTerm arg1 arg2-fullReconstructTerm (DistinctTerm _ _ _ _ args) =- traverse fullReconstructTerm args >>= curThreadDistinctTerm-fullReconstructTerm (ITETerm _ _ _ _ cond arg1 arg2) =- fullReconstructTerm3 curThreadIteTerm cond arg1 arg2-fullReconstructTerm (AddNumTerm _ _ _ _ arg1 arg2) =- fullReconstructTerm2 curThreadAddNumTerm arg1 arg2-fullReconstructTerm (NegNumTerm _ _ _ _ arg) =- fullReconstructTerm1 curThreadNegNumTerm arg-fullReconstructTerm (MulNumTerm _ _ _ _ arg1 arg2) =- fullReconstructTerm2 curThreadMulNumTerm arg1 arg2-fullReconstructTerm (AbsNumTerm _ _ _ _ arg) =- fullReconstructTerm1 curThreadAbsNumTerm arg-fullReconstructTerm (SignumNumTerm _ _ _ _ arg) =- fullReconstructTerm1 curThreadSignumNumTerm arg-fullReconstructTerm (LtOrdTerm _ _ _ _ arg1 arg2) =- fullReconstructTerm2 curThreadLtOrdTerm arg1 arg2-fullReconstructTerm (LeOrdTerm _ _ _ _ arg1 arg2) =- fullReconstructTerm2 curThreadLeOrdTerm arg1 arg2-fullReconstructTerm (AndBitsTerm _ _ _ _ arg1 arg2) =- fullReconstructTerm2 curThreadAndBitsTerm arg1 arg2-fullReconstructTerm (OrBitsTerm _ _ _ _ arg1 arg2) =- fullReconstructTerm2 curThreadOrBitsTerm arg1 arg2-fullReconstructTerm (XorBitsTerm _ _ _ _ arg1 arg2) =- fullReconstructTerm2 curThreadXorBitsTerm arg1 arg2-fullReconstructTerm (ComplementBitsTerm _ _ _ _ arg) =- fullReconstructTerm1 curThreadComplementBitsTerm arg-fullReconstructTerm (ShiftLeftTerm _ _ _ _ arg n) =- fullReconstructTerm1 (curThreadShiftLeftTerm arg) n-fullReconstructTerm (ShiftRightTerm _ _ _ _ arg n) =- fullReconstructTerm1 (curThreadShiftRightTerm arg) n-fullReconstructTerm (RotateLeftTerm _ _ _ _ arg n) =- fullReconstructTerm1 (curThreadRotateLeftTerm arg) n-fullReconstructTerm (RotateRightTerm _ _ _ _ arg n) =- fullReconstructTerm1 (curThreadRotateRightTerm arg) n-fullReconstructTerm (BitCastTerm _ _ _ _ v) =- fullReconstructTerm1 curThreadBitCastTerm v-fullReconstructTerm (BitCastOrTerm _ _ _ _ d v) =- fullReconstructTerm2 curThreadBitCastOrTerm d v-fullReconstructTerm (BVConcatTerm _ _ _ _ arg1 arg2) =- fullReconstructTerm2 curThreadBVConcatTerm arg1 arg2-fullReconstructTerm (BVSelectTerm _ _ _ _ (_ :: Proxy ix) (_ :: Proxy w) arg) =- fullReconstructTerm1 (curThreadBVSelectTerm (Proxy @ix) (Proxy @w)) arg-fullReconstructTerm (BVExtendTerm _ _ _ _ signed p arg) =- fullReconstructTerm1 (curThreadBVExtendTerm signed p) arg-fullReconstructTerm (ApplyTerm _ _ _ _ f arg) =- fullReconstructTerm2 curThreadApplyTerm f arg-fullReconstructTerm (DivIntegralTerm _ _ _ _ arg1 arg2) =- fullReconstructTerm2 curThreadDivIntegralTerm arg1 arg2-fullReconstructTerm (ModIntegralTerm _ _ _ _ arg1 arg2) =- fullReconstructTerm2 curThreadModIntegralTerm arg1 arg2-fullReconstructTerm (QuotIntegralTerm _ _ _ _ arg1 arg2) =- fullReconstructTerm2 curThreadQuotIntegralTerm arg1 arg2-fullReconstructTerm (RemIntegralTerm _ _ _ _ arg1 arg2) =- fullReconstructTerm2 curThreadRemIntegralTerm arg1 arg2-fullReconstructTerm (FPTraitTerm _ _ _ _ trait arg) =- fullReconstructTerm1 (curThreadFpTraitTerm trait) arg-fullReconstructTerm (FdivTerm _ _ _ _ arg1 arg2) =- fullReconstructTerm2 curThreadFdivTerm arg1 arg2-fullReconstructTerm (RecipTerm _ _ _ _ arg) =- fullReconstructTerm1 curThreadRecipTerm arg-fullReconstructTerm (FloatingUnaryTerm _ _ _ _ op arg) =- fullReconstructTerm1 (curThreadFloatingUnaryTerm op) arg-fullReconstructTerm (PowerTerm _ _ _ _ arg1 arg2) =- fullReconstructTerm2 curThreadPowerTerm arg1 arg2-fullReconstructTerm (FPUnaryTerm _ _ _ _ op arg) =- fullReconstructTerm1 (curThreadFpUnaryTerm op) arg-fullReconstructTerm (FPBinaryTerm _ _ _ _ op arg1 arg2) =- fullReconstructTerm2 (curThreadFpBinaryTerm op) arg1 arg2-fullReconstructTerm (FPRoundingUnaryTerm _ _ _ _ op mode arg) =- introSupportedPrimConstraint mode $- fullReconstructTerm2 (curThreadFpRoundingUnaryTerm op) mode arg-fullReconstructTerm (FPRoundingBinaryTerm _ _ _ _ op mode arg1 arg2) =- introSupportedPrimConstraint mode $- fullReconstructTerm3 (curThreadFpRoundingBinaryTerm op) mode arg1 arg2-fullReconstructTerm (FPFMATerm _ _ _ _ mode arg1 arg2 arg3) =- introSupportedPrimConstraint mode $ do- rmode <- fullReconstructTerm mode- rarg1 <- fullReconstructTerm arg1- rarg2 <- fullReconstructTerm arg2- rarg3 <- fullReconstructTerm arg3- curThreadFpFMATerm rmode rarg1 rarg2 rarg3-fullReconstructTerm (FromIntegralTerm _ _ _ _ arg) =- fullReconstructTerm1 curThreadFromIntegralTerm arg-fullReconstructTerm (FromFPOrTerm _ _ _ _ d r arg) =- introSupportedPrimConstraint r $- introSupportedPrimConstraint arg $- fullReconstructTerm3 curThreadFromFPOrTerm d r arg-fullReconstructTerm (ToFPTerm _ _ _ _ r arg _ _) =- introSupportedPrimConstraint r $- fullReconstructTerm2 curThreadToFPTerm r arg--toCurThreadImpl :: forall t. WeakThreadId -> Term t -> IO (Term t)-toCurThreadImpl tid t | termThreadId t == tid = return t-toCurThreadImpl _ t = fullReconstructTerm t-{-# INLINE toCurThreadImpl #-}---- | Convert a term to the current thread.-toCurThread :: forall t. Term t -> IO (Term t)-toCurThread t = do- tid <- myWeakThreadId- toCurThreadImpl tid t-{-# INLINE toCurThread #-}---- | Construct and internalizing a 'ConTerm'.-curThreadConTerm :: forall t. (SupportedPrim t) => t -> IO (Term t)-curThreadConTerm t =- withSupportedPrimTypeable @t $- intern $- UConTerm t-{-# INLINE curThreadConTerm #-}---- | Construct and internalizing a 'SymTerm'.-curThreadSymTerm :: forall knd t. TypedSymbol knd t -> IO (Term t)-curThreadSymTerm (TypedSymbol s) =- withSupportedPrimTypeable @t $ intern $ USymTerm $ TypedSymbol s-{-# INLINE curThreadSymTerm #-}---- | Construct and internalizing a 'ForallTerm'.-curThreadForallTerm ::- TypedSymbol 'ConstantKind t ->- Term Bool ->- IO (Term Bool)-curThreadForallTerm sym arg = intern $ UForallTerm sym arg-{-# INLINE curThreadForallTerm #-}---- | Construct and internalizing a 'ExistsTerm'.-curThreadExistsTerm ::- TypedSymbol 'ConstantKind t ->- Term Bool ->- IO (Term Bool)-curThreadExistsTerm sym arg = intern $ UExistsTerm sym arg-{-# INLINE curThreadExistsTerm #-}---- | Construct and internalizing a 'SymTerm' with an identifier, using simple--- symbols.-curThreadSsymTerm :: (SupportedPrim t) => Identifier -> IO (Term t)-curThreadSsymTerm ident =- curThreadSymTerm @AnyKind $ TypedSymbol $ SimpleSymbol ident-{-# INLINE curThreadSsymTerm #-}---- | Construct and internalizing a 'SymTerm' with an identifier and an index,--- using indexed symbols.-curThreadIsymTerm :: (SupportedPrim t) => Identifier -> Int -> IO (Term t)-curThreadIsymTerm str idx =- curThreadSymTerm @AnyKind $ TypedSymbol $ IndexedSymbol str idx-{-# INLINE curThreadIsymTerm #-}---- | Construct and internalizing a 'NotTerm'.-curThreadNotTerm :: Term Bool -> IO (Term Bool)-curThreadNotTerm = intern . UNotTerm-{-# INLINE curThreadNotTerm #-}---- | Construct and internalizing a 'OrTerm'.-curThreadOrTerm :: Term Bool -> Term Bool -> IO (Term Bool)-curThreadOrTerm l r = intern $ UOrTerm l r-{-# INLINE curThreadOrTerm #-}---- | Construct and internalizing a 'AndTerm'.-curThreadAndTerm :: Term Bool -> Term Bool -> IO (Term Bool)-curThreadAndTerm l r = intern $ UAndTerm l r-{-# INLINE curThreadAndTerm #-}---- | Construct and internalizing a 'EqTerm'.-curThreadEqTerm :: Term a -> Term a -> IO (Term Bool)-curThreadEqTerm l r = intern $ UEqTerm l r-{-# INLINE curThreadEqTerm #-}---- | Construct and internalizing a 'DistinctTerm'.-curThreadDistinctTerm :: NonEmpty (Term a) -> IO (Term Bool)-curThreadDistinctTerm args = intern $ UDistinctTerm args-{-# INLINE curThreadDistinctTerm #-}---- | Construct and internalizing a 'ITETerm'.-curThreadIteTerm :: Term Bool -> Term a -> Term a -> IO (Term a)-curThreadIteTerm c l r =- introSupportedPrimConstraint l $- intern $- UITETerm c l r-{-# INLINE curThreadIteTerm #-}---- | Construct and internalizing a 'AddNumTerm'.-curThreadAddNumTerm :: (PEvalNumTerm a) => Term a -> Term a -> IO (Term a)-curThreadAddNumTerm l r =- introSupportedPrimConstraint l $ intern $ UAddNumTerm l r-{-# INLINE curThreadAddNumTerm #-}---- | Construct and internalizing a 'NegNumTerm'.-curThreadNegNumTerm :: (PEvalNumTerm a) => Term a -> IO (Term a)-curThreadNegNumTerm l = introSupportedPrimConstraint l $ intern $ UNegNumTerm l-{-# INLINE curThreadNegNumTerm #-}---- | Construct and internalizing a 'MulNumTerm'.-curThreadMulNumTerm :: (PEvalNumTerm a) => Term a -> Term a -> IO (Term a)-curThreadMulNumTerm l r =- introSupportedPrimConstraint l $ intern $ UMulNumTerm l r-{-# INLINE curThreadMulNumTerm #-}---- | Construct and internalizing a 'AbsNumTerm'.-curThreadAbsNumTerm :: (PEvalNumTerm a) => Term a -> IO (Term a)-curThreadAbsNumTerm l = introSupportedPrimConstraint l $ intern $ UAbsNumTerm l-{-# INLINE curThreadAbsNumTerm #-}---- | Construct and internalizing a 'SignumNumTerm'.-curThreadSignumNumTerm :: (PEvalNumTerm a) => Term a -> IO (Term a)-curThreadSignumNumTerm l =- introSupportedPrimConstraint l $ intern $ USignumNumTerm l-{-# INLINE curThreadSignumNumTerm #-}---- | Construct and internalizing a 'LtOrdTerm'.-curThreadLtOrdTerm :: (PEvalOrdTerm a) => Term a -> Term a -> IO (Term Bool)-curThreadLtOrdTerm l r =- introSupportedPrimConstraint l $ intern $ ULtOrdTerm l r-{-# INLINE curThreadLtOrdTerm #-}---- | Construct and internalizing a 'LeOrdTerm'.-curThreadLeOrdTerm :: (PEvalOrdTerm a) => Term a -> Term a -> IO (Term Bool)-curThreadLeOrdTerm l r =- introSupportedPrimConstraint l $ intern $ ULeOrdTerm l r-{-# INLINE curThreadLeOrdTerm #-}---- | Construct and internalizing a 'AndBitsTerm'.-curThreadAndBitsTerm :: (PEvalBitwiseTerm a) => Term a -> Term a -> IO (Term a)-curThreadAndBitsTerm l r =- introSupportedPrimConstraint l $ intern $ UAndBitsTerm l r-{-# INLINE curThreadAndBitsTerm #-}---- | Construct and internalizing a 'OrBitsTerm'.-curThreadOrBitsTerm :: (PEvalBitwiseTerm a) => Term a -> Term a -> IO (Term a)-curThreadOrBitsTerm l r =- introSupportedPrimConstraint l $ intern $ UOrBitsTerm l r-{-# INLINE curThreadOrBitsTerm #-}---- | Construct and internalizing a 'XorBitsTerm'.-curThreadXorBitsTerm :: (PEvalBitwiseTerm a) => Term a -> Term a -> IO (Term a)-curThreadXorBitsTerm l r =- introSupportedPrimConstraint l $ intern $ UXorBitsTerm l r-{-# INLINE curThreadXorBitsTerm #-}---- | Construct and internalizing a 'ComplementBitsTerm'.-curThreadComplementBitsTerm :: (PEvalBitwiseTerm a) => Term a -> IO (Term a)-curThreadComplementBitsTerm l =- introSupportedPrimConstraint l $ intern $ UComplementBitsTerm l-{-# INLINE curThreadComplementBitsTerm #-}---- | Construct and internalizing a 'ShiftLeftTerm'.-curThreadShiftLeftTerm :: (PEvalShiftTerm a) => Term a -> Term a -> IO (Term a)-curThreadShiftLeftTerm t n =- introSupportedPrimConstraint t $ intern $ UShiftLeftTerm t n-{-# INLINE curThreadShiftLeftTerm #-}---- | Construct and internalizing a 'ShiftRightTerm'.-curThreadShiftRightTerm :: (PEvalShiftTerm a) => Term a -> Term a -> IO (Term a)-curThreadShiftRightTerm t n =- introSupportedPrimConstraint t $ intern $ UShiftRightTerm t n-{-# INLINE curThreadShiftRightTerm #-}---- | Construct and internalizing a 'RotateLeftTerm'.-curThreadRotateLeftTerm ::- (PEvalRotateTerm a) => Term a -> Term a -> IO (Term a)-curThreadRotateLeftTerm t n =- introSupportedPrimConstraint t $ intern $ URotateLeftTerm t n-{-# INLINE curThreadRotateLeftTerm #-}---- | Construct and internalizing a 'RotateRightTerm'.-curThreadRotateRightTerm ::- (PEvalRotateTerm a) => Term a -> Term a -> IO (Term a)-curThreadRotateRightTerm t n =- introSupportedPrimConstraint t $ intern $ URotateRightTerm t n-{-# INLINE curThreadRotateRightTerm #-}---- | Construct and internalizing a 'BitCastTerm'.-curThreadBitCastTerm ::- forall a b.- (SupportedPrim b, PEvalBitCastTerm a b) =>- Term a ->- IO (Term b)-curThreadBitCastTerm =- withSupportedPrimTypeable @b $- intern . UBitCastTerm-{-# INLINE curThreadBitCastTerm #-}---- | Construct and internalizing a 'BitCastOrTerm'.-curThreadBitCastOrTerm ::- (PEvalBitCastOrTerm a b) =>- Term b ->- Term a ->- IO (Term b)-curThreadBitCastOrTerm d a =- introSupportedPrimConstraint d $ intern $ UBitCastOrTerm d a-{-# INLINE curThreadBitCastOrTerm #-}---- | Construct and internalizing a 'BVConcatTerm'.-curThreadBVConcatTerm ::- forall bv l r.- ( PEvalBVTerm bv,- KnownNat l,- KnownNat r,- KnownNat (l + r),- 1 <= l,- 1 <= r,- 1 <= l + r,- SupportedPrim (bv (l + r))- ) =>- Term (bv l) ->- Term (bv r) ->- IO (Term (bv (l + r)))-curThreadBVConcatTerm l r =- withSupportedPrimTypeable @(bv (l + r)) $ intern $ UBVConcatTerm l r-{-# INLINE curThreadBVConcatTerm #-}---- | Construct and internalizing a 'BVSelectTerm'.-curThreadBVSelectTerm ::- forall bv n ix w p q.- ( PEvalBVTerm bv,- KnownNat n,- KnownNat ix,- KnownNat w,- 1 <= n,- 1 <= w,- ix + w <= n,- SupportedPrim (bv w)- ) =>- p ix ->- q w ->- Term (bv n) ->- IO (Term (bv w))-curThreadBVSelectTerm _ _ v =- withSupportedPrimTypeable @(bv w) $- intern $- UBVSelectTerm (Proxy @ix) (Proxy @w) v-{-# INLINE curThreadBVSelectTerm #-}---- | Construct and internalizing a 'BVExtendTerm'.-curThreadBVExtendTerm ::- forall bv l r proxy.- ( PEvalBVTerm bv,- KnownNat l,- KnownNat r,- 1 <= l,- 1 <= r,- l <= r,- SupportedPrim (bv r)- ) =>- Bool ->- proxy r ->- Term (bv l) ->- IO (Term (bv r))-curThreadBVExtendTerm signed _ v =- withSupportedPrimTypeable @(bv r) $- intern $- UBVExtendTerm signed (Proxy @r) v-{-# INLINE curThreadBVExtendTerm #-}---- | Construct and internalizing a 'BVExtendTerm' with sign extension.-curThreadBvsignExtendTerm ::- forall bv l r proxy.- ( PEvalBVTerm bv,- KnownNat l,- KnownNat r,- 1 <= l,- 1 <= r,- l <= r,- SupportedPrim (bv r)- ) =>- proxy r ->- Term (bv l) ->- IO (Term (bv r))-curThreadBvsignExtendTerm _ v =- withSupportedPrimTypeable @(bv r) $- intern $- UBVExtendTerm True (Proxy @r) v-{-# INLINE curThreadBvsignExtendTerm #-}---- | Construct and internalizing a 'BVExtendTerm' with zero extension.-curThreadBvzeroExtendTerm ::- forall bv l r proxy.- ( PEvalBVTerm bv,- KnownNat l,- KnownNat r,- 1 <= l,- 1 <= r,- l <= r,- SupportedPrim (bv r)- ) =>- proxy r ->- Term (bv l) ->- IO (Term (bv r))-curThreadBvzeroExtendTerm _ v =- withSupportedPrimTypeable @(bv r) $- intern $- UBVExtendTerm False (Proxy @r) v-{-# INLINE curThreadBvzeroExtendTerm #-}---- | Construct and internalizing a 'ApplyTerm'.-curThreadApplyTerm ::- forall f a b.- (PEvalApplyTerm f a b, SupportedPrim b) =>- Term f ->- Term a ->- IO (Term b)-curThreadApplyTerm f a =- withSupportedPrimTypeable @b $- intern $- UApplyTerm f a-{-# INLINE curThreadApplyTerm #-}---- | Construct and internalizing a 'DivIntegralTerm'.-curThreadDivIntegralTerm ::- (PEvalDivModIntegralTerm a) => Term a -> Term a -> IO (Term a)-curThreadDivIntegralTerm l r =- introSupportedPrimConstraint l $ intern $ UDivIntegralTerm l r-{-# INLINE curThreadDivIntegralTerm #-}---- | Construct and internalizing a 'ModIntegralTerm'.-curThreadModIntegralTerm ::- (PEvalDivModIntegralTerm a) => Term a -> Term a -> IO (Term a)-curThreadModIntegralTerm l r =- introSupportedPrimConstraint l $ intern $ UModIntegralTerm l r-{-# INLINE curThreadModIntegralTerm #-}---- | Construct and internalizing a 'QuotIntegralTerm'.-curThreadQuotIntegralTerm ::- (PEvalDivModIntegralTerm a) => Term a -> Term a -> IO (Term a)-curThreadQuotIntegralTerm l r =- introSupportedPrimConstraint l $ intern $ UQuotIntegralTerm l r-{-# INLINE curThreadQuotIntegralTerm #-}---- | Construct and internalizing a 'RemIntegralTerm'.-curThreadRemIntegralTerm ::- (PEvalDivModIntegralTerm a) => Term a -> Term a -> IO (Term a)-curThreadRemIntegralTerm l r =- introSupportedPrimConstraint l $ intern $ URemIntegralTerm l r-{-# INLINE curThreadRemIntegralTerm #-}---- | Construct and internalizing a 'FPTraitTerm'.-curThreadFpTraitTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- FPTrait ->- Term (FP eb sb) ->- IO (Term Bool)-curThreadFpTraitTerm trait v = intern $ UFPTraitTerm trait v-{-# INLINE curThreadFpTraitTerm #-}---- | Construct and internalizing a 'FdivTerm'.-curThreadFdivTerm :: (PEvalFractionalTerm a) => Term a -> Term a -> IO (Term a)-curThreadFdivTerm l r = introSupportedPrimConstraint l $ intern $ UFdivTerm l r-{-# INLINE curThreadFdivTerm #-}---- | Construct and internalizing a 'RecipTerm'.-curThreadRecipTerm :: (PEvalFractionalTerm a) => Term a -> IO (Term a)-curThreadRecipTerm l = introSupportedPrimConstraint l $ intern $ URecipTerm l-{-# INLINE curThreadRecipTerm #-}---- | Construct and internalizing a 'FloatingUnaryTerm'.-curThreadFloatingUnaryTerm ::- (PEvalFloatingTerm a) => FloatingUnaryOp -> Term a -> IO (Term a)-curThreadFloatingUnaryTerm op a =- introSupportedPrimConstraint a $ intern $ UFloatingUnaryTerm op a-{-# INLINE curThreadFloatingUnaryTerm #-}---- | Construct and internalizing a 'PowerTerm'.-curThreadPowerTerm :: (PEvalFloatingTerm a) => Term a -> Term a -> IO (Term a)-curThreadPowerTerm l r =- introSupportedPrimConstraint l $ intern $ UPowerTerm l r-{-# INLINE curThreadPowerTerm #-}---- | Construct and internalizing a 'FPUnaryTerm'.-curThreadFpUnaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- FPUnaryOp ->- Term (FP eb sb) ->- IO (Term (FP eb sb))-curThreadFpUnaryTerm op v = intern $ UFPUnaryTerm op v-{-# INLINE curThreadFpUnaryTerm #-}---- | Construct and internalizing a 'FPBinaryTerm'.-curThreadFpBinaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- FPBinaryOp ->- Term (FP eb sb) ->- Term (FP eb sb) ->- IO (Term (FP eb sb))-curThreadFpBinaryTerm op l r = intern $ UFPBinaryTerm op l r-{-# INLINE curThreadFpBinaryTerm #-}---- | Construct and internalizing a 'FPRoundingUnaryTerm'.-curThreadFpRoundingUnaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- FPRoundingUnaryOp ->- Term FPRoundingMode ->- Term (FP eb sb) ->- IO (Term (FP eb sb))-curThreadFpRoundingUnaryTerm op mode v = intern $ UFPRoundingUnaryTerm op mode v-{-# INLINE curThreadFpRoundingUnaryTerm #-}---- | Construct and internalizing a 'FPRoundingBinaryTerm'.-curThreadFpRoundingBinaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- FPRoundingBinaryOp ->- Term FPRoundingMode ->- Term (FP eb sb) ->- Term (FP eb sb) ->- IO (Term (FP eb sb))-curThreadFpRoundingBinaryTerm op mode l r =- intern $ UFPRoundingBinaryTerm op mode l r-{-# INLINE curThreadFpRoundingBinaryTerm #-}---- | Construct and internalizing a 'FPFMATerm'.-curThreadFpFMATerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- Term FPRoundingMode ->- Term (FP eb sb) ->- Term (FP eb sb) ->- Term (FP eb sb) ->- IO (Term (FP eb sb))-curThreadFpFMATerm mode l r s = intern $ UFPFMATerm mode l r s-{-# INLINE curThreadFpFMATerm #-}---- | Construct and internalizing a 'FromIntegralTerm'.-curThreadFromIntegralTerm ::- forall a b.- (PEvalFromIntegralTerm a b, SupportedPrim b) =>- Term a ->- IO (Term b)-curThreadFromIntegralTerm =- withSupportedPrimTypeable @b $ intern . UFromIntegralTerm-{-# INLINE curThreadFromIntegralTerm #-}---- | Construct and internalizing a 'FromFPOrTerm'.-curThreadFromFPOrTerm ::- forall a eb sb.- ( PEvalIEEEFPConvertibleTerm a,- ValidFP eb sb- ) =>- Term a ->- Term FPRoundingMode ->- Term (FP eb sb) ->- IO (Term a)-curThreadFromFPOrTerm d r f =- introSupportedPrimConstraint d $- withSupportedPrimTypeable @a $- intern $- UFromFPOrTerm d r f-{-# INLINE curThreadFromFPOrTerm #-}---- | Construct and internalizing a 'ToFPTerm'.-curThreadToFPTerm ::- forall a eb sb.- ( PEvalIEEEFPConvertibleTerm a,- ValidFP eb sb,- SupportedPrim (FP eb sb)- ) =>- Term FPRoundingMode ->- Term a ->- IO (Term (FP eb sb))-curThreadToFPTerm r f = intern $ UToFPTerm r f (Proxy @eb) (Proxy @sb)-{-# INLINE curThreadToFPTerm #-}--inCurThread1 ::- forall a b.- (Term a -> IO (Term b)) ->- Term a ->- IO (Term b)-inCurThread1 f t = do- tid <- myWeakThreadId- toCurThreadImpl tid t >>= f-{-# INLINE inCurThread1 #-}--inCurThread2 ::- forall a b c.- (Term a -> Term b -> IO (Term c)) ->- Term a ->- Term b ->- IO (Term c)-inCurThread2 f a b = do- tid <- myWeakThreadId- ra <- toCurThreadImpl tid a- rb <- toCurThreadImpl tid b- f ra rb-{-# INLINE inCurThread2 #-}--inCurThread3 ::- forall a b c d.- (Term a -> Term b -> Term c -> IO (Term d)) ->- Term a ->- Term b ->- Term c ->- IO (Term d)-inCurThread3 f a b c = do- tid <- myWeakThreadId- ra <- toCurThreadImpl tid a- rb <- toCurThreadImpl tid b- rc <- toCurThreadImpl tid c- f ra rb rc-{-# INLINE inCurThread3 #-}--unsafeInCurThread1 ::- forall a b.- (Term a -> IO (Term b)) ->- Term a ->- Term b-unsafeInCurThread1 f = unsafePerformIO . inCurThread1 f-{-# NOINLINE unsafeInCurThread1 #-}--unsafeInCurThread2 ::- forall a b c.- (Term a -> Term b -> IO (Term c)) ->- Term a ->- Term b ->- Term c-unsafeInCurThread2 f a b = unsafePerformIO $ inCurThread2 f a b-{-# NOINLINE unsafeInCurThread2 #-}--unsafeInCurThread3 ::- forall a b c d.- (Term a -> Term b -> Term c -> IO (Term d)) ->- Term a ->- Term b ->- Term c ->- Term d-unsafeInCurThread3 f a b c = unsafePerformIO $ inCurThread3 f a b c-{-# NOINLINE unsafeInCurThread3 #-}---- | Construct and internalizing a 'ConTerm'.-conTerm :: (SupportedPrim t) => t -> Term t-conTerm = unsafePerformIO . curThreadConTerm-{-# NOINLINE conTerm #-}---- | Construct and internalizing a 'SymTerm'.-symTerm :: TypedSymbol knd t -> Term t-symTerm = unsafePerformIO . curThreadSymTerm-{-# NOINLINE symTerm #-}---- | Construct and internalizing a 'ForallTerm'.-forallTerm ::- TypedSymbol 'ConstantKind t ->- Term Bool ->- Term Bool-forallTerm sym@TypedSymbol {} = unsafeInCurThread1 (curThreadForallTerm sym)-{-# NOINLINE forallTerm #-}---- | Construct and internalizing a 'ExistsTerm'.-existsTerm ::- TypedSymbol 'ConstantKind t ->- Term Bool ->- Term Bool-existsTerm sym@TypedSymbol {} = unsafeInCurThread1 (curThreadExistsTerm sym)-{-# NOINLINE existsTerm #-}---- | Construct and internalizing a 'SymTerm' with an identifier, using simple--- symbols.-ssymTerm :: (SupportedPrim t) => Identifier -> Term t-ssymTerm = unsafePerformIO . curThreadSsymTerm-{-# NOINLINE ssymTerm #-}---- | Construct and internalizing a 'SymTerm' with an identifier and an index,--- using indexed symbols.-isymTerm :: (SupportedPrim t) => Identifier -> Int -> Term t-isymTerm ident index = unsafePerformIO $ curThreadIsymTerm ident index-{-# NOINLINE isymTerm #-}---- | Construct and internalizing a 'NotTerm'.-notTerm :: Term Bool -> Term Bool-notTerm = unsafeInCurThread1 curThreadNotTerm-{-# NOINLINE notTerm #-}---- | Construct and internalizing a 'OrTerm'.-orTerm :: Term Bool -> Term Bool -> Term Bool-orTerm = unsafeInCurThread2 curThreadOrTerm-{-# NOINLINE orTerm #-}---- | Construct and internalizing a 'AndTerm'.-andTerm :: Term Bool -> Term Bool -> Term Bool-andTerm = unsafeInCurThread2 curThreadAndTerm-{-# NOINLINE andTerm #-}---- | Construct and internalizing a 'EqTerm'.-eqTerm :: Term a -> Term a -> Term Bool-eqTerm = unsafeInCurThread2 curThreadEqTerm-{-# NOINLINE eqTerm #-}---- | Construct and internalizing a 'DistinctTerm'.-distinctTerm :: NonEmpty (Term a) -> Term Bool-distinctTerm args =- unsafePerformIO $ do- tid <- myWeakThreadId- traverse (toCurThreadImpl tid) args >>= curThreadDistinctTerm-{-# NOINLINE distinctTerm #-}---- | Construct and internalizing a 'ITETerm'.-iteTerm :: Term Bool -> Term a -> Term a -> Term a-iteTerm = unsafeInCurThread3 curThreadIteTerm-{-# NOINLINE iteTerm #-}---- | Construct and internalizing a 'AddNumTerm'.-addNumTerm :: (PEvalNumTerm a) => Term a -> Term a -> Term a-addNumTerm = unsafeInCurThread2 curThreadAddNumTerm-{-# NOINLINE addNumTerm #-}---- | Construct and internalizing a 'NegNumTerm'.-negNumTerm :: (PEvalNumTerm a) => Term a -> Term a-negNumTerm = unsafeInCurThread1 curThreadNegNumTerm-{-# NOINLINE negNumTerm #-}---- | Construct and internalizing a 'MulNumTerm'.-mulNumTerm :: (PEvalNumTerm a) => Term a -> Term a -> Term a-mulNumTerm = unsafeInCurThread2 curThreadMulNumTerm-{-# NOINLINE mulNumTerm #-}---- | Construct and internalizing a 'AbsNumTerm'.-absNumTerm :: (PEvalNumTerm a) => Term a -> Term a-absNumTerm = unsafeInCurThread1 curThreadAbsNumTerm-{-# NOINLINE absNumTerm #-}---- | Construct and internalizing a 'SignumNumTerm'.-signumNumTerm :: (PEvalNumTerm a) => Term a -> Term a-signumNumTerm = unsafeInCurThread1 curThreadSignumNumTerm-{-# NOINLINE signumNumTerm #-}---- | Construct and internalizing a 'LtOrdTerm'.-ltOrdTerm :: (PEvalOrdTerm a) => Term a -> Term a -> Term Bool-ltOrdTerm = unsafeInCurThread2 curThreadLtOrdTerm-{-# NOINLINE ltOrdTerm #-}---- | Construct and internalizing a 'LeOrdTerm'.-leOrdTerm :: (PEvalOrdTerm a) => Term a -> Term a -> Term Bool-leOrdTerm = unsafeInCurThread2 curThreadLeOrdTerm-{-# NOINLINE leOrdTerm #-}---- | Construct and internalizing a 'AndBitsTerm'.-andBitsTerm :: (PEvalBitwiseTerm a) => Term a -> Term a -> Term a-andBitsTerm = unsafeInCurThread2 curThreadAndBitsTerm-{-# NOINLINE andBitsTerm #-}---- | Construct and internalizing a 'OrBitsTerm'.-orBitsTerm :: (PEvalBitwiseTerm a) => Term a -> Term a -> Term a-orBitsTerm = unsafeInCurThread2 curThreadOrBitsTerm-{-# NOINLINE orBitsTerm #-}---- | Construct and internalizing a 'XorBitsTerm'.-xorBitsTerm :: (PEvalBitwiseTerm a) => Term a -> Term a -> Term a-xorBitsTerm = unsafeInCurThread2 curThreadXorBitsTerm-{-# NOINLINE xorBitsTerm #-}---- | Construct and internalizing a 'ComplementBitsTerm'.-complementBitsTerm :: (PEvalBitwiseTerm a) => Term a -> Term a-complementBitsTerm = unsafeInCurThread1 curThreadComplementBitsTerm-{-# NOINLINE complementBitsTerm #-}---- | Construct and internalizing a 'ShiftLeftTerm'.-shiftLeftTerm :: (PEvalShiftTerm a) => Term a -> Term a -> Term a-shiftLeftTerm = unsafeInCurThread2 curThreadShiftLeftTerm-{-# NOINLINE shiftLeftTerm #-}---- | Construct and internalizing a 'ShiftRightTerm'.-shiftRightTerm :: (PEvalShiftTerm a) => Term a -> Term a -> Term a-shiftRightTerm = unsafeInCurThread2 curThreadShiftRightTerm-{-# NOINLINE shiftRightTerm #-}---- | Construct and internalizing a 'RotateLeftTerm'.-rotateLeftTerm :: (PEvalRotateTerm a) => Term a -> Term a -> Term a-rotateLeftTerm = unsafeInCurThread2 curThreadRotateLeftTerm-{-# NOINLINE rotateLeftTerm #-}---- | Construct and internalizing a 'RotateRightTerm'.-rotateRightTerm :: (PEvalRotateTerm a) => Term a -> Term a -> Term a-rotateRightTerm = unsafeInCurThread2 curThreadRotateRightTerm-{-# NOINLINE rotateRightTerm #-}---- | Construct and internalizing a 'BitCastTerm'.-bitCastTerm ::- (PEvalBitCastTerm a b, SupportedPrim b) =>- Term a ->- Term b-bitCastTerm = unsafeInCurThread1 curThreadBitCastTerm-{-# NOINLINE bitCastTerm #-}---- | Construct and internalizing a 'BitCastOrTerm'.-bitCastOrTerm ::- (PEvalBitCastOrTerm a b) =>- Term b ->- Term a ->- Term b-bitCastOrTerm = unsafeInCurThread2 curThreadBitCastOrTerm-{-# NOINLINE bitCastOrTerm #-}---- | Construct and internalizing a 'BVConcatTerm'.-bvConcatTerm ::- forall bv l r.- ( PEvalBVTerm bv,- KnownNat l,- KnownNat r,- KnownNat (l + r),- 1 <= l,- 1 <= r,- 1 <= l + r,- SupportedPrim (bv (l + r))- ) =>- Term (bv l) ->- Term (bv r) ->- Term (bv (l + r))-bvConcatTerm = unsafeInCurThread2 curThreadBVConcatTerm-{-# NOINLINE bvConcatTerm #-}---- | Construct and internalizing a 'BVSelectTerm'.-bvSelectTerm ::- forall bv n ix w p q.- ( PEvalBVTerm bv,- KnownNat n,- KnownNat ix,- KnownNat w,- 1 <= n,- 1 <= w,- ix + w <= n,- SupportedPrim (bv w)- ) =>- p ix ->- q w ->- Term (bv n) ->- Term (bv w)-bvSelectTerm ix w = unsafeInCurThread1 (curThreadBVSelectTerm ix w)-{-# NOINLINE bvSelectTerm #-}---- | Construct and internalizing a 'BVExtendTerm'.-bvExtendTerm ::- forall bv l r proxy.- ( PEvalBVTerm bv,- KnownNat l,- KnownNat r,- 1 <= l,- 1 <= r,- l <= r,- SupportedPrim (bv r)- ) =>- Bool ->- proxy r ->- Term (bv l) ->- Term (bv r)-bvExtendTerm signed r = unsafeInCurThread1 (curThreadBVExtendTerm signed r)-{-# NOINLINE bvExtendTerm #-}---- | Construct and internalizing a 'BVExtendTerm' with sign extension.-bvsignExtendTerm ::- forall bv l r proxy.- ( PEvalBVTerm bv,- KnownNat l,- KnownNat r,- 1 <= l,- 1 <= r,- l <= r,- SupportedPrim (bv r)- ) =>- proxy r ->- Term (bv l) ->- Term (bv r)-bvsignExtendTerm r = unsafeInCurThread1 (curThreadBvsignExtendTerm r)-{-# NOINLINE bvsignExtendTerm #-}---- | Construct and internalizing a 'BVExtendTerm' with zero extension.-bvzeroExtendTerm ::- forall bv l r proxy.- ( PEvalBVTerm bv,- KnownNat l,- KnownNat r,- 1 <= l,- 1 <= r,- l <= r,- SupportedPrim (bv r)- ) =>- proxy r ->- Term (bv l) ->- Term (bv r)-bvzeroExtendTerm r = unsafeInCurThread1 (curThreadBvzeroExtendTerm r)-{-# NOINLINE bvzeroExtendTerm #-}---- | Construct and internalizing a 'ApplyTerm'.-applyTerm ::- (PEvalApplyTerm f a b, SupportedPrim b) => Term f -> Term a -> Term b-applyTerm = unsafeInCurThread2 curThreadApplyTerm-{-# NOINLINE applyTerm #-}---- | Construct and internalizing a 'DivIntegralTerm'.-divIntegralTerm :: (PEvalDivModIntegralTerm a) => Term a -> Term a -> Term a-divIntegralTerm = unsafeInCurThread2 curThreadDivIntegralTerm-{-# NOINLINE divIntegralTerm #-}---- | Construct and internalizing a 'ModIntegralTerm'.-modIntegralTerm :: (PEvalDivModIntegralTerm a) => Term a -> Term a -> Term a-modIntegralTerm = unsafeInCurThread2 curThreadModIntegralTerm-{-# NOINLINE modIntegralTerm #-}---- | Construct and internalizing a 'QuotIntegralTerm'.-quotIntegralTerm :: (PEvalDivModIntegralTerm a) => Term a -> Term a -> Term a-quotIntegralTerm = unsafeInCurThread2 curThreadQuotIntegralTerm-{-# NOINLINE quotIntegralTerm #-}---- | Construct and internalizing a 'RemIntegralTerm'.-remIntegralTerm :: (PEvalDivModIntegralTerm a) => Term a -> Term a -> Term a-remIntegralTerm = unsafeInCurThread2 curThreadRemIntegralTerm-{-# NOINLINE remIntegralTerm #-}---- | Construct and internalizing a 'FPTraitTerm'.-fpTraitTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- FPTrait ->- Term (FP eb sb) ->- Term Bool-fpTraitTerm trait = unsafeInCurThread1 (curThreadFpTraitTerm trait)-{-# NOINLINE fpTraitTerm #-}---- | Construct and internalizing a 'FdivTerm'.-fdivTerm :: (PEvalFractionalTerm a) => Term a -> Term a -> Term a-fdivTerm = unsafeInCurThread2 curThreadFdivTerm-{-# NOINLINE fdivTerm #-}---- | Construct and internalizing a 'RecipTerm'.-recipTerm :: (PEvalFractionalTerm a) => Term a -> Term a-recipTerm = unsafeInCurThread1 curThreadRecipTerm-{-# NOINLINE recipTerm #-}---- | Construct and internalizing a 'FloatingUnaryTerm'.-floatingUnaryTerm :: (PEvalFloatingTerm a) => FloatingUnaryOp -> Term a -> Term a-floatingUnaryTerm op = unsafeInCurThread1 (curThreadFloatingUnaryTerm op)-{-# NOINLINE floatingUnaryTerm #-}---- | Construct and internalizing a 'PowerTerm'.-powerTerm :: (PEvalFloatingTerm a) => Term a -> Term a -> Term a-powerTerm = unsafeInCurThread2 curThreadPowerTerm-{-# NOINLINE powerTerm #-}---- | Construct and internalizing a 'FPUnaryTerm'.-fpUnaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- FPUnaryOp ->- Term (FP eb sb) ->- Term (FP eb sb)-fpUnaryTerm op = unsafeInCurThread1 (curThreadFpUnaryTerm op)-{-# NOINLINE fpUnaryTerm #-}---- | Construct and internalizing a 'FPBinaryTerm'.-fpBinaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- FPBinaryOp ->- Term (FP eb sb) ->- Term (FP eb sb) ->- Term (FP eb sb)-fpBinaryTerm op = unsafeInCurThread2 (curThreadFpBinaryTerm op)-{-# NOINLINE fpBinaryTerm #-}---- | Construct and internalizing a 'FPRoundingUnaryTerm'.-fpRoundingUnaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- FPRoundingUnaryOp ->- Term FPRoundingMode ->- Term (FP eb sb) ->- Term (FP eb sb)-fpRoundingUnaryTerm op = unsafeInCurThread2 (curThreadFpRoundingUnaryTerm op)-{-# NOINLINE fpRoundingUnaryTerm #-}---- | Construct and internalizing a 'FPRoundingBinaryTerm'.-fpRoundingBinaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- FPRoundingBinaryOp ->- Term FPRoundingMode ->- Term (FP eb sb) ->- Term (FP eb sb) ->- Term (FP eb sb)-fpRoundingBinaryTerm op = unsafeInCurThread3 (curThreadFpRoundingBinaryTerm op)-{-# NOINLINE fpRoundingBinaryTerm #-}---- | Construct and internalizing a 'FPFMATerm'.-fpFMATerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- Term FPRoundingMode ->- Term (FP eb sb) ->- Term (FP eb sb) ->- Term (FP eb sb) ->- Term (FP eb sb)-fpFMATerm mode a b c = unsafePerformIO $ do- tid <- myWeakThreadId- mode' <- toCurThreadImpl tid mode- a' <- toCurThreadImpl tid a- b' <- toCurThreadImpl tid b- c' <- toCurThreadImpl tid c- curThreadFpFMATerm mode' a' b' c'-{-# NOINLINE fpFMATerm #-}---- | Construct and internalizing a 'FromIntegralTerm'.-fromIntegralTerm ::- (PEvalFromIntegralTerm a b, SupportedPrim b) => Term a -> Term b-fromIntegralTerm = unsafeInCurThread1 curThreadFromIntegralTerm-{-# NOINLINE fromIntegralTerm #-}---- | Construct and internalizing a 'FromFPOrTerm'.-fromFPOrTerm ::- ( PEvalIEEEFPConvertibleTerm a,- ValidFP eb sb- ) =>- Term a ->- Term FPRoundingMode ->- Term (FP eb sb) ->- Term a-fromFPOrTerm = unsafeInCurThread3 curThreadFromFPOrTerm-{-# NOINLINE fromFPOrTerm #-}---- | Construct and internalizing a 'ToFPTerm'.-toFPTerm ::- forall a eb sb.- ( PEvalIEEEFPConvertibleTerm a,- ValidFP eb sb,- SupportedPrim (FP eb sb)- ) =>- Term FPRoundingMode ->- Term a ->- Term (FP eb sb)-toFPTerm = unsafeInCurThread2 curThreadToFPTerm-{-# NOINLINE toFPTerm #-}---- Support for boolean type-defaultValueForBool :: Bool-defaultValueForBool = False---- | Construct and internalizing 'True' term.-trueTerm :: Term Bool-trueTerm = conTerm True-{-# NOINLINE trueTerm #-}---- | Construct and internalizing 'False' term.-falseTerm :: Term Bool-falseTerm = conTerm False-{-# NOINLINE falseTerm #-}--boolConTermView :: forall a. Term a -> Maybe Bool-boolConTermView (ConTerm _ _ _ _ b) = withSupportedPrimTypeable @a $ cast b-boolConTermView _ = Nothing-{-# INLINE boolConTermView #-}---- | Pattern matcher for concrete 'Bool' terms.-pattern BoolConTerm :: Bool -> Term a-pattern BoolConTerm b <- (boolConTermView -> Just b)---- | Pattern matcher for 'True' term.-pattern TrueTerm :: Term a-pattern TrueTerm <- BoolConTerm True---- | Pattern matcher for 'False' term.-pattern FalseTerm :: Term a-pattern FalseTerm <- BoolConTerm False--boolTermView :: forall a. Term a -> Maybe (Term Bool)-boolTermView t = introSupportedPrimConstraint t $ cast t-{-# INLINE boolTermView #-}---- | Pattern matcher for 'Bool' terms.-pattern BoolTerm :: Term Bool -> Term a-pattern BoolTerm b <- (boolTermView -> Just b)---- | Partial evaluation for not terms.-pevalNotTerm :: Term Bool -> Term Bool-pevalNotTerm (NotTerm _ _ _ _ tm) = tm-pevalNotTerm (ConTerm _ _ _ _ a) = if a then falseTerm else trueTerm-pevalNotTerm (OrTerm _ _ _ _ (NotTerm _ _ _ _ n1) n2) = pevalAndTerm n1 (pevalNotTerm n2)-pevalNotTerm (OrTerm _ _ _ _ (DistinctTerm _ _ _ _ (n1 :| [n2])) n3) =- introSupportedPrimConstraint n1 $- pevalAndTerm (pevalEqTerm n1 n2) (pevalNotTerm n3)-pevalNotTerm (OrTerm _ _ _ _ n1 (NotTerm _ _ _ _ n2)) = pevalAndTerm (pevalNotTerm n1) n2-pevalNotTerm (OrTerm _ _ _ _ n1 (DistinctTerm _ _ _ _ (n2 :| [n3]))) =- introSupportedPrimConstraint n2 $- pevalAndTerm (pevalNotTerm n1) (pevalEqTerm n2 n3)-pevalNotTerm (AndTerm _ _ _ _ (NotTerm _ _ _ _ n1) n2) = pevalOrTerm n1 (pevalNotTerm n2)-pevalNotTerm (AndTerm _ _ _ _ (DistinctTerm _ _ _ _ (n1 :| [n2])) n3) =- introSupportedPrimConstraint n1 $- pevalOrTerm (pevalEqTerm n1 n2) (pevalNotTerm n3)-pevalNotTerm (AndTerm _ _ _ _ n1 (NotTerm _ _ _ _ n2)) = pevalOrTerm (pevalNotTerm n1) n2-pevalNotTerm (AndTerm _ _ _ _ n1 (DistinctTerm _ _ _ _ (n2 :| [n3]))) =- introSupportedPrimConstraint n2 $- pevalOrTerm (pevalNotTerm n1) $- pevalEqTerm n2 n3-pevalNotTerm (EqTerm _ _ _ _ a b) = distinctTerm $ a :| [b]-pevalNotTerm (DistinctTerm _ _ _ _ (a :| [b])) = eqTerm a b-pevalNotTerm tm = notTerm tm-{-# INLINEABLE pevalNotTerm #-}--orEqFirst :: Term Bool -> Term Bool -> Bool-orEqFirst _ (ConTerm _ _ _ _ False) = True-orEqFirst- (DistinctTerm _ _ _ _ ((e1 :: Term a) :| [ec1@ConTerm {} :: Term b]))- (EqTerm _ _ _ _ (DynTerm (e2 :: Term a)) (DynTerm (ec2@ConTerm {} :: Term b)))- | e1 == e2 && ec1 /= ec2 = True--- orEqFirst--- (NotTerm _ (EqTerm _ (e1 :: Term a) (ec1@(ConTerm _ _ _) :: Term b)))--- (EqTerm _ (Dyn (e2 :: Term a)) (Dyn (ec2@(ConTerm _ _ _) :: Term b)))--- | e1 == e2 && ec1 /= ec2 = True-orEqFirst x y- | x == y = True- | otherwise = False-{-# INLINE orEqFirst #-}--orEqTrue :: Term Bool -> Term Bool -> Bool-orEqTrue (ConTerm _ _ _ _ True) ~_ = True-orEqTrue _ (ConTerm _ _ _ _ True) = True--- orEqTrue (NotTerm _ e1) (NotTerm _ e2) = andEqFalse e1 e2-orEqTrue- (DistinctTerm _ _ _ _ ((e1 :: Term a) :| [ec1@ConTerm {} :: Term b]))- (DistinctTerm _ _ _ _ ((DynTerm (e2 :: Term a)) :| [DynTerm (ec2@ConTerm {} :: Term b)]))- | e1 == e2 && ec1 /= ec2 = True--- orEqTrue--- (NotTerm _ (EqTerm _ (e1 :: Term a) (ec1@(ConTerm _ _ _ _) :: Term b)))--- (NotTerm _ (EqTerm _ (Dyn (e2 :: Term a)) (Dyn (ec2@(ConTerm _ _ _ _) :: Term b))))--- | e1 == e2 && ec1 /= ec2 = True-orEqTrue (NotTerm _ _ _ _ l) r | l == r = True-orEqTrue l (NotTerm _ _ _ _ r) | l == r = True-orEqTrue _ _ = False-{-# INLINE orEqTrue #-}--andEqFirst :: Term Bool -> Term Bool -> Bool-andEqFirst _ (ConTerm _ _ _ _ True) = True--- andEqFirst x (NotTerm _ y) = andEqFalse x y-andEqFirst- (EqTerm _ _ _ _ (e1 :: Term a) (ec1@ConTerm {} :: Term b))- (DistinctTerm _ _ _ _ ((DynTerm (e2 :: Term a)) :| [DynTerm (ec2@ConTerm {} :: Term b)]))- | e1 == e2 && ec1 /= ec2 = True--- andEqFirst--- (EqTerm _ (e1 :: Term a) (ec1@(ConTerm _ _ _ _) :: Term b))--- (NotTerm _ (EqTerm _ (Dyn (e2 :: Term a)) (Dyn (ec2@(ConTerm _ _ _ _) :: Term b))))--- | e1 == e2 && ec1 /= ec2 = True-andEqFirst x y- | x == y = True- | otherwise = False-{-# INLINE andEqFirst #-}--andEqFalse :: Term Bool -> Term Bool -> Bool-andEqFalse (ConTerm _ _ _ _ False) ~_ = True-andEqFalse _ (ConTerm _ _ _ _ False) = True--- andEqFalse (NotTerm _ e1) (NotTerm _ e2) = orEqTrue e1 e2-andEqFalse- (EqTerm _ _ _ _ (e1 :: Term a) (ec1@ConTerm {} :: Term b))- (EqTerm _ _ _ _ (DynTerm (e2 :: Term a)) (DynTerm (ec2@ConTerm {} :: Term b)))- | e1 == e2 && ec1 /= ec2 = True-andEqFalse (NotTerm _ _ _ _ x) y | x == y = True-andEqFalse x (NotTerm _ _ _ _ y) | x == y = True-andEqFalse _ _ = False-{-# INLINE andEqFalse #-}---- | Partial evaluation for or terms.-pevalOrTerm :: Term Bool -> Term Bool -> Term Bool-pevalOrTerm l ~r- | orEqTrue l r = trueTerm- | orEqFirst l r = l- | orEqFirst r l = r-pevalOrTerm l r@(OrTerm _ _ _ _ r1 r2)- | orEqTrue l r1 = trueTerm- | orEqTrue l r2 = trueTerm- | orEqFirst r1 l = r- | orEqFirst r2 l = r- | orEqFirst l r1 = pevalOrTerm l r2- | orEqFirst l r2 = pevalOrTerm l r1-pevalOrTerm l@(OrTerm _ _ _ _ l1 l2) r- | orEqTrue l1 r = trueTerm- | orEqTrue l2 r = trueTerm- | orEqFirst l1 r = l- | orEqFirst l2 r = l- | orEqFirst r l1 = pevalOrTerm l2 r- | orEqFirst r l2 = pevalOrTerm l1 r-pevalOrTerm l (AndTerm _ _ _ _ r1 r2)- | orEqFirst l r1 = l- | orEqFirst l r2 = l- | orEqTrue l r1 = pevalOrTerm l r2- | orEqTrue l r2 = pevalOrTerm l r1-pevalOrTerm (AndTerm _ _ _ _ l1 l2) r- | orEqFirst r l1 = r- | orEqFirst r l2 = r- | orEqTrue l1 r = pevalOrTerm l2 r- | orEqTrue l2 r = pevalOrTerm l1 r-pevalOrTerm- (AndTerm _ _ _ _ nl1@(NotTerm _ _ _ _ l1) l2)- (EqTerm _ _ _ _ (DynTerm (e1 :: Term Bool)) (DynTerm (e2 :: Term Bool)))- | l1 == e1 && l2 == e2 = pevalOrTerm nl1 l2-pevalOrTerm (NotTerm _ _ _ _ nl) (NotTerm _ _ _ _ nr) =- pevalNotTerm $ pevalAndTerm nl nr-pevalOrTerm l r = orTerm l r-{-# INLINEABLE pevalOrTerm #-}---- | Partial evaluation for and terms.-pevalAndTerm :: Term Bool -> Term Bool -> Term Bool-pevalAndTerm l ~r- | andEqFalse l r = falseTerm- | andEqFirst l r = l- | andEqFirst r l = r-pevalAndTerm l r@(AndTerm _ _ _ _ r1 r2)- | andEqFalse l r1 = falseTerm- | andEqFalse l r2 = falseTerm- | andEqFirst r1 l = r- | andEqFirst r2 l = r- | andEqFirst l r1 = pevalAndTerm l r2- | andEqFirst l r2 = pevalAndTerm l r1-pevalAndTerm l@(AndTerm _ _ _ _ l1 l2) r- | andEqFalse l1 r = falseTerm- | andEqFalse l2 r = falseTerm- | andEqFirst l1 r = l- | andEqFirst l2 r = l- | andEqFirst r l1 = pevalAndTerm l2 r- | andEqFirst r l2 = pevalAndTerm l1 r-pevalAndTerm l (OrTerm _ _ _ _ r1 r2)- | andEqFirst l r1 = l- | andEqFirst l r2 = l- | andEqFalse l r1 = pevalAndTerm l r2- | andEqFalse l r2 = pevalAndTerm l r1-pevalAndTerm (OrTerm _ _ _ _ l1 l2) r- | andEqFirst r l1 = r- | andEqFirst r l2 = r- | andEqFalse l1 r = pevalAndTerm l2 r- | andEqFalse l2 r = pevalAndTerm l1 r-pevalAndTerm- (OrTerm _ _ _ _ l1 nl2@(NotTerm _ _ _ _ l2))- (NotTerm _ _ _ _ (EqTerm _ _ _ _ (DynTerm (e1 :: Term Bool)) (DynTerm (e2 :: Term Bool))))- | l1 == e1 && l2 == e2 = pevalAndTerm l1 nl2-pevalAndTerm (NotTerm _ _ _ _ nl) (NotTerm _ _ _ _ nr) = pevalNotTerm $ pevalOrTerm nl nr-pevalAndTerm l r = andTerm l r-{-# INLINEABLE pevalAndTerm #-}---- | Partial evaluation for imply terms.-pevalImplyTerm :: Term Bool -> Term Bool -> Term Bool-pevalImplyTerm l = pevalOrTerm (pevalNotTerm l)---- | Partial evaluation for xor terms.-pevalXorTerm :: Term Bool -> Term Bool -> Term Bool-pevalXorTerm l r = pevalOrTerm (pevalAndTerm (pevalNotTerm l) r) (pevalAndTerm l (pevalNotTerm r))--pevalImpliesTerm :: Term Bool -> Term Bool -> Bool-pevalImpliesTerm (ConTerm _ _ _ _ False) _ = True-pevalImpliesTerm _ (ConTerm _ _ _ _ True) = True-pevalImpliesTerm- (EqTerm _ _ _ _ (e1 :: Term a) (ec1@ConTerm {} :: Term b))- (DistinctTerm _ _ _ _ ((DynTerm (e2 :: Term a)) :| [(DynTerm (ec2@ConTerm {} :: Term b))]))- | e1 == e2 && ec1 /= ec2 = True--- pevalImpliesTerm--- (EqTerm _ (e1 :: Term a) (ec1@(ConTerm _ _ _ _) :: Term b))--- (NotTerm _ (EqTerm _ (Dyn (e2 :: Term a)) (Dyn (ec2@(ConTerm _ _ _ _) :: Term b))))--- | e1 == e2 && ec1 /= ec2 = True-pevalImpliesTerm a b- | a == b = True- | otherwise = False-{-# INLINE pevalImpliesTerm #-}--pevalITEBoolLeftNot :: Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)-pevalITEBoolLeftNot cond nIfTrue ifFalse- -- need test- | cond == nIfTrue = Just $ pevalAndTerm (pevalNotTerm cond) ifFalse- | otherwise = case nIfTrue of- AndTerm _ _ _ _ nt1 nt2 -> ra- where- ra- | pevalImpliesTerm cond nt1 =- Just $ pevalITETerm cond (pevalNotTerm nt2) ifFalse- | pevalImpliesTerm cond nt2 =- Just $ pevalITETerm cond (pevalNotTerm nt1) ifFalse- | pevalImpliesTerm cond (pevalNotTerm nt1)- || pevalImpliesTerm cond (pevalNotTerm nt2) =- Just $ pevalOrTerm cond ifFalse- | otherwise = Nothing- OrTerm _ _ _ _ nt1 nt2 -> ra- where- ra- | pevalImpliesTerm cond nt1 || pevalImpliesTerm cond nt2 =- Just $ pevalAndTerm (pevalNotTerm cond) ifFalse- | pevalImpliesTerm cond (pevalNotTerm nt1) =- Just $ pevalITETerm cond (pevalNotTerm nt2) ifFalse- | pevalImpliesTerm cond (pevalNotTerm nt2) =- Just $ pevalITETerm cond (pevalNotTerm nt1) ifFalse- | otherwise = Nothing- _ -> Nothing--pevalITEBoolBothNot :: Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)-pevalITEBoolBothNot cond nIfTrue nIfFalse =- Just $ pevalNotTerm $ pevalITETerm cond nIfTrue nIfFalse--pevalITEBoolRightNot :: Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)-pevalITEBoolRightNot cond ifTrue nIfFalse- -- need test- | cond == nIfFalse = Just $ pevalOrTerm (pevalNotTerm cond) ifTrue- | otherwise = Nothing -- need work--pevalInferImplies :: Term Bool -> Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)-pevalInferImplies cond (NotTerm _ _ _ _ nt1) _ falseRes- | cond == nt1 = Just falseRes- | otherwise = Nothing--- \| otherwise = case (cond, nt1) of--- ( EqTerm _ (e1 :: Term a) (ec1@(ConTerm _ _ _ _) :: Term b),--- EqTerm _ (Dyn (e2 :: Term a)) (Dyn (ec2@(ConTerm _ _ _ _) :: Term b))--- )--- | e1 == e2 && ec1 /= ec2 -> Just trueRes--- _ -> Nothing-pevalInferImplies- (EqTerm _ _ _ _ (e1 :: Term a) (ec1@ConTerm {} :: Term b))- (DistinctTerm _ _ _ _ ((DynTerm (e2 :: Term a)) :| [DynTerm (ec2@ConTerm {} :: Term b)]))- trueRes- _- | e1 == e2 && ec1 /= ec2 = Just trueRes-pevalInferImplies- (EqTerm _ _ _ _ (e1 :: Term a) (ec1@ConTerm {} :: Term b))- (EqTerm _ _ _ _ (DynTerm (e2 :: Term a)) (DynTerm (ec2@ConTerm {} :: Term b)))- _- falseRes- | e1 == e2 && ec1 /= ec2 = Just falseRes-pevalInferImplies _ _ _ _ = Nothing--pevalITEBoolLeftAnd :: Term Bool -> Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)-pevalITEBoolLeftAnd cond t1 t2 ifFalse- | t1 == ifFalse = Just $ pevalAndTerm t1 $ pevalImplyTerm cond t2- | t2 == ifFalse = Just $ pevalAndTerm t2 $ pevalImplyTerm cond t1- | cond == t1 = Just $ pevalITETerm cond t2 ifFalse- | cond == t2 = Just $ pevalITETerm cond t1 ifFalse- | otherwise =- msum- [ pevalInferImplies cond t1 (pevalITETerm cond t2 ifFalse) (pevalAndTerm (pevalNotTerm cond) ifFalse),- pevalInferImplies cond t2 (pevalITETerm cond t1 ifFalse) (pevalAndTerm (pevalNotTerm cond) ifFalse)- ]--pevalITEBoolBothAnd :: Term Bool -> Term Bool -> Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)-pevalITEBoolBothAnd cond t1 t2 f1 f2- | t1 == f1 = Just $ pevalAndTerm t1 $ pevalITETerm cond t2 f2- | t1 == f2 = Just $ pevalAndTerm t1 $ pevalITETerm cond t2 f1- | t2 == f1 = Just $ pevalAndTerm t2 $ pevalITETerm cond t1 f2- | t2 == f2 = Just $ pevalAndTerm t2 $ pevalITETerm cond t1 f1- | otherwise = Nothing--pevalITEBoolRightAnd :: Term Bool -> Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)-pevalITEBoolRightAnd cond ifTrue f1 f2- | f1 == ifTrue = Just $ pevalAndTerm f1 $ pevalOrTerm cond f2- | f2 == ifTrue = Just $ pevalAndTerm f2 $ pevalOrTerm cond f1- | otherwise = Nothing--pevalITEBoolLeftOr :: Term Bool -> Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)-pevalITEBoolLeftOr cond t1 t2 ifFalse- | t1 == ifFalse = Just $ pevalOrTerm t1 $ pevalAndTerm cond t2- | t2 == ifFalse = Just $ pevalOrTerm t2 $ pevalAndTerm cond t1- | cond == t1 = Just $ pevalOrTerm cond ifFalse- | cond == t2 = Just $ pevalOrTerm cond ifFalse- | otherwise =- msum- [ pevalInferImplies cond t1 (pevalOrTerm cond ifFalse) (pevalITETerm cond t2 ifFalse),- pevalInferImplies cond t2 (pevalOrTerm cond ifFalse) (pevalITETerm cond t1 ifFalse)- ]--pevalITEBoolBothOr :: Term Bool -> Term Bool -> Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)-pevalITEBoolBothOr cond t1 t2 f1 f2- | t1 == f1 = Just $ pevalOrTerm t1 $ pevalITETerm cond t2 f2- | t1 == f2 = Just $ pevalOrTerm t1 $ pevalITETerm cond t2 f1- | t2 == f1 = Just $ pevalOrTerm t2 $ pevalITETerm cond t1 f2- | t2 == f2 = Just $ pevalOrTerm t2 $ pevalITETerm cond t1 f1- | otherwise = Nothing--pevalITEBoolRightOr :: Term Bool -> Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)-pevalITEBoolRightOr cond ifTrue f1 f2- | f1 == ifTrue = Just $ pevalOrTerm f1 $ pevalAndTerm (pevalNotTerm cond) f2- | f2 == ifTrue = Just $ pevalOrTerm f2 $ pevalAndTerm (pevalNotTerm cond) f1- | otherwise = Nothing--pevalITEBoolLeft :: Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)-pevalITEBoolLeft cond (AndTerm _ _ _ _ t1 t2) ifFalse =- msum- [ pevalITEBoolLeftAnd cond t1 t2 ifFalse,- case ifFalse of- AndTerm _ _ _ _ f1 f2 -> pevalITEBoolBothAnd cond t1 t2 f1 f2- _ -> Nothing- ]-pevalITEBoolLeft cond (OrTerm _ _ _ _ t1 t2) ifFalse =- msum- [ pevalITEBoolLeftOr cond t1 t2 ifFalse,- case ifFalse of- OrTerm _ _ _ _ f1 f2 -> pevalITEBoolBothOr cond t1 t2 f1 f2- _ -> Nothing- ]-pevalITEBoolLeft cond (NotTerm _ _ _ _ nIfTrue) ifFalse =- msum- [ pevalITEBoolLeftNot cond nIfTrue ifFalse,- case ifFalse of- NotTerm _ _ _ _ nIfFalse ->- pevalITEBoolBothNot cond nIfTrue nIfFalse- _ -> Nothing- ]-pevalITEBoolLeft _ _ _ = Nothing--pevalITEBoolNoLeft :: Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)-pevalITEBoolNoLeft cond ifTrue (AndTerm _ _ _ _ f1 f2) = pevalITEBoolRightAnd cond ifTrue f1 f2-pevalITEBoolNoLeft cond ifTrue (OrTerm _ _ _ _ f1 f2) = pevalITEBoolRightOr cond ifTrue f1 f2-pevalITEBoolNoLeft cond ifTrue (NotTerm _ _ _ _ nIfFalse) = pevalITEBoolRightNot cond ifTrue nIfFalse-pevalITEBoolNoLeft _ _ _ = Nothing---- | Basic partial evaluation for ITE terms.-pevalITEBasic :: (SupportedPrim a) => Term Bool -> Term a -> Term a -> Maybe (Term a)-pevalITEBasic (ConTerm _ _ _ _ True) ~ifTrue ~_ = Just ifTrue-pevalITEBasic (ConTerm _ _ _ _ False) ~_ ~ifFalse = Just ifFalse-pevalITEBasic (NotTerm _ _ _ _ ncond) ifTrue ifFalse = Just $ pevalITETerm ncond ifFalse ifTrue-pevalITEBasic _ ifTrue ifFalse | ifTrue == ifFalse = Just ifTrue-pevalITEBasic (ITETerm _ _ _ _ cc ct cf) (ITETerm _ _ _ _ tc tt tf) (ITETerm _ _ _ _ fc ft ff) -- later- | cc == tc && cc == fc = Just $ pevalITETerm cc (pevalITETerm ct tt ft) (pevalITETerm cf tf ff)-pevalITEBasic cond (ITETerm _ _ _ _ tc tt tf) ifFalse -- later- | cond == tc = Just $ pevalITETerm cond tt ifFalse- | tt == ifFalse = Just $ pevalITETerm (pevalOrTerm (pevalNotTerm cond) tc) tt tf- | tf == ifFalse = Just $ pevalITETerm (pevalAndTerm cond tc) tt tf-pevalITEBasic cond ifTrue (ITETerm _ _ _ _ fc ft ff) -- later- | ifTrue == ft = Just $ pevalITETerm (pevalOrTerm cond fc) ifTrue ff- | ifTrue == ff = Just $ pevalITETerm (pevalOrTerm cond (pevalNotTerm fc)) ifTrue ft- | pevalImpliesTerm fc cond = Just $ pevalITETerm cond ifTrue ff-pevalITEBasic _ _ _ = Nothing--pevalITEBoolBasic :: Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)-pevalITEBoolBasic cond ifTrue ifFalse- | cond == ifTrue = Just $ pevalOrTerm cond ifFalse- | cond == ifFalse = Just $ pevalAndTerm cond ifTrue-pevalITEBoolBasic cond (ConTerm _ _ _ _ v) ifFalse- | v = Just $ pevalOrTerm cond ifFalse- | otherwise = Just $ pevalAndTerm (pevalNotTerm cond) ifFalse-pevalITEBoolBasic cond ifTrue (ConTerm _ _ _ _ v)- | v = Just $ pevalOrTerm (pevalNotTerm cond) ifTrue- | otherwise = Just $ pevalAndTerm cond ifTrue-pevalITEBoolBasic _ _ _ = Nothing--pevalITEBool :: Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)-pevalITEBool cond ~ifTrue ~ifFalse =- msum- [ pevalITEBasic cond ifTrue ifFalse,- pevalITEBoolBasic cond ifTrue ifFalse,- pevalITEBoolLeft cond ifTrue ifFalse,- pevalITEBoolNoLeft cond ifTrue ifFalse- ]---- | Basic partial evaluation for ITE terms.-pevalITEBasicTerm :: (SupportedPrim a) => Term Bool -> Term a -> Term a -> Term a-pevalITEBasicTerm cond ~ifTrue ~ifFalse =- fromMaybe (iteTerm cond ifTrue ifFalse) $- pevalITEBasic cond ifTrue ifFalse---- | Default partial evaluation for equality terms.-pevalDefaultEqTerm :: (SupportedNonFuncPrim a) => Term a -> Term a -> Term Bool-pevalDefaultEqTerm l@ConTerm {} r@ConTerm {} = conTerm $ l == r-pevalDefaultEqTerm l@ConTerm {} r = pevalDefaultEqTerm r l-pevalDefaultEqTerm l (BoolConTerm rv) =- if rv- then unsafeCoerce l- else pevalNotTerm (unsafeCoerce l)-pevalDefaultEqTerm (NotTerm _ _ _ _ lv) r- | lv == r = falseTerm-pevalDefaultEqTerm l (NotTerm _ _ _ _ rv)- | l == rv = falseTerm-pevalDefaultEqTerm (AddNumTerm _ _ _ _ (ConTerm _ _ _ _ c) v) (ConTerm _ _ _ _ c2) =- pevalDefaultEqTerm v (conTerm $ c2 - c)-pevalDefaultEqTerm l (ITETerm _ _ _ _ c t f)- | l == t = pevalOrTerm c (pevalDefaultEqTerm l f)- | l == f = pevalOrTerm (pevalNotTerm c) (pevalDefaultEqTerm l t)-pevalDefaultEqTerm (ITETerm _ _ _ _ c t f) r- | t == r = pevalOrTerm c (pevalDefaultEqTerm f r)- | f == r = pevalOrTerm (pevalNotTerm c) (pevalDefaultEqTerm t r)-pevalDefaultEqTerm l r- | l == r = trueTerm- | otherwise = eqTerm l r-{-# INLINEABLE pevalDefaultEqTerm #-}--instance SBVRep Bool where- type SBVType Bool = SBV.SBV Bool--instance SupportedPrimConstraint Bool--instance SupportedPrim Bool where- pformatCon True = "true"- pformatCon False = "false"- defaultValue = defaultValueForBool- pevalITETerm cond ~ifTrue ~ifFalse =- fromMaybe (iteTerm cond ifTrue ifFalse) $- pevalITEBool cond ifTrue ifFalse- pevalEqTerm = pevalDefaultEqTerm- pevalDistinctTerm (_ :| []) = conTerm True- pevalDistinctTerm (a :| [b]) = pevalNotTerm $ pevalEqTerm a b- pevalDistinctTerm _ = conTerm False- conSBVTerm n = if n then SBV.sTrue else SBV.sFalse- symSBVName symbol _ = show symbol- symSBVTerm = sbvFresh- withPrim r = r- parseSMTModelResult _ = parseScalarSMTModelResult id- castTypedSymbol ::- forall knd knd'.- (IsSymbolKind knd') =>- TypedSymbol knd Bool ->- Maybe (TypedSymbol knd' Bool)- castTypedSymbol (TypedSymbol s) =- case decideSymbolKind @knd' of- Left HRefl -> Just $ TypedSymbol s- Right HRefl -> Just $ TypedSymbol s- funcDummyConstraint _ = SBV.sTrue--instance NonFuncSBVRep Bool where- type NonFuncSBVBaseType Bool = Bool--instance SupportedNonFuncPrim Bool where- conNonFuncSBVTerm = conSBVTerm- symNonFuncSBVTerm = symSBVTerm @Bool- withNonFuncPrim r = r--data PhantomDict a where- PhantomDict :: (SupportedPrim a) => PhantomDict a--data PhantomNonFuncDict a where- PhantomNonFuncDict ::- (SupportedNonFuncPrim a) => PhantomNonFuncDict a--{-# NOINLINE phantomDictCache #-}-phantomDictCache :: IORef (HM.HashMap SomeTypeRep (PhantomDict Any))-phantomDictCache = unsafePerformIO $ newIORef HM.empty---- TODO-{-# NOINLINE getPhantomDict #-}-getPhantomDict :: forall a. (SupportedPrim a) => PhantomDict a-getPhantomDict = unsafePerformIO $ do- cache <- readIORef phantomDictCache- let !tr = SomeTypeRep $ primTypeRep @a- case HM.lookup tr cache of- Just p -> return $ unsafeCoerce p- Nothing -> do- let r = PhantomDict :: PhantomDict a- atomicModifyIORefCAS_ phantomDictCache $ HM.insert tr $ unsafeCoerce r- return r--{-# NOINLINE phantomNonFuncDictCache #-}-phantomNonFuncDictCache ::- IORef (HM.HashMap SomeTypeRep (PhantomNonFuncDict Any))-phantomNonFuncDictCache = unsafePerformIO $ newIORef HM.empty---- TODO-{-# NOINLINE getPhantomNonFuncDict #-}-getPhantomNonFuncDict ::- forall a. (SupportedNonFuncPrim a) => PhantomNonFuncDict a-getPhantomNonFuncDict = unsafePerformIO $ do- cache <- readIORef phantomNonFuncDictCache- let !tr = SomeTypeRep $ primTypeRep @a- case HM.lookup tr cache of- Just p -> return $ unsafeCoerce p- Nothing -> do- let r = PhantomNonFuncDict :: PhantomNonFuncDict a- atomicModifyIORefCAS_ phantomNonFuncDictCache $- HM.insert tr $- unsafeCoerce r- return r+{-# HLINT ignore "Unused LANGUAGE pragma" #-}+{-# LANGUAGE DerivingStrategies #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE InstanceSigs #-}+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE QuantifiedConstraints #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE Strict #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE UndecidableInstances #-}+{-# LANGUAGE ViewPatterns #-}+{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}+{-# OPTIONS_GHC -funbox-strict-fields #-}++-- |+-- Module : Grisette.Internal.SymPrim.Prim.Internal.Term+-- Copyright : (c) Sirui Lu 2021-2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.SymPrim.Prim.Internal.Term+ ( -- * Supported primitive types+ SupportedPrimConstraint (..),+ SupportedPrim (..),+ SymRep (..),+ ConRep (..),+ LinkedRep (..),++ -- * Partial evaluation for the terms+ PEvalApplyTerm (..),+ PEvalBitwiseTerm (..),+ PEvalShiftTerm (..),+ PEvalRotateTerm (..),+ PEvalNumTerm (..),+ pevalSubNumTerm,+ PEvalOrdTerm (..),+ pevalGtOrdTerm,+ pevalGeOrdTerm,+ pevalNEqTerm,+ PEvalDivModIntegralTerm (..),+ PEvalBitCastTerm (..),+ PEvalBitCastOrTerm (..),+ PEvalBVTerm (..),+ PEvalFractionalTerm (..),+ PEvalFPTerm (..),+ PEvalFloatingTerm (..),+ PEvalFromIntegralTerm (..),+ PEvalIEEEFPConvertibleTerm (..),++ -- * Typed symbols+ SymbolKind (..),+ TypedSymbol (TypedSymbol, unTypedSymbol),+ typedConstantSymbol,+ typedAnySymbol,+ TypedConstantSymbol,+ TypedAnySymbol,+ SomeTypedSymbol (..),+ SomeTypedConstantSymbol,+ SomeTypedAnySymbol,+ IsSymbolKind (..),+ showUntyped,+ someTypedSymbol,+ eqHeteroSymbol,+ castSomeTypedSymbol,++ -- * Terms+ FPTrait (..),+ FPUnaryOp (..),+ FPBinaryOp (..),+ FPRoundingUnaryOp (..),+ FPRoundingBinaryOp (..),+ FloatingUnaryOp (..),+ Term (..),+ defaultValueDynamic,+ pattern DynTerm,+ toCurThread,+ CachedInfo (..),+ termInfo,+ termThreadId,+ termDigest,+ termId,+ termStableIdent,+ pformatTerm,+ ModelValue (..),+ toModelValue,+ unsafeFromModelValue,++ -- * Interning+ UTerm (..),+ prettyPrintTerm,++ -- * Interned constructors+ conTerm,+ symTerm,+ ssymTerm,+ isymTerm,+ forallTerm,+ existsTerm,+ notTerm,+ orTerm,+ andTerm,+ eqTerm,+ distinctTerm,+ iteTerm,+ addNumTerm,+ negNumTerm,+ mulNumTerm,+ absNumTerm,+ signumNumTerm,+ ltOrdTerm,+ leOrdTerm,+ andBitsTerm,+ orBitsTerm,+ xorBitsTerm,+ complementBitsTerm,+ shiftLeftTerm,+ rotateLeftTerm,+ shiftRightTerm,+ rotateRightTerm,+ bitCastTerm,+ bitCastOrTerm,+ bvConcatTerm,+ bvSelectTerm,+ bvExtendTerm,+ bvsignExtendTerm,+ bvzeroExtendTerm,+ applyTerm,+ divIntegralTerm,+ modIntegralTerm,+ quotIntegralTerm,+ remIntegralTerm,+ fpTraitTerm,+ fdivTerm,+ recipTerm,+ floatingUnaryTerm,+ powerTerm,+ fpUnaryTerm,+ fpBinaryTerm,+ fpRoundingUnaryTerm,+ fpRoundingBinaryTerm,+ fpFMATerm,+ fromIntegralTerm,+ fromFPOrTerm,+ toFPTerm,++ -- * Patterns+ pattern SupportedTerm,+ pattern SupportedTypedSymbol,+ pattern SupportedConstantTypedSymbol,+ pattern ConTerm,+ pattern SymTerm,+ pattern ForallTerm,+ pattern ExistsTerm,+ pattern NotTerm,+ pattern OrTerm,+ pattern AndTerm,+ pattern OrTermAll,+ pattern AndTermAll,+ pattern EqTerm,+ pattern DistinctTerm,+ pattern ITETerm,+ pattern AddNumTerm,+ pattern NegNumTerm,+ pattern MulNumTerm,+ pattern AbsNumTerm,+ pattern SignumNumTerm,+ pattern LtOrdTerm,+ pattern LeOrdTerm,+ pattern AndBitsTerm,+ pattern OrBitsTerm,+ pattern XorBitsTerm,+ pattern ComplementBitsTerm,+ pattern ShiftLeftTerm,+ pattern RotateLeftTerm,+ pattern ShiftRightTerm,+ pattern RotateRightTerm,+ pattern BitCastTerm,+ pattern BitCastOrTerm,+ pattern BVConcatTerm,+ pattern BVSelectTerm,+ pattern BVExtendTerm,+ pattern ApplyTerm,+ pattern DivIntegralTerm,+ pattern ModIntegralTerm,+ pattern QuotIntegralTerm,+ pattern RemIntegralTerm,+ pattern FPTraitTerm,+ pattern FdivTerm,+ pattern RecipTerm,+ pattern FloatingUnaryTerm,+ pattern PowerTerm,+ pattern FPUnaryTerm,+ pattern FPBinaryTerm,+ pattern FPRoundingUnaryTerm,+ pattern FPRoundingBinaryTerm,+ pattern FPFMATerm,+ pattern FromIntegralTerm,+ pattern FromFPOrTerm,+ pattern ToFPTerm,++ -- * Support for boolean type+ trueTerm,+ falseTerm,+ pattern BoolConTerm,+ pattern TrueTerm,+ pattern FalseTerm,+ pattern BoolTerm,+ pevalNotTerm,+ pevalOrTerm,+ pevalAndTerm,+ pevalImplyTerm,+ pevalXorTerm,+ pevalITEBasic,+ pevalITEBasicTerm,+ pevalDefaultEqTerm,+ NonFuncPrimConstraint,+ NonFuncSBVRep (..),+ SupportedNonFuncPrim (..),+ SBVRep (..),+ SBVFreshMonad (..),+ translateTypeError,+ parseSMTModelResultError,+ partitionCVArg,+ parseScalarSMTModelResult,+ bvIsNonZeroFromGEq1,++ -- * Partial evaluation+ PartialFun,+ PartialRuleUnary,+ TotalRuleUnary,+ PartialRuleBinary,+ TotalRuleBinary,+ totalize,+ totalize2,+ UnaryPartialStrategy (..),+ unaryPartial,+ BinaryCommPartialStrategy (..),+ BinaryPartialStrategy (..),+ binaryPartial,++ -- * Unfold+ unaryUnfoldOnce,+ binaryUnfoldOnce,+ generalUnaryUnfolded,+ generalBinaryUnfolded,++ -- * bv+ unsafePevalBVConcatTerm,+ unsafePevalBVExtendTerm,+ unsafePevalBVSelectTerm,+ boolToBVTerm,++ -- * num+ pevalDefaultAddNumTerm,+ pevalDefaultNegNumTerm,+ pevalDefaultMulNumTerm,+ pevalBitsAbsNumTerm,+ doPevalNoOverflowAbsNumTerm,+ pevalGeneralSignumNumTerm,+ doPevalNoOverflowSignumNumTerm,+ )+where++#if MIN_VERSION_prettyprinter(1,7,0)+import Prettyprinter+ ( column,+ pageWidth,+ Doc,+ PageWidth(Unbounded, AvailablePerLine),+ Pretty(pretty),+ )+#else+import Data.Text.Prettyprint.Doc+ ( column,+ pageWidth,+ Doc,+ PageWidth(Unbounded, AvailablePerLine),+ Pretty(pretty),+ )+#endif++#if !MIN_VERSION_sbv(10,0,0)+#define SMTDefinable Uninterpreted+#endif++#if MIN_VERSION_sbv(11,0,0)+import qualified Data.SBV as SBVTC+#endif++#if MIN_VERSION_base(4,15,0)+import Language.Haskell.TH (Code, Quote)+#else+import Language.Haskell.TH (TExpQ)+#endif++import Control.DeepSeq (NFData (rnf))+import Control.Monad (msum)+import Control.Monad.Except (MonadError (catchError))+import Control.Monad.IO.Class (MonadIO)+import qualified Control.Monad.RWS.Lazy as Lazy+import qualified Control.Monad.RWS.Strict as Strict+import Control.Monad.Reader (MonadTrans (lift), ReaderT)+import qualified Control.Monad.State.Lazy as Lazy+import qualified Control.Monad.State.Strict as Strict+import qualified Control.Monad.Writer.Lazy as Lazy+import qualified Control.Monad.Writer.Strict as Strict+import Data.Atomics (atomicModifyIORefCAS_)+import qualified Data.Binary as Binary+import Data.Bits+ ( Bits (complement, isSigned, xor, zeroBits, (.&.), (.|.)),+ FiniteBits (countLeadingZeros),+ )+import Data.Bytes.Serial (Serial (deserialize, serialize))+import Data.Coerce (coerce)+import qualified Data.HashMap.Strict as HM+import qualified Data.HashSet as HS+import Data.Hashable (Hashable (hashWithSalt))+import Data.IORef (IORef, newIORef, readIORef)+import Data.Kind (Constraint, Type)+import Data.List.NonEmpty (NonEmpty ((:|)), toList)+import Data.Maybe (fromMaybe, isJust)+import Data.Proxy (Proxy (Proxy))+import Data.SBV (BVIsNonZero)+import qualified Data.SBV as SBV+import qualified Data.SBV.Dynamic as SBVD+import qualified Data.SBV.Trans as SBVT+import qualified Data.SBV.Trans.Control as SBVTC+import qualified Data.Serialize as Cereal+import Data.String (IsString (fromString))+import Data.Type.Equality ((:~:) (Refl), type (:~~:) (HRefl))+import Data.Typeable (Typeable, cast, typeRepFingerprint)+import GHC.Exts (Any, sortWith)+import GHC.Fingerprint (Fingerprint)+import GHC.Generics (Generic)+import GHC.IO (unsafePerformIO)+import GHC.Stack (HasCallStack)+import GHC.TypeNats (KnownNat, Nat, natVal, sameNat, type (+), type (-), type (<=))+import Grisette.Internal.Core.Data.Class.BitCast (BitCast (bitCast), BitCastOr)+import Grisette.Internal.Core.Data.Class.BitVector+ ( SizedBV+ ( sizedBVConcat,+ sizedBVFromIntegral,+ sizedBVSelect,+ sizedBVSext,+ sizedBVZext+ ),+ )+import Grisette.Internal.Core.Data.Class.IEEEFP+ ( fpIsNegativeZero,+ fpIsPositiveZero,+ )+import Grisette.Internal.Core.Data.Symbol+ ( Identifier,+ Symbol (IndexedSymbol, SimpleSymbol),+ )+import Grisette.Internal.SymPrim.AlgReal (AlgReal, fromSBVAlgReal, toSBVAlgReal)+import Grisette.Internal.SymPrim.BV (IntN, WordN)+import Grisette.Internal.SymPrim.FP+ ( FP (FP),+ FPRoundingMode (RNA, RNE, RTN, RTP, RTZ),+ ValidFP,+ )+import Grisette.Internal.SymPrim.Prim.Internal.Caches+ ( CachedInfo+ ( CachedInfo,+ cachedDigest,+ cachedId,+ cachedStableIdent,+ cachedThreadId+ ),+ Digest,+ Id,+ Interned+ ( Description,+ Uninterned,+ describe,+ descriptionDigest,+ identify,+ threadId+ ),+ StableIdent,+ intern,+ )+import Grisette.Internal.SymPrim.Prim.Internal.Utils+ ( WeakThreadId,+ myWeakThreadId,+ )+import Grisette.Internal.Utils.Parameterized+ ( LeqProof (LeqProof),+ NatRepr,+ SomeNatRepr (SomeNatRepr),+ SomePositiveNatRepr (SomePositiveNatRepr),+ addNat,+ mkNatRepr,+ mkPositiveNatRepr,+ natRepr,+ unsafeAxiom,+ unsafeKnownProof,+ unsafeLeqProof,+ withKnownNat,+ withKnownProof,+ )+import Language.Haskell.TH.Syntax (Lift (liftTyped))+import Type.Reflection+ ( SomeTypeRep (SomeTypeRep),+ TypeRep,+ eqTypeRep,+ someTypeRep,+ typeRep,+ )+import qualified Type.Reflection as R+import Unsafe.Coerce (unsafeCoerce)++-- $setup+-- >>> import Grisette.Core+-- >>> import Grisette.SymPrim++-- | Monads that supports generating sbv fresh variables.+class (MonadIO m) => SBVFreshMonad m where+ sbvFresh :: (SBV.SymVal a) => String -> m (SBV.SBV a)++instance (MonadIO m) => SBVFreshMonad (SBVT.SymbolicT m) where+ sbvFresh = SBVT.free+ {-# INLINE sbvFresh #-}++instance (MonadIO m) => SBVFreshMonad (SBVTC.QueryT m) where+ sbvFresh = SBVTC.freshVar+ {-# INLINE sbvFresh #-}++instance (SBVFreshMonad m) => SBVFreshMonad (ReaderT r m) where+ sbvFresh = lift . sbvFresh+ {-# INLINE sbvFresh #-}++instance (SBVFreshMonad m, Monoid w) => SBVFreshMonad (Lazy.WriterT w m) where+ sbvFresh = lift . sbvFresh+ {-# INLINE sbvFresh #-}++instance (SBVFreshMonad m, Monoid w) => SBVFreshMonad (Lazy.RWST r w s m) where+ sbvFresh = lift . sbvFresh+ {-# INLINE sbvFresh #-}++instance (SBVFreshMonad m) => SBVFreshMonad (Lazy.StateT s m) where+ sbvFresh = lift . sbvFresh+ {-# INLINE sbvFresh #-}++instance (SBVFreshMonad m, Monoid w) => SBVFreshMonad (Strict.WriterT w m) where+ sbvFresh = lift . sbvFresh+ {-# INLINE sbvFresh #-}++instance (SBVFreshMonad m, Monoid w) => SBVFreshMonad (Strict.RWST r w s m) where+ sbvFresh = lift . sbvFresh+ {-# INLINE sbvFresh #-}++instance (SBVFreshMonad m) => SBVFreshMonad (Strict.StateT s m) where+ sbvFresh = lift . sbvFresh+ {-# INLINE sbvFresh #-}++-- | Error message for unsupported types.+translateTypeError :: (HasCallStack) => Maybe String -> TypeRep a -> b+translateTypeError Nothing ta =+ error $+ "Don't know how to translate the type " ++ show ta ++ " to SMT"+translateTypeError (Just reason) ta =+ error $+ "Don't know how to translate the type " ++ show ta ++ " to SMT: " <> reason++-- | Type class for resolving the base type for the SBV type for the primitive+-- type.+class+ ( SupportedPrim a,+ Ord a,+ Eq a,+ Show a,+ Hashable a,+ Typeable a+ ) =>+ NonFuncSBVRep a+ where+ type NonFuncSBVBaseType a++-- | Type class for resolving the constraint for a supported non-function+-- primitive type.+type NonFuncPrimConstraint a =+ ( SBV.SymVal (NonFuncSBVBaseType a),+ SBV.EqSymbolic (SBVType a),+ SBV.Mergeable (SBVType a),+ SBV.SMTDefinable (SBVType a),+ SBV.Mergeable (SBVType a),+ SBVType a ~ SBV.SBV (NonFuncSBVBaseType a),+ PrimConstraint a+ )++-- | Indicates that a type is supported, can be represented as a symbolic term,+-- is not a function type, and can be lowered to an SBV term.+class (NonFuncSBVRep a) => SupportedNonFuncPrim a where+ conNonFuncSBVTerm :: a -> SBV.SBV (NonFuncSBVBaseType a)+ symNonFuncSBVTerm ::+ (SBVFreshMonad m) => String -> m (SBV.SBV (NonFuncSBVBaseType a))+ withNonFuncPrim :: ((NonFuncPrimConstraint a) => r) -> r++-- | Partition the list of CVs for models for functions.+partitionCVArg ::+ forall a.+ (SupportedNonFuncPrim a) =>+ [([SBVD.CV], SBVD.CV)] ->+ [(a, [([SBVD.CV], SBVD.CV)])]+partitionCVArg cv =+ partitionOrdCVArg $+ parseFirstCVArg cv+ where+ parseFirstCVArg ::+ forall a.+ (SupportedNonFuncPrim a) =>+ [([SBVD.CV], SBVD.CV)] ->+ [(a, [([SBVD.CV], SBVD.CV)])]+ parseFirstCVArg =+ fmap+ ( \case+ (x : xs, v) ->+ (parseSMTModelResult 0 ([], x), [(xs, v)])+ _ -> error "impossible"+ )+ partitionOrdCVArg ::+ forall a.+ (SupportedNonFuncPrim a) =>+ [(a, [([SBVD.CV], SBVD.CV)])] ->+ [(a, [([SBVD.CV], SBVD.CV)])]+ partitionOrdCVArg v = go sorted+ where+ sorted = sortWith fst v :: [(a, [([SBVD.CV], SBVD.CV)])]+ go (x : x1 : xs) =+ if fst x == fst x1+ then go $ (fst x, snd x ++ snd x1) : xs+ else x : go (x1 : xs)+ go x = x++-- | Parse the scalar model result.+parseScalarSMTModelResult ::+ forall v r.+ (SBVT.SatModel r, Typeable v) =>+ (r -> v) ->+ ([([SBVD.CV], SBVD.CV)], SBVD.CV) ->+ v+parseScalarSMTModelResult convert cvs@([], v) = case SBVT.parseCVs [v] of+ Just (x, _) -> convert x+ Nothing -> parseSMTModelResultError (typeRep @v) cvs+parseScalarSMTModelResult _ cv = parseSMTModelResultError (typeRep @v) cv++-- | Type class for resolving the SBV type for the primitive type.+class SBVRep t where+ type SBVType t++-- | Type class for resolving the constraint for a supported primitive type.+class SupportedPrimConstraint t where+ type PrimConstraint t :: Constraint+ type PrimConstraint _ = ()++-- | Indicates that a type is supported, can be represented as a symbolic term,+-- and can be lowered to an SBV term.+class+ ( Lift t,+ NFData t,+ Typeable t,+ SupportedPrimConstraint t,+ SBVRep t+ ) =>+ SupportedPrim t+ where+ primTypeRep :: TypeRep t+ default primTypeRep :: (Typeable t) => TypeRep t+ primTypeRep = typeRep+ sameCon :: t -> t -> Bool+ default sameCon :: (Eq t) => t -> t -> Bool+ sameCon = (==)+ hashConWithSalt :: Int -> t -> Int+ default hashConWithSalt :: (Hashable t) => Int -> t -> Int+ hashConWithSalt = hashWithSalt+ pformatCon :: t -> String+ default pformatCon :: (Show t) => t -> String+ pformatCon = show+ defaultValue :: t+ pevalITETerm :: Term Bool -> Term t -> Term t -> Term t+ pevalEqTerm :: Term t -> Term t -> Term Bool+ pevalDistinctTerm :: NonEmpty (Term t) -> Term Bool+ conSBVTerm :: t -> SBVType t+ symSBVName :: TypedSymbol 'AnyKind t -> Int -> String+ symSBVTerm :: (SBVFreshMonad m) => String -> m (SBVType t)+ default withPrim ::+ ( PrimConstraint t,+ SBV.SMTDefinable (SBVType t),+ SBV.Mergeable (SBVType t),+ Typeable (SBVType t)+ ) =>+ ( ( PrimConstraint t,+ SBV.SMTDefinable (SBVType t),+ SBV.Mergeable (SBVType t),+ Typeable (SBVType t)+ ) =>+ a+ ) ->+ a+ withPrim ::+ ( ( PrimConstraint t,+ SBV.SMTDefinable (SBVType t),+ SBV.Mergeable (SBVType t),+ Typeable (SBVType t)+ ) =>+ a+ ) ->+ a+ withPrim i = i+ {-# INLINE withPrim #-}+ sbvIte :: SBV.SBV Bool -> SBVType t -> SBVType t -> SBVType t+ sbvIte = withPrim @t SBV.ite+ sbvEq :: SBVType t -> SBVType t -> SBV.SBV Bool+ default sbvEq ::+ (SBVT.EqSymbolic (SBVType t)) => SBVType t -> SBVType t -> SBV.SBV Bool+ sbvEq = (SBV..==)+ sbvDistinct :: NonEmpty (SBVType t) -> SBV.SBV Bool+ default sbvDistinct ::+ (SBVT.EqSymbolic (SBVType t)) => NonEmpty (SBVType t) -> SBV.SBV Bool+ sbvDistinct = SBV.distinct . toList+ parseSMTModelResult :: Int -> ([([SBVD.CV], SBVD.CV)], SBVD.CV) -> t+ castTypedSymbol ::+ (IsSymbolKind knd') => TypedSymbol knd t -> Maybe (TypedSymbol knd' t)+ funcDummyConstraint :: SBVType t -> SBV.SBV Bool++-- | The default value in a dynamic t'ModelValue'.+defaultValueDynamic ::+ forall t proxy. (SupportedPrim t) => proxy t -> ModelValue+defaultValueDynamic _ = toModelValue (defaultValue @t)++-- | A value with its type information.+data ModelValue where+ ModelValue :: forall v. (SupportedPrim v) => v -> ModelValue++instance NFData ModelValue where+ rnf (ModelValue v) = rnf v++instance Lift ModelValue where+ liftTyped (ModelValue v) = [||ModelValue v||]++instance Show ModelValue where+ show (ModelValue (v :: v)) = pformatCon v ++ " :: " ++ show (primTypeRep @v)++instance Eq ModelValue where+ (ModelValue (v1 :: v1)) == (ModelValue (v2 :: v2)) =+ case eqTypeRep (primTypeRep @v1) (primTypeRep @v2) of+ Just HRefl -> sameCon v1 v2+ _ -> False++instance Hashable ModelValue where+ s `hashWithSalt` (ModelValue (v :: v)) =+ (s `hashWithSalt` (primTypeRep @v)) `hashConWithSalt` v++-- | Convert from a model value. Crashes if the types does not match.+unsafeFromModelValue :: forall a. (Typeable a) => ModelValue -> a+unsafeFromModelValue (ModelValue (v :: v)) =+ case eqTypeRep (primTypeRep @v) (typeRep @a) of+ Just HRefl -> v+ _ ->+ error $+ "Bad model value type, expected type: "+ ++ show (typeRep @a)+ ++ ", but got: "+ ++ show (primTypeRep @v)++-- | Convert to a model value.+toModelValue :: forall a. (SupportedPrim a) => a -> ModelValue+toModelValue = ModelValue++-- | Cast a typed symbol to a different kind. Check if the kind is compatible.+castSomeTypedSymbol ::+ (IsSymbolKind knd') => SomeTypedSymbol knd -> Maybe (SomeTypedSymbol knd')+castSomeTypedSymbol (SomeTypedSymbol s@TypedSymbol {}) =+ SomeTypedSymbol <$> castTypedSymbol s+{-# INLINE castSomeTypedSymbol #-}++-- | Error message for failure to parse the SBV model result.+parseSMTModelResultError ::+ (HasCallStack) => TypeRep a -> ([([SBVD.CV], SBVD.CV)], SBVD.CV) -> a+parseSMTModelResultError ty cv =+ error $+ "BUG: cannot parse SBV model value \""+ <> show cv+ <> "\" to Grisette model value with the type "+ <> show ty++-- | Partial evaluation for inequality terms.+pevalNEqTerm :: (SupportedPrim a) => Term a -> Term a -> Term Bool+pevalNEqTerm l r = pevalNotTerm $ pevalEqTerm l r+{-# INLINE pevalNEqTerm #-}++-- | Type family to resolve the concrete type associated with a symbolic type.+class ConRep sym where+ type ConType sym++-- | Type family to resolve the symbolic type associated with a concrete type.+class (SupportedPrim con) => SymRep con where+ type SymType con++-- | One-to-one mapping between symbolic types and concrete types.+class+ (ConRep sym, SymRep con, sym ~ SymType con, con ~ ConType sym) =>+ LinkedRep con sym+ | con -> sym,+ sym -> con+ where+ underlyingTerm :: sym -> Term con+ wrapTerm :: Term con -> sym++-- | Partial evaluation and lowering for function application terms.+class PEvalApplyTerm f a b | f -> a b where+ pevalApplyTerm :: Term f -> Term a -> Term b+ sbvApplyTerm :: SBVType f -> SBVType a -> SBVType b++-- | Partial evaluation and lowering for bitwise operation terms.+class PEvalBitwiseTerm t where+ pevalAndBitsTerm :: Term t -> Term t -> Term t+ pevalOrBitsTerm :: Term t -> Term t -> Term t+ pevalXorBitsTerm :: Term t -> Term t -> Term t+ pevalComplementBitsTerm :: Term t -> Term t+ withSbvBitwiseTermConstraint :: (((Bits (SBVType t)) => r)) -> r+ sbvAndBitsTerm :: SBVType t -> SBVType t -> SBVType t+ sbvAndBitsTerm = withSbvBitwiseTermConstraint @t (SBV..&.)+ sbvOrBitsTerm :: SBVType t -> SBVType t -> SBVType t+ sbvOrBitsTerm = withSbvBitwiseTermConstraint @t (SBV..|.)+ sbvXorBitsTerm :: SBVType t -> SBVType t -> SBVType t+ sbvXorBitsTerm = withSbvBitwiseTermConstraint @t SBV.xor+ sbvComplementBitsTerm :: SBVType t -> SBVType t+ sbvComplementBitsTerm = withSbvBitwiseTermConstraint @t SBV.complement++-- | Partial evaluation and lowering for symbolic shifting terms.+class PEvalShiftTerm t where+ pevalShiftLeftTerm :: Term t -> Term t -> Term t+ pevalShiftRightTerm :: Term t -> Term t -> Term t+ withSbvShiftTermConstraint ::+ (((SBV.SIntegral (NonFuncSBVBaseType t)) => r)) -> r+ sbvShiftLeftTerm :: SBVType t -> SBVType t -> SBVType t+ default sbvShiftLeftTerm ::+ (SupportedNonFuncPrim t) => SBVType t -> SBVType t -> SBVType t+ sbvShiftLeftTerm l r =+ withNonFuncPrim @t $ withSbvShiftTermConstraint @t $ SBV.sShiftLeft l r+ default sbvShiftRightTerm ::+ (SupportedNonFuncPrim t) => SBVType t -> SBVType t -> SBVType t+ sbvShiftRightTerm :: SBVType t -> SBVType t -> SBVType t+ sbvShiftRightTerm l r =+ withNonFuncPrim @t $ withSbvShiftTermConstraint @t $ SBV.sShiftRight l r++-- | Partial evaluation and lowering for symbolic rotate terms.+class PEvalRotateTerm t where+ pevalRotateLeftTerm :: Term t -> Term t -> Term t+ pevalRotateRightTerm :: Term t -> Term t -> Term t+ withSbvRotateTermConstraint ::+ (((SBV.SIntegral (NonFuncSBVBaseType t)) => r)) -> r+ sbvRotateLeftTerm :: SBVType t -> SBVType t -> SBVType t+ default sbvRotateLeftTerm ::+ (SupportedNonFuncPrim t) => SBVType t -> SBVType t -> SBVType t+ sbvRotateLeftTerm l r =+ withNonFuncPrim @t $ withSbvRotateTermConstraint @t $ SBV.sRotateLeft l r+ sbvRotateRightTerm :: SBVType t -> SBVType t -> SBVType t+ default sbvRotateRightTerm ::+ (SupportedNonFuncPrim t) => SBVType t -> SBVType t -> SBVType t+ sbvRotateRightTerm l r =+ withNonFuncPrim @t $ withSbvRotateTermConstraint @t $ SBV.sRotateRight l r++-- | Partial evaluation and lowering for number terms.+class (Num t) => PEvalNumTerm t where+ pevalAddNumTerm :: Term t -> Term t -> Term t+ pevalNegNumTerm :: Term t -> Term t+ pevalMulNumTerm :: Term t -> Term t -> Term t+ pevalAbsNumTerm :: Term t -> Term t+ pevalSignumNumTerm :: Term t -> Term t+ withSbvNumTermConstraint :: (((Num (SBVType t)) => r)) -> r+ sbvAddNumTerm ::+ SBVType t ->+ SBVType t ->+ SBVType t+ sbvAddNumTerm l r = withSbvNumTermConstraint @t $ l + r+ sbvNegNumTerm ::+ SBVType t ->+ SBVType t+ sbvNegNumTerm l = withSbvNumTermConstraint @t $ -l+ sbvMulNumTerm ::+ SBVType t ->+ SBVType t ->+ SBVType t+ sbvMulNumTerm l r = withSbvNumTermConstraint @t $ l * r+ sbvAbsNumTerm ::+ SBVType t ->+ SBVType t+ sbvAbsNumTerm l = withSbvNumTermConstraint @t $ abs l+ sbvSignumNumTerm ::+ SBVType t ->+ SBVType t+ sbvSignumNumTerm l = withSbvNumTermConstraint @t $ signum l++-- | Partial evaluation for subtraction terms.+pevalSubNumTerm :: (PEvalNumTerm a) => Term a -> Term a -> Term a+pevalSubNumTerm l r = pevalAddNumTerm l (pevalNegNumTerm r)++-- | Partial evaluation and lowering for comparison terms.+class PEvalOrdTerm t where+ pevalLtOrdTerm :: Term t -> Term t -> Term Bool+ pevalLeOrdTerm :: Term t -> Term t -> Term Bool+ withSbvOrdTermConstraint :: (((SBV.OrdSymbolic (SBVType t)) => r)) -> r+ sbvLtOrdTerm ::+ SBVType t ->+ SBVType t ->+ SBV.SBV Bool+ sbvLtOrdTerm l r = withSbvOrdTermConstraint @t $ l SBV..< r+ sbvLeOrdTerm :: SBVType t -> SBVType t -> SBV.SBV Bool+ sbvLeOrdTerm l r = withSbvOrdTermConstraint @t $ l SBV..<= r++-- | Partial evaluation for greater than terms.+pevalGtOrdTerm :: (PEvalOrdTerm a) => Term a -> Term a -> Term Bool+pevalGtOrdTerm = flip pevalLtOrdTerm+{-# INLINE pevalGtOrdTerm #-}++-- | Partial evaluation for greater than or equal to terms.+pevalGeOrdTerm :: (PEvalOrdTerm a) => Term a -> Term a -> Term Bool+pevalGeOrdTerm = flip pevalLeOrdTerm+{-# INLINE pevalGeOrdTerm #-}++-- | Partial evaluation and lowering for integer division and modulo terms.+class PEvalDivModIntegralTerm t where+ pevalDivIntegralTerm :: Term t -> Term t -> Term t+ pevalModIntegralTerm :: Term t -> Term t -> Term t+ pevalQuotIntegralTerm :: Term t -> Term t -> Term t+ pevalRemIntegralTerm :: Term t -> Term t -> Term t+ withSbvDivModIntegralTermConstraint ::+ (((SBV.SDivisible (SBVType t)) => r)) -> r+ sbvDivIntegralTerm :: SBVType t -> SBVType t -> SBVType t+ sbvDivIntegralTerm l r =+ withSbvDivModIntegralTermConstraint @t $ l `SBV.sDiv` r+ sbvModIntegralTerm :: SBVType t -> SBVType t -> SBVType t+ sbvModIntegralTerm l r =+ withSbvDivModIntegralTermConstraint @t $ l `SBV.sMod` r+ sbvQuotIntegralTerm :: SBVType t -> SBVType t -> SBVType t+ sbvQuotIntegralTerm l r =+ withSbvDivModIntegralTermConstraint @t $ l `SBV.sQuot` r+ sbvRemIntegralTerm :: SBVType t -> SBVType t -> SBVType t+ sbvRemIntegralTerm l r =+ withSbvDivModIntegralTermConstraint @t $ l `SBV.sRem` r++-- | Partial evaluation and lowering for bitcast terms.+class (BitCast a b) => PEvalBitCastTerm a b where+ pevalBitCastTerm :: Term a -> Term b+ sbvBitCast :: SBVType a -> SBVType b++-- | Partial evaluation and lowering for bitcast or default value terms.+class+ (BitCastOr a b) =>+ PEvalBitCastOrTerm a b+ where+ pevalBitCastOrTerm :: Term b -> Term a -> Term b+ sbvBitCastOr :: SBVType b -> SBVType a -> SBVType b++-- | Partial evaluation and lowering for bit-vector terms.+class+ ( SizedBV bv,+ forall n. (KnownNat n, 1 <= n) => PEvalNumTerm (bv n),+ forall n. (KnownNat n, 1 <= n) => PEvalBitwiseTerm (bv n),+ forall n. (KnownNat n, 1 <= n) => FiniteBits (bv n),+ forall n. (KnownNat n, 1 <= n) => Num (bv n)+ ) =>+ PEvalBVTerm bv+ where+ pevalBVConcatTerm ::+ (KnownNat l, KnownNat r, 1 <= l, 1 <= r) =>+ Term (bv l) ->+ Term (bv r) ->+ Term (bv (l + r))+ pevalBVExtendTerm ::+ (KnownNat l, KnownNat r, 1 <= l, 1 <= r, l <= r) =>+ Bool ->+ proxy r ->+ Term (bv l) ->+ Term (bv r)+ pevalBVSelectTerm ::+ (KnownNat n, KnownNat ix, KnownNat w, 1 <= n, 1 <= w, ix + w <= n) =>+ p ix ->+ q w ->+ Term (bv n) ->+ Term (bv w)+ sbvBVConcatTerm ::+ (KnownNat l, KnownNat r, 1 <= l, 1 <= r) =>+ p1 l ->+ p2 r ->+ SBVType (bv l) ->+ SBVType (bv r) ->+ SBVType (bv (l + r))+ sbvBVExtendTerm ::+ (KnownNat l, KnownNat r, 1 <= l, 1 <= r, l <= r) =>+ p1 l ->+ p2 r ->+ Bool ->+ SBVType (bv l) ->+ SBVType (bv r)+ sbvBVSelectTerm ::+ ( KnownNat ix,+ KnownNat w,+ KnownNat n,+ 1 <= n,+ 1 <= w,+ ix + w <= n+ ) =>+ p1 ix ->+ p2 w ->+ p3 n ->+ SBVType (bv n) ->+ SBVType (bv w)++-- | Partial evaluation and lowering for fractional terms.+class (Fractional t) => PEvalFractionalTerm t where+ pevalFdivTerm :: Term t -> Term t -> Term t+ pevalRecipTerm :: Term t -> Term t+ withSbvFractionalTermConstraint ::+ (((Fractional (SBVType t)) => r)) ->+ r+ sbvFdivTerm ::+ SBVType t ->+ SBVType t ->+ SBVType t+ sbvFdivTerm l r = withSbvFractionalTermConstraint @t $ l / r+ sbvRecipTerm ::+ SBVType t ->+ SBVType t+ sbvRecipTerm l = withSbvFractionalTermConstraint @t $ recip l++-- | Unary floating point operations.+data FloatingUnaryOp+ = FloatingExp+ | FloatingLog+ | FloatingSqrt+ | FloatingSin+ | FloatingCos+ | FloatingTan+ | FloatingAsin+ | FloatingAcos+ | FloatingAtan+ | FloatingSinh+ | FloatingCosh+ | FloatingTanh+ | FloatingAsinh+ | FloatingAcosh+ | FloatingAtanh+ deriving (Eq, Ord, Generic, Hashable, Lift, NFData, Serial)++instance Cereal.Serialize FloatingUnaryOp where+ put = serialize+ get = deserialize++instance Binary.Binary FloatingUnaryOp where+ put = serialize+ get = deserialize++instance Show FloatingUnaryOp where+ show FloatingExp = "exp"+ show FloatingLog = "log"+ show FloatingSqrt = "sqrt"+ show FloatingSin = "sin"+ show FloatingCos = "cos"+ show FloatingTan = "tan"+ show FloatingAsin = "asin"+ show FloatingAcos = "acos"+ show FloatingAtan = "atan"+ show FloatingSinh = "sinh"+ show FloatingCosh = "cosh"+ show FloatingTanh = "tanh"+ show FloatingAsinh = "asinh"+ show FloatingAcosh = "acosh"+ show FloatingAtanh = "atanh"++-- | Partial evaluation and lowering for floating point terms.+class PEvalFPTerm fp where+ pevalFPTraitTerm :: (ValidFP eb sb) => FPTrait -> Term (fp eb sb) -> Term Bool+ pevalFPUnaryTerm ::+ (ValidFP eb sb) =>+ FPUnaryOp ->+ Term (fp eb sb) ->+ Term (fp eb sb)+ pevalFPBinaryTerm ::+ (ValidFP eb sb) =>+ FPBinaryOp ->+ Term (fp eb sb) ->+ Term (fp eb sb) ->+ Term (fp eb sb)+ pevalFPRoundingUnaryTerm ::+ (ValidFP eb sb) =>+ FPRoundingUnaryOp ->+ Term FPRoundingMode ->+ Term (fp eb sb) ->+ Term (fp eb sb)+ pevalFPRoundingBinaryTerm ::+ (ValidFP eb sb) =>+ FPRoundingBinaryOp ->+ Term FPRoundingMode ->+ Term (fp eb sb) ->+ Term (fp eb sb) ->+ Term (fp eb sb)+ pevalFPFMATerm ::+ (ValidFP eb sb) =>+ Term FPRoundingMode ->+ Term (fp eb sb) ->+ Term (fp eb sb) ->+ Term (fp eb sb) ->+ Term (fp eb sb)+ sbvFPTraitTerm ::+ (ValidFP eb sb) => FPTrait -> SBVType (fp eb sb) -> SBVType Bool+ sbvFPUnaryTerm ::+ (ValidFP eb sb) =>+ FPUnaryOp ->+ SBVType (fp eb sb) ->+ SBVType (fp eb sb)+ sbvFPBinaryTerm ::+ (ValidFP eb sb) =>+ FPBinaryOp ->+ SBVType (fp eb sb) ->+ SBVType (fp eb sb) ->+ SBVType (fp eb sb)+ sbvFPRoundingUnaryTerm ::+ (ValidFP eb sb) =>+ FPRoundingUnaryOp ->+ SBVType FPRoundingMode ->+ SBVType (fp eb sb) ->+ SBVType (fp eb sb)+ sbvFPRoundingBinaryTerm ::+ (ValidFP eb sb) =>+ FPRoundingBinaryOp ->+ SBVType FPRoundingMode ->+ SBVType (fp eb sb) ->+ SBVType (fp eb sb) ->+ SBVType (fp eb sb)+ sbvFPFMATerm ::+ (ValidFP eb sb) =>+ SBVType FPRoundingMode ->+ SBVType (fp eb sb) ->+ SBVType (fp eb sb) ->+ SBVType (fp eb sb) ->+ SBVType (fp eb sb)++-- | Partial evaluation and lowering for floating point terms.+class PEvalFloatingTerm t where+ pevalFloatingUnaryTerm :: FloatingUnaryOp -> Term t -> Term t+ pevalPowerTerm :: Term t -> Term t -> Term t+ withSbvFloatingTermConstraint ::+ (((Floating (SBVType t)) => r)) ->+ r+ sbvPowerTerm ::+ SBVType t ->+ SBVType t ->+ SBVType t+ sbvPowerTerm = withSbvFloatingTermConstraint @t (**)+ sbvFloatingUnaryTerm ::+ FloatingUnaryOp ->+ SBVType t ->+ SBVType t+ sbvFloatingUnaryTerm op l =+ withSbvFloatingTermConstraint @t $+ case op of+ FloatingExp -> exp l+ FloatingLog -> log l+ FloatingSqrt -> sqrt l+ FloatingSin -> sin l+ FloatingCos -> cos l+ FloatingTan -> tan l+ FloatingAsin -> asin l+ FloatingAcos -> acos l+ FloatingAtan -> atan l+ FloatingSinh -> sinh l+ FloatingCosh -> cosh l+ FloatingTanh -> tanh l+ FloatingAsinh -> asinh l+ FloatingAcosh -> acosh l+ FloatingAtanh -> atanh l++-- | Partial evaluation and lowering for integral terms.+class (Integral a, Num b) => PEvalFromIntegralTerm a b where+ pevalFromIntegralTerm :: Term a -> Term b+ sbvFromIntegralTerm :: SBVType a -> SBVType b++-- | Partial evaluation and lowering for converting from and to IEEE floating+-- point terms.+class PEvalIEEEFPConvertibleTerm a where+ pevalFromFPOrTerm ::+ (ValidFP eb sb) =>+ Term a ->+ Term FPRoundingMode ->+ Term (FP eb sb) ->+ Term a+ pevalToFPTerm ::+ (ValidFP eb sb) => Term FPRoundingMode -> Term a -> Term (FP eb sb)+ sbvFromFPOrTerm ::+ (ValidFP eb sb) =>+ SBVType a ->+ SBVType FPRoundingMode ->+ SBVType (FP eb sb) ->+ SBVType a+ sbvToFPTerm ::+ (ValidFP eb sb) =>+ SBVType FPRoundingMode ->+ SBVType a ->+ SBVType (FP eb sb)++-- Typed Symbols++-- | The kind of a symbol.+--+-- All symbols are 'AnyKind', and all symbols other than general/tabular+-- functions are 'ConstantKind'.+data SymbolKind = ConstantKind | AnyKind++-- | Decision procedure for symbol kinds.+class IsSymbolKind (knd :: SymbolKind) where+ type SymbolKindConstraint knd :: Type -> Constraint+ decideSymbolKind :: Either (knd :~~: 'ConstantKind) (knd :~~: 'AnyKind)+ withSymbolKindConstraint ::+ TypedSymbol knd t ->+ ((SymbolKindConstraint knd t) => a) ->+ a++instance IsSymbolKind 'ConstantKind where+ type SymbolKindConstraint 'ConstantKind = SupportedNonFuncPrim+ decideSymbolKind = Left HRefl+ withSymbolKindConstraint r = withConstantSymbolSupported r++instance IsSymbolKind 'AnyKind where+ type SymbolKindConstraint 'AnyKind = SupportedPrim+ decideSymbolKind = Right HRefl+ withSymbolKindConstraint r = withSymbolSupported r++-- | A typed symbol is a symbol that is associated with a type. Note that the+-- same symbol bodies with different types are considered different symbols+-- and can coexist in a term.+--+-- Simple symbols can be created with the @OverloadedStrings@ extension:+--+-- >>> "a" :: TypedSymbol 'AnyKind Bool+-- a :: Bool+data TypedSymbol (knd :: SymbolKind) t where+ TypedSymbol ::+ ( SupportedPrim t,+ SymbolKindConstraint knd t,+ IsSymbolKind knd+ ) =>+ {unTypedSymbol :: Symbol} ->+ TypedSymbol knd t++-- | Create a typed symbol with constant kinds.+typedConstantSymbol ::+ forall t. (SupportedNonFuncPrim t) => Symbol -> TypedSymbol 'ConstantKind t+typedConstantSymbol = typedConstantSymbol' getPhantomNonFuncDict+{-# INLINE typedConstantSymbol #-}++{-# NOINLINE typedConstantSymbol' #-}+typedConstantSymbol' ::+ forall t. PhantomNonFuncDict t -> Symbol -> TypedSymbol 'ConstantKind t+typedConstantSymbol' PhantomNonFuncDict symbol = TypedSymbol symbol++-- | Create a typed symbol with any kinds.+typedAnySymbol ::+ forall t. (SupportedPrim t) => Symbol -> TypedSymbol 'AnyKind t+typedAnySymbol = typedAnySymbol' getPhantomDict+{-# INLINE typedAnySymbol #-}++{-# NOINLINE typedAnySymbol' #-}+typedAnySymbol' ::+ forall t. PhantomDict t -> Symbol -> TypedSymbol 'AnyKind t+typedAnySymbol' PhantomDict symbol = TypedSymbol symbol++-- | Constant symbol+type TypedConstantSymbol = TypedSymbol 'ConstantKind++-- | Any symbol+type TypedAnySymbol = TypedSymbol 'AnyKind++instance Eq (TypedSymbol knd t) where+ TypedSymbol x == TypedSymbol y = x == y++instance Ord (TypedSymbol knd t) where+ TypedSymbol x <= TypedSymbol y = x <= y++instance Lift (TypedSymbol knd t) where+ liftTyped (TypedSymbol x) = [||TypedSymbol x||]++instance Show (TypedSymbol knd t) where+ show (TypedSymbol symbol) = show symbol ++ " :: " ++ show (primTypeRep @t)++-- | Show a typed symbol without the type information.+showUntyped :: TypedSymbol knd t -> String+showUntyped (TypedSymbol symbol) = show symbol++instance Hashable (TypedSymbol knd t) where+ s `hashWithSalt` TypedSymbol x = s `hashWithSalt` x++instance NFData (TypedSymbol knd t) where+ rnf (TypedSymbol str) = rnf str++instance+ ( SupportedPrim t,+ SymbolKindConstraint knd t,+ IsSymbolKind knd+ ) =>+ IsString (TypedSymbol knd t)+ where+ fromString = TypedSymbol . fromString++-- | Introduce the 'SupportedPrim' constraint from the t'TypedSymbol'.+withSymbolSupported ::+ forall knd t a.+ TypedSymbol knd t ->+ ((SupportedPrim t) => a) ->+ a+withSymbolSupported (TypedSymbol _) a = a+{-# INLINE withSymbolSupported #-}++-- | Introduce the 'SupportedPrim' constraint from the t'TypedSymbol'.+withConstantSymbolSupported ::+ forall t a.+ TypedSymbol 'ConstantKind t ->+ ((SupportedNonFuncPrim t) => a) ->+ a+withConstantSymbolSupported (TypedSymbol _) a = a+{-# INLINE withConstantSymbolSupported #-}++-- | A non-indexed symbol. Type information are checked at runtime.+data SomeTypedSymbol knd where+ SomeTypedSymbol ::+ forall knd t.+ TypedSymbol knd t ->+ SomeTypedSymbol knd++-- | Non-indexed constant symbol+type SomeTypedConstantSymbol = SomeTypedSymbol 'ConstantKind++-- | Non-indexed any symbol+type SomeTypedAnySymbol = SomeTypedSymbol 'AnyKind++instance NFData (SomeTypedSymbol knd) where+ rnf (SomeTypedSymbol s) = rnf s+ {-# INLINE rnf #-}++instance Lift (SomeTypedSymbol knd) where+ liftTyped (SomeTypedSymbol s) = [||SomeTypedSymbol s||]++instance Eq (SomeTypedSymbol knd) where+ (SomeTypedSymbol (s1 :: TypedSymbol knd a))+ == (SomeTypedSymbol (s2 :: TypedSymbol knd b)) =+ withSymbolSupported s1 $+ withSymbolSupported s2 $+ case eqTypeRep (primTypeRep @a) (primTypeRep @b) of+ Just HRefl -> s1 == s2+ _ -> False+ {-# INLINE (==) #-}++instance Ord (SomeTypedSymbol knd) where+ (SomeTypedSymbol (s1 :: TypedSymbol knd a))+ <= (SomeTypedSymbol (s2 :: TypedSymbol knd b)) =+ withSymbolSupported s1 $+ withSymbolSupported s2 $+ let t1 = primTypeRep @a+ t2 = primTypeRep @b+ in SomeTypeRep t1 < SomeTypeRep t2+ || ( case eqTypeRep t1 t2 of+ Just HRefl -> s1 <= s2+ _ -> False+ )++instance Hashable (SomeTypedSymbol knd) where+ hashWithSalt s (SomeTypedSymbol s1) = s `hashWithSalt` s1+ {-# INLINE hashWithSalt #-}++instance Show (SomeTypedSymbol knd) where+ show (SomeTypedSymbol s) = show s++-- | Construct a t'SomeTypedSymbol' from a t'TypedSymbol'.+someTypedSymbol :: forall knd t. TypedSymbol knd t -> SomeTypedSymbol knd+someTypedSymbol s@(TypedSymbol _) = SomeTypedSymbol s+{-# INLINE someTypedSymbol #-}++-- Terms++-- | Traits for IEEE floating point numbers.+data FPTrait+ = FPIsNaN+ | FPIsPositive+ | FPIsNegative+ | FPIsPositiveInfinite+ | FPIsNegativeInfinite+ | FPIsInfinite+ | FPIsPositiveZero+ | FPIsNegativeZero+ | FPIsZero+ | FPIsNormal+ | FPIsSubnormal+ | FPIsPoint+ deriving (Eq, Ord, Generic, Hashable, Lift, NFData, Serial)++instance Cereal.Serialize FPTrait where+ put = serialize+ get = deserialize++instance Binary.Binary FPTrait where+ put = serialize+ get = deserialize++instance Show FPTrait where+ show FPIsNaN = "is_nan"+ show FPIsPositive = "is_pos"+ show FPIsNegative = "is_neg"+ show FPIsPositiveInfinite = "is_pos_inf"+ show FPIsNegativeInfinite = "is_neg_inf"+ show FPIsInfinite = "is_inf"+ show FPIsPositiveZero = "is_pos_zero"+ show FPIsNegativeZero = "is_neg_zero"+ show FPIsZero = "is_zero"+ show FPIsNormal = "is_normal"+ show FPIsSubnormal = "is_subnormal"+ show FPIsPoint = "is_point"++-- | Unary floating point operations.+data FPUnaryOp = FPAbs | FPNeg+ deriving (Eq, Ord, Generic, Hashable, Lift, NFData, Serial)++instance Cereal.Serialize FPUnaryOp where+ put = serialize+ get = deserialize++instance Binary.Binary FPUnaryOp where+ put = serialize+ get = deserialize++instance Show FPUnaryOp where+ show FPAbs = "fp.abs"+ show FPNeg = "fp.neg"++-- | Binary floating point operations.+data FPBinaryOp+ = FPRem+ | FPMinimum+ | FPMinimumNumber+ | FPMaximum+ | FPMaximumNumber+ deriving (Eq, Ord, Generic, Hashable, Lift, NFData, Serial)++instance Cereal.Serialize FPBinaryOp where+ put = serialize+ get = deserialize++instance Binary.Binary FPBinaryOp where+ put = serialize+ get = deserialize++instance Show FPBinaryOp where+ show FPRem = "fp.rem"+ show FPMinimum = "fp.minimum"+ show FPMinimumNumber = "fp.minimumNumber"+ show FPMaximum = "fp.maximum"+ show FPMaximumNumber = "fp.maximumNumber"++-- | Unary floating point operations with rounding modes.+data FPRoundingUnaryOp = FPSqrt | FPRoundToIntegral+ deriving (Eq, Ord, Generic, Hashable, Lift, NFData, Serial)++instance Cereal.Serialize FPRoundingUnaryOp where+ put = serialize+ get = deserialize++instance Binary.Binary FPRoundingUnaryOp where+ put = serialize+ get = deserialize++instance Show FPRoundingUnaryOp where+ show FPSqrt = "fp.sqrt"+ show FPRoundToIntegral = "fp.roundToIntegral"++-- | Binary floating point operations with rounding modes.+data FPRoundingBinaryOp = FPAdd | FPSub | FPMul | FPDiv+ deriving (Eq, Ord, Generic, Hashable, Lift, NFData, Serial)++instance Cereal.Serialize FPRoundingBinaryOp where+ put = serialize+ get = deserialize++instance Binary.Binary FPRoundingBinaryOp where+ put = serialize+ get = deserialize++instance Show FPRoundingBinaryOp where+ show FPAdd = "fp.add"+ show FPSub = "fp.sub"+ show FPMul = "fp.mul"+ show FPDiv = "fp.div"++instance NFData CachedInfo where+ rnf (CachedInfo tid digest id stableIdent) =+ rnf tid `seq` rnf digest `seq` rnf id `seq` rnf stableIdent++-- | Internal representation for Grisette symbolic terms.+data Term t where+ ConTerm' ::+ (SupportedPrim t) =>+ {-# UNPACK #-} !CachedInfo ->+ !t ->+ Term t+ SymTerm' ::+ {-# UNPACK #-} !CachedInfo ->+ !(TypedSymbol 'AnyKind t) ->+ Term t+ ForallTerm' ::+ {-# UNPACK #-} !CachedInfo ->+ !(TypedSymbol 'ConstantKind t) ->+ !(Term Bool) ->+ Term Bool+ ExistsTerm' ::+ {-# UNPACK #-} !CachedInfo ->+ !(TypedSymbol 'ConstantKind t) ->+ !(Term Bool) ->+ Term Bool+ NotTerm' ::+ {-# UNPACK #-} !CachedInfo ->+ !(Term Bool) ->+ Term Bool+ OrTerm' ::+ {-# UNPACK #-} !CachedInfo ->+ !(Term Bool) ->+ !(Term Bool) ->+ !(HS.HashSet (Term Bool)) -> -- All or'ed terms+ Term Bool+ AndTerm' ::+ {-# UNPACK #-} !CachedInfo ->+ !(Term Bool) ->+ !(Term Bool) ->+ !(HS.HashSet (Term Bool)) -> -- All and'ed terms+ Term Bool+ EqTerm' ::+ {-# UNPACK #-} !CachedInfo ->+ !(Term t) ->+ !(Term t) ->+ Term Bool+ DistinctTerm' ::+ {-# UNPACK #-} !CachedInfo ->+ !(NonEmpty (Term t)) ->+ Term Bool+ ITETerm' ::+ (SupportedPrim t) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Term Bool) ->+ !(Term t) ->+ !(Term t) ->+ Term t+ AddNumTerm' ::+ (SupportedPrim t, PEvalNumTerm t) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Term t) ->+ !(Term t) ->+ Term t+ NegNumTerm' ::+ (SupportedPrim t, PEvalNumTerm t) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Term t) ->+ Term t+ MulNumTerm' ::+ (SupportedPrim t, PEvalNumTerm t) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Term t) ->+ !(Term t) ->+ Term t+ AbsNumTerm' ::+ (SupportedPrim t, PEvalNumTerm t) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Term t) ->+ Term t+ SignumNumTerm' ::+ (SupportedPrim t, PEvalNumTerm t) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Term t) ->+ Term t+ LtOrdTerm' ::+ (SupportedPrim t, PEvalOrdTerm t) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Term t) ->+ !(Term t) ->+ Term Bool+ LeOrdTerm' ::+ (SupportedPrim t, PEvalOrdTerm t) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Term t) ->+ !(Term t) ->+ Term Bool+ AndBitsTerm' ::+ (SupportedPrim t, PEvalBitwiseTerm t) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Term t) ->+ !(Term t) ->+ Term t+ OrBitsTerm' ::+ (SupportedPrim t, PEvalBitwiseTerm t) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Term t) ->+ !(Term t) ->+ Term t+ XorBitsTerm' ::+ (SupportedPrim t, PEvalBitwiseTerm t) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Term t) ->+ !(Term t) ->+ Term t+ ComplementBitsTerm' ::+ (SupportedPrim t, PEvalBitwiseTerm t) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Term t) ->+ Term t+ ShiftLeftTerm' ::+ (SupportedPrim t, PEvalShiftTerm t) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Term t) ->+ !(Term t) ->+ Term t+ ShiftRightTerm' ::+ (SupportedPrim t, PEvalShiftTerm t) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Term t) ->+ !(Term t) ->+ Term t+ RotateLeftTerm' ::+ (SupportedPrim t, PEvalRotateTerm t) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Term t) ->+ !(Term t) ->+ Term t+ RotateRightTerm' ::+ (SupportedPrim t, PEvalRotateTerm t) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Term t) ->+ !(Term t) ->+ Term t+ BitCastTerm' ::+ (SupportedPrim b, PEvalBitCastTerm a b) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Term a) ->+ Term b+ BitCastOrTerm' ::+ (SupportedPrim b, PEvalBitCastOrTerm a b) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Term b) ->+ !(Term a) ->+ Term b+ BVConcatTerm' ::+ ( PEvalBVTerm bv,+ KnownNat l,+ KnownNat r,+ KnownNat (l + r),+ 1 <= l,+ 1 <= r,+ 1 <= l + r,+ SupportedPrim (bv (l + r))+ ) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Term (bv l)) ->+ !(Term (bv r)) ->+ Term (bv (l + r))+ BVSelectTerm' ::+ ( PEvalBVTerm bv,+ KnownNat n,+ KnownNat ix,+ KnownNat w,+ 1 <= n,+ 1 <= w,+ ix + w <= n,+ SupportedPrim (bv w)+ ) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Proxy ix) ->+ !(Proxy w) ->+ !(Term (bv n)) ->+ Term (bv w)+ BVExtendTerm' ::+ ( PEvalBVTerm bv,+ KnownNat l,+ KnownNat r,+ 1 <= l,+ 1 <= r,+ l <= r,+ SupportedPrim (bv r)+ ) =>+ {-# UNPACK #-} !CachedInfo ->+ !Bool ->+ !(Proxy r) ->+ !(Term (bv l)) ->+ Term (bv r)+ ApplyTerm' ::+ (PEvalApplyTerm f a b, SupportedPrim b) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Term f) ->+ !(Term a) ->+ Term b+ DivIntegralTerm' ::+ (SupportedPrim t, PEvalDivModIntegralTerm t) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Term t) ->+ !(Term t) ->+ Term t+ ModIntegralTerm' ::+ (SupportedPrim t, PEvalDivModIntegralTerm t) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Term t) ->+ !(Term t) ->+ Term t+ QuotIntegralTerm' ::+ (SupportedPrim t, PEvalDivModIntegralTerm t) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Term t) ->+ !(Term t) ->+ Term t+ RemIntegralTerm' ::+ (SupportedPrim t, PEvalDivModIntegralTerm t) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Term t) ->+ !(Term t) ->+ Term t+ FPTraitTerm' ::+ (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) =>+ {-# UNPACK #-} !CachedInfo ->+ !FPTrait ->+ !(Term (fp eb sb)) ->+ Term Bool+ FdivTerm' ::+ (SupportedPrim t, PEvalFractionalTerm t) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Term t) ->+ !(Term t) ->+ Term t+ RecipTerm' ::+ (SupportedPrim t, PEvalFractionalTerm t) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Term t) ->+ Term t+ FloatingUnaryTerm' ::+ (SupportedPrim t, PEvalFloatingTerm t) =>+ {-# UNPACK #-} !CachedInfo ->+ !FloatingUnaryOp ->+ !(Term t) ->+ Term t+ PowerTerm' ::+ (SupportedPrim t, PEvalFloatingTerm t) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Term t) ->+ !(Term t) ->+ Term t+ FPUnaryTerm' ::+ (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) =>+ {-# UNPACK #-} !CachedInfo ->+ !FPUnaryOp ->+ !(Term (fp eb sb)) ->+ Term (fp eb sb)+ FPBinaryTerm' ::+ (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) =>+ {-# UNPACK #-} !CachedInfo ->+ !FPBinaryOp ->+ !(Term (fp eb sb)) ->+ !(Term (fp eb sb)) ->+ Term (fp eb sb)+ FPRoundingUnaryTerm' ::+ (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) =>+ {-# UNPACK #-} !CachedInfo ->+ !FPRoundingUnaryOp ->+ !(Term FPRoundingMode) ->+ !(Term (fp eb sb)) ->+ Term (fp eb sb)+ FPRoundingBinaryTerm' ::+ (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) =>+ {-# UNPACK #-} !CachedInfo ->+ !FPRoundingBinaryOp ->+ !(Term FPRoundingMode) ->+ !(Term (fp eb sb)) ->+ !(Term (fp eb sb)) ->+ Term (fp eb sb)+ FPFMATerm' ::+ (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Term FPRoundingMode) ->+ !(Term (fp eb sb)) ->+ !(Term (fp eb sb)) ->+ !(Term (fp eb sb)) ->+ Term (fp eb sb)+ FromIntegralTerm' ::+ (PEvalFromIntegralTerm a b, SupportedPrim b) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Term a) ->+ Term b+ FromFPOrTerm' ::+ ( PEvalIEEEFPConvertibleTerm a,+ ValidFP eb sb,+ SupportedPrim a+ ) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Term a) ->+ !(Term FPRoundingMode) ->+ !(Term (FP eb sb)) ->+ Term a+ ToFPTerm' ::+ ( PEvalIEEEFPConvertibleTerm a,+ ValidFP eb sb,+ SupportedPrim (FP eb sb)+ ) =>+ {-# UNPACK #-} !CachedInfo ->+ !(Term FPRoundingMode) ->+ !(Term a) ->+ Proxy eb ->+ Proxy sb ->+ Term (FP eb sb)++data SupportedPrimEvidence t where+ SupportedPrimEvidence :: (SupportedPrim t) => SupportedPrimEvidence t++-- | Pattern synonym to introduce the SupportedPrim constraint.+pattern SupportedTerm :: forall t. () => (SupportedPrim t) => Term t+pattern SupportedTerm <-+ ( ( \v ->+ introSupportedPrimConstraint v $+ Just (SupportedPrimEvidence @t)+ ) ->+ Just SupportedPrimEvidence+ )++#if MIN_VERSION_base(4, 16, 4)+{-# COMPLETE SupportedTerm #-}+{-# INLINE SupportedTerm #-}+#endif++-- | Cast a term to another type.+castTerm :: forall a b. (Typeable b) => Term a -> Maybe (Term b)+castTerm t@SupportedTerm = cast t+{-# INLINE castTerm #-}++data SupportedTypedSymbolEvidence (k :: SymbolKind) t where+ SupportedTypedSymbolEvidence ::+ forall k t.+ (SupportedPrim t, SymbolKindConstraint k t, IsSymbolKind k) =>+ SupportedTypedSymbolEvidence k t++supportedTypedSymbolViewPat ::+ TypedSymbol k t -> Maybe (SupportedTypedSymbolEvidence k t)+supportedTypedSymbolViewPat (TypedSymbol _) = Just SupportedTypedSymbolEvidence++-- | Pattern synonym to introduce constraints from a t'TypedSymbol'.+pattern SupportedTypedSymbol ::+ forall (k :: SymbolKind) t.+ () =>+ (SupportedPrim t, SymbolKindConstraint k t, IsSymbolKind k) =>+ TypedSymbol k t+pattern SupportedTypedSymbol <-+ (supportedTypedSymbolViewPat -> Just SupportedTypedSymbolEvidence)++#if MIN_VERSION_base(4, 16, 4)+{-# COMPLETE SupportedTypedSymbol #-}+{-# INLINE SupportedTypedSymbol #-}+#endif++data SupportedConstantTypedSymbolEvidence k t where+ SupportedConstantTypedSymbolEvidence ::+ forall k t.+ ( SupportedPrim t,+ SymbolKindConstraint k t,+ IsSymbolKind k,+ k ~ 'ConstantKind+ ) =>+ SupportedConstantTypedSymbolEvidence k t++supportedConstantTypedSymbolViewPat ::+ forall k t.+ TypedSymbol k t ->+ Maybe (SupportedConstantTypedSymbolEvidence k t)+supportedConstantTypedSymbolViewPat (TypedSymbol _) =+ case decideSymbolKind @k of+ Left HRefl -> Just SupportedConstantTypedSymbolEvidence+ Right _ -> Nothing++-- | Pattern synonym to introduce constraints from a t'TypedSymbol'. Also checks+-- that the symbol kind is 'ConstantKind'.+pattern SupportedConstantTypedSymbol ::+ forall k t.+ () =>+ ( SupportedPrim t,+ SymbolKindConstraint k t,+ IsSymbolKind k,+ k ~ 'ConstantKind+ ) =>+ TypedSymbol k t+pattern SupportedConstantTypedSymbol <-+ ( supportedConstantTypedSymbolViewPat ->+ Just SupportedConstantTypedSymbolEvidence+ )++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE SupportedConstantTypedSymbol #-}+#endif++-- | Pattern synonym for 'ConTerm''. Note that using this pattern to construct+-- a 'Term' will do term simplification.+pattern ConTerm :: forall t. () => (SupportedPrim t) => t -> Term t+pattern ConTerm t <- (ConTerm' _ t)+ where+ ConTerm = conTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE ConTerm #-}+#endif++-- | Pattern synonym for 'SymTerm''. Note that using this pattern to construct+-- a 'Term' will do term simplification.+pattern SymTerm ::+ forall t. () => (SupportedPrim t) => TypedSymbol 'AnyKind t -> Term t+pattern SymTerm t <- (SymTerm' _ t@SupportedTypedSymbol)+ where+ SymTerm = symTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE SymTerm #-}+#endif++-- | Pattern synonym for 'ForallTerm''. Note that using this pattern to+-- construct a 'Term' will do term simplification.+pattern ForallTerm ::+ forall r.+ () =>+ forall t.+ (r ~ Bool, SupportedNonFuncPrim t) =>+ TypedSymbol 'ConstantKind t ->+ Term Bool ->+ Term r+pattern ForallTerm sym body <-+ (ForallTerm' _ sym@SupportedConstantTypedSymbol body)+ where+ ForallTerm = forallTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE ForallTerm #-}+#endif++-- | Pattern synonym for 'ExistsTerm''. Note that using this pattern to+-- construct a 'Term' will do term simplification.+pattern ExistsTerm ::+ forall r.+ () =>+ forall t.+ (r ~ Bool, SupportedNonFuncPrim t) =>+ TypedSymbol 'ConstantKind t ->+ Term Bool ->+ Term r+pattern ExistsTerm sym body <-+ (ExistsTerm' _ sym@SupportedConstantTypedSymbol body)+ where+ ExistsTerm = existsTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE ExistsTerm #-}+#endif++-- | Pattern synonym for 'NotTerm''. Note that using this pattern to construct+-- a 'Term' will do term simplification.+pattern NotTerm :: forall r. () => (r ~ Bool) => Term Bool -> Term r+pattern NotTerm body <- (NotTerm' _ body)+ where+ NotTerm = pevalNotTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE NotTerm #-}+#endif++-- | Pattern synonym for 'OrTerm''. Note that using this pattern to construct a+-- 'Term' will do term simplification.+pattern OrTerm :: forall r. () => (r ~ Bool) => Term Bool -> Term Bool -> Term r+pattern OrTerm l r <- (OrTerm' _ l r _)+ where+ OrTerm = pevalOrTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE OrTerm #-}+#endif++-- | Pattern synonym for 'OrTerm''. Note that using this pattern to construct a+-- 'Term' will do term simplification.+pattern OrTermAll ::+ forall r.+ () =>+ (r ~ Bool) =>+ Term Bool -> Term Bool -> HS.HashSet (Term Bool) -> Term r+pattern OrTermAll l r s <- (OrTerm' _ l r s)++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE OrTermAll #-}+#endif++-- | Pattern synonym for 'AndTerm''. Note that using this pattern to construct a+-- 'Term' will do term simplification.+pattern AndTerm :: forall r. () => (r ~ Bool) => Term Bool -> Term Bool -> Term r+pattern AndTerm l r <- (AndTerm' _ l r _)+ where+ AndTerm = pevalAndTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE AndTerm #-}+#endif++-- | Pattern synonym for 'AndTerm''. Note that using this pattern to construct a+-- 'Term' will do term simplification.+pattern AndTermAll ::+ forall r.+ () =>+ (r ~ Bool) =>+ Term Bool -> Term Bool -> HS.HashSet (Term Bool) -> Term r+pattern AndTermAll l r s <- (AndTerm' _ l r s)++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE AndTermAll #-}+#endif++-- | Pattern synonym for 'EqTerm''. Note that using this pattern to construct a+-- 'Term' will do term simplification.+pattern EqTerm ::+ forall r.+ () =>+ forall t.+ (r ~ Bool, SupportedPrim t) =>+ Term t ->+ Term t ->+ Term r+pattern EqTerm l r <- (EqTerm' _ l r@SupportedTerm)+ where+ EqTerm = pevalEqTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE EqTerm #-}+#endif++-- | Pattern synonym for 'DistinctTerm''. Note that using this pattern to+-- construct a 'Term' will do term simplification.+pattern DistinctTerm ::+ forall r.+ () =>+ forall t.+ (r ~ Bool, SupportedPrim t) =>+ NonEmpty (Term t) ->+ Term r+pattern DistinctTerm ts <- (DistinctTerm' _ ts@(SupportedTerm :| _))+ where+ DistinctTerm = pevalDistinctTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE DistinctTerm #-}+#endif++-- | Pattern synonym for 'ITETerm''. Note that using this pattern to construct a+-- 'Term' will do term simplification.+pattern ITETerm ::+ forall t.+ () =>+ (SupportedPrim t) =>+ Term Bool ->+ Term t ->+ Term t ->+ Term t+pattern ITETerm cond t1 t2 <- (ITETerm' _ cond t1 t2)+ where+ ITETerm = pevalITETerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE ITETerm #-}+#endif++-- | Pattern synonym for 'AddNumTerm''. Note that using this pattern to+-- construct a 'Term' will do term simplification.+pattern AddNumTerm ::+ forall t.+ () =>+ (SupportedPrim t, PEvalNumTerm t) =>+ Term t ->+ Term t ->+ Term t+pattern AddNumTerm l r <- (AddNumTerm' _ l r)+ where+ AddNumTerm = pevalAddNumTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE AddNumTerm #-}+#endif++-- | Pattern synonym for 'NegNumTerm''. Note that using this pattern to+-- construct a 'Term' will do term simplification.+pattern NegNumTerm ::+ forall t.+ () =>+ (SupportedPrim t, PEvalNumTerm t) =>+ Term t ->+ Term t+pattern NegNumTerm t <- (NegNumTerm' _ t)+ where+ NegNumTerm = pevalNegNumTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE NegNumTerm #-}+#endif++-- | Pattern synonym for 'MulNumTerm''. Note that using this pattern to+-- construct a 'Term' will do term simplification.+pattern MulNumTerm ::+ forall t.+ () =>+ (SupportedPrim t, PEvalNumTerm t) =>+ Term t ->+ Term t ->+ Term t+pattern MulNumTerm l r <- (MulNumTerm' _ l r)+ where+ MulNumTerm = pevalMulNumTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE MulNumTerm #-}+#endif++-- | Pattern synonym for 'AbsNumTerm''. Note that using this pattern to+-- construct a 'Term' will do term simplification.+pattern AbsNumTerm ::+ forall t.+ () =>+ (SupportedPrim t, PEvalNumTerm t) =>+ Term t ->+ Term t+pattern AbsNumTerm t <- (AbsNumTerm' _ t)+ where+ AbsNumTerm = pevalAbsNumTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE AbsNumTerm #-}+#endif++-- | Pattern synonym for 'SignumNumTerm''. Note that using this pattern to+-- construct a 'Term' will do term simplification.+pattern SignumNumTerm ::+ forall t.+ () =>+ (SupportedPrim t, PEvalNumTerm t) =>+ Term t ->+ Term t+pattern SignumNumTerm t <- (SignumNumTerm' _ t)+ where+ SignumNumTerm = pevalSignumNumTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE SignumNumTerm #-}+#endif++-- | Pattern synonym for 'LtOrdTerm''. Note that using this pattern to construct+-- a 'Term' will do term simplification.+pattern LtOrdTerm ::+ forall r.+ () =>+ forall t.+ (r ~ Bool, SupportedPrim t, PEvalOrdTerm t) =>+ Term t ->+ Term t ->+ Term r+pattern LtOrdTerm l r <- (LtOrdTerm' _ l r@SupportedTerm)+ where+ LtOrdTerm = pevalLtOrdTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE LtOrdTerm #-}+#endif++-- | Pattern synonym for 'LeOrdTerm''. Note that using this pattern to construct+-- a 'Term' will do term simplification.+pattern LeOrdTerm ::+ forall r.+ () =>+ forall t.+ (r ~ Bool, SupportedPrim t, PEvalOrdTerm t) =>+ Term t ->+ Term t ->+ Term r+pattern LeOrdTerm l r <- (LeOrdTerm' _ l r@SupportedTerm)+ where+ LeOrdTerm = pevalLeOrdTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE LeOrdTerm #-}+#endif++-- | Pattern synonym for 'AndBitsTerm''. Note that using this pattern to+-- construct a 'Term' will do term simplification.+pattern AndBitsTerm ::+ forall t.+ () =>+ (SupportedPrim t, PEvalBitwiseTerm t) =>+ Term t ->+ Term t ->+ Term t+pattern AndBitsTerm l r <- (AndBitsTerm' _ l r)+ where+ AndBitsTerm = pevalAndBitsTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE AndBitsTerm #-}+#endif++-- | Pattern synonym for 'OrBitsTerm''. Note that using this pattern to+-- construct a 'Term' will do term simplification.+pattern OrBitsTerm ::+ forall t.+ () =>+ (SupportedPrim t, PEvalBitwiseTerm t) =>+ Term t ->+ Term t ->+ Term t+pattern OrBitsTerm l r <- (OrBitsTerm' _ l r)+ where+ OrBitsTerm = pevalOrBitsTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE OrBitsTerm #-}+#endif++-- | Pattern synonym for 'XorBitsTerm''. Note that using this pattern to+-- construct a 'Term' will do term simplification.+pattern XorBitsTerm ::+ forall t.+ () =>+ (SupportedPrim t, PEvalBitwiseTerm t) =>+ Term t ->+ Term t ->+ Term t+pattern XorBitsTerm l r <- (XorBitsTerm' _ l r)+ where+ XorBitsTerm = pevalXorBitsTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE XorBitsTerm #-}+#endif++-- | Pattern synonym for 'ComplementBitsTerm''. Note that using this pattern to+-- construct a 'Term' will do term simplification.+pattern ComplementBitsTerm ::+ forall t.+ () =>+ (SupportedPrim t, PEvalBitwiseTerm t) =>+ Term t ->+ Term t+pattern ComplementBitsTerm t <- (ComplementBitsTerm' _ t)+ where+ ComplementBitsTerm = pevalComplementBitsTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE ComplementBitsTerm #-}+#endif++-- | Pattern synonym for 'ShiftLeftTerm''. Note that using this pattern to+-- construct a 'Term' will do term simplification.+pattern ShiftLeftTerm ::+ forall t.+ () =>+ (SupportedPrim t, PEvalShiftTerm t) =>+ Term t ->+ Term t ->+ Term t+pattern ShiftLeftTerm l r <- (ShiftLeftTerm' _ l r)+ where+ ShiftLeftTerm = pevalShiftLeftTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE ShiftLeftTerm #-}+#endif++-- | Pattern synonym for 'ShiftRightTerm''. Note that using this pattern to+-- construct a 'Term' will do term simplification.+pattern ShiftRightTerm ::+ forall t.+ () =>+ (SupportedPrim t, PEvalShiftTerm t) =>+ Term t ->+ Term t ->+ Term t+pattern ShiftRightTerm l r <- (ShiftRightTerm' _ l r)+ where+ ShiftRightTerm = pevalShiftRightTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE ShiftRightTerm #-}+#endif++-- | Pattern synonym for 'RotateLeftTerm''. Note that using this pattern to+-- construct a 'Term' will do term simplification.+pattern RotateLeftTerm ::+ forall t.+ () =>+ (SupportedPrim t, PEvalRotateTerm t) =>+ Term t ->+ Term t ->+ Term t+pattern RotateLeftTerm l r <- (RotateLeftTerm' _ l r)+ where+ RotateLeftTerm = pevalRotateLeftTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE RotateLeftTerm #-}+#endif++-- | Pattern synonym for 'RotateRightTerm''. Note that using this pattern to+-- construct a 'Term' will do term simplification.+pattern RotateRightTerm ::+ forall t.+ () =>+ (SupportedPrim t, PEvalRotateTerm t) =>+ Term t ->+ Term t ->+ Term t+pattern RotateRightTerm l r <- (RotateRightTerm' _ l r)+ where+ RotateRightTerm = pevalRotateRightTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE RotateRightTerm #-}+#endif++-- | Pattern synonym for 'BitCastTerm''. Note that using this pattern to+-- construct a 'Term' will do term simplification.+pattern BitCastTerm ::+ forall b.+ () =>+ forall a.+ (SupportedPrim a, SupportedPrim b, PEvalBitCastTerm a b) =>+ Term a ->+ Term b+pattern BitCastTerm t <- (BitCastTerm' _ t@SupportedTerm)+ where+ BitCastTerm = pevalBitCastTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE BitCastTerm #-}+#endif++-- | Pattern synonym for 'BitCastOrTerm''. Note that using this pattern to+-- construct a 'Term' will do term simplification.+pattern BitCastOrTerm ::+ forall b.+ () =>+ forall a.+ (SupportedPrim a, SupportedPrim b, PEvalBitCastOrTerm a b) =>+ Term b ->+ Term a ->+ Term b+pattern BitCastOrTerm t1 t2 <- (BitCastOrTerm' _ t1 t2@SupportedTerm)+ where+ BitCastOrTerm = pevalBitCastOrTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE BitCastOrTerm #-}+#endif++-- | Pattern synonym for 'BVConcatTerm''. Note that using this pattern to+-- construct a 'Term' will do term simplification.+pattern BVConcatTerm ::+ forall ret.+ () =>+ forall bv l r.+ ( PEvalBVTerm bv,+ KnownNat l,+ KnownNat r,+ KnownNat (l + r),+ 1 <= l,+ 1 <= r,+ 1 <= l + r,+ SupportedPrim (bv l),+ SupportedPrim (bv r),+ SupportedPrim (bv (l + r)),+ ret ~ bv (l + r)+ ) =>+ Term (bv l) ->+ Term (bv r) ->+ Term ret+pattern BVConcatTerm l r <- (BVConcatTerm' _ l@SupportedTerm r@SupportedTerm)+ where+ BVConcatTerm = pevalBVConcatTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE BVConcatTerm #-}+#endif++-- | Pattern synonym for 'BVSelectTerm''. Note that using this pattern to+-- construct a 'Term' will do term simplification.+pattern BVSelectTerm ::+ forall ret.+ () =>+ forall bv w n ix.+ ( PEvalBVTerm bv,+ KnownNat n,+ KnownNat ix,+ KnownNat w,+ 1 <= n,+ 1 <= w,+ ix + w <= n,+ SupportedPrim (bv n),+ SupportedPrim (bv w),+ ret ~ bv w+ ) =>+ Proxy ix ->+ Proxy w ->+ Term (bv n) ->+ Term ret+pattern BVSelectTerm ix w t <- (BVSelectTerm' _ ix w t@SupportedTerm)+ where+ BVSelectTerm = pevalBVSelectTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE BVSelectTerm #-}+#endif++-- | Pattern synonym for 'BVExtendTerm''. Note that using this pattern to+-- construct a 'Term' will do term simplification.+pattern BVExtendTerm ::+ forall ret.+ () =>+ forall bv l r.+ ( PEvalBVTerm bv,+ KnownNat l,+ KnownNat r,+ 1 <= l,+ 1 <= r,+ l <= r,+ SupportedPrim (bv l),+ SupportedPrim (bv r),+ ret ~ bv r+ ) =>+ Bool ->+ Proxy r ->+ Term (bv l) ->+ Term ret+pattern BVExtendTerm signed p t <- (BVExtendTerm' _ signed p t@SupportedTerm)+ where+ BVExtendTerm = pevalBVExtendTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE BVExtendTerm #-}+#endif++-- | Pattern synonym for 'ApplyTerm''. Note that using this pattern to construct+-- a 'Term' will do term simplification.+pattern ApplyTerm ::+ forall b.+ () =>+ forall f a.+ (PEvalApplyTerm f a b, SupportedPrim f, SupportedPrim a, SupportedPrim b) =>+ Term f ->+ Term a ->+ Term b+pattern ApplyTerm f x <- (ApplyTerm' _ f@SupportedTerm x@SupportedTerm)+ where+ ApplyTerm = pevalApplyTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE ApplyTerm #-}+#endif++-- | Pattern synonym for 'DivIntegralTerm''. Note that using this pattern to+-- construct a 'Term' will do term simplification.+pattern DivIntegralTerm ::+ forall t.+ () =>+ (SupportedPrim t, PEvalDivModIntegralTerm t) =>+ Term t ->+ Term t ->+ Term t+pattern DivIntegralTerm l r <- (DivIntegralTerm' _ l r)+ where+ DivIntegralTerm = pevalDivIntegralTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE DivIntegralTerm #-}+#endif++-- | Pattern synonym for 'ModIntegralTerm''. Note that using this pattern to+-- construct a 'Term' will do term simplification.+pattern ModIntegralTerm ::+ forall t.+ () =>+ (SupportedPrim t, PEvalDivModIntegralTerm t) =>+ Term t ->+ Term t ->+ Term t+pattern ModIntegralTerm l r <- (ModIntegralTerm' _ l r)+ where+ ModIntegralTerm = pevalModIntegralTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE ModIntegralTerm #-}+#endif++-- | Pattern synonym for 'QuotIntegralTerm''. Note that using this pattern to+-- construct a 'Term' will do term simplification.+pattern QuotIntegralTerm ::+ forall t.+ () =>+ (SupportedPrim t, PEvalDivModIntegralTerm t) =>+ Term t ->+ Term t ->+ Term t+pattern QuotIntegralTerm l r <- (QuotIntegralTerm' _ l r)+ where+ QuotIntegralTerm = pevalQuotIntegralTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE QuotIntegralTerm #-}+#endif++-- | Pattern synonym for 'RemIntegralTerm''. Note that using this pattern to+-- construct a 'Term' will do term simplification.+pattern RemIntegralTerm ::+ forall t.+ () =>+ (SupportedPrim t, PEvalDivModIntegralTerm t) =>+ Term t ->+ Term t ->+ Term t+pattern RemIntegralTerm l r <- (RemIntegralTerm' _ l r)+ where+ RemIntegralTerm = pevalRemIntegralTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE RemIntegralTerm #-}+#endif++-- | Pattern synonym for 'FPTraitTerm''. Note that using this pattern to+-- construct a 'Term' will do term simplification.+pattern FPTraitTerm ::+ forall r.+ () =>+ forall eb sb fp.+ (r ~ Bool, ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) =>+ FPTrait ->+ Term (fp eb sb) ->+ Term r+pattern FPTraitTerm trait t <- (FPTraitTerm' _ trait t)+ where+ FPTraitTerm = pevalFPTraitTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE FPTraitTerm #-}+#endif++-- | Pattern synonym for 'FdivTerm''. Note that using this pattern to construct+-- a 'Term' will do term simplification.+pattern FdivTerm ::+ forall t.+ () =>+ (SupportedPrim t, PEvalFractionalTerm t) =>+ Term t ->+ Term t ->+ Term t+pattern FdivTerm l r <- (FdivTerm' _ l r)+ where+ FdivTerm = pevalFdivTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE FdivTerm #-}+#endif++-- | Pattern synonym for 'RecipTerm''. Note that using this pattern to construct+-- a 'Term' will do term simplification.+pattern RecipTerm ::+ forall t.+ () =>+ (SupportedPrim t, PEvalFractionalTerm t) =>+ Term t ->+ Term t+pattern RecipTerm t <- (RecipTerm' _ t)+ where+ RecipTerm = pevalRecipTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE RecipTerm #-}+#endif++-- | Pattern synonym for 'FloatingUnaryTerm''. Note that using this pattern to+-- construct a 'Term' will do term simplification.+pattern FloatingUnaryTerm ::+ forall t.+ () =>+ (SupportedPrim t, PEvalFloatingTerm t) =>+ FloatingUnaryOp ->+ Term t ->+ Term t+pattern FloatingUnaryTerm op t <- (FloatingUnaryTerm' _ op t)+ where+ FloatingUnaryTerm = pevalFloatingUnaryTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE FloatingUnaryTerm #-}+#endif++-- | Pattern synonym for 'PowerTerm''. Note that using this pattern to construct+-- a 'Term' will do term simplification.+pattern PowerTerm ::+ forall t.+ () =>+ (SupportedPrim t, PEvalFloatingTerm t) =>+ Term t ->+ Term t ->+ Term t+pattern PowerTerm l r <- (PowerTerm' _ l r)+ where+ PowerTerm = pevalPowerTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE PowerTerm #-}+#endif++-- | Pattern synonym for 'FPUnaryTerm''. Note that using this pattern to construct+-- a 'Term' will do term simplification.+pattern FPUnaryTerm ::+ forall ret.+ () =>+ forall fp eb sb.+ (ret ~ fp eb sb, ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) =>+ FPUnaryOp ->+ Term (fp eb sb) ->+ Term ret+pattern FPUnaryTerm op t <- (FPUnaryTerm' _ op t)+ where+ FPUnaryTerm = pevalFPUnaryTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE FPUnaryTerm #-}+#endif++-- | Pattern synonym for 'FPBinaryTerm''. Note that using this pattern to construct+-- a 'Term' will do term simplification.+pattern FPBinaryTerm ::+ forall ret.+ () =>+ forall fp eb sb.+ (ret ~ fp eb sb, ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) =>+ FPBinaryOp ->+ Term (fp eb sb) ->+ Term (fp eb sb) ->+ Term ret+pattern FPBinaryTerm op l r <- (FPBinaryTerm' _ op l r)+ where+ FPBinaryTerm = pevalFPBinaryTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE FPBinaryTerm #-}+#endif++-- | Pattern synonym for 'FPRoundingUnaryTerm''. Note that using this pattern to+-- construct a 'Term' will do term simplification.+pattern FPRoundingUnaryTerm ::+ forall ret.+ () =>+ forall fp eb sb.+ (ret ~ fp eb sb, ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) =>+ FPRoundingUnaryOp ->+ Term FPRoundingMode ->+ Term (fp eb sb) ->+ Term ret+pattern FPRoundingUnaryTerm op rm t <- (FPRoundingUnaryTerm' _ op rm t)+ where+ FPRoundingUnaryTerm = pevalFPRoundingUnaryTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE FPRoundingUnaryTerm #-}+#endif++-- | Pattern synonym for 'FPRoundingBinaryTerm''. Note that using this pattern to+-- construct a 'Term' will do term simplification.+pattern FPRoundingBinaryTerm ::+ forall ret.+ () =>+ forall fp eb sb.+ (ret ~ fp eb sb, ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) =>+ FPRoundingBinaryOp ->+ Term FPRoundingMode ->+ Term (fp eb sb) ->+ Term (fp eb sb) ->+ Term ret+pattern FPRoundingBinaryTerm op rm l r <- (FPRoundingBinaryTerm' _ op rm l r)+ where+ FPRoundingBinaryTerm = pevalFPRoundingBinaryTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE FPRoundingBinaryTerm #-}+#endif++-- | Pattern synonym for 'FPFMATerm''. Note that using this pattern to construct+-- a 'Term' will do term simplification.+pattern FPFMATerm ::+ forall ret.+ () =>+ forall fp eb sb.+ (ret ~ fp eb sb, ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) =>+ Term FPRoundingMode ->+ Term (fp eb sb) ->+ Term (fp eb sb) ->+ Term (fp eb sb) ->+ Term ret+pattern FPFMATerm rm t1 t2 t3 <- (FPFMATerm' _ rm t1 t2 t3)+ where+ FPFMATerm = pevalFPFMATerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE FPFMATerm #-}+#endif++-- | Pattern synonym for 'FromIntegralTerm''. Note that using this pattern to+-- construct a 'Term' will do term simplification.+pattern FromIntegralTerm ::+ forall b.+ () =>+ forall a.+ (PEvalFromIntegralTerm a b, SupportedPrim a, SupportedPrim b) =>+ Term a ->+ Term b+pattern FromIntegralTerm t <- (FromIntegralTerm' _ t@SupportedTerm)+ where+ FromIntegralTerm = pevalFromIntegralTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE FromIntegralTerm #-}+#endif++-- | Pattern synonym for 'FromFPOrTerm''. Note that using this pattern to construct+-- a 'Term' will do term simplification.+pattern FromFPOrTerm ::+ forall a.+ () =>+ forall eb sb.+ ( PEvalIEEEFPConvertibleTerm a,+ ValidFP eb sb,+ SupportedPrim a+ ) =>+ Term a ->+ Term FPRoundingMode ->+ Term (FP eb sb) ->+ Term a+pattern FromFPOrTerm t1 rm t2 <- (FromFPOrTerm' _ t1 rm t2)+ where+ FromFPOrTerm = pevalFromFPOrTerm++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE FromFPOrTerm #-}+#endif++-- | Pattern synonym for 'ToFPTerm''. Note that using this pattern to construct+-- a 'Term' will do term simplification.+pattern ToFPTerm ::+ forall ret.+ () =>+ forall eb sb a.+ ( PEvalIEEEFPConvertibleTerm a,+ ValidFP eb sb,+ SupportedPrim (FP eb sb),+ SupportedPrim a,+ ret ~ FP eb sb+ ) =>+ Term FPRoundingMode ->+ Term a ->+ Proxy eb ->+ Proxy sb ->+ Term ret+pattern ToFPTerm rm t eb sb <- (ToFPTerm' _ rm t@SupportedTerm eb sb)+ where+ ToFPTerm rm t _ _ = pevalToFPTerm rm t++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE ToFPTerm #-}+#endif++#if MIN_VERSION_base(4, 16, 4)+{-# COMPLETE+ ConTerm,+ SymTerm,+ ForallTerm,+ ExistsTerm,+ NotTerm,+ OrTerm,+ AndTerm,+ EqTerm,+ DistinctTerm,+ ITETerm,+ AddNumTerm,+ NegNumTerm,+ MulNumTerm,+ AbsNumTerm,+ SignumNumTerm,+ LtOrdTerm,+ LeOrdTerm,+ AndBitsTerm,+ OrBitsTerm,+ XorBitsTerm,+ ComplementBitsTerm,+ ShiftLeftTerm,+ ShiftRightTerm,+ RotateLeftTerm,+ RotateRightTerm,+ BitCastTerm,+ BitCastOrTerm,+ BVConcatTerm,+ BVSelectTerm,+ BVExtendTerm,+ ApplyTerm,+ DivIntegralTerm,+ ModIntegralTerm,+ QuotIntegralTerm,+ RemIntegralTerm,+ FPTraitTerm,+ FdivTerm,+ RecipTerm,+ FloatingUnaryTerm,+ PowerTerm,+ FPUnaryTerm,+ FPBinaryTerm,+ FPRoundingUnaryTerm,+ FPRoundingBinaryTerm,+ FPFMATerm,+ FromIntegralTerm,+ FromFPOrTerm,+ ToFPTerm+ #-}+#endif++-- | Get the cached information for a term.+termInfo :: Term t -> CachedInfo+termInfo (ConTerm' i _) = i+termInfo (SymTerm' i _) = i+termInfo (ForallTerm' i _ _) = i+termInfo (ExistsTerm' i _ _) = i+termInfo (NotTerm' i _) = i+termInfo (OrTerm' i _ _ _) = i+termInfo (AndTerm' i _ _ _) = i+termInfo (EqTerm' i _ _) = i+termInfo (DistinctTerm' i _) = i+termInfo (ITETerm' i _ _ _) = i+termInfo (AddNumTerm' i _ _) = i+termInfo (NegNumTerm' i _) = i+termInfo (MulNumTerm' i _ _) = i+termInfo (AbsNumTerm' i _) = i+termInfo (SignumNumTerm' i _) = i+termInfo (LtOrdTerm' i _ _) = i+termInfo (LeOrdTerm' i _ _) = i+termInfo (AndBitsTerm' i _ _) = i+termInfo (OrBitsTerm' i _ _) = i+termInfo (XorBitsTerm' i _ _) = i+termInfo (ComplementBitsTerm' i _) = i+termInfo (ShiftLeftTerm' i _ _) = i+termInfo (ShiftRightTerm' i _ _) = i+termInfo (RotateLeftTerm' i _ _) = i+termInfo (RotateRightTerm' i _ _) = i+termInfo (BitCastTerm' i _) = i+termInfo (BitCastOrTerm' i _ _) = i+termInfo (BVConcatTerm' i _ _) = i+termInfo (BVSelectTerm' i _ _ _) = i+termInfo (BVExtendTerm' i _ _ _) = i+termInfo (ApplyTerm' i _ _) = i+termInfo (DivIntegralTerm' i _ _) = i+termInfo (ModIntegralTerm' i _ _) = i+termInfo (QuotIntegralTerm' i _ _) = i+termInfo (RemIntegralTerm' i _ _) = i+termInfo (FPTraitTerm' i _ _) = i+termInfo (FdivTerm' i _ _) = i+termInfo (RecipTerm' i _) = i+termInfo (FloatingUnaryTerm' i _ _) = i+termInfo (PowerTerm' i _ _) = i+termInfo (FPUnaryTerm' i _ _) = i+termInfo (FPBinaryTerm' i _ _ _) = i+termInfo (FPRoundingUnaryTerm' i _ _ _) = i+termInfo (FPRoundingBinaryTerm' i _ _ _ _) = i+termInfo (FPFMATerm' i _ _ _ _) = i+termInfo (FromIntegralTerm' i _) = i+termInfo (FromFPOrTerm' i _ _ _) = i+termInfo (ToFPTerm' i _ _ _ _) = i++-- | Get the thread ID for a term.+{-# INLINE termThreadId #-}+termThreadId :: Term t -> WeakThreadId+termThreadId = cachedThreadId . termInfo++-- | Get the digest for a term.+{-# INLINE termDigest #-}+termDigest :: Term t -> Digest+termDigest = cachedDigest . termInfo++-- | Get the ID for a term.+{-# INLINE termId #-}+termId :: Term t -> Id+termId = cachedId . termInfo++-- | Get the stable identifier for a term.+{-# INLINE termStableIdent #-}+termStableIdent :: Term t -> StableIdent+termStableIdent = cachedStableIdent . termInfo++-- | Pattern for term with dynamic typing.+pattern DynTerm :: forall a b. (SupportedPrim a) => Term a -> Term b+pattern DynTerm x <- ((\v@SupportedTerm -> cast v) -> Just x)++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE DynTerm #-}+#endif++-- baseHash :: Term t -> Digest+-- baseHash t = case hashId t of+-- HashId h _ -> h+-- {-# INLINE baseHash #-}++data HashId = HashId {-# UNPACK #-} !Digest Id deriving (Show)++instance Eq HashId where+ HashId _ l == HashId _ r = l == r+ {-# INLINE (==) #-}++instance Hashable HashId where+ hashWithSalt s (HashId i _) = hashWithSalt s i+ {-# INLINE hashWithSalt #-}++eqHashId :: HashId -> HashId -> Bool+eqHashId = (==)+{-# INLINE eqHashId #-}++data TypeHashId = TypeHashId {-# UNPACK #-} !Fingerprint {-# UNPACK #-} !HashId+ deriving (Show)++instance Eq TypeHashId where+ TypeHashId l li == TypeHashId r ri = l == r && li == ri+ {-# INLINE (==) #-}++instance Hashable TypeHashId where+ hashWithSalt s (TypeHashId tp i) = s `hashWithSalt` tp `hashWithSalt` i+ {-# INLINE hashWithSalt #-}++{-# INLINE termHashId #-}+termHashId :: Term t -> HashId+termHashId t = HashId (termDigest t) (termId t)++typeFingerprint :: forall t. (SupportedPrim t) => Fingerprint+typeFingerprint = typeRepFingerprint $ SomeTypeRep $ primTypeRep @t+{-# INLINE typeFingerprint #-}++{-# INLINE termTypeHashId #-}+termTypeHashId :: forall t. Term t -> TypeHashId+termTypeHashId t@SupportedTerm = TypeHashId (typeFingerprint @t) (termHashId t)++-- {-# NOINLINE typeHashId #-}+introSupportedPrimConstraint0 :: forall t a. Term t -> ((SupportedPrim t) => a) -> a+introSupportedPrimConstraint0 ConTerm' {} x = x+introSupportedPrimConstraint0 (SymTerm' _ t) x = withSymbolSupported t x+introSupportedPrimConstraint0 ForallTerm' {} x = x+introSupportedPrimConstraint0 ExistsTerm' {} x = x+introSupportedPrimConstraint0 NotTerm' {} x = x+introSupportedPrimConstraint0 OrTerm' {} x = x+introSupportedPrimConstraint0 AndTerm' {} x = x+introSupportedPrimConstraint0 EqTerm' {} x = x+introSupportedPrimConstraint0 DistinctTerm' {} x = x+introSupportedPrimConstraint0 ITETerm' {} x = x+introSupportedPrimConstraint0 AddNumTerm' {} x = x+introSupportedPrimConstraint0 NegNumTerm' {} x = x+introSupportedPrimConstraint0 MulNumTerm' {} x = x+introSupportedPrimConstraint0 AbsNumTerm' {} x = x+introSupportedPrimConstraint0 SignumNumTerm' {} x = x+introSupportedPrimConstraint0 LtOrdTerm' {} x = x+introSupportedPrimConstraint0 LeOrdTerm' {} x = x+introSupportedPrimConstraint0 AndBitsTerm' {} x = x+introSupportedPrimConstraint0 OrBitsTerm' {} x = x+introSupportedPrimConstraint0 XorBitsTerm' {} x = x+introSupportedPrimConstraint0 ComplementBitsTerm' {} x = x+introSupportedPrimConstraint0 ShiftLeftTerm' {} x = x+introSupportedPrimConstraint0 RotateLeftTerm' {} x = x+introSupportedPrimConstraint0 ShiftRightTerm' {} x = x+introSupportedPrimConstraint0 RotateRightTerm' {} x = x+introSupportedPrimConstraint0 BitCastTerm' {} x = x+introSupportedPrimConstraint0 BitCastOrTerm' {} x = x+introSupportedPrimConstraint0 BVConcatTerm' {} x = x+introSupportedPrimConstraint0 BVSelectTerm' {} x = x+introSupportedPrimConstraint0 BVExtendTerm' {} x = x+introSupportedPrimConstraint0 ApplyTerm' {} x = x+introSupportedPrimConstraint0 DivIntegralTerm' {} x = x+introSupportedPrimConstraint0 ModIntegralTerm' {} x = x+introSupportedPrimConstraint0 QuotIntegralTerm' {} x = x+introSupportedPrimConstraint0 RemIntegralTerm' {} x = x+introSupportedPrimConstraint0 FPTraitTerm' {} x = x+introSupportedPrimConstraint0 FdivTerm' {} x = x+introSupportedPrimConstraint0 RecipTerm' {} x = x+introSupportedPrimConstraint0 FloatingUnaryTerm' {} x = x+introSupportedPrimConstraint0 PowerTerm' {} x = x+introSupportedPrimConstraint0 FPUnaryTerm' {} x = x+introSupportedPrimConstraint0 FPBinaryTerm' {} x = x+introSupportedPrimConstraint0 FPRoundingUnaryTerm' {} x = x+introSupportedPrimConstraint0 FPRoundingBinaryTerm' {} x = x+introSupportedPrimConstraint0 FPFMATerm' {} x = x+introSupportedPrimConstraint0 FromIntegralTerm' {} x = x+introSupportedPrimConstraint0 FromFPOrTerm' {} x = x+introSupportedPrimConstraint0 ToFPTerm' {} x = x++-- | Introduce the 'SupportedPrim' constraint from a term.+introSupportedPrimConstraint ::+ forall t a. Term t -> ((SupportedPrim t, Typeable t) => a) -> a+introSupportedPrimConstraint t a = introSupportedPrimConstraint0 t a+{-# INLINE introSupportedPrimConstraint #-}++-- | Pretty-print a term.+pformatTerm :: forall t. Term t -> String+pformatTerm (ConTerm t) = pformatCon t+pformatTerm (SymTerm sym) = showUntyped sym+pformatTerm (ForallTerm sym arg) = "(forall " ++ show sym ++ " " ++ pformatTerm arg ++ ")"+pformatTerm (ExistsTerm sym arg) = "(exists " ++ show sym ++ " " ++ pformatTerm arg ++ ")"+pformatTerm (NotTerm arg) = "(! " ++ pformatTerm arg ++ ")"+pformatTerm (OrTerm arg1 arg2) = "(|| " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (AndTerm arg1 arg2) = "(&& " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (EqTerm arg1 arg2) = "(= " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (DistinctTerm args) = "(distinct " ++ unwords (map pformatTerm $ toList args) ++ ")"+pformatTerm (ITETerm cond arg1 arg2) = "(ite " ++ pformatTerm cond ++ " " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (AddNumTerm arg1 arg2) = "(+ " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (NegNumTerm arg) = "(- " ++ pformatTerm arg ++ ")"+pformatTerm (MulNumTerm arg1 arg2) = "(* " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (AbsNumTerm arg) = "(abs " ++ pformatTerm arg ++ ")"+pformatTerm (SignumNumTerm arg) = "(signum " ++ pformatTerm arg ++ ")"+pformatTerm (LtOrdTerm arg1 arg2) = "(< " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (LeOrdTerm arg1 arg2) = "(<= " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (AndBitsTerm arg1 arg2) = "(& " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (OrBitsTerm arg1 arg2) = "(| " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (XorBitsTerm arg1 arg2) = "(^ " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (ComplementBitsTerm arg) = "(~ " ++ pformatTerm arg ++ ")"+pformatTerm (ShiftLeftTerm arg n) = "(shl " ++ pformatTerm arg ++ " " ++ pformatTerm n ++ ")"+pformatTerm (ShiftRightTerm arg n) = "(shr " ++ pformatTerm arg ++ " " ++ pformatTerm n ++ ")"+pformatTerm (RotateLeftTerm arg n) = "(rotl " ++ pformatTerm arg ++ " " ++ pformatTerm n ++ ")"+pformatTerm (RotateRightTerm arg n) = "(rotr " ++ pformatTerm arg ++ " " ++ pformatTerm n ++ ")"+pformatTerm (BitCastTerm arg) = "(bitcast " ++ pformatTerm arg ++ ")"+pformatTerm (BitCastOrTerm d arg) = "(bitcast_or " ++ pformatTerm d ++ " " ++ pformatTerm arg ++ ")"+pformatTerm (BVConcatTerm arg1 arg2) = "(bvconcat " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (BVSelectTerm (_ :: Proxy ix) (_ :: Proxy w) arg) =+ "(bvselect " ++ show (typeRep @ix) ++ " " ++ show (typeRep @w) ++ " " ++ pformatTerm arg ++ ")"+pformatTerm (BVExtendTerm signed (_ :: Proxy n) arg) =+ (if signed then "(bvsext " else "(bvzext ") ++ show (typeRep @n) ++ " " ++ pformatTerm arg ++ ")"+pformatTerm (ApplyTerm func arg) = "(apply " ++ pformatTerm func ++ " " ++ pformatTerm arg ++ ")"+pformatTerm (DivIntegralTerm arg1 arg2) = "(div " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (ModIntegralTerm arg1 arg2) = "(mod " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (QuotIntegralTerm arg1 arg2) = "(quot " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (RemIntegralTerm arg1 arg2) = "(rem " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (FPTraitTerm trait arg) = "(" ++ show trait ++ " " ++ pformatTerm arg ++ ")"+pformatTerm (FdivTerm arg1 arg2) = "(fdiv " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (RecipTerm arg) = "(recip " ++ pformatTerm arg ++ ")"+pformatTerm (FloatingUnaryTerm op arg) = "(" ++ show op ++ " " ++ pformatTerm arg ++ ")"+pformatTerm (PowerTerm arg1 arg2) = "(** " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (FPUnaryTerm op arg) = "(" ++ show op ++ " " ++ pformatTerm arg ++ ")"+pformatTerm (FPBinaryTerm op arg1 arg2) = "(" ++ show op ++ " " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (FPRoundingUnaryTerm op mode arg) = "(" ++ show op ++ " " ++ pformatTerm mode ++ " " ++ pformatTerm arg ++ ")"+pformatTerm (FPRoundingBinaryTerm op mode arg1 arg2) =+ "(" ++ show op ++ " " ++ pformatTerm mode ++ " " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (FPFMATerm mode arg1 arg2 arg3) =+ "(fp.fma " ++ pformatTerm mode ++ " " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ " " ++ pformatTerm arg3 ++ ")"+pformatTerm (FromIntegralTerm arg) = "(from_integral " ++ pformatTerm arg ++ ")"+pformatTerm (FromFPOrTerm d r arg) = "(from_fp_or " ++ pformatTerm d ++ " " ++ pformatTerm r ++ " " ++ pformatTerm arg ++ ")"+pformatTerm (ToFPTerm r arg _ _) = "(to_fp " ++ pformatTerm r ++ " " ++ pformatTerm arg ++ ")"++-- {-# INLINE pformatTerm #-}++instance NFData (Term a) where+ rnf i = rnf (termInfo i)+ {-# INLINE rnf #-}++#if MIN_VERSION_base(4,15,0)+type CODE x = forall qq. Quote qq => Code qq (x)+#else+type CODE x = TExpQ x+#endif++instance Lift (Term t) where+ liftTyped (ConTerm v) = [||conTerm v||]+ liftTyped (SymTerm t) = [||symTerm t||]+ liftTyped (ForallTerm t1 t2) = [||forallTerm t1 t2||]+ liftTyped (ExistsTerm t1 t2) = [||existsTerm t1 t2||]+ liftTyped (NotTerm t) = [||notTerm t||]+ liftTyped (OrTerm t1 t2) = [||orTerm t1 t2||]+ liftTyped (AndTerm t1 t2) = [||andTerm t1 t2||]+ liftTyped (EqTerm t1 t2) = [||eqTerm t1 t2||]+ liftTyped (DistinctTerm t) = [||distinctTerm t||]+ liftTyped (ITETerm t1 t2 t3) = [||iteTerm t1 t2 t3||]+ liftTyped (AddNumTerm t1 t2) = [||addNumTerm t1 t2||]+ liftTyped (NegNumTerm t) = [||negNumTerm t||]+ liftTyped (MulNumTerm t1 t2) = [||mulNumTerm t1 t2||]+ liftTyped (AbsNumTerm t) = [||absNumTerm t||]+ liftTyped (SignumNumTerm t) = [||signumNumTerm t||]+ liftTyped (LtOrdTerm t1 t2) = [||ltOrdTerm t1 t2||]+ liftTyped (LeOrdTerm t1 t2) = [||leOrdTerm t1 t2||]+ liftTyped (AndBitsTerm t1 t2) = [||andBitsTerm t1 t2||]+ liftTyped (OrBitsTerm t1 t2) = [||orBitsTerm t1 t2||]+ liftTyped (XorBitsTerm t1 t2) = [||xorBitsTerm t1 t2||]+ liftTyped (ComplementBitsTerm t) = [||complementBitsTerm t||]+ liftTyped (ShiftLeftTerm t1 t2) = [||shiftLeftTerm t1 t2||]+ liftTyped (ShiftRightTerm t1 t2) = [||shiftRightTerm t1 t2||]+ liftTyped (RotateLeftTerm t1 t2) = [||rotateLeftTerm t1 t2||]+ liftTyped (RotateRightTerm t1 t2) = [||rotateRightTerm t1 t2||]+ liftTyped (BitCastTerm t) = [||bitCastTerm t||]+ liftTyped (BitCastOrTerm t1 t2) = [||bitCastOrTerm t1 t2||]+ liftTyped (BVConcatTerm t1 t2) = [||bvConcatTerm t1 t2||]+ liftTyped (BVSelectTerm (_ :: p ix) (_ :: q w) t3) =+ let pix = [||Proxy||] :: CODE (Proxy ix)+ pw = [||Proxy||] :: CODE (Proxy w)+ in [||bvSelectTerm $$pix $$pw t3||]+ liftTyped (BVExtendTerm b (_ :: p r) t2) =+ let pr = [||Proxy||] :: CODE (Proxy r)+ in [||bvExtendTerm b $$pr t2||]+ liftTyped (ApplyTerm t1 t2) = [||applyTerm t1 t2||]+ liftTyped (DivIntegralTerm t1 t2) = [||divIntegralTerm t1 t2||]+ liftTyped (ModIntegralTerm t1 t2) = [||modIntegralTerm t1 t2||]+ liftTyped (QuotIntegralTerm t1 t2) = [||quotIntegralTerm t1 t2||]+ liftTyped (RemIntegralTerm t1 t2) = [||remIntegralTerm t1 t2||]+ liftTyped (FPTraitTerm t1 t2) = [||fpTraitTerm t1 t2||]+ liftTyped (FdivTerm t1 t2) = [||fdivTerm t1 t2||]+ liftTyped (RecipTerm t) = [||recipTerm t||]+ liftTyped (FloatingUnaryTerm t1 t2) = [||floatingUnaryTerm t1 t2||]+ liftTyped (PowerTerm t1 t2) = [||powerTerm t1 t2||]+ liftTyped (FPUnaryTerm t1 t2) = [||fpUnaryTerm t1 t2||]+ liftTyped (FPBinaryTerm t1 t2 t3) = [||fpBinaryTerm t1 t2 t3||]+ liftTyped (FPRoundingUnaryTerm t1 t2 t3) =+ [||fpRoundingUnaryTerm t1 t2 t3||]+ liftTyped (FPRoundingBinaryTerm t1 t2 t3 t4) =+ [||fpRoundingBinaryTerm t1 t2 t3 t4||]+ liftTyped (FPFMATerm t1 t2 t3 t4) = [||fpFMATerm t1 t2 t3 t4||]+ liftTyped (FromIntegralTerm t) = [||fromIntegralTerm t||]+ liftTyped (FromFPOrTerm t1 t2 t3) = [||fromFPOrTerm t1 t2 t3||]+ liftTyped (ToFPTerm t1 t2 _ _) =+ [||toFPTerm t1 t2||]++instance Show (Term ty) where+ show t@(ConTerm v) =+ "ConTerm{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", v="+ ++ pformatCon v+ ++ "}"+ show t@(SymTerm name@TypedSymbol {}) =+ "SymTerm{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", name="+ ++ show name+ ++ ", type="+ ++ show (primTypeRep @ty)+ ++ "}"+ show t@(ForallTerm sym arg) =+ "Forall{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", sym="+ ++ show sym+ ++ ", arg="+ ++ show arg+ ++ "}"+ show t@(ExistsTerm sym arg) =+ "Exists{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", sym="+ ++ show sym+ ++ ", arg="+ ++ show arg+ ++ "}"+ show t@(NotTerm arg) =+ "Not{tid=" ++ show (termThreadId t) ++ ", id=" ++ show (termId t) ++ ", arg=" ++ show arg ++ "}"+ show t@(OrTerm arg1 arg2) =+ "Or{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", arg1="+ ++ show arg1+ ++ ", arg2="+ ++ show arg2+ ++ "}"+ show t@(AndTerm arg1 arg2) =+ "And{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", arg1="+ ++ show arg1+ ++ ", arg2="+ ++ show arg2+ ++ "}"+ show t@(EqTerm arg1 arg2) =+ "Eqv{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", arg1="+ ++ show arg1+ ++ ", arg2="+ ++ show arg2+ ++ "}"+ show t@(DistinctTerm args) =+ "Distinct{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", args="+ ++ show args+ ++ "}"+ show t@(ITETerm cond l r) =+ "ITE{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", cond="+ ++ show cond+ ++ ", then="+ ++ show l+ ++ ", else="+ ++ show r+ ++ "}"+ show t@(AddNumTerm arg1 arg2) =+ "AddNum{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", arg1="+ ++ show arg1+ ++ ", arg2="+ ++ show arg2+ ++ "}"+ show t@(NegNumTerm arg) =+ "NegNum{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", arg="+ ++ show arg+ ++ "}"+ show t@(MulNumTerm arg1 arg2) =+ "MulNum{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", arg1="+ ++ show arg1+ ++ ", arg2="+ ++ show arg2+ ++ "}"+ show t@(AbsNumTerm arg) =+ "AbsNum{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", arg="+ ++ show arg+ ++ "}"+ show t@(SignumNumTerm arg) =+ "SignumNum{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", arg="+ ++ show arg+ ++ "}"+ show t@(LtOrdTerm arg1 arg2) =+ "LTNum{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", arg1="+ ++ show arg1+ ++ ", arg2="+ ++ show arg2+ ++ "}"+ show t@(LeOrdTerm arg1 arg2) =+ "LENum{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", arg1="+ ++ show arg1+ ++ ", arg2="+ ++ show arg2+ ++ "}"+ show t@(AndBitsTerm arg1 arg2) =+ "AndBits{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", arg1="+ ++ show arg1+ ++ ", arg2="+ ++ show arg2+ ++ "}"+ show t@(OrBitsTerm arg1 arg2) =+ "OrBits{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", arg1="+ ++ show arg1+ ++ ", arg2="+ ++ show arg2+ ++ "}"+ show t@(XorBitsTerm arg1 arg2) =+ "XorBits{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", arg1="+ ++ show arg1+ ++ ", arg2="+ ++ show arg2+ ++ "}"+ show t@(ComplementBitsTerm arg) =+ "ComplementBits{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", arg="+ ++ show arg+ ++ "}"+ show t@(ShiftLeftTerm arg n) =+ "ShiftLeft{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", arg="+ ++ show arg+ ++ ", n="+ ++ show n+ ++ "}"+ show t@(ShiftRightTerm arg n) =+ "ShiftRight{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", arg="+ ++ show arg+ ++ ", n="+ ++ show n+ ++ "}"+ show t@(RotateLeftTerm arg n) =+ "RotateLeft{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", arg="+ ++ show arg+ ++ ", n="+ ++ show n+ ++ "}"+ show t@(RotateRightTerm arg n) =+ "RotateRight{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", arg="+ ++ show arg+ ++ ", n="+ ++ show n+ ++ "}"+ show t@(BitCastTerm arg) =+ "BitCast{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", arg="+ ++ show arg+ ++ "}"+ show t@(BitCastOrTerm arg d) =+ "BitCastOr{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", default="+ ++ show d+ ++ ", arg="+ ++ show arg+ ++ "}"+ show t@(BVConcatTerm arg1 arg2) =+ "BVConcat{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", arg1="+ ++ show arg1+ ++ ", arg2="+ ++ show arg2+ ++ "}"+ show t@(BVSelectTerm ix w arg) =+ "BVSelect{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", ix="+ ++ show (natVal ix)+ ++ ", w="+ ++ show (natVal w)+ ++ ", arg="+ ++ show arg+ ++ "}"+ show t@(BVExtendTerm signed n arg) =+ "BVExtend{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", signed="+ ++ show signed+ ++ ", n="+ ++ show (natVal n)+ ++ ", arg="+ ++ show arg+ ++ "}"+ show t@(ApplyTerm func arg) =+ "Apply{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", f="+ ++ show func+ ++ ", arg="+ ++ show arg+ ++ "}"+ show t@(DivIntegralTerm arg1 arg2) =+ "DivIntegral{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", arg1="+ ++ show arg1+ ++ ", arg2="+ ++ show arg2+ ++ "}"+ show t@(ModIntegralTerm arg1 arg2) =+ "ModIntegral{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", arg1="+ ++ show arg1+ ++ ", arg2="+ ++ show arg2+ ++ "}"+ show t@(QuotIntegralTerm arg1 arg2) =+ "QuotIntegral{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", arg1="+ ++ show arg1+ ++ ", arg2="+ ++ show arg2+ ++ "}"+ show t@(RemIntegralTerm arg1 arg2) =+ "RemIntegral{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", arg1="+ ++ show arg1+ ++ ", arg2="+ ++ show arg2+ ++ "}"+ show t@(FPTraitTerm trait arg) =+ "FPTrait{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", trait="+ ++ show trait+ ++ ", arg="+ ++ show arg+ ++ "}"+ show t@(FdivTerm arg1 arg2) =+ "Fdiv{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", arg1="+ ++ show arg1+ ++ ", arg2="+ ++ show arg2+ ++ "}"+ show t@(RecipTerm arg) =+ "Recip{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", arg="+ ++ show arg+ ++ "}"+ show t@(FloatingUnaryTerm op arg) =+ "FloatingUnary{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", op="+ ++ show op+ ++ ", arg="+ ++ show arg+ ++ "}"+ show t@(PowerTerm arg1 arg2) =+ "Power{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", arg1="+ ++ show arg1+ ++ ", arg2="+ ++ show arg2+ ++ "}"+ show t@(FPUnaryTerm op arg) =+ "FPUnary{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", op="+ ++ show op+ ++ ", arg="+ ++ show arg+ ++ "}"+ show t@(FPBinaryTerm op arg1 arg2) =+ "FPBinary{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", op="+ ++ show op+ ++ ", arg1="+ ++ show arg1+ ++ ", arg2="+ ++ show arg2+ ++ "}"+ show t@(FPRoundingUnaryTerm op mode arg) =+ "FPRoundingUnary{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", op="+ ++ show op+ ++ ", mode="+ ++ show mode+ ++ ", arg="+ ++ show arg+ ++ "}"+ show t@(FPRoundingBinaryTerm op mode arg1 arg2) =+ "FPRoundingBinary{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", op="+ ++ show op+ ++ ", mode="+ ++ show mode+ ++ ", arg1="+ ++ show arg1+ ++ ", arg2="+ ++ show arg2+ ++ "}"+ show t@(FPFMATerm mode arg1 arg2 arg3) =+ "FPFMA{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", mode="+ ++ show mode+ ++ ", arg1="+ ++ show arg1+ ++ ", arg2="+ ++ show arg2+ ++ ", arg3="+ ++ show arg3+ ++ "}"+ show t@(FromIntegralTerm arg) =+ "FromIntegral{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", arg="+ ++ show arg+ ++ "}"+ show t@(FromFPOrTerm arg d mode) =+ "FromFPTerm{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", default="+ ++ show d+ ++ ", mode="+ ++ show mode+ ++ ", arg="+ ++ show arg+ ++ "}"+ show t@(ToFPTerm arg mode _ _) =+ "ToFPTerm{tid="+ ++ show (termThreadId t)+ ++ ", id="+ ++ show (termId t)+ ++ ", mode="+ ++ show mode+ ++ ", arg="+ ++ show arg+ ++ "}"++-- {-# INLINE show #-}++-- | Pretty-print a term, possibly eliding parts of it.+prettyPrintTerm :: Term t -> Doc ann+prettyPrintTerm v@SupportedTerm =+ column+ ( \c ->+ pageWidth $ \case+ AvailablePerLine i r ->+ if fromIntegral (c + len) > fromIntegral i * r+ then "..."+ else pretty formatted+ Unbounded -> pretty formatted+ )+ where+ formatted = pformatTerm v+ len = length formatted++instance (SupportedPrim t) => Eq (Term t) where+ a == b =+ if threadId a == threadId b+ then termId a == termId b+ else unsafePerformIO $ do+ tid <- myWeakThreadId+ a' <- toCurThreadImpl tid a+ b' <- toCurThreadImpl tid b+ return $ a' == b'++instance (SupportedPrim t) => Hashable (Term t) where+ hashWithSalt s t = hashWithSalt s $ termHashId t+ {-# INLINE hashWithSalt #-}++-- | Term without identity (before internalizing).+data UTerm t where+ UConTerm :: (SupportedPrim t) => !t -> UTerm t+ USymTerm :: !(TypedSymbol 'AnyKind t) -> UTerm t+ UForallTerm ::+ !(TypedSymbol 'ConstantKind t) ->+ !(Term Bool) ->+ UTerm Bool+ UExistsTerm ::+ !(TypedSymbol 'ConstantKind t) ->+ !(Term Bool) ->+ UTerm Bool+ UNotTerm :: !(Term Bool) -> UTerm Bool+ UOrTerm :: !(Term Bool) -> !(Term Bool) -> !(HS.HashSet (Term Bool)) -> UTerm Bool+ UAndTerm :: !(Term Bool) -> !(Term Bool) -> !(HS.HashSet (Term Bool)) -> UTerm Bool+ UEqTerm :: !(Term t) -> !(Term t) -> UTerm Bool+ UDistinctTerm :: !(NonEmpty (Term t)) -> UTerm Bool+ UITETerm ::+ (SupportedPrim t) =>+ !(Term Bool) ->+ !(Term t) ->+ !(Term t) ->+ UTerm t+ UAddNumTerm :: (SupportedPrim t, PEvalNumTerm t) => !(Term t) -> !(Term t) -> UTerm t+ UNegNumTerm :: (SupportedPrim t, PEvalNumTerm t) => !(Term t) -> UTerm t+ UMulNumTerm :: (SupportedPrim t, PEvalNumTerm t) => !(Term t) -> !(Term t) -> UTerm t+ UAbsNumTerm :: (SupportedPrim t, PEvalNumTerm t) => !(Term t) -> UTerm t+ USignumNumTerm :: (SupportedPrim t, PEvalNumTerm t) => !(Term t) -> UTerm t+ ULtOrdTerm :: (SupportedPrim t, PEvalOrdTerm t) => !(Term t) -> !(Term t) -> UTerm Bool+ ULeOrdTerm :: (SupportedPrim t, PEvalOrdTerm t) => !(Term t) -> !(Term t) -> UTerm Bool+ UAndBitsTerm :: (SupportedPrim t, PEvalBitwiseTerm t) => !(Term t) -> !(Term t) -> UTerm t+ UOrBitsTerm :: (SupportedPrim t, PEvalBitwiseTerm t) => !(Term t) -> !(Term t) -> UTerm t+ UXorBitsTerm :: (SupportedPrim t, PEvalBitwiseTerm t) => !(Term t) -> !(Term t) -> UTerm t+ UComplementBitsTerm :: (SupportedPrim t, PEvalBitwiseTerm t) => !(Term t) -> UTerm t+ UShiftLeftTerm ::+ (SupportedPrim t, PEvalShiftTerm t) => !(Term t) -> !(Term t) -> UTerm t+ UShiftRightTerm ::+ (SupportedPrim t, PEvalShiftTerm t) => !(Term t) -> !(Term t) -> UTerm t+ URotateLeftTerm ::+ (SupportedPrim t, PEvalRotateTerm t) => !(Term t) -> !(Term t) -> UTerm t+ URotateRightTerm ::+ (SupportedPrim t, PEvalRotateTerm t) => !(Term t) -> !(Term t) -> UTerm t+ UBitCastTerm ::+ (SupportedPrim b, PEvalBitCastTerm a b) =>+ !(Term a) ->+ UTerm b+ UBitCastOrTerm ::+ (SupportedPrim b, PEvalBitCastOrTerm a b) =>+ !(Term b) ->+ !(Term a) ->+ UTerm b+ UBVConcatTerm ::+ ( PEvalBVTerm bv,+ KnownNat l,+ KnownNat r,+ KnownNat (l + r),+ 1 <= l,+ 1 <= r,+ 1 <= l + r,+ SupportedPrim (bv (l + r))+ ) =>+ !(Term (bv l)) ->+ !(Term (bv r)) ->+ UTerm (bv (l + r))+ UBVSelectTerm ::+ ( PEvalBVTerm bv,+ KnownNat n,+ KnownNat ix,+ KnownNat w,+ 1 <= n,+ 1 <= w,+ ix + w <= n,+ SupportedPrim (bv w)+ ) =>+ !(Proxy ix) ->+ !(Proxy w) ->+ !(Term (bv n)) ->+ UTerm (bv w)+ UBVExtendTerm ::+ ( PEvalBVTerm bv,+ KnownNat l,+ KnownNat r,+ 1 <= l,+ 1 <= r,+ l <= r,+ SupportedPrim (bv r)+ ) =>+ !Bool ->+ !(Proxy r) ->+ !(Term (bv l)) ->+ UTerm (bv r)+ UApplyTerm ::+ (PEvalApplyTerm f a b, SupportedPrim b) =>+ Term f ->+ Term a ->+ UTerm b+ UDivIntegralTerm ::+ (SupportedPrim t, PEvalDivModIntegralTerm t) =>+ !(Term t) ->+ !(Term t) ->+ UTerm t+ UModIntegralTerm ::+ (SupportedPrim t, PEvalDivModIntegralTerm t) =>+ !(Term t) ->+ !(Term t) ->+ UTerm t+ UQuotIntegralTerm ::+ (SupportedPrim t, PEvalDivModIntegralTerm t) =>+ !(Term t) ->+ !(Term t) ->+ UTerm t+ URemIntegralTerm ::+ (SupportedPrim t, PEvalDivModIntegralTerm t) =>+ !(Term t) ->+ !(Term t) ->+ UTerm t+ UFPTraitTerm ::+ (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) =>+ !FPTrait ->+ !(Term (fp eb sb)) ->+ UTerm Bool+ UFdivTerm ::+ (SupportedPrim t, PEvalFractionalTerm t) =>+ !(Term t) ->+ !(Term t) ->+ UTerm t+ URecipTerm :: (SupportedPrim t, PEvalFractionalTerm t) => !(Term t) -> UTerm t+ UFloatingUnaryTerm ::+ (SupportedPrim t, PEvalFloatingTerm t) =>+ !FloatingUnaryOp ->+ !(Term t) ->+ UTerm t+ UPowerTerm ::+ (SupportedPrim t, PEvalFloatingTerm t) => !(Term t) -> !(Term t) -> UTerm t+ UFPUnaryTerm ::+ (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) =>+ !FPUnaryOp ->+ !(Term (fp eb sb)) ->+ UTerm (fp eb sb)+ UFPBinaryTerm ::+ (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) =>+ !FPBinaryOp ->+ !(Term (fp eb sb)) ->+ !(Term (fp eb sb)) ->+ UTerm (fp eb sb)+ UFPRoundingUnaryTerm ::+ (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) =>+ !FPRoundingUnaryOp ->+ !(Term FPRoundingMode) ->+ !(Term (fp eb sb)) ->+ UTerm (fp eb sb)+ UFPRoundingBinaryTerm ::+ (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) =>+ !FPRoundingBinaryOp ->+ !(Term FPRoundingMode) ->+ !(Term (fp eb sb)) ->+ !(Term (fp eb sb)) ->+ UTerm (fp eb sb)+ UFPFMATerm ::+ (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) =>+ !(Term FPRoundingMode) ->+ !(Term (fp eb sb)) ->+ !(Term (fp eb sb)) ->+ !(Term (fp eb sb)) ->+ UTerm (fp eb sb)+ UFromIntegralTerm ::+ (PEvalFromIntegralTerm a b, SupportedPrim b) =>+ !(Term a) ->+ UTerm b+ UFromFPOrTerm ::+ ( PEvalIEEEFPConvertibleTerm a,+ SupportedPrim a,+ ValidFP eb sb+ ) =>+ Term a ->+ !(Term FPRoundingMode) ->+ !(Term (FP eb sb)) ->+ UTerm a+ UToFPTerm ::+ ( PEvalIEEEFPConvertibleTerm a,+ ValidFP eb sb,+ SupportedPrim (FP eb sb)+ ) =>+ !(Term FPRoundingMode) ->+ !(Term a) ->+ Proxy eb ->+ Proxy sb ->+ UTerm (FP eb sb)++-- | Compare two t'TypedSymbol's for equality.+eqHeteroSymbol :: forall ta a tb b. TypedSymbol ta a -> TypedSymbol tb b -> Bool+eqHeteroSymbol (TypedSymbol taga) (TypedSymbol tagb) =+ case eqTypeRep (primTypeRep @a) (primTypeRep @b) of+ Just HRefl -> taga == tagb+ Nothing -> False+{-# INLINE eqHeteroSymbol #-}++preHashConDescription :: (SupportedPrim t) => t -> Digest+preHashConDescription = fromIntegral . hashConWithSalt 0+{-# INLINE preHashConDescription #-}++preHashSymDescription :: TypedSymbol 'AnyKind t -> Digest+preHashSymDescription = fromIntegral . hashWithSalt 1+{-# INLINE preHashSymDescription #-}++preHashForallDescription ::+ TypedSymbol 'ConstantKind t -> HashId -> Digest+preHashForallDescription sym h =+ fromIntegral+ ( 2+ `hashWithSalt` sym+ `hashWithSalt` h+ )+{-# INLINE preHashForallDescription #-}++preHashExistsDescription ::+ TypedSymbol 'ConstantKind t -> HashId -> Digest+preHashExistsDescription sym h =+ fromIntegral+ ( 3+ `hashWithSalt` sym+ `hashWithSalt` h+ )+{-# INLINE preHashExistsDescription #-}++preHashNotDescription :: HashId -> Digest+preHashNotDescription = fromIntegral . hashWithSalt 7+{-# INLINE preHashNotDescription #-}++preHashOrDescription :: HashId -> HashId -> Digest+preHashOrDescription h1 h2 =+ fromIntegral (8 `hashWithSalt` h1 `hashWithSalt` h2)+{-# INLINE preHashOrDescription #-}++preHashAndDescription :: HashId -> HashId -> Digest+preHashAndDescription h1 h2 =+ fromIntegral (9 `hashWithSalt` h1 `hashWithSalt` h2)+{-# INLINE preHashAndDescription #-}++preHashEqDescription :: Fingerprint -> HashId -> HashId -> Digest+preHashEqDescription tp h1 h2 =+ fromIntegral (10 `hashWithSalt` tp `hashWithSalt` h1 `hashWithSalt` h2)+{-# INLINE preHashEqDescription #-}++preHashDistinctDescription :: Fingerprint -> NonEmpty HashId -> Digest+preHashDistinctDescription tp hs =+ fromIntegral (11 `hashWithSalt` tp `hashWithSalt` hs)+{-# INLINE preHashDistinctDescription #-}++preHashITEDescription :: HashId -> HashId -> HashId -> Digest+preHashITEDescription h1 h2 h3 =+ fromIntegral (12 `hashWithSalt` h1 `hashWithSalt` h2 `hashWithSalt` h3)+{-# INLINE preHashITEDescription #-}++preHashAddNumDescription :: HashId -> HashId -> Digest+preHashAddNumDescription h1 h2 =+ fromIntegral (13 `hashWithSalt` h1 `hashWithSalt` h2)+{-# INLINE preHashAddNumDescription #-}++preHashNegNumDescription :: HashId -> Digest+preHashNegNumDescription =+ fromIntegral . hashWithSalt 14+{-# INLINE preHashNegNumDescription #-}++preHashMulNumDescription :: HashId -> HashId -> Digest+preHashMulNumDescription h1 h2 =+ fromIntegral (15 `hashWithSalt` h1 `hashWithSalt` h2)+{-# INLINE preHashMulNumDescription #-}++preHashAbsNumDescription :: HashId -> Digest+preHashAbsNumDescription = fromIntegral . hashWithSalt 16+{-# INLINE preHashAbsNumDescription #-}++preHashSignumNumDescription :: HashId -> Digest+preHashSignumNumDescription = fromIntegral . hashWithSalt 17+{-# INLINE preHashSignumNumDescription #-}++preHashLtOrdDescription :: Fingerprint -> HashId -> HashId -> Digest+preHashLtOrdDescription tp h1 h2 =+ fromIntegral (18 `hashWithSalt` tp `hashWithSalt` h1 `hashWithSalt` h2)+{-# INLINE preHashLtOrdDescription #-}++preHashLeOrdDescription :: Fingerprint -> HashId -> HashId -> Digest+preHashLeOrdDescription tp h1 h2 =+ fromIntegral (19 `hashWithSalt` tp `hashWithSalt` h1 `hashWithSalt` h2)+{-# INLINE preHashLeOrdDescription #-}++preHashAndBitsDescription :: HashId -> HashId -> Digest+preHashAndBitsDescription h1 h2 =+ fromIntegral (20 `hashWithSalt` h1 `hashWithSalt` h2)+{-# INLINE preHashAndBitsDescription #-}++preHashOrBitsDescription :: HashId -> HashId -> Digest+preHashOrBitsDescription h1 h2 =+ fromIntegral (21 `hashWithSalt` h1 `hashWithSalt` h2)+{-# INLINE preHashOrBitsDescription #-}++preHashXorBitsDescription :: HashId -> HashId -> Digest+preHashXorBitsDescription h1 h2 =+ fromIntegral (22 `hashWithSalt` h1 `hashWithSalt` h2)+{-# INLINE preHashXorBitsDescription #-}++preHashComplementBitsDescription :: HashId -> Digest+preHashComplementBitsDescription = fromIntegral . hashWithSalt 23+{-# INLINE preHashComplementBitsDescription #-}++preHashShiftLeftDescription :: HashId -> HashId -> Digest+preHashShiftLeftDescription h1 h2 =+ fromIntegral (24 `hashWithSalt` h1 `hashWithSalt` h2)+{-# INLINE preHashShiftLeftDescription #-}++preHashShiftRightDescription :: HashId -> HashId -> Digest+preHashShiftRightDescription h1 h2 =+ fromIntegral (25 `hashWithSalt` h1 `hashWithSalt` h2)+{-# INLINE preHashShiftRightDescription #-}++preHashRotateLeftDescription :: HashId -> HashId -> Digest+preHashRotateLeftDescription h1 h2 =+ fromIntegral (26 `hashWithSalt` h1 `hashWithSalt` h2)+{-# INLINE preHashRotateLeftDescription #-}++preHashRotateRightDescription :: HashId -> HashId -> Digest+preHashRotateRightDescription h1 h2 =+ fromIntegral (27 `hashWithSalt` h1 `hashWithSalt` h2)+{-# INLINE preHashRotateRightDescription #-}++preHashBVConcatDescription :: TypeHashId -> TypeHashId -> Digest+preHashBVConcatDescription h1 h2 =+ fromIntegral+ ( 28+ `hashWithSalt` h1+ `hashWithSalt` h2+ )++preHashBVSelectDescription :: Fingerprint -> TypeHashId -> Digest+preHashBVSelectDescription tp h =+ fromIntegral (29 `hashWithSalt` tp `hashWithSalt` h)++preHashBVExtendDescription :: Bool -> TypeHashId -> Digest+preHashBVExtendDescription signed h =+ fromIntegral (30 `hashWithSalt` signed `hashWithSalt` h)++preHashBitCastDescription :: TypeHashId -> Digest+preHashBitCastDescription = fromIntegral . hashWithSalt 31+{-# INLINE preHashBitCastDescription #-}++preHashBitCastOrDescription :: HashId -> TypeHashId -> Digest+preHashBitCastOrDescription h1 h2 =+ fromIntegral (32 `hashWithSalt` h1 `hashWithSalt` h2)+{-# INLINE preHashBitCastOrDescription #-}++preHashApplyDescription :: TypeHashId -> TypeHashId -> Digest+preHashApplyDescription h1 h2 =+ fromIntegral (33 `hashWithSalt` h1 `hashWithSalt` h2)+{-# INLINE preHashApplyDescription #-}++preHashDivIntegralDescription :: HashId -> HashId -> Digest+preHashDivIntegralDescription h1 h2 =+ fromIntegral (34 `hashWithSalt` h1 `hashWithSalt` h2)+{-# INLINE preHashDivIntegralDescription #-}++preHashModIntegralDescription :: HashId -> HashId -> Digest+preHashModIntegralDescription h1 h2 =+ fromIntegral (35 `hashWithSalt` h1 `hashWithSalt` h2)+{-# INLINE preHashModIntegralDescription #-}++preHashQuotIntegralDescription :: HashId -> HashId -> Digest+preHashQuotIntegralDescription h1 h2 =+ fromIntegral (36 `hashWithSalt` h1 `hashWithSalt` h2)+{-# INLINE preHashQuotIntegralDescription #-}++preHashRemIntegralDescription :: HashId -> HashId -> Digest+preHashRemIntegralDescription h1 h2 =+ fromIntegral (37 `hashWithSalt` h1 `hashWithSalt` h2)+{-# INLINE preHashRemIntegralDescription #-}++preHashFPTraitDescription :: FPTrait -> TypeHashId -> Digest+preHashFPTraitDescription trait h =+ fromIntegral (38 `hashWithSalt` trait `hashWithSalt` h)+{-# INLINE preHashFPTraitDescription #-}++preHashFdivDescription :: HashId -> HashId -> Digest+preHashFdivDescription h1 h2 =+ fromIntegral (39 `hashWithSalt` h1 `hashWithSalt` h2)+{-# INLINE preHashFdivDescription #-}++preHashRecipDescription :: HashId -> Digest+preHashRecipDescription = fromIntegral . hashWithSalt 40+{-# INLINE preHashRecipDescription #-}++preHashFloatingUnaryDescription :: FloatingUnaryOp -> HashId -> Digest+preHashFloatingUnaryDescription op h =+ fromIntegral (41 `hashWithSalt` op `hashWithSalt` h)+{-# INLINE preHashFloatingUnaryDescription #-}++preHashPowerDescription :: HashId -> HashId -> Digest+preHashPowerDescription h1 h2 =+ fromIntegral (42 `hashWithSalt` h1 `hashWithSalt` h2)+{-# INLINE preHashPowerDescription #-}++preHashFPUnaryDescription :: FPUnaryOp -> HashId -> Digest+preHashFPUnaryDescription op h =+ fromIntegral (43 `hashWithSalt` op `hashWithSalt` h)+{-# INLINE preHashFPUnaryDescription #-}++preHashFPBinaryDescription :: FPBinaryOp -> HashId -> HashId -> Digest+preHashFPBinaryDescription op h1 h2 =+ fromIntegral (44 `hashWithSalt` op `hashWithSalt` h1 `hashWithSalt` h2)+{-# INLINE preHashFPBinaryDescription #-}++preHashFPRoundingUnaryDescription ::+ FPRoundingUnaryOp -> HashId -> HashId -> Digest+preHashFPRoundingUnaryDescription op mode h =+ fromIntegral (45 `hashWithSalt` op `hashWithSalt` mode `hashWithSalt` h)+{-# INLINE preHashFPRoundingUnaryDescription #-}++preHashFPRoundingBinaryDescription ::+ FPRoundingBinaryOp -> HashId -> HashId -> HashId -> Digest+preHashFPRoundingBinaryDescription op mode h1 h2 =+ fromIntegral+ ( 46+ `hashWithSalt` op+ `hashWithSalt` mode+ `hashWithSalt` h1+ `hashWithSalt` h2+ )++preHashFPFMADescription ::+ HashId -> HashId -> HashId -> HashId -> Digest+preHashFPFMADescription mode h1 h2 h3 =+ fromIntegral+ ( 47+ `hashWithSalt` mode+ `hashWithSalt` h1+ `hashWithSalt` h2+ `hashWithSalt` h3+ )+{-# INLINE preHashFPFMADescription #-}++preHashFromIntegralDescription :: TypeHashId -> Digest+preHashFromIntegralDescription = fromIntegral . hashWithSalt 48+{-# INLINE preHashFromIntegralDescription #-}++preHashFromFPOrDescription ::+ HashId -> HashId -> TypeHashId -> Digest+preHashFromFPOrDescription h1 h2 h3 =+ fromIntegral (49 `hashWithSalt` h1 `hashWithSalt` h2 `hashWithSalt` h3)+{-# INLINE preHashFromFPOrDescription #-}++preHashToFPTermDescription :: HashId -> TypeHashId -> Digest+preHashToFPTermDescription h1 h2 =+ fromIntegral (50 `hashWithSalt` h1 `hashWithSalt` h2)+{-# INLINE preHashToFPTermDescription #-}++instance Interned (Term t) where+ type Uninterned (Term t) = UTerm t+ data Description (Term t) where+ DConTerm ::+ (t -> t -> Bool) -> {-# UNPACK #-} !Digest -> t -> Description (Term t)+ DSymTerm ::+ {-# UNPACK #-} !Digest ->+ TypedSymbol 'AnyKind t ->+ Description (Term t)+ DForallTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !(TypedSymbol 'ConstantKind t) ->+ {-# UNPACK #-} !HashId ->+ Description (Term Bool)+ DExistsTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !(TypedSymbol 'ConstantKind t) ->+ {-# UNPACK #-} !HashId ->+ Description (Term Bool)+ DNotTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !HashId ->+ Description (Term Bool)+ DOrTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !HashId ->+ !(HS.HashSet (Term Bool)) ->+ Description (Term Bool)+ DAndTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !HashId ->+ !(HS.HashSet (Term Bool)) ->+ Description (Term Bool)+ DEqTerm ::+ {-# UNPACK #-} !Digest ->+ Fingerprint ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !HashId ->+ Description (Term Bool)+ DDistinctTerm ::+ {-# UNPACK #-} !Digest ->+ Fingerprint ->+ !(NonEmpty HashId) ->+ Description (Term Bool)+ DITETerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !HashId ->+ Description (Term t)+ DAddNumTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !HashId ->+ Description (Term t)+ DNegNumTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !HashId ->+ Description (Term t)+ DMulNumTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !HashId ->+ Description (Term t)+ DAbsNumTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !HashId ->+ Description (Term t)+ DSignumNumTerm ::+ {-# UNPACK #-} !Digest -> {-# UNPACK #-} !HashId -> Description (Term t)+ DLtOrdTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !Fingerprint ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !HashId ->+ Description (Term Bool)+ DLeOrdTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !Fingerprint ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !HashId ->+ Description (Term Bool)+ DAndBitsTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !HashId ->+ Description (Term t)+ DOrBitsTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !HashId ->+ Description (Term t)+ DXorBitsTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !HashId ->+ Description (Term t)+ DComplementBitsTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !HashId ->+ Description (Term t)+ DShiftLeftTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !HashId ->+ Description (Term t)+ DShiftRightTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !HashId ->+ Description (Term t)+ DRotateLeftTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !HashId ->+ Description (Term t)+ DRotateRightTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !HashId ->+ Description (Term t)+ DBVConcatTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !TypeHashId ->+ {-# UNPACK #-} !TypeHashId ->+ Description (Term t)+ DBitCastTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !TypeHashId ->+ Description (Term b)+ DBitCastOrTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !TypeHashId ->+ Description (Term b)+ DBVSelectTerm ::+ forall bv (w :: Nat).+ {-# UNPACK #-} !Digest ->+ !Fingerprint ->+ {-# UNPACK #-} !TypeHashId ->+ Description (Term (bv w))+ DBVExtendTerm ::+ forall bv (r :: Nat).+ {-# UNPACK #-} !Digest ->+ !Bool ->+ !(Proxy r) ->+ {-# UNPACK #-} !TypeHashId ->+ Description (Term (bv r))+ DApplyTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !TypeHashId ->+ {-# UNPACK #-} !TypeHashId ->+ Description (Term b)+ DDivIntegralTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !HashId ->+ Description (Term a)+ DModIntegralTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !HashId ->+ Description (Term a)+ DQuotIntegralTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !HashId ->+ Description (Term a)+ DRemIntegralTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !HashId ->+ Description (Term a)+ DFPTraitTerm ::+ {-# UNPACK #-} !Digest ->+ FPTrait ->+ {-# UNPACK #-} !TypeHashId ->+ Description (Term Bool)+ DFdivTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !HashId ->+ Description (Term a)+ DRecipTerm ::+ {-# UNPACK #-} !Digest -> {-# UNPACK #-} !HashId -> Description (Term a)+ DFloatingUnaryTerm ::+ {-# UNPACK #-} !Digest ->+ FloatingUnaryOp ->+ {-# UNPACK #-} !HashId ->+ Description (Term a)+ DPowerTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !HashId ->+ Description (Term a)+ DFPUnaryTerm ::+ forall fp (eb :: Nat) (sb :: Nat).+ {-# UNPACK #-} !Digest ->+ FPUnaryOp ->+ {-# UNPACK #-} !HashId ->+ Description (Term (fp eb sb))+ DFPBinaryTerm ::+ forall fp (eb :: Nat) (sb :: Nat).+ {-# UNPACK #-} !Digest ->+ FPBinaryOp ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !HashId ->+ Description (Term (fp eb sb))+ DFPRoundingUnaryTerm ::+ forall fp (eb :: Nat) (sb :: Nat).+ {-# UNPACK #-} !Digest ->+ FPRoundingUnaryOp ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !HashId ->+ Description (Term (fp eb sb))+ DFPRoundingBinaryTerm ::+ forall fp (eb :: Nat) (sb :: Nat).+ {-# UNPACK #-} !Digest ->+ FPRoundingBinaryOp ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !HashId ->+ Description (Term (fp eb sb))+ DFPFMATerm ::+ forall fp (eb :: Nat) (sb :: Nat).+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !HashId ->+ Description (Term (fp eb sb))+ DFromIntegralTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !TypeHashId ->+ Description (Term b)+ DFromFPOrTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !TypeHashId ->+ Description (Term a)+ DToFPTerm ::+ {-# UNPACK #-} !Digest ->+ {-# UNPACK #-} !HashId ->+ {-# UNPACK #-} !TypeHashId ->+ Description (Term (FP eb sb))++ describe (UConTerm v) = DConTerm sameCon (preHashConDescription v) v+ describe ((USymTerm name) :: UTerm t) =+ DSymTerm @t (preHashSymDescription name) name+ describe (UForallTerm (sym :: TypedSymbol 'ConstantKind arg) arg) =+ let argHashId = termHashId arg+ in DForallTerm (preHashForallDescription sym argHashId) sym argHashId+ describe (UExistsTerm (sym :: TypedSymbol 'ConstantKind arg) arg) =+ let argHashId = termHashId arg+ in DExistsTerm (preHashExistsDescription sym argHashId) sym argHashId+ describe (UNotTerm arg) =+ let argHashId = termHashId arg+ in DNotTerm (preHashNotDescription argHashId) argHashId+ describe (UOrTerm arg1 arg2 s) =+ let arg1HashId = termHashId arg1+ arg2HashId = termHashId arg2+ in DOrTerm+ (preHashOrDescription arg1HashId arg2HashId)+ arg1HashId+ arg2HashId+ s+ describe (UAndTerm arg1 arg2 s) =+ let arg1HashId = termHashId arg1+ arg2HashId = termHashId arg2+ in DAndTerm+ (preHashAndDescription arg1HashId arg2HashId)+ arg1HashId+ arg2HashId+ s+ describe (UEqTerm (arg1@SupportedTerm :: Term arg) arg2) = do+ let fingerprint = typeFingerprint @arg+ arg1HashId = termHashId arg1+ arg2HashId = termHashId arg2+ in DEqTerm+ (preHashEqDescription fingerprint arg1HashId arg2HashId)+ fingerprint+ arg1HashId+ arg2HashId+ describe (UDistinctTerm args@((SupportedTerm :: Term arg) :| _)) =+ let fingerprint = typeFingerprint @arg+ argsHashId = termHashId <$> args+ in DDistinctTerm+ (preHashDistinctDescription fingerprint argsHashId)+ fingerprint+ argsHashId+ describe (UITETerm cond (l :: Term arg) r) =+ let condHashId = termHashId cond+ lHashId = termHashId l+ rHashId = termHashId r+ in DITETerm+ (preHashITEDescription condHashId lHashId rHashId)+ condHashId+ lHashId+ rHashId+ describe (UAddNumTerm arg1 arg2) =+ let arg1HashId = termHashId arg1+ arg2HashId = termHashId arg2+ in DAddNumTerm+ (preHashAddNumDescription arg1HashId arg2HashId)+ arg1HashId+ arg2HashId+ describe (UNegNumTerm arg) =+ let argHashId = termHashId arg+ in DNegNumTerm (preHashNegNumDescription argHashId) argHashId+ describe (UMulNumTerm arg1 arg2) =+ let arg1HashId = termHashId arg1+ arg2HashId = termHashId arg2+ in DMulNumTerm+ (preHashMulNumDescription arg1HashId arg2HashId)+ arg1HashId+ arg2HashId+ describe (UAbsNumTerm arg) =+ let argHashId = termHashId arg+ in DAbsNumTerm (preHashAbsNumDescription argHashId) argHashId+ describe (USignumNumTerm arg) =+ let argHashId = termHashId arg+ in DSignumNumTerm (preHashSignumNumDescription argHashId) argHashId+ describe (ULtOrdTerm (arg1 :: Term arg) arg2) =+ let tr = typeFingerprint @arg+ arg1HashId = termHashId arg1+ arg2HashId = termHashId arg2+ in DLtOrdTerm+ (preHashLtOrdDescription tr arg1HashId arg2HashId)+ tr+ arg1HashId+ arg2HashId+ describe (ULeOrdTerm (arg1 :: Term arg) arg2) =+ let tr = typeFingerprint @arg+ arg1HashId = termHashId arg1+ arg2HashId = termHashId arg2+ in DLeOrdTerm+ (preHashLeOrdDescription tr arg1HashId arg2HashId)+ tr+ arg1HashId+ arg2HashId+ describe (UAndBitsTerm arg1 arg2) =+ let arg1HashId = termHashId arg1+ arg2HashId = termHashId arg2+ in DAndBitsTerm+ (preHashAndBitsDescription arg1HashId arg2HashId)+ arg1HashId+ arg2HashId+ describe (UOrBitsTerm arg1 arg2) =+ let arg1HashId = termHashId arg1+ arg2HashId = termHashId arg2+ in DOrBitsTerm+ (preHashOrBitsDescription arg1HashId arg2HashId)+ arg1HashId+ arg2HashId+ describe (UXorBitsTerm arg1 arg2) =+ let arg1HashId = termHashId arg1+ arg2HashId = termHashId arg2+ in DXorBitsTerm+ (preHashXorBitsDescription arg1HashId arg2HashId)+ arg1HashId+ arg2HashId+ describe (UComplementBitsTerm arg) =+ let argHashId = termHashId arg+ in DComplementBitsTerm+ (preHashComplementBitsDescription argHashId)+ argHashId+ describe (UShiftLeftTerm arg n) =+ let argHashId = termHashId arg+ nHashId = termHashId n+ in DShiftLeftTerm+ (preHashShiftLeftDescription argHashId nHashId)+ argHashId+ nHashId+ describe (UShiftRightTerm arg n) =+ let argHashId = termHashId arg+ nHashId = termHashId n+ in DShiftRightTerm+ (preHashShiftRightDescription argHashId nHashId)+ argHashId+ nHashId+ describe (URotateLeftTerm arg n) =+ let argHashId = termHashId arg+ nHashId = termHashId n+ in DRotateLeftTerm+ (preHashRotateLeftDescription argHashId nHashId)+ argHashId+ nHashId+ describe (URotateRightTerm arg n) =+ let argHashId = termHashId arg+ nHashId = termHashId n+ in DRotateRightTerm+ (preHashRotateRightDescription argHashId nHashId)+ argHashId+ nHashId+ describe (UBitCastTerm (arg :: Term a)) =+ let argHashId = termTypeHashId arg+ in DBitCastTerm (preHashBitCastDescription argHashId) argHashId+ describe (UBitCastOrTerm d (arg :: Term a)) =+ let dHashId = termHashId d+ argHashId = termTypeHashId arg+ in DBitCastOrTerm+ (preHashBitCastOrDescription dHashId argHashId)+ dHashId+ argHashId+ describe (UBVConcatTerm (arg1 :: Term bv1) (arg2 :: Term bv2)) =+ let arg1HashId = termTypeHashId arg1+ arg2HashId = termTypeHashId arg2+ in DBVConcatTerm+ (preHashBVConcatDescription arg1HashId arg2HashId)+ arg1HashId+ arg2HashId+ describe (UBVSelectTerm (ix :: Proxy ix) _ (arg :: Term arg)) =+ let ixFingerprint = typeRepFingerprint $ someTypeRep ix+ argHashId = termTypeHashId arg+ in DBVSelectTerm+ (preHashBVSelectDescription ixFingerprint argHashId)+ ixFingerprint+ argHashId+ describe (UBVExtendTerm signed (n :: Proxy n) (arg :: Term arg)) =+ let argHashId = termTypeHashId arg+ in DBVExtendTerm+ (preHashBVExtendDescription signed argHashId)+ signed+ n+ argHashId+ describe (UApplyTerm (f :: Term f) (arg :: Term a)) =+ let fHashId = termTypeHashId f+ argHashId = termTypeHashId arg+ in DApplyTerm+ (preHashApplyDescription fHashId argHashId)+ fHashId+ argHashId+ describe (UDivIntegralTerm arg1 arg2) =+ let arg1HashId = termHashId arg1+ arg2HashId = termHashId arg2+ in DDivIntegralTerm+ (preHashDivIntegralDescription arg1HashId arg2HashId)+ arg1HashId+ arg2HashId+ describe (UModIntegralTerm arg1 arg2) =+ let arg1HashId = termHashId arg1+ arg2HashId = termHashId arg2+ in DModIntegralTerm+ (preHashModIntegralDescription arg1HashId arg2HashId)+ arg1HashId+ arg2HashId+ describe (UQuotIntegralTerm arg1 arg2) =+ let arg1HashId = termHashId arg1+ arg2HashId = termHashId arg2+ in DQuotIntegralTerm+ (preHashQuotIntegralDescription arg1HashId arg2HashId)+ arg1HashId+ arg2HashId+ describe (URemIntegralTerm arg1 arg2) =+ let arg1HashId = termHashId arg1+ arg2HashId = termHashId arg2+ in DRemIntegralTerm+ (preHashRemIntegralDescription arg1HashId arg2HashId)+ arg1HashId+ arg2HashId+ describe (UFPTraitTerm trait (arg :: Term arg)) =+ let argHashId = termTypeHashId arg+ in DFPTraitTerm+ (preHashFPTraitDescription trait argHashId)+ trait+ argHashId+ describe (UFdivTerm arg1 arg2) =+ let arg1HashId = termHashId arg1+ arg2HashId = termHashId arg2+ in DFdivTerm+ (preHashFdivDescription arg1HashId arg2HashId)+ arg1HashId+ arg2HashId+ describe (URecipTerm arg) =+ let argHashId = termHashId arg+ in DRecipTerm (preHashRecipDescription argHashId) argHashId+ describe (UFloatingUnaryTerm op arg) =+ let argHashId = termHashId arg+ in DFloatingUnaryTerm+ (preHashFloatingUnaryDescription op argHashId)+ op+ argHashId+ describe (UPowerTerm arg1 arg2) =+ let arg1HashId = termHashId arg1+ arg2HashId = termHashId arg2+ in DPowerTerm+ (preHashPowerDescription arg1HashId arg2HashId)+ arg1HashId+ arg2HashId+ describe (UFPUnaryTerm op arg) =+ let argHashId = termHashId arg+ in DFPUnaryTerm+ (preHashFPUnaryDescription op argHashId)+ op+ argHashId+ describe (UFPBinaryTerm op arg1 arg2) =+ let arg1HashId = termHashId arg1+ arg2HashId = termHashId arg2+ in DFPBinaryTerm+ (preHashFPBinaryDescription op arg1HashId arg2HashId)+ op+ arg1HashId+ arg2HashId+ describe (UFPRoundingUnaryTerm op mode arg) =+ let modeHashId = termHashId mode+ argHashId = termHashId arg+ in DFPRoundingUnaryTerm+ (preHashFPRoundingUnaryDescription op modeHashId argHashId)+ op+ modeHashId+ argHashId+ describe (UFPRoundingBinaryTerm op mode arg1 arg2) =+ let modeHashId = termHashId mode+ arg1HashId = termHashId arg1+ arg2HashId = termHashId arg2+ in DFPRoundingBinaryTerm+ ( preHashFPRoundingBinaryDescription+ op+ modeHashId+ arg1HashId+ arg2HashId+ )+ op+ modeHashId+ arg1HashId+ arg2HashId+ describe (UFPFMATerm mode arg1 arg2 arg3) =+ let modeHashId = termHashId mode+ arg1HashId = termHashId arg1+ arg2HashId = termHashId arg2+ arg3HashId = termHashId arg3+ in DFPFMATerm+ (preHashFPFMADescription modeHashId arg1HashId arg2HashId arg3HashId)+ modeHashId+ arg1HashId+ arg2HashId+ arg3HashId+ describe (UFromIntegralTerm (arg :: Term a)) =+ let argHashId = termTypeHashId arg+ in DFromIntegralTerm (preHashFromIntegralDescription argHashId) argHashId+ describe (UFromFPOrTerm d mode (arg :: Term a)) =+ let dHashId = termHashId d+ modeHashId = termHashId mode+ argHashId = termTypeHashId arg+ in DFromFPOrTerm+ (preHashFromFPOrDescription dHashId modeHashId argHashId)+ dHashId+ modeHashId+ argHashId+ describe (UToFPTerm mode (arg :: Term a) _ _) =+ let modeHashId = termHashId mode+ argHashId = termTypeHashId arg+ in DToFPTerm+ (preHashToFPTermDescription modeHashId argHashId)+ modeHashId+ argHashId++ -- {-# INLINE describe #-}++ identify info = go+ where+ go (UConTerm v) = goPhantomCon info getPhantomDict v+ go (USymTerm v) = SymTerm' info v+ go (UForallTerm sym arg) = ForallTerm' info sym arg+ go (UExistsTerm sym arg) = ExistsTerm' info sym arg+ go (UNotTerm arg) = NotTerm' info arg+ go (UOrTerm arg1 arg2 s) = OrTerm' info arg1 arg2 s+ go (UAndTerm arg1 arg2 s) = AndTerm' info arg1 arg2 s+ go (UEqTerm arg1 arg2) = EqTerm' info arg1 arg2+ go (UDistinctTerm args) = DistinctTerm' info args+ -- ITE is propagated+ go (UITETerm cond l r) = ITETerm' info cond l r+ go (UAddNumTerm arg1 arg2) = AddNumTerm' info arg1 arg2+ go (UNegNumTerm arg) = NegNumTerm' info arg+ go (UMulNumTerm arg1 arg2) = MulNumTerm' info arg1 arg2+ go (UAbsNumTerm arg) = AbsNumTerm' info arg+ go (USignumNumTerm arg) = SignumNumTerm' info arg+ go (ULtOrdTerm arg1 arg2) = LtOrdTerm' info arg1 arg2+ go (ULeOrdTerm arg1 arg2) = LeOrdTerm' info arg1 arg2+ go (UAndBitsTerm arg1 arg2) = AndBitsTerm' info arg1 arg2+ go (UOrBitsTerm arg1 arg2) = OrBitsTerm' info arg1 arg2+ go (UXorBitsTerm arg1 arg2) = XorBitsTerm' info arg1 arg2+ go (UComplementBitsTerm arg) = ComplementBitsTerm' info arg+ go (UShiftLeftTerm arg n) = ShiftLeftTerm' info arg n+ go (UShiftRightTerm arg n) = ShiftRightTerm' info arg n+ go (URotateLeftTerm arg n) = RotateLeftTerm' info arg n+ go (URotateRightTerm arg n) = RotateRightTerm' info arg n+ go (UBitCastTerm arg) = goPhantomBitCast info getPhantomDict arg+ go (UBitCastOrTerm d arg) = BitCastOrTerm' info d arg+ go (UBVConcatTerm arg1 arg2) =+ goPhantomBVConcat info getPhantomDict arg1 arg2+ go (UBVSelectTerm ix w arg) =+ goPhantomBVSelect info getPhantomDict ix w arg+ go (UBVExtendTerm signed n arg) =+ goPhantomBVExtend info getPhantomDict signed n arg+ go (UApplyTerm f arg) = goPhantomApply info getPhantomDict f arg+ go (UDivIntegralTerm arg1 arg2) = DivIntegralTerm' info arg1 arg2+ go (UModIntegralTerm arg1 arg2) = ModIntegralTerm' info arg1 arg2+ go (UQuotIntegralTerm arg1 arg2) = QuotIntegralTerm' info arg1 arg2+ go (URemIntegralTerm arg1 arg2) = RemIntegralTerm' info arg1 arg2+ go (UFPTraitTerm trait arg) =+ goPhantomFPTrait info getPhantomDict trait arg+ go (UFdivTerm arg1 arg2) = FdivTerm' info arg1 arg2+ go (URecipTerm arg) = RecipTerm' info arg+ go (UFloatingUnaryTerm op arg) = FloatingUnaryTerm' info op arg+ go (UPowerTerm arg1 arg2) = PowerTerm' info arg1 arg2+ go (UFPUnaryTerm op arg) = goPhantomFPUnary info getPhantomDict op arg+ go (UFPBinaryTerm op arg1 arg2) =+ goPhantomFPBinary info getPhantomDict op arg1 arg2+ go (UFPRoundingUnaryTerm op mode arg) =+ goPhantomFPRoundingUnary info getPhantomDict op mode arg+ go (UFPRoundingBinaryTerm op mode arg1 arg2) =+ goPhantomFPRoundingBinary info getPhantomDict op mode arg1 arg2+ go (UFPFMATerm mode arg1 arg2 arg3) =+ goPhantomFPFMA info getPhantomDict mode arg1 arg2 arg3+ go (UFromIntegralTerm arg) =+ goPhantomFromIntegral info getPhantomDict arg+ go (UFromFPOrTerm d mode arg) = FromFPOrTerm' info d mode arg+ go (UToFPTerm mode (arg :: Term a) _ _) =+ goPhantomToFP info getPhantomDict mode arg+ {-# INLINE go #-}++ -- {-# INLINE identify #-}+ threadId = termThreadId+ {-# INLINE threadId #-}++ descriptionDigest (DConTerm _ h _) = h+ descriptionDigest (DSymTerm h _) = h+ descriptionDigest (DForallTerm h _ _) = h+ descriptionDigest (DExistsTerm h _ _) = h+ descriptionDigest (DNotTerm h _) = h+ descriptionDigest (DOrTerm h _ _ _) = h+ descriptionDigest (DAndTerm h _ _ _) = h+ descriptionDigest (DEqTerm h _ _ _) = h+ descriptionDigest (DDistinctTerm h _ _) = h+ descriptionDigest (DITETerm h _ _ _) = h+ descriptionDigest (DAddNumTerm h _ _) = h+ descriptionDigest (DNegNumTerm h _) = h+ descriptionDigest (DMulNumTerm h _ _) = h+ descriptionDigest (DAbsNumTerm h _) = h+ descriptionDigest (DSignumNumTerm h _) = h+ descriptionDigest (DLtOrdTerm h _ _ _) = h+ descriptionDigest (DLeOrdTerm h _ _ _) = h+ descriptionDigest (DAndBitsTerm h _ _) = h+ descriptionDigest (DOrBitsTerm h _ _) = h+ descriptionDigest (DXorBitsTerm h _ _) = h+ descriptionDigest (DComplementBitsTerm h _) = h+ descriptionDigest (DShiftLeftTerm h _ _) = h+ descriptionDigest (DShiftRightTerm h _ _) = h+ descriptionDigest (DRotateLeftTerm h _ _) = h+ descriptionDigest (DRotateRightTerm h _ _) = h+ descriptionDigest (DBitCastTerm h _) = h+ descriptionDigest (DBitCastOrTerm h _ _) = h+ descriptionDigest (DBVConcatTerm h _ _) = h+ descriptionDigest (DBVSelectTerm h _ _) = h+ descriptionDigest (DBVExtendTerm h _ _ _) = h+ descriptionDigest (DDivIntegralTerm h _ _) = h+ descriptionDigest (DModIntegralTerm h _ _) = h+ descriptionDigest (DQuotIntegralTerm h _ _) = h+ descriptionDigest (DRemIntegralTerm h _ _) = h+ descriptionDigest (DApplyTerm h _ _) = h+ descriptionDigest (DFPTraitTerm h _ _) = h+ descriptionDigest (DFdivTerm h _ _) = h+ descriptionDigest (DRecipTerm h _) = h+ descriptionDigest (DFloatingUnaryTerm h _ _) = h+ descriptionDigest (DPowerTerm h _ _) = h+ descriptionDigest (DFPUnaryTerm h _ _) = h+ descriptionDigest (DFPBinaryTerm h _ _ _) = h+ descriptionDigest (DFPRoundingUnaryTerm h _ _ _) = h+ descriptionDigest (DFPRoundingBinaryTerm h _ _ _ _) = h+ descriptionDigest (DFPFMATerm h _ _ _ _) = h+ descriptionDigest (DFromIntegralTerm h _) = h+ descriptionDigest (DFromFPOrTerm h _ _ _) = h+ descriptionDigest (DToFPTerm h _ _) = h++-- {-# INLINE descriptionDigest #-}+{-# NOINLINE goPhantomCon #-}+goPhantomCon ::+ CachedInfo ->+ PhantomDict t ->+ t ->+ Term t+goPhantomCon info PhantomDict v = ConTerm' info v++{-# NOINLINE goPhantomBitCast #-}+goPhantomBitCast ::+ (PEvalBitCastTerm a t) =>+ CachedInfo ->+ PhantomDict t ->+ Term a ->+ Term t+goPhantomBitCast info PhantomDict arg = BitCastTerm' info arg++{-# NOINLINE goPhantomBVConcat #-}+goPhantomBVConcat ::+ ( PEvalBVTerm bv,+ KnownNat l,+ KnownNat r,+ KnownNat (l + r),+ 1 <= l,+ 1 <= r,+ 1 <= l + r+ ) =>+ CachedInfo ->+ PhantomDict (bv (l + r)) ->+ Term (bv l) ->+ Term (bv r) ->+ Term (bv (l + r))+goPhantomBVConcat info PhantomDict arg1 arg2 =+ BVConcatTerm' info arg1 arg2++{-# NOINLINE goPhantomBVSelect #-}+goPhantomBVSelect ::+ ( PEvalBVTerm bv,+ KnownNat n,+ KnownNat ix,+ KnownNat w,+ 1 <= n,+ 1 <= w,+ ix + w <= n+ ) =>+ CachedInfo ->+ PhantomDict (bv w) ->+ Proxy ix ->+ Proxy w ->+ Term (bv n) ->+ Term (bv w)+goPhantomBVSelect info PhantomDict ix w arg =+ BVSelectTerm' info ix w arg++{-# NOINLINE goPhantomBVExtend #-}+goPhantomBVExtend ::+ ( PEvalBVTerm bv,+ KnownNat l,+ KnownNat r,+ 1 <= l,+ 1 <= r,+ l <= r+ ) =>+ CachedInfo ->+ PhantomDict (bv r) ->+ Bool ->+ Proxy r ->+ Term (bv l) ->+ Term (bv r)+goPhantomBVExtend info PhantomDict signed n arg =+ BVExtendTerm' info signed n arg++{-# NOINLINE goPhantomApply #-}+goPhantomApply ::+ (PEvalApplyTerm f a t) =>+ CachedInfo ->+ PhantomDict t ->+ Term f ->+ Term a ->+ Term t+goPhantomApply info PhantomDict f arg = ApplyTerm' info f arg++{-# NOINLINE goPhantomFPTrait #-}+goPhantomFPTrait ::+ (ValidFP eb sb, PEvalFPTerm fp) =>+ CachedInfo ->+ PhantomDict (fp eb sb) ->+ FPTrait ->+ Term (fp eb sb) ->+ Term Bool+goPhantomFPTrait info PhantomDict trait arg = FPTraitTerm' info trait arg++{-# NOINLINE goPhantomFPUnary #-}+goPhantomFPUnary ::+ (ValidFP eb sb, PEvalFPTerm fp) =>+ CachedInfo ->+ PhantomDict (fp eb sb) ->+ FPUnaryOp ->+ Term (fp eb sb) ->+ Term (fp eb sb)+goPhantomFPUnary info PhantomDict op arg = FPUnaryTerm' info op arg++{-# NOINLINE goPhantomFPBinary #-}+goPhantomFPBinary ::+ (ValidFP eb sb, PEvalFPTerm fp) =>+ CachedInfo ->+ PhantomDict (fp eb sb) ->+ FPBinaryOp ->+ Term (fp eb sb) ->+ Term (fp eb sb) ->+ Term (fp eb sb)+goPhantomFPBinary info PhantomDict op arg1 arg2 =+ FPBinaryTerm' info op arg1 arg2++{-# NOINLINE goPhantomFPRoundingUnary #-}+goPhantomFPRoundingUnary ::+ (ValidFP eb sb, PEvalFPTerm fp) =>+ CachedInfo ->+ PhantomDict (fp eb sb) ->+ FPRoundingUnaryOp ->+ Term FPRoundingMode ->+ Term (fp eb sb) ->+ Term (fp eb sb)+goPhantomFPRoundingUnary info PhantomDict op mode arg =+ FPRoundingUnaryTerm' info op mode arg++{-# NOINLINE goPhantomFPRoundingBinary #-}+goPhantomFPRoundingBinary ::+ (ValidFP eb sb, PEvalFPTerm fp) =>+ CachedInfo ->+ PhantomDict (fp eb sb) ->+ FPRoundingBinaryOp ->+ Term FPRoundingMode ->+ Term (fp eb sb) ->+ Term (fp eb sb) ->+ Term (fp eb sb)+goPhantomFPRoundingBinary info PhantomDict op mode arg1 arg2 =+ FPRoundingBinaryTerm' info op mode arg1 arg2++{-# NOINLINE goPhantomFPFMA #-}+goPhantomFPFMA ::+ (ValidFP eb sb, PEvalFPTerm fp) =>+ CachedInfo ->+ PhantomDict (fp eb sb) ->+ Term FPRoundingMode ->+ Term (fp eb sb) ->+ Term (fp eb sb) ->+ Term (fp eb sb) ->+ Term (fp eb sb)+goPhantomFPFMA info PhantomDict mode arg1 arg2 arg3 =+ FPFMATerm' info mode arg1 arg2 arg3++{-# NOINLINE goPhantomFromIntegral #-}+goPhantomFromIntegral ::+ (PEvalFromIntegralTerm a b) =>+ CachedInfo ->+ PhantomDict b ->+ Term a ->+ Term b+goPhantomFromIntegral info PhantomDict arg = FromIntegralTerm' info arg++{-# NOINLINE goPhantomToFP #-}+goPhantomToFP ::+ forall a eb sb.+ (ValidFP eb sb, PEvalIEEEFPConvertibleTerm a) =>+ CachedInfo ->+ PhantomDict (FP eb sb) ->+ Term FPRoundingMode ->+ Term a ->+ Term (FP eb sb)+goPhantomToFP info PhantomDict mode arg =+ ToFPTerm' info mode arg (Proxy @eb) (Proxy @sb)++instance Eq (Description (Term t)) where+ DConTerm eqFunc _ l == DConTerm _ _ r =+ eqFunc l r+ DSymTerm _ ls == DSymTerm _ rs = ls == rs+ DForallTerm _ ls li == DForallTerm _ rs ri =+ eqHeteroSymbol ls rs && eqHashId li ri+ DExistsTerm _ ls li == DExistsTerm _ rs ri =+ eqHeteroSymbol ls rs && eqHashId li ri+ DNotTerm _ li == DNotTerm _ ri = eqHashId li ri+ DOrTerm _ li1 li2 _ == DOrTerm _ ri1 ri2 _ = eqHashId li1 ri1 && eqHashId li2 ri2+ DAndTerm _ li1 li2 _ == DAndTerm _ ri1 ri2 _ = eqHashId li1 ri1 && eqHashId li2 ri2+ DEqTerm _ lfp li1 li2 == DEqTerm _ rfp ri1 ri2 = lfp == rfp && eqHashId li1 ri1 && eqHashId li2 ri2+ DDistinctTerm _ lfp li == DDistinctTerm _ rfp ri =+ lfp == rfp+ && length li == length ri+ && and (zipWith eqHashId (toList li) (toList ri))+ DITETerm _ lc li1 li2 == DITETerm _ rc ri1 ri2 = eqHashId lc rc && eqHashId li1 ri1 && eqHashId li2 ri2+ DAddNumTerm _ li1 li2 == DAddNumTerm _ ri1 ri2 = eqHashId li1 ri1 && eqHashId li2 ri2+ DNegNumTerm _ li == DNegNumTerm _ ri = eqHashId li ri+ DMulNumTerm _ li1 li2 == DMulNumTerm _ ri1 ri2 = eqHashId li1 ri1 && eqHashId li2 ri2+ DAbsNumTerm _ li == DAbsNumTerm _ ri = eqHashId li ri+ DSignumNumTerm _ li == DSignumNumTerm _ ri = eqHashId li ri+ DLtOrdTerm _ lrep li1 li2 == DLtOrdTerm _ rrep ri1 ri2 = lrep == rrep && eqHashId li1 ri1 && eqHashId li2 ri2+ DLeOrdTerm _ lrep li1 li2 == DLeOrdTerm _ rrep ri1 ri2 = lrep == rrep && eqHashId li1 ri1 && eqHashId li2 ri2+ DAndBitsTerm _ li1 li2 == DAndBitsTerm _ ri1 ri2 = eqHashId li1 ri1 && eqHashId li2 ri2+ DOrBitsTerm _ li1 li2 == DOrBitsTerm _ ri1 ri2 = eqHashId li1 ri1 && eqHashId li2 ri2+ DXorBitsTerm _ li1 li2 == DXorBitsTerm _ ri1 ri2 = eqHashId li1 ri1 && eqHashId li2 ri2+ DComplementBitsTerm _ li == DComplementBitsTerm _ ri = eqHashId li ri+ DShiftLeftTerm _ li ln == DShiftLeftTerm _ ri rn = eqHashId li ri && eqHashId ln rn+ DShiftRightTerm _ li ln == DShiftRightTerm _ ri rn = eqHashId li ri && eqHashId ln rn+ DRotateLeftTerm _ li ln == DRotateLeftTerm _ ri rn = eqHashId li ri && eqHashId ln rn+ DRotateRightTerm _ li ln == DRotateRightTerm _ ri rn = eqHashId li ri && eqHashId ln rn+ DBitCastTerm _ li == DBitCastTerm _ ri = li == ri+ DBitCastOrTerm _ ld li == DBitCastOrTerm _ rd ri = ld == rd && li == ri+ DBVConcatTerm _ li1 li2 == DBVConcatTerm _ ri1 ri2 = li1 == ri1 && li2 == ri2+ DBVSelectTerm _ lix li == DBVSelectTerm _ rix ri =+ lix == rix && li == ri+ DBVExtendTerm _ lIsSigned _ li == DBVExtendTerm _ rIsSigned _ ri =+ lIsSigned == rIsSigned+ && li == ri+ DApplyTerm _ lf li == DApplyTerm _ rf ri = lf == rf && li == ri+ DDivIntegralTerm _ li1 li2 == DDivIntegralTerm _ ri1 ri2 = eqHashId li1 ri1 && eqHashId li2 ri2+ DModIntegralTerm _ li1 li2 == DModIntegralTerm _ ri1 ri2 = eqHashId li1 ri1 && eqHashId li2 ri2+ DQuotIntegralTerm _ li1 li2 == DQuotIntegralTerm _ ri1 ri2 = eqHashId li1 ri1 && eqHashId li2 ri2+ DRemIntegralTerm _ li1 li2 == DRemIntegralTerm _ ri1 ri2 = eqHashId li1 ri1 && eqHashId li2 ri2+ DFPTraitTerm _ lt li == DFPTraitTerm _ rt ri = lt == rt && li == ri+ DFdivTerm _ li1 li2 == DFdivTerm _ ri1 ri2 = eqHashId li1 ri1 && eqHashId li2 ri2+ DRecipTerm _ li == DRecipTerm _ ri = eqHashId li ri+ DFloatingUnaryTerm _ lop li == DFloatingUnaryTerm _ rop ri = lop == rop && eqHashId li ri+ DPowerTerm _ li1 li2 == DPowerTerm _ ri1 ri2 = eqHashId li1 ri1 && eqHashId li2 ri2+ DFPUnaryTerm _ lop li == DFPUnaryTerm _ rop ri = lop == rop && eqHashId li ri+ DFPBinaryTerm _ lop li1 li2 == DFPBinaryTerm _ rop ri1 ri2 = lop == rop && eqHashId li1 ri1 && eqHashId li2 ri2+ DFPRoundingUnaryTerm _ lop lmode li == DFPRoundingUnaryTerm _ rop rmode ri =+ lop == rop && eqHashId lmode rmode && eqHashId li ri+ DFPRoundingBinaryTerm _ lop lmode li1 li2 == DFPRoundingBinaryTerm _ rop rmode ri1 ri2 =+ lop == rop && eqHashId lmode rmode && eqHashId li1 ri1 && eqHashId li2 ri2+ DFPFMATerm _ lmode li1 li2 li3 == DFPFMATerm _ rmode ri1 ri2 ri3 =+ eqHashId lmode rmode && eqHashId li1 ri1 && eqHashId li2 ri2 && eqHashId li3 ri3+ DFromIntegralTerm _ li == DFromIntegralTerm _ ri = li == ri+ DFromFPOrTerm _ ld li lai == DFromFPOrTerm _ rd ri rai = eqHashId ld rd && eqHashId li ri && lai == rai+ DToFPTerm _ li lai == DToFPTerm _ ri rai = eqHashId li ri && lai == rai+ _ == _ = False++-- {-# INLINE (==) #-}++instance Hashable (Description (Term t)) where+ hashWithSalt s = hashWithSalt s . descriptionDigest+ {-# INLINE hashWithSalt #-}++fullReconstructTerm1 ::+ forall a b.+ (Term a -> IO (Term b)) ->+ Term a ->+ IO (Term b)+fullReconstructTerm1 f x = fullReconstructTerm x >>= f+{-# INLINE fullReconstructTerm1 #-}++fullReconstructTerm2 ::+ forall a b c.+ (Term a -> Term b -> IO (Term c)) ->+ Term a ->+ Term b ->+ IO (Term c)+fullReconstructTerm2 f x y = do+ rx <- fullReconstructTerm x+ ry <- fullReconstructTerm y+ f rx ry+{-# INLINE fullReconstructTerm2 #-}++fullReconstructTerm3 ::+ forall a b c d.+ (Term a -> Term b -> Term c -> IO (Term d)) ->+ Term a ->+ Term b ->+ Term c ->+ IO (Term d)+fullReconstructTerm3 f x y z = do+ rx <- fullReconstructTerm x+ ry <- fullReconstructTerm y+ rz <- fullReconstructTerm z+ f rx ry rz+{-# INLINE fullReconstructTerm3 #-}++fullReconstructTerm2Set ::+ forall a c.+ (Term a -> Term a -> HS.HashSet (Term a) -> IO (Term c)) ->+ Term a ->+ Term a ->+ HS.HashSet (Term a) ->+ IO (Term c)+fullReconstructTerm2Set f x y s = do+ rx@SupportedTerm <- fullReconstructTerm x+ ry <- fullReconstructTerm y+ rs <- traverse fullReconstructTerm (HS.toList s)+ f rx ry (HS.fromList rs)+{-# INLINE fullReconstructTerm2Set #-}++fullReconstructTerm :: forall t. Term t -> IO (Term t)+fullReconstructTerm (ConTerm i) = curThreadConTerm i+fullReconstructTerm (SymTerm sym) = curThreadSymTerm sym+fullReconstructTerm (ForallTerm sym arg) =+ fullReconstructTerm1 (curThreadForallTerm sym) arg+fullReconstructTerm (ExistsTerm sym arg) =+ fullReconstructTerm1 (curThreadExistsTerm sym) arg+fullReconstructTerm (NotTerm arg) =+ fullReconstructTerm1 curThreadNotTerm arg+fullReconstructTerm (OrTermAll arg1 arg2 s) =+ fullReconstructTerm2Set curThreadOrTerm arg1 arg2 s+fullReconstructTerm (OrTerm _ _) = error "Make compiler happy"+fullReconstructTerm (AndTermAll arg1 arg2 s) =+ fullReconstructTerm2Set curThreadAndTerm arg1 arg2 s+fullReconstructTerm (AndTerm _ _) = error "Make compiler happy"+fullReconstructTerm (EqTerm arg1 arg2) =+ fullReconstructTerm2 curThreadEqTerm arg1 arg2+fullReconstructTerm (DistinctTerm args) =+ traverse fullReconstructTerm args >>= curThreadDistinctTerm+fullReconstructTerm (ITETerm cond arg1 arg2) =+ fullReconstructTerm3 curThreadIteTerm cond arg1 arg2+fullReconstructTerm (AddNumTerm arg1 arg2) =+ fullReconstructTerm2 curThreadAddNumTerm arg1 arg2+fullReconstructTerm (NegNumTerm arg) =+ fullReconstructTerm1 curThreadNegNumTerm arg+fullReconstructTerm (MulNumTerm arg1 arg2) =+ fullReconstructTerm2 curThreadMulNumTerm arg1 arg2+fullReconstructTerm (AbsNumTerm arg) =+ fullReconstructTerm1 curThreadAbsNumTerm arg+fullReconstructTerm (SignumNumTerm arg) =+ fullReconstructTerm1 curThreadSignumNumTerm arg+fullReconstructTerm (LtOrdTerm arg1 arg2) =+ fullReconstructTerm2 curThreadLtOrdTerm arg1 arg2+fullReconstructTerm (LeOrdTerm arg1 arg2) =+ fullReconstructTerm2 curThreadLeOrdTerm arg1 arg2+fullReconstructTerm (AndBitsTerm arg1 arg2) =+ fullReconstructTerm2 curThreadAndBitsTerm arg1 arg2+fullReconstructTerm (OrBitsTerm arg1 arg2) =+ fullReconstructTerm2 curThreadOrBitsTerm arg1 arg2+fullReconstructTerm (XorBitsTerm arg1 arg2) =+ fullReconstructTerm2 curThreadXorBitsTerm arg1 arg2+fullReconstructTerm (ComplementBitsTerm arg) =+ fullReconstructTerm1 curThreadComplementBitsTerm arg+fullReconstructTerm (ShiftLeftTerm arg n) =+ fullReconstructTerm1 (curThreadShiftLeftTerm arg) n+fullReconstructTerm (ShiftRightTerm arg n) =+ fullReconstructTerm1 (curThreadShiftRightTerm arg) n+fullReconstructTerm (RotateLeftTerm arg n) =+ fullReconstructTerm1 (curThreadRotateLeftTerm arg) n+fullReconstructTerm (RotateRightTerm arg n) =+ fullReconstructTerm1 (curThreadRotateRightTerm arg) n+fullReconstructTerm (BitCastTerm v) =+ fullReconstructTerm1 curThreadBitCastTerm v+fullReconstructTerm (BitCastOrTerm d v) =+ fullReconstructTerm2 curThreadBitCastOrTerm d v+fullReconstructTerm (BVConcatTerm arg1 arg2) =+ fullReconstructTerm2 curThreadBVConcatTerm arg1 arg2+fullReconstructTerm (BVSelectTerm (_ :: Proxy ix) (_ :: Proxy w) arg) =+ fullReconstructTerm1 (curThreadBVSelectTerm (Proxy @ix) (Proxy @w)) arg+fullReconstructTerm (BVExtendTerm signed p arg) =+ fullReconstructTerm1 (curThreadBVExtendTerm signed p) arg+fullReconstructTerm (ApplyTerm f arg) =+ fullReconstructTerm2 curThreadApplyTerm f arg+fullReconstructTerm (DivIntegralTerm arg1 arg2) =+ fullReconstructTerm2 curThreadDivIntegralTerm arg1 arg2+fullReconstructTerm (ModIntegralTerm arg1 arg2) =+ fullReconstructTerm2 curThreadModIntegralTerm arg1 arg2+fullReconstructTerm (QuotIntegralTerm arg1 arg2) =+ fullReconstructTerm2 curThreadQuotIntegralTerm arg1 arg2+fullReconstructTerm (RemIntegralTerm arg1 arg2) =+ fullReconstructTerm2 curThreadRemIntegralTerm arg1 arg2+fullReconstructTerm (FPTraitTerm trait arg) =+ fullReconstructTerm1 (curThreadFpTraitTerm trait) arg+fullReconstructTerm (FdivTerm arg1 arg2) =+ fullReconstructTerm2 curThreadFdivTerm arg1 arg2+fullReconstructTerm (RecipTerm arg) =+ fullReconstructTerm1 curThreadRecipTerm arg+fullReconstructTerm (FloatingUnaryTerm op arg) =+ fullReconstructTerm1 (curThreadFloatingUnaryTerm op) arg+fullReconstructTerm (PowerTerm arg1 arg2) =+ fullReconstructTerm2 curThreadPowerTerm arg1 arg2+fullReconstructTerm (FPUnaryTerm op arg) =+ fullReconstructTerm1 (curThreadFpUnaryTerm op) arg+fullReconstructTerm (FPBinaryTerm op arg1 arg2) =+ fullReconstructTerm2 (curThreadFpBinaryTerm op) arg1 arg2+fullReconstructTerm (FPRoundingUnaryTerm op mode arg) =+ fullReconstructTerm2 (curThreadFpRoundingUnaryTerm op) mode arg+fullReconstructTerm (FPRoundingBinaryTerm op mode arg1 arg2) =+ fullReconstructTerm3 (curThreadFpRoundingBinaryTerm op) mode arg1 arg2+fullReconstructTerm (FPFMATerm mode arg1 arg2 arg3) = do+ rmode <- fullReconstructTerm mode+ rarg1 <- fullReconstructTerm arg1+ rarg2 <- fullReconstructTerm arg2+ rarg3 <- fullReconstructTerm arg3+ curThreadFpFMATerm rmode rarg1 rarg2 rarg3+fullReconstructTerm (FromIntegralTerm arg) =+ fullReconstructTerm1 curThreadFromIntegralTerm arg+fullReconstructTerm (FromFPOrTerm d r arg) =+ fullReconstructTerm3 curThreadFromFPOrTerm d r arg+fullReconstructTerm (ToFPTerm r arg _ _) =+ fullReconstructTerm2 curThreadToFPTerm r arg++toCurThreadImpl :: forall t. WeakThreadId -> Term t -> IO (Term t)+toCurThreadImpl tid t | termThreadId t == tid = return t+toCurThreadImpl _ t = fullReconstructTerm t+{-# INLINE toCurThreadImpl #-}++-- | Convert a term to the current thread.+toCurThread :: forall t. Term t -> IO (Term t)+toCurThread t = do+ tid <- myWeakThreadId+ toCurThreadImpl tid t+{-# INLINE toCurThread #-}++-- | Construct and internalizing a 'ConTerm'.+curThreadConTerm :: forall t. (SupportedPrim t) => t -> IO (Term t)+curThreadConTerm t = intern $ UConTerm t+{-# INLINE curThreadConTerm #-}++-- | Construct and internalizing a 'SymTerm'.+curThreadSymTerm :: forall knd t. TypedSymbol knd t -> IO (Term t)+curThreadSymTerm (TypedSymbol s) = intern $ USymTerm $ TypedSymbol s+{-# INLINE curThreadSymTerm #-}++-- | Construct and internalizing a 'ForallTerm'.+curThreadForallTerm ::+ TypedSymbol 'ConstantKind t ->+ Term Bool ->+ IO (Term Bool)+curThreadForallTerm sym arg = intern $ UForallTerm sym arg+{-# INLINE curThreadForallTerm #-}++-- | Construct and internalizing a 'ExistsTerm'.+curThreadExistsTerm ::+ TypedSymbol 'ConstantKind t ->+ Term Bool ->+ IO (Term Bool)+curThreadExistsTerm sym arg = intern $ UExistsTerm sym arg+{-# INLINE curThreadExistsTerm #-}++-- | Construct and internalizing a 'SymTerm' with an identifier, using simple+-- symbols.+curThreadSsymTerm :: (SupportedPrim t) => Identifier -> IO (Term t)+curThreadSsymTerm ident =+ curThreadSymTerm @AnyKind $ TypedSymbol $ SimpleSymbol ident+{-# INLINE curThreadSsymTerm #-}++-- | Construct and internalizing a 'SymTerm' with an identifier and an index,+-- using indexed symbols.+curThreadIsymTerm :: (SupportedPrim t) => Identifier -> Int -> IO (Term t)+curThreadIsymTerm str idx =+ curThreadSymTerm @AnyKind $ TypedSymbol $ IndexedSymbol str idx+{-# INLINE curThreadIsymTerm #-}++-- | Construct and internalizing a 'NotTerm'.+curThreadNotTerm :: Term Bool -> IO (Term Bool)+curThreadNotTerm = intern . UNotTerm+{-# INLINE curThreadNotTerm #-}++-- | Construct and internalizing a 'OrTerm'.+curThreadOrTerm :: Term Bool -> Term Bool -> HS.HashSet (Term Bool) -> IO (Term Bool)+curThreadOrTerm l r s = intern $ UOrTerm l r s+{-# INLINE curThreadOrTerm #-}++-- | Construct and internalizing a 'AndTerm'.+curThreadAndTerm :: Term Bool -> Term Bool -> HS.HashSet (Term Bool) -> IO (Term Bool)+curThreadAndTerm l r s = intern $ UAndTerm l r s+{-# INLINE curThreadAndTerm #-}++-- | Construct and internalizing a 'EqTerm'.+curThreadEqTerm :: Term a -> Term a -> IO (Term Bool)+curThreadEqTerm l r = intern $ UEqTerm l r+{-# INLINE curThreadEqTerm #-}++-- | Construct and internalizing a 'DistinctTerm'.+curThreadDistinctTerm :: NonEmpty (Term a) -> IO (Term Bool)+curThreadDistinctTerm args = intern $ UDistinctTerm args+{-# INLINE curThreadDistinctTerm #-}++-- | Construct and internalizing a 'ITETerm'.+curThreadIteTerm :: Term Bool -> Term a -> Term a -> IO (Term a)+curThreadIteTerm c l@SupportedTerm r = intern $ UITETerm c l r+{-# INLINE curThreadIteTerm #-}++-- | Construct and internalizing a 'AddNumTerm'.+curThreadAddNumTerm :: (PEvalNumTerm a) => Term a -> Term a -> IO (Term a)+curThreadAddNumTerm l@SupportedTerm r = intern $ UAddNumTerm l r+{-# INLINE curThreadAddNumTerm #-}++-- | Construct and internalizing a 'NegNumTerm'.+curThreadNegNumTerm :: (PEvalNumTerm a) => Term a -> IO (Term a)+curThreadNegNumTerm l@SupportedTerm = intern $ UNegNumTerm l+{-# INLINE curThreadNegNumTerm #-}++-- | Construct and internalizing a 'MulNumTerm'.+curThreadMulNumTerm :: (PEvalNumTerm a) => Term a -> Term a -> IO (Term a)+curThreadMulNumTerm l@SupportedTerm r = intern $ UMulNumTerm l r+{-# INLINE curThreadMulNumTerm #-}++-- | Construct and internalizing a 'AbsNumTerm'.+curThreadAbsNumTerm :: (PEvalNumTerm a) => Term a -> IO (Term a)+curThreadAbsNumTerm l@SupportedTerm = intern $ UAbsNumTerm l+{-# INLINE curThreadAbsNumTerm #-}++-- | Construct and internalizing a 'SignumNumTerm'.+curThreadSignumNumTerm :: (PEvalNumTerm a) => Term a -> IO (Term a)+curThreadSignumNumTerm l@SupportedTerm = intern $ USignumNumTerm l+{-# INLINE curThreadSignumNumTerm #-}++-- | Construct and internalizing a 'LtOrdTerm'.+curThreadLtOrdTerm :: (PEvalOrdTerm a) => Term a -> Term a -> IO (Term Bool)+curThreadLtOrdTerm l@SupportedTerm r = intern $ ULtOrdTerm l r+{-# INLINE curThreadLtOrdTerm #-}++-- | Construct and internalizing a 'LeOrdTerm'.+curThreadLeOrdTerm :: (PEvalOrdTerm a) => Term a -> Term a -> IO (Term Bool)+curThreadLeOrdTerm l@SupportedTerm r = intern $ ULeOrdTerm l r+{-# INLINE curThreadLeOrdTerm #-}++-- | Construct and internalizing a 'AndBitsTerm'.+curThreadAndBitsTerm :: (PEvalBitwiseTerm a) => Term a -> Term a -> IO (Term a)+curThreadAndBitsTerm l@SupportedTerm r = intern $ UAndBitsTerm l r+{-# INLINE curThreadAndBitsTerm #-}++-- | Construct and internalizing a 'OrBitsTerm'.+curThreadOrBitsTerm :: (PEvalBitwiseTerm a) => Term a -> Term a -> IO (Term a)+curThreadOrBitsTerm l@SupportedTerm r = intern $ UOrBitsTerm l r+{-# INLINE curThreadOrBitsTerm #-}++-- | Construct and internalizing a 'XorBitsTerm'.+curThreadXorBitsTerm :: (PEvalBitwiseTerm a) => Term a -> Term a -> IO (Term a)+curThreadXorBitsTerm l@SupportedTerm r = intern $ UXorBitsTerm l r+{-# INLINE curThreadXorBitsTerm #-}++-- | Construct and internalizing a 'ComplementBitsTerm'.+curThreadComplementBitsTerm :: (PEvalBitwiseTerm a) => Term a -> IO (Term a)+curThreadComplementBitsTerm l@SupportedTerm = intern $ UComplementBitsTerm l+{-# INLINE curThreadComplementBitsTerm #-}++-- | Construct and internalizing a 'ShiftLeftTerm'.+curThreadShiftLeftTerm :: (PEvalShiftTerm a) => Term a -> Term a -> IO (Term a)+curThreadShiftLeftTerm t@SupportedTerm n = intern $ UShiftLeftTerm t n+{-# INLINE curThreadShiftLeftTerm #-}++-- | Construct and internalizing a 'ShiftRightTerm'.+curThreadShiftRightTerm :: (PEvalShiftTerm a) => Term a -> Term a -> IO (Term a)+curThreadShiftRightTerm t@SupportedTerm n = intern $ UShiftRightTerm t n+{-# INLINE curThreadShiftRightTerm #-}++-- | Construct and internalizing a 'RotateLeftTerm'.+curThreadRotateLeftTerm ::+ (PEvalRotateTerm a) => Term a -> Term a -> IO (Term a)+curThreadRotateLeftTerm t@SupportedTerm n = intern $ URotateLeftTerm t n+{-# INLINE curThreadRotateLeftTerm #-}++-- | Construct and internalizing a 'RotateRightTerm'.+curThreadRotateRightTerm ::+ (PEvalRotateTerm a) => Term a -> Term a -> IO (Term a)+curThreadRotateRightTerm t@SupportedTerm n = intern $ URotateRightTerm t n+{-# INLINE curThreadRotateRightTerm #-}++-- | Construct and internalizing a 'BitCastTerm'.+curThreadBitCastTerm ::+ forall a b.+ (SupportedPrim b, PEvalBitCastTerm a b) =>+ Term a ->+ IO (Term b)+curThreadBitCastTerm = intern . UBitCastTerm+{-# INLINE curThreadBitCastTerm #-}++-- | Construct and internalizing a 'BitCastOrTerm'.+curThreadBitCastOrTerm ::+ (PEvalBitCastOrTerm a b) =>+ Term b ->+ Term a ->+ IO (Term b)+curThreadBitCastOrTerm d@SupportedTerm a = intern $ UBitCastOrTerm d a+{-# INLINE curThreadBitCastOrTerm #-}++-- | Construct and internalizing a 'BVConcatTerm'.+curThreadBVConcatTerm ::+ forall bv l r.+ ( PEvalBVTerm bv,+ KnownNat l,+ KnownNat r,+ KnownNat (l + r),+ 1 <= l,+ 1 <= r,+ 1 <= l + r,+ SupportedPrim (bv (l + r))+ ) =>+ Term (bv l) ->+ Term (bv r) ->+ IO (Term (bv (l + r)))+curThreadBVConcatTerm l r = intern $ UBVConcatTerm l r+{-# INLINE curThreadBVConcatTerm #-}++-- | Construct and internalizing a 'BVSelectTerm'.+curThreadBVSelectTerm ::+ forall bv n ix w p q.+ ( PEvalBVTerm bv,+ KnownNat n,+ KnownNat ix,+ KnownNat w,+ 1 <= n,+ 1 <= w,+ ix + w <= n,+ SupportedPrim (bv w)+ ) =>+ p ix ->+ q w ->+ Term (bv n) ->+ IO (Term (bv w))+curThreadBVSelectTerm _ _ v = intern $ UBVSelectTerm (Proxy @ix) (Proxy @w) v+{-# INLINE curThreadBVSelectTerm #-}++-- | Construct and internalizing a 'BVExtendTerm'.+curThreadBVExtendTerm ::+ forall bv l r proxy.+ ( PEvalBVTerm bv,+ KnownNat l,+ KnownNat r,+ 1 <= l,+ 1 <= r,+ l <= r,+ SupportedPrim (bv r)+ ) =>+ Bool ->+ proxy r ->+ Term (bv l) ->+ IO (Term (bv r))+curThreadBVExtendTerm signed _ v = intern $ UBVExtendTerm signed (Proxy @r) v+{-# INLINE curThreadBVExtendTerm #-}++-- | Construct and internalizing a 'BVExtendTerm' with sign extension.+curThreadBvsignExtendTerm ::+ forall bv l r proxy.+ ( PEvalBVTerm bv,+ KnownNat l,+ KnownNat r,+ 1 <= l,+ 1 <= r,+ l <= r,+ SupportedPrim (bv r)+ ) =>+ proxy r ->+ Term (bv l) ->+ IO (Term (bv r))+curThreadBvsignExtendTerm _ v = intern $ UBVExtendTerm True (Proxy @r) v+{-# INLINE curThreadBvsignExtendTerm #-}++-- | Construct and internalizing a 'BVExtendTerm' with zero extension.+curThreadBvzeroExtendTerm ::+ forall bv l r proxy.+ ( PEvalBVTerm bv,+ KnownNat l,+ KnownNat r,+ 1 <= l,+ 1 <= r,+ l <= r,+ SupportedPrim (bv r)+ ) =>+ proxy r ->+ Term (bv l) ->+ IO (Term (bv r))+curThreadBvzeroExtendTerm _ v = intern $ UBVExtendTerm False (Proxy @r) v+{-# INLINE curThreadBvzeroExtendTerm #-}++-- | Construct and internalizing a 'ApplyTerm'.+curThreadApplyTerm ::+ forall f a b.+ (PEvalApplyTerm f a b, SupportedPrim b) =>+ Term f ->+ Term a ->+ IO (Term b)+curThreadApplyTerm f a = intern $ UApplyTerm f a+{-# INLINE curThreadApplyTerm #-}++-- | Construct and internalizing a 'DivIntegralTerm'.+curThreadDivIntegralTerm ::+ (PEvalDivModIntegralTerm a) => Term a -> Term a -> IO (Term a)+curThreadDivIntegralTerm l@SupportedTerm r = intern $ UDivIntegralTerm l r+{-# INLINE curThreadDivIntegralTerm #-}++-- | Construct and internalizing a 'ModIntegralTerm'.+curThreadModIntegralTerm ::+ (PEvalDivModIntegralTerm a) => Term a -> Term a -> IO (Term a)+curThreadModIntegralTerm l@SupportedTerm r = intern $ UModIntegralTerm l r+{-# INLINE curThreadModIntegralTerm #-}++-- | Construct and internalizing a 'QuotIntegralTerm'.+curThreadQuotIntegralTerm ::+ (PEvalDivModIntegralTerm a) => Term a -> Term a -> IO (Term a)+curThreadQuotIntegralTerm l@SupportedTerm r = intern $ UQuotIntegralTerm l r+{-# INLINE curThreadQuotIntegralTerm #-}++-- | Construct and internalizing a 'RemIntegralTerm'.+curThreadRemIntegralTerm ::+ (PEvalDivModIntegralTerm a) => Term a -> Term a -> IO (Term a)+curThreadRemIntegralTerm l@SupportedTerm r = intern $ URemIntegralTerm l r+{-# INLINE curThreadRemIntegralTerm #-}++-- | Construct and internalizing a 'FPTraitTerm'.+curThreadFpTraitTerm ::+ (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) =>+ FPTrait ->+ Term (fp eb sb) ->+ IO (Term Bool)+curThreadFpTraitTerm trait v = intern $ UFPTraitTerm trait v+{-# INLINE curThreadFpTraitTerm #-}++-- | Construct and internalizing a 'FdivTerm'.+curThreadFdivTerm :: (PEvalFractionalTerm a) => Term a -> Term a -> IO (Term a)+curThreadFdivTerm l@SupportedTerm r = intern $ UFdivTerm l r+{-# INLINE curThreadFdivTerm #-}++-- | Construct and internalizing a 'RecipTerm'.+curThreadRecipTerm :: (PEvalFractionalTerm a) => Term a -> IO (Term a)+curThreadRecipTerm l@SupportedTerm = intern $ URecipTerm l+{-# INLINE curThreadRecipTerm #-}++-- | Construct and internalizing a 'FloatingUnaryTerm'.+curThreadFloatingUnaryTerm ::+ (PEvalFloatingTerm a) => FloatingUnaryOp -> Term a -> IO (Term a)+curThreadFloatingUnaryTerm op a@SupportedTerm = intern $ UFloatingUnaryTerm op a+{-# INLINE curThreadFloatingUnaryTerm #-}++-- | Construct and internalizing a 'PowerTerm'.+curThreadPowerTerm :: (PEvalFloatingTerm a) => Term a -> Term a -> IO (Term a)+curThreadPowerTerm l@SupportedTerm r = intern $ UPowerTerm l r+{-# INLINE curThreadPowerTerm #-}++-- | Construct and internalizing a 'FPUnaryTerm'.+curThreadFpUnaryTerm ::+ (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) =>+ FPUnaryOp ->+ Term (fp eb sb) ->+ IO (Term (fp eb sb))+curThreadFpUnaryTerm op v = intern $ UFPUnaryTerm op v+{-# INLINE curThreadFpUnaryTerm #-}++-- | Construct and internalizing a 'FPBinaryTerm'.+curThreadFpBinaryTerm ::+ (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) =>+ FPBinaryOp ->+ Term (fp eb sb) ->+ Term (fp eb sb) ->+ IO (Term (fp eb sb))+curThreadFpBinaryTerm op l r = intern $ UFPBinaryTerm op l r+{-# INLINE curThreadFpBinaryTerm #-}++-- | Construct and internalizing a 'FPRoundingUnaryTerm'.+curThreadFpRoundingUnaryTerm ::+ (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) =>+ FPRoundingUnaryOp ->+ Term FPRoundingMode ->+ Term (fp eb sb) ->+ IO (Term (fp eb sb))+curThreadFpRoundingUnaryTerm op mode v = intern $ UFPRoundingUnaryTerm op mode v+{-# INLINE curThreadFpRoundingUnaryTerm #-}++-- | Construct and internalizing a 'FPRoundingBinaryTerm'.+curThreadFpRoundingBinaryTerm ::+ (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) =>+ FPRoundingBinaryOp ->+ Term FPRoundingMode ->+ Term (fp eb sb) ->+ Term (fp eb sb) ->+ IO (Term (fp eb sb))+curThreadFpRoundingBinaryTerm op mode l r =+ intern $ UFPRoundingBinaryTerm op mode l r+{-# INLINE curThreadFpRoundingBinaryTerm #-}++-- | Construct and internalizing a 'FPFMATerm'.+curThreadFpFMATerm ::+ (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) =>+ Term FPRoundingMode ->+ Term (fp eb sb) ->+ Term (fp eb sb) ->+ Term (fp eb sb) ->+ IO (Term (fp eb sb))+curThreadFpFMATerm mode l r s = intern $ UFPFMATerm mode l r s+{-# INLINE curThreadFpFMATerm #-}++-- | Construct and internalizing a 'FromIntegralTerm'.+curThreadFromIntegralTerm ::+ forall a b.+ (PEvalFromIntegralTerm a b, SupportedPrim b) =>+ Term a ->+ IO (Term b)+curThreadFromIntegralTerm = intern . UFromIntegralTerm+{-# INLINE curThreadFromIntegralTerm #-}++-- | Construct and internalizing a 'FromFPOrTerm'.+curThreadFromFPOrTerm ::+ forall a eb sb.+ ( PEvalIEEEFPConvertibleTerm a,+ ValidFP eb sb+ ) =>+ Term a ->+ Term FPRoundingMode ->+ Term (FP eb sb) ->+ IO (Term a)+curThreadFromFPOrTerm d@SupportedTerm r f = intern $ UFromFPOrTerm d r f+{-# INLINE curThreadFromFPOrTerm #-}++-- | Construct and internalizing a 'ToFPTerm'.+curThreadToFPTerm ::+ forall a eb sb.+ ( PEvalIEEEFPConvertibleTerm a,+ ValidFP eb sb,+ SupportedPrim (FP eb sb)+ ) =>+ Term FPRoundingMode ->+ Term a ->+ IO (Term (FP eb sb))+curThreadToFPTerm r f = intern $ UToFPTerm r f (Proxy @eb) (Proxy @sb)+{-# INLINE curThreadToFPTerm #-}++inCurThread1 ::+ forall a b.+ (Term a -> IO (Term b)) ->+ Term a ->+ IO (Term b)+inCurThread1 f t = do+ tid <- myWeakThreadId+ toCurThreadImpl tid t >>= f+{-# INLINE inCurThread1 #-}++inCurThread2 ::+ forall a b c.+ (Term a -> Term b -> IO (Term c)) ->+ Term a ->+ Term b ->+ IO (Term c)+inCurThread2 f a b = do+ tid <- myWeakThreadId+ ra <- toCurThreadImpl tid a+ rb <- toCurThreadImpl tid b+ f ra rb+{-# INLINE inCurThread2 #-}++inCurThread3 ::+ forall a b c d.+ (Term a -> Term b -> Term c -> IO (Term d)) ->+ Term a ->+ Term b ->+ Term c ->+ IO (Term d)+inCurThread3 f a b c = do+ tid <- myWeakThreadId+ ra <- toCurThreadImpl tid a+ rb <- toCurThreadImpl tid b+ rc <- toCurThreadImpl tid c+ f ra rb rc+{-# INLINE inCurThread3 #-}++unsafeInCurThread1 ::+ forall a b.+ (Term a -> IO (Term b)) ->+ Term a ->+ Term b+unsafeInCurThread1 f = unsafePerformIO . inCurThread1 f+{-# NOINLINE unsafeInCurThread1 #-}++unsafeInCurThread2 ::+ forall a b c.+ (Term a -> Term b -> IO (Term c)) ->+ Term a ->+ Term b ->+ Term c+unsafeInCurThread2 f a b = unsafePerformIO $ inCurThread2 f a b+{-# NOINLINE unsafeInCurThread2 #-}++unsafeInCurThread3 ::+ forall a b c d.+ (Term a -> Term b -> Term c -> IO (Term d)) ->+ Term a ->+ Term b ->+ Term c ->+ Term d+unsafeInCurThread3 f a b c = unsafePerformIO $ inCurThread3 f a b c+{-# NOINLINE unsafeInCurThread3 #-}++-- | Construct and internalizing a 'ConTerm'.+conTerm :: (SupportedPrim t) => t -> Term t+conTerm = unsafePerformIO . curThreadConTerm+{-# NOINLINE conTerm #-}++-- | Construct and internalizing a 'SymTerm'.+symTerm :: TypedSymbol knd t -> Term t+symTerm = unsafePerformIO . curThreadSymTerm+{-# NOINLINE symTerm #-}++-- | Construct and internalizing a 'ForallTerm'.+forallTerm ::+ TypedSymbol 'ConstantKind t ->+ Term Bool ->+ Term Bool+forallTerm sym@TypedSymbol {} = unsafeInCurThread1 (curThreadForallTerm sym)+{-# NOINLINE forallTerm #-}++-- | Construct and internalizing a 'ExistsTerm'.+existsTerm ::+ TypedSymbol 'ConstantKind t ->+ Term Bool ->+ Term Bool+existsTerm sym@TypedSymbol {} = unsafeInCurThread1 (curThreadExistsTerm sym)+{-# NOINLINE existsTerm #-}++-- | Construct and internalizing a 'SymTerm' with an identifier, using simple+-- symbols.+ssymTerm :: (SupportedPrim t) => Identifier -> Term t+ssymTerm = unsafePerformIO . curThreadSsymTerm+{-# NOINLINE ssymTerm #-}++-- | Construct and internalizing a 'SymTerm' with an identifier and an index,+-- using indexed symbols.+isymTerm :: (SupportedPrim t) => Identifier -> Int -> Term t+isymTerm ident index = unsafePerformIO $ curThreadIsymTerm ident index+{-# NOINLINE isymTerm #-}++-- | Construct and internalizing a 'NotTerm'.+notTerm :: Term Bool -> Term Bool+notTerm = unsafeInCurThread1 curThreadNotTerm+{-# NOINLINE notTerm #-}++inCurThread2Set ::+ forall a c.+ (Term a -> Term a -> HS.HashSet (Term a) -> IO (Term c)) ->+ Term a ->+ Term a ->+ HS.HashSet (Term a) ->+ IO (Term c)+inCurThread2Set f a b s = do+ tid <- myWeakThreadId+ ra@SupportedTerm <- toCurThreadImpl tid a+ rb <- toCurThreadImpl tid b+ rs <- traverse (toCurThreadImpl tid) (HS.toList s)+ f ra rb (HS.fromList rs)+{-# INLINE inCurThread2Set #-}++unsafeInCurThread2Set ::+ forall a c.+ (Term a -> Term a -> HS.HashSet (Term a) -> IO (Term c)) ->+ Term a ->+ Term a ->+ HS.HashSet (Term a) ->+ Term c+unsafeInCurThread2Set f a b s = unsafePerformIO $ inCurThread2Set f a b s+{-# NOINLINE unsafeInCurThread2Set #-}++-- | Construct and internalizing a 'OrTerm'.+orTerm :: Term Bool -> Term Bool -> Term Bool+orTerm l@(OrTermAll _ _ s1) r@(OrTermAll _ _ s2) =+ unsafeInCurThread2Set+ curThreadOrTerm+ l+ r+ ( if HS.size s1 + HS.size s2 > 30+ then HS.fromList [l, r]+ else HS.insert l $ HS.insert r $ HS.union s1 s2+ )+orTerm l@(OrTermAll _ _ s1) r =+ unsafeInCurThread2Set+ curThreadOrTerm+ l+ r+ ( if HS.size s1 > 30+ then HS.fromList [l, r]+ else HS.insert r $ HS.insert l s1+ )+orTerm l r@(OrTermAll _ _ s2) =+ unsafeInCurThread2Set+ curThreadOrTerm+ l+ r+ ( if HS.size s2 > 30+ then HS.fromList [l, r]+ else HS.insert l $ HS.insert r s2+ )+orTerm l r = unsafeInCurThread2Set curThreadOrTerm l r (HS.fromList [l, r])+{-# NOINLINE orTerm #-}++-- | Construct and internalizing a 'AndTerm'.+andTerm :: Term Bool -> Term Bool -> Term Bool+andTerm l@(AndTermAll _ _ s1) r@(AndTermAll _ _ s2) =+ unsafeInCurThread2Set+ curThreadAndTerm+ l+ r+ ( if HS.size s1 + HS.size s2 > 30+ then HS.fromList [l, r]+ else HS.insert l $ HS.insert r $ HS.union s1 s2+ )+andTerm l@(AndTermAll _ _ s1) r =+ unsafeInCurThread2Set+ curThreadAndTerm+ l+ r+ ( if HS.size s1 > 30+ then HS.fromList [l, r]+ else HS.insert r $ HS.insert l s1+ )+andTerm l r@(AndTermAll _ _ s2) =+ unsafeInCurThread2Set+ curThreadAndTerm+ l+ r+ ( if HS.size s2 > 30+ then HS.fromList [l, r]+ else HS.insert l $ HS.insert r s2+ )+andTerm l r = unsafeInCurThread2Set curThreadAndTerm l r (HS.fromList [l, r])+{-# NOINLINE andTerm #-}++-- | Construct and internalizing a 'EqTerm'.+eqTerm :: Term a -> Term a -> Term Bool+eqTerm = unsafeInCurThread2 curThreadEqTerm+{-# NOINLINE eqTerm #-}++-- | Construct and internalizing a 'DistinctTerm'.+distinctTerm :: NonEmpty (Term a) -> Term Bool+distinctTerm args =+ unsafePerformIO $ do+ tid <- myWeakThreadId+ traverse (toCurThreadImpl tid) args >>= curThreadDistinctTerm+{-# NOINLINE distinctTerm #-}++-- | Construct and internalizing a 'ITETerm'.+iteTerm :: Term Bool -> Term a -> Term a -> Term a+iteTerm = unsafeInCurThread3 curThreadIteTerm+{-# NOINLINE iteTerm #-}++-- | Construct and internalizing a 'AddNumTerm'.+addNumTerm :: (PEvalNumTerm a) => Term a -> Term a -> Term a+addNumTerm = unsafeInCurThread2 curThreadAddNumTerm+{-# NOINLINE addNumTerm #-}++-- | Construct and internalizing a 'NegNumTerm'.+negNumTerm :: (PEvalNumTerm a) => Term a -> Term a+negNumTerm = unsafeInCurThread1 curThreadNegNumTerm+{-# NOINLINE negNumTerm #-}++-- | Construct and internalizing a 'MulNumTerm'.+mulNumTerm :: (PEvalNumTerm a) => Term a -> Term a -> Term a+mulNumTerm = unsafeInCurThread2 curThreadMulNumTerm+{-# NOINLINE mulNumTerm #-}++-- | Construct and internalizing a 'AbsNumTerm'.+absNumTerm :: (PEvalNumTerm a) => Term a -> Term a+absNumTerm = unsafeInCurThread1 curThreadAbsNumTerm+{-# NOINLINE absNumTerm #-}++-- | Construct and internalizing a 'SignumNumTerm'.+signumNumTerm :: (PEvalNumTerm a) => Term a -> Term a+signumNumTerm = unsafeInCurThread1 curThreadSignumNumTerm+{-# NOINLINE signumNumTerm #-}++-- | Construct and internalizing a 'LtOrdTerm'.+ltOrdTerm :: (PEvalOrdTerm a) => Term a -> Term a -> Term Bool+ltOrdTerm = unsafeInCurThread2 curThreadLtOrdTerm+{-# NOINLINE ltOrdTerm #-}++-- | Construct and internalizing a 'LeOrdTerm'.+leOrdTerm :: (PEvalOrdTerm a) => Term a -> Term a -> Term Bool+leOrdTerm = unsafeInCurThread2 curThreadLeOrdTerm+{-# NOINLINE leOrdTerm #-}++-- | Construct and internalizing a 'AndBitsTerm'.+andBitsTerm :: (PEvalBitwiseTerm a) => Term a -> Term a -> Term a+andBitsTerm a b =+ unsafeInCurThread2 curThreadAndBitsTerm a b+{-# NOINLINE andBitsTerm #-}++-- | Construct and internalizing a 'OrBitsTerm'.+orBitsTerm :: (PEvalBitwiseTerm a) => Term a -> Term a -> Term a+orBitsTerm = unsafeInCurThread2 curThreadOrBitsTerm+{-# NOINLINE orBitsTerm #-}++-- | Construct and internalizing a 'XorBitsTerm'.+xorBitsTerm :: (PEvalBitwiseTerm a) => Term a -> Term a -> Term a+xorBitsTerm = unsafeInCurThread2 curThreadXorBitsTerm+{-# NOINLINE xorBitsTerm #-}++-- | Construct and internalizing a 'ComplementBitsTerm'.+complementBitsTerm :: (PEvalBitwiseTerm a) => Term a -> Term a+complementBitsTerm = unsafeInCurThread1 curThreadComplementBitsTerm+{-# NOINLINE complementBitsTerm #-}++-- | Construct and internalizing a 'ShiftLeftTerm'.+shiftLeftTerm :: (PEvalShiftTerm a) => Term a -> Term a -> Term a+shiftLeftTerm = unsafeInCurThread2 curThreadShiftLeftTerm+{-# NOINLINE shiftLeftTerm #-}++-- | Construct and internalizing a 'ShiftRightTerm'.+shiftRightTerm :: (PEvalShiftTerm a) => Term a -> Term a -> Term a+shiftRightTerm = unsafeInCurThread2 curThreadShiftRightTerm+{-# NOINLINE shiftRightTerm #-}++-- | Construct and internalizing a 'RotateLeftTerm'.+rotateLeftTerm :: (PEvalRotateTerm a) => Term a -> Term a -> Term a+rotateLeftTerm = unsafeInCurThread2 curThreadRotateLeftTerm+{-# NOINLINE rotateLeftTerm #-}++-- | Construct and internalizing a 'RotateRightTerm'.+rotateRightTerm :: (PEvalRotateTerm a) => Term a -> Term a -> Term a+rotateRightTerm = unsafeInCurThread2 curThreadRotateRightTerm+{-# NOINLINE rotateRightTerm #-}++-- | Construct and internalizing a 'BitCastTerm'.+bitCastTerm ::+ (PEvalBitCastTerm a b, SupportedPrim b) =>+ Term a ->+ Term b+bitCastTerm = unsafeInCurThread1 curThreadBitCastTerm+{-# NOINLINE bitCastTerm #-}++-- | Construct and internalizing a 'BitCastOrTerm'.+bitCastOrTerm ::+ (PEvalBitCastOrTerm a b) =>+ Term b ->+ Term a ->+ Term b+bitCastOrTerm = unsafeInCurThread2 curThreadBitCastOrTerm+{-# NOINLINE bitCastOrTerm #-}++-- | Construct and internalizing a 'BVConcatTerm'.+bvConcatTerm ::+ forall bv l r.+ ( PEvalBVTerm bv,+ KnownNat l,+ KnownNat r,+ KnownNat (l + r),+ 1 <= l,+ 1 <= r,+ 1 <= l + r,+ SupportedPrim (bv (l + r))+ ) =>+ Term (bv l) ->+ Term (bv r) ->+ Term (bv (l + r))+bvConcatTerm = unsafeInCurThread2 curThreadBVConcatTerm+{-# NOINLINE bvConcatTerm #-}++-- | Construct and internalizing a 'BVSelectTerm'.+bvSelectTerm ::+ forall bv n ix w p q.+ ( PEvalBVTerm bv,+ KnownNat n,+ KnownNat ix,+ KnownNat w,+ 1 <= n,+ 1 <= w,+ ix + w <= n,+ SupportedPrim (bv w)+ ) =>+ p ix ->+ q w ->+ Term (bv n) ->+ Term (bv w)+bvSelectTerm ix w = unsafeInCurThread1 (curThreadBVSelectTerm ix w)+{-# NOINLINE bvSelectTerm #-}++-- | Construct and internalizing a 'BVExtendTerm'.+bvExtendTerm ::+ forall bv l r proxy.+ ( PEvalBVTerm bv,+ KnownNat l,+ KnownNat r,+ 1 <= l,+ 1 <= r,+ l <= r,+ SupportedPrim (bv r)+ ) =>+ Bool ->+ proxy r ->+ Term (bv l) ->+ Term (bv r)+bvExtendTerm signed r = unsafeInCurThread1 (curThreadBVExtendTerm signed r)+{-# NOINLINE bvExtendTerm #-}++-- | Construct and internalizing a 'BVExtendTerm' with sign extension.+bvsignExtendTerm ::+ forall bv l r proxy.+ ( PEvalBVTerm bv,+ KnownNat l,+ KnownNat r,+ 1 <= l,+ 1 <= r,+ l <= r,+ SupportedPrim (bv r)+ ) =>+ proxy r ->+ Term (bv l) ->+ Term (bv r)+bvsignExtendTerm r = unsafeInCurThread1 (curThreadBvsignExtendTerm r)+{-# NOINLINE bvsignExtendTerm #-}++-- | Construct and internalizing a 'BVExtendTerm' with zero extension.+bvzeroExtendTerm ::+ forall bv l r proxy.+ ( PEvalBVTerm bv,+ KnownNat l,+ KnownNat r,+ 1 <= l,+ 1 <= r,+ l <= r,+ SupportedPrim (bv r)+ ) =>+ proxy r ->+ Term (bv l) ->+ Term (bv r)+bvzeroExtendTerm r = unsafeInCurThread1 (curThreadBvzeroExtendTerm r)+{-# NOINLINE bvzeroExtendTerm #-}++-- | Construct and internalizing a 'ApplyTerm'.+applyTerm ::+ (PEvalApplyTerm f a b, SupportedPrim b) => Term f -> Term a -> Term b+applyTerm = unsafeInCurThread2 curThreadApplyTerm+{-# NOINLINE applyTerm #-}++-- | Construct and internalizing a 'DivIntegralTerm'.+divIntegralTerm :: (PEvalDivModIntegralTerm a) => Term a -> Term a -> Term a+divIntegralTerm = unsafeInCurThread2 curThreadDivIntegralTerm+{-# NOINLINE divIntegralTerm #-}++-- | Construct and internalizing a 'ModIntegralTerm'.+modIntegralTerm :: (PEvalDivModIntegralTerm a) => Term a -> Term a -> Term a+modIntegralTerm = unsafeInCurThread2 curThreadModIntegralTerm+{-# NOINLINE modIntegralTerm #-}++-- | Construct and internalizing a 'QuotIntegralTerm'.+quotIntegralTerm :: (PEvalDivModIntegralTerm a) => Term a -> Term a -> Term a+quotIntegralTerm = unsafeInCurThread2 curThreadQuotIntegralTerm+{-# NOINLINE quotIntegralTerm #-}++-- | Construct and internalizing a 'RemIntegralTerm'.+remIntegralTerm :: (PEvalDivModIntegralTerm a) => Term a -> Term a -> Term a+remIntegralTerm = unsafeInCurThread2 curThreadRemIntegralTerm+{-# NOINLINE remIntegralTerm #-}++-- | Construct and internalizing a 'FPTraitTerm'.+fpTraitTerm ::+ (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) =>+ FPTrait ->+ Term (fp eb sb) ->+ Term Bool+fpTraitTerm trait = unsafeInCurThread1 (curThreadFpTraitTerm trait)+{-# NOINLINE fpTraitTerm #-}++-- | Construct and internalizing a 'FdivTerm'.+fdivTerm :: (PEvalFractionalTerm a) => Term a -> Term a -> Term a+fdivTerm = unsafeInCurThread2 curThreadFdivTerm+{-# NOINLINE fdivTerm #-}++-- | Construct and internalizing a 'RecipTerm'.+recipTerm :: (PEvalFractionalTerm a) => Term a -> Term a+recipTerm = unsafeInCurThread1 curThreadRecipTerm+{-# NOINLINE recipTerm #-}++-- | Construct and internalizing a 'FloatingUnaryTerm'.+floatingUnaryTerm :: (PEvalFloatingTerm a) => FloatingUnaryOp -> Term a -> Term a+floatingUnaryTerm op = unsafeInCurThread1 (curThreadFloatingUnaryTerm op)+{-# NOINLINE floatingUnaryTerm #-}++-- | Construct and internalizing a 'PowerTerm'.+powerTerm :: (PEvalFloatingTerm a) => Term a -> Term a -> Term a+powerTerm = unsafeInCurThread2 curThreadPowerTerm+{-# NOINLINE powerTerm #-}++-- | Construct and internalizing a 'FPUnaryTerm'.+fpUnaryTerm ::+ (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) =>+ FPUnaryOp ->+ Term (fp eb sb) ->+ Term (fp eb sb)+fpUnaryTerm op = unsafeInCurThread1 (curThreadFpUnaryTerm op)+{-# NOINLINE fpUnaryTerm #-}++-- | Construct and internalizing a 'FPBinaryTerm'.+fpBinaryTerm ::+ (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) =>+ FPBinaryOp ->+ Term (fp eb sb) ->+ Term (fp eb sb) ->+ Term (fp eb sb)+fpBinaryTerm op = unsafeInCurThread2 (curThreadFpBinaryTerm op)+{-# NOINLINE fpBinaryTerm #-}++-- | Construct and internalizing a 'FPRoundingUnaryTerm'.+fpRoundingUnaryTerm ::+ (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) =>+ FPRoundingUnaryOp ->+ Term FPRoundingMode ->+ Term (fp eb sb) ->+ Term (fp eb sb)+fpRoundingUnaryTerm op = unsafeInCurThread2 (curThreadFpRoundingUnaryTerm op)+{-# NOINLINE fpRoundingUnaryTerm #-}++-- | Construct and internalizing a 'FPRoundingBinaryTerm'.+fpRoundingBinaryTerm ::+ (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) =>+ FPRoundingBinaryOp ->+ Term FPRoundingMode ->+ Term (fp eb sb) ->+ Term (fp eb sb) ->+ Term (fp eb sb)+fpRoundingBinaryTerm op = unsafeInCurThread3 (curThreadFpRoundingBinaryTerm op)+{-# NOINLINE fpRoundingBinaryTerm #-}++-- | Construct and internalizing a 'FPFMATerm'.+fpFMATerm ::+ (ValidFP eb sb, SupportedPrim (fp eb sb), PEvalFPTerm fp) =>+ Term FPRoundingMode ->+ Term (fp eb sb) ->+ Term (fp eb sb) ->+ Term (fp eb sb) ->+ Term (fp eb sb)+fpFMATerm mode a b c = unsafePerformIO $ do+ tid <- myWeakThreadId+ mode' <- toCurThreadImpl tid mode+ a' <- toCurThreadImpl tid a+ b' <- toCurThreadImpl tid b+ c' <- toCurThreadImpl tid c+ curThreadFpFMATerm mode' a' b' c'+{-# NOINLINE fpFMATerm #-}++-- | Construct and internalizing a 'FromIntegralTerm'.+fromIntegralTerm ::+ (PEvalFromIntegralTerm a b, SupportedPrim b) => Term a -> Term b+fromIntegralTerm = unsafeInCurThread1 curThreadFromIntegralTerm+{-# NOINLINE fromIntegralTerm #-}++-- | Construct and internalizing a 'FromFPOrTerm'.+fromFPOrTerm ::+ ( PEvalIEEEFPConvertibleTerm a,+ ValidFP eb sb+ ) =>+ Term a ->+ Term FPRoundingMode ->+ Term (FP eb sb) ->+ Term a+fromFPOrTerm = unsafeInCurThread3 curThreadFromFPOrTerm+{-# NOINLINE fromFPOrTerm #-}++-- | Construct and internalizing a 'ToFPTerm'.+toFPTerm ::+ forall a eb sb.+ ( PEvalIEEEFPConvertibleTerm a,+ ValidFP eb sb,+ SupportedPrim (FP eb sb)+ ) =>+ Term FPRoundingMode ->+ Term a ->+ Term (FP eb sb)+toFPTerm = unsafeInCurThread2 curThreadToFPTerm+{-# NOINLINE toFPTerm #-}++-- Support for boolean type+defaultValueForBool :: Bool+defaultValueForBool = False++-- | Construct and internalizing 'True' term.+trueTerm :: Term Bool+trueTerm = conTerm True+{-# NOINLINE trueTerm #-}++-- | Construct and internalizing 'False' term.+falseTerm :: Term Bool+falseTerm = conTerm False+{-# NOINLINE falseTerm #-}++boolConTermView :: forall a. Term a -> Maybe Bool+boolConTermView (ConTerm b) = cast b+boolConTermView _ = Nothing+{-# INLINE boolConTermView #-}++-- | Pattern matcher for concrete 'Bool' terms.+pattern BoolConTerm :: Bool -> Term a+pattern BoolConTerm b <- (boolConTermView -> Just b)++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE BoolConTerm #-}+#endif++-- | Pattern matcher for 'True' term.+pattern TrueTerm :: Term a+pattern TrueTerm <- BoolConTerm True++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE TrueTerm #-}+#endif++-- | Pattern matcher for 'False' term.+pattern FalseTerm :: Term a+pattern FalseTerm <- BoolConTerm False++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE FalseTerm #-}+#endif++boolTermView :: forall a. Term a -> Maybe (Term Bool)+boolTermView t@SupportedTerm = cast t+{-# INLINE boolTermView #-}++-- | Pattern matcher for 'Bool' terms.+pattern BoolTerm :: Term Bool -> Term a+pattern BoolTerm b <- (boolTermView -> Just b)++#if MIN_VERSION_base(4, 16, 4)+{-# INLINE BoolTerm #-}+#endif++-- | Partial evaluation for not terms.+pevalNotTerm :: Term Bool -> Term Bool+pevalNotTerm (NotTerm tm) = tm+pevalNotTerm (ConTerm a) = if a then falseTerm else trueTerm+pevalNotTerm (OrTerm (NotTerm n1) n2) = pevalAndTerm n1 (pevalNotTerm n2)+pevalNotTerm (OrTerm (DistinctTerm (n1 :| [n2])) n3) =+ pevalAndTerm (pevalEqTerm n1 n2) (pevalNotTerm n3)+pevalNotTerm (OrTerm n1 (NotTerm n2)) = pevalAndTerm (pevalNotTerm n1) n2+pevalNotTerm (OrTerm n1 (DistinctTerm (n2 :| [n3]))) =+ pevalAndTerm (pevalNotTerm n1) (pevalEqTerm n2 n3)+pevalNotTerm (AndTerm (NotTerm n1) n2) = pevalOrTerm n1 (pevalNotTerm n2)+pevalNotTerm (AndTerm (DistinctTerm (n1 :| [n2])) n3) =+ pevalOrTerm (pevalEqTerm n1 n2) (pevalNotTerm n3)+pevalNotTerm (AndTerm n1 (NotTerm n2)) = pevalOrTerm (pevalNotTerm n1) n2+pevalNotTerm (AndTerm n1 (DistinctTerm (n2 :| [n3]))) =+ pevalOrTerm (pevalNotTerm n1) (pevalEqTerm n2 n3)+pevalNotTerm+ (EqTerm a (DynTerm (ConTerm b :: Term (WordN 1))))+ | b == 0 = eqTerm (unsafeCoerce a) (conTerm 1 :: Term (WordN 1))+ | b == 1 = eqTerm (unsafeCoerce a) (conTerm 0 :: Term (WordN 1))+pevalNotTerm+ (EqTerm a (DynTerm (ConTerm b :: Term (IntN 1))))+ | b == 0 = eqTerm (unsafeCoerce a) (conTerm 1 :: Term (IntN 1))+ | b == 1 = eqTerm (unsafeCoerce a) (conTerm 0 :: Term (IntN 1))+-- pevalNotTerm (EqTerm a b) = distinctTerm $ a :| [b]+pevalNotTerm (DistinctTerm (a :| [b])) = eqTerm a b+pevalNotTerm tm = notTerm tm+{-# INLINEABLE pevalNotTerm #-}++orEqFirst' :: Term Bool -> Term Bool -> Bool+orEqFirst'+ (DistinctTerm ((e1 :: Term a) :| [ec1@ConTerm {} :: Term b]))+ (EqTerm (DynTerm (e2 :: Term a)) (DynTerm (ec2@ConTerm {} :: Term b)))+ | e1 == e2 && ec1 /= ec2 = True+orEqFirst'+ (NotTerm (EqTerm (e1 :: Term a) (ec1@ConTerm {} :: Term b)))+ (EqTerm (DynTerm (e2 :: Term a)) (DynTerm (ec2@ConTerm {} :: Term b)))+ | e1 == e2 && ec1 /= ec2 = True+orEqFirst' _ _ = False+{-# INLINE orEqFirst' #-}++orEqFirst :: Term Bool -> Term Bool -> Bool+orEqFirst _ (ConTerm False) = True+orEqFirst x y+ | x == y = True+ | otherwise = orEqFirst' x y+{-# INLINE orEqFirst #-}++orEqTrue' :: Term Bool -> Term Bool -> Bool+orEqTrue'+ (DistinctTerm ((e1 :: Term a) :| [ec1@ConTerm {} :: Term b]))+ (DistinctTerm ((DynTerm (e2 :: Term a)) :| [DynTerm (ec2@ConTerm {} :: Term b)]))+ | e1 == e2 && ec1 /= ec2 = True+orEqTrue'+ (NotTerm (EqTerm (e1 :: Term a) (ec1@ConTerm {} :: Term b)))+ (NotTerm (EqTerm (DynTerm (e2 :: Term a)) (DynTerm (ec2@ConTerm {} :: Term b))))+ | e1 == e2 && ec1 /= ec2 = True+orEqTrue' _ _ = False+{-# INLINE orEqTrue' #-}++orEqTrue :: Term Bool -> Term Bool -> Bool+orEqTrue (ConTerm True) ~_ = True+orEqTrue _ (ConTerm True) = True+orEqTrue (NotTerm l) r | l == r = True+orEqTrue l (NotTerm r) | l == r = True+orEqTrue l r = orEqTrue' l r+{-# INLINE orEqTrue #-}++-- | Partial evaluation for or terms.+pevalOrTerm :: Term Bool -> Term Bool -> Term Bool+pevalOrTerm (ConTerm True) ~_ = trueTerm+pevalOrTerm _ (ConTerm True) = trueTerm+pevalOrTerm (ConTerm False) y = y+pevalOrTerm x (ConTerm False) = x+pevalOrTerm (NotTerm x) y | x == y = trueTerm+pevalOrTerm x (NotTerm y) | x == y = trueTerm+pevalOrTerm x y | x == y = x+pevalOrTerm l ~r+ | orEqTrue' l r = trueTerm+ | orEqFirst' l r = l+ | orEqFirst' r l = r+pevalOrTerm l r@(OrTermAll r1 r2 s)+ | HS.member l s = r+ | HS.member (simpleNot l) s = trueTerm+ | orEqTrue' l r1 = trueTerm+ | orEqTrue' l r2 = trueTerm+ | orEqFirst' r1 l = r+ | orEqFirst' r2 l = r+ | orEqFirst' l r1 = pevalOrTerm l r2+ | orEqFirst' l r2 = pevalOrTerm l r1+pevalOrTerm l@(OrTermAll l1 l2 s) r+ | HS.member r s = l+ | HS.member (simpleNot r) s = trueTerm+ | orEqTrue' l1 r = trueTerm+ | orEqTrue' l2 r = trueTerm+ | orEqFirst' l1 r = l+ | orEqFirst' l2 r = l+ | orEqFirst' r l1 = pevalOrTerm l2 r+ | orEqFirst' r l2 = pevalOrTerm l1 r+pevalOrTerm (AndTerm l1 l2) (AndTerm r1 r2)+ | l1 == r1 = pevalAndTerm l1 (pevalOrTerm l2 r2)+ | l1 == r2 = pevalAndTerm l1 (pevalOrTerm l2 r1)+ | l2 == r1 = pevalAndTerm l2 (pevalOrTerm l1 r2)+ | l2 == r2 = pevalAndTerm l2 (pevalOrTerm l1 r1)+pevalOrTerm l (AndTermAll r1 r2 s)+ | HS.member l s = l+ | orEqFirst l r1 = l+ | orEqFirst l r2 = l+ | orEqTrue l r1 = pevalOrTerm l r2+ | orEqTrue l r2 = pevalOrTerm l r1+pevalOrTerm (AndTermAll l1 l2 s) r+ | HS.member r s = r+ | orEqFirst r l1 = r+ | orEqFirst r l2 = r+ | orEqTrue l1 r = pevalOrTerm l2 r+ | orEqTrue l2 r = pevalOrTerm l1 r+pevalOrTerm+ (AndTerm nl1@(NotTerm l1) l2)+ (EqTerm (DynTerm (e1 :: Term Bool)) (DynTerm (e2 :: Term Bool)))+ | l1 == e1 && l2 == e2 = pevalOrTerm nl1 l2+pevalOrTerm (NotTerm nl) (NotTerm nr) =+ pevalNotTerm $ pevalAndTerm nl nr+pevalOrTerm (AndTermAll _ _ sa) r@(OrTermAll _ _ so)+ | sa `HS.intersection` so /= HS.empty = r+pevalOrTerm l@(OrTermAll _ _ so) (AndTermAll _ _ sa)+ | sa `HS.intersection` so /= HS.empty = l+pevalOrTerm+ (EqTerm a (BVTerm bt@(ConTerm (b :: bv n))))+ (EqTerm c (DynTerm (BVTerm (ConTerm d) :: Term (bv n))))+ | natVal (Proxy @n) == 1 && b == -1 && d == -1 =+ pevalEqTerm+ ( pevalOrBitsTerm+ (unsafeCoerce a :: Term (bv n))+ (unsafeCoerce c :: Term (bv n))+ )+ bt+pevalOrTerm+ (EqTerm a (BVTerm bt@(ConTerm (b :: bv n))))+ (EqTerm c (DynTerm (BVTerm (ConTerm d) :: Term (bv n))))+ | natVal (Proxy @n) == 1 && b == 0 && d == 0 =+ pevalEqTerm+ ( pevalAndBitsTerm+ (unsafeCoerce a :: Term (bv n))+ (unsafeCoerce c :: Term (bv n))+ )+ bt+pevalOrTerm l r = orTerm l r+{-# INLINEABLE pevalOrTerm #-}++andEqFalse' :: Term Bool -> Term Bool -> Bool+andEqFalse'+ (EqTerm (e1 :: Term a) (ec1@ConTerm {} :: Term b))+ (EqTerm (DynTerm (e2 :: Term a)) (DynTerm (ec2@ConTerm {} :: Term b)))+ | e1 == e2 && ec1 /= ec2 = True+andEqFalse' _ _ = False+{-# INLINE andEqFalse' #-}++andEqFalse :: Term Bool -> Term Bool -> Bool+andEqFalse (NotTerm x) y | x == y = True+andEqFalse x (NotTerm y) | x == y = True+andEqFalse l r = andEqFalse' l r+{-# INLINE andEqFalse #-}++andEqFirst' :: Term Bool -> Term Bool -> Bool+andEqFirst'+ (EqTerm (e1 :: Term a) (ec1@ConTerm {} :: Term b))+ (DistinctTerm ((DynTerm (e2 :: Term a)) :| [DynTerm (ec2@ConTerm {} :: Term b)]))+ | e1 == e2 && ec1 /= ec2 = True+andEqFirst'+ (EqTerm (e1 :: Term a) (ec1@ConTerm {} :: Term b))+ (NotTerm (EqTerm (DynTerm (e2 :: Term a)) (DynTerm (ec2@ConTerm {} :: Term b))))+ | e1 == e2 && ec1 /= ec2 = True+andEqFirst' _ _ = False+{-# INLINE andEqFirst' #-}++andEqFirst :: Term Bool -> Term Bool -> Bool+andEqFirst _ (ConTerm True) = True+andEqFirst x y+ | x == y = True+ | otherwise = andEqFirst' x y+{-# INLINE andEqFirst #-}++simpleNot :: Term Bool -> Term Bool+simpleNot (NotTerm n) = n+simpleNot n = notTerm n+{-# INLINEABLE simpleNot #-}++-- | Partial evaluation for and terms.+pevalAndTerm :: Term Bool -> Term Bool -> Term Bool+pevalAndTerm (ConTerm False) ~_ = falseTerm+pevalAndTerm _ (ConTerm False) = falseTerm+pevalAndTerm (ConTerm True) y = y+pevalAndTerm x (ConTerm True) = x+pevalAndTerm (NotTerm x) y | x == y = falseTerm+pevalAndTerm x (NotTerm y) | x == y = falseTerm+pevalAndTerm x y | x == y = x+pevalAndTerm l ~r+ | andEqFalse' l r = falseTerm+ | andEqFirst' l r = l+ | andEqFirst' r l = r+pevalAndTerm l r@(AndTermAll r1 r2 s)+ | HS.member l s = r+ | HS.member (simpleNot l) s = falseTerm+ | andEqFalse' l r1 = falseTerm+ | andEqFalse' l r2 = falseTerm+ | andEqFirst' r1 l = r+ | andEqFirst' r2 l = r+ | andEqFirst' l r1 = pevalAndTerm l r2+ | andEqFirst' l r2 = pevalAndTerm l r1+pevalAndTerm l@(AndTermAll l1 l2 s) r+ | HS.member r s = l+ | HS.member (simpleNot r) s = falseTerm+ | andEqFalse' l1 r = falseTerm+ | andEqFalse' l2 r = falseTerm+ | andEqFirst' l1 r = l+ | andEqFirst' l2 r = l+ | andEqFirst' r l1 = pevalAndTerm l2 r+ | andEqFirst' r l2 = pevalAndTerm l1 r+pevalAndTerm (OrTerm l1 l2) (OrTerm r1 r2)+ | l1 == r1 = pevalOrTerm l1 (pevalAndTerm l2 r2)+ | l1 == r2 = pevalOrTerm l1 (pevalAndTerm l2 r1)+ | l2 == r1 = pevalOrTerm l2 (pevalAndTerm l1 r2)+ | l2 == r2 = pevalOrTerm l2 (pevalAndTerm l1 r1)+pevalAndTerm l (OrTermAll r1 r2 s)+ | HS.member l s = l+ | andEqFirst l r1 = l+ | andEqFirst l r2 = l+ | andEqFalse l r1 = pevalAndTerm l r2+ | andEqFalse l r2 = pevalAndTerm l r1+pevalAndTerm (OrTermAll l1 l2 s) r+ | HS.member r s = r+ | andEqFirst r l1 = r+ | andEqFirst r l2 = r+ | andEqFalse l1 r = pevalAndTerm l2 r+ | andEqFalse l2 r = pevalAndTerm l1 r+pevalAndTerm+ (OrTerm l1 nl2@(NotTerm l2))+ (NotTerm (EqTerm (DynTerm (e1 :: Term Bool)) (DynTerm (e2 :: Term Bool))))+ | l1 == e1 && l2 == e2 = pevalAndTerm l1 nl2+pevalAndTerm (NotTerm nl) (NotTerm nr) = pevalNotTerm $ pevalOrTerm nl nr+pevalAndTerm (OrTermAll _ _ so) r@(AndTermAll _ _ sa)+ | sa `HS.intersection` so /= HS.empty = r+pevalAndTerm l@(AndTermAll _ _ sa) (OrTermAll _ _ so)+ | sa `HS.intersection` so /= HS.empty = l+pevalAndTerm+ (EqTerm a (BVTerm bt@(ConTerm (b :: bv n))))+ (EqTerm c (DynTerm (BVTerm (ConTerm d) :: Term (bv n))))+ | natVal (Proxy @n) == 1 && b == 0 && d == 0 =+ pevalEqTerm+ ( pevalOrBitsTerm+ (unsafeCoerce a :: Term (bv n))+ (unsafeCoerce c :: Term (bv n))+ )+ bt+pevalAndTerm+ (EqTerm a (BVTerm bt@(ConTerm (b :: bv n))))+ (EqTerm c (DynTerm (BVTerm (ConTerm d) :: Term (bv n))))+ | natVal (Proxy @n) == 1 && b == -1 && d == -1 =+ pevalEqTerm+ ( pevalAndBitsTerm+ (unsafeCoerce a :: Term (bv n))+ (unsafeCoerce c :: Term (bv n))+ )+ bt+pevalAndTerm l r = andTerm l r+{-# INLINEABLE pevalAndTerm #-}++data BVTermView where+ BVTermView ::+ forall bv n.+ ( KnownNat n,+ 1 <= n,+ PEvalBitwiseTerm (bv n),+ Eq (bv n),+ Num (bv n)+ ) =>+ Term (bv n) -> BVTermView++bvTermViewPattern ::+ forall a.+ (SupportedPrim a) =>+ Term a ->+ Maybe BVTermView+bvTermViewPattern b = case R.typeRep @a of+ R.App i _ -> case ( R.eqTypeRep i (R.typeRep @IntN),+ R.eqTypeRep i (R.typeRep @WordN)+ ) of+ (Just R.HRefl, _) -> withPrim @a $ Just (BVTermView b)+ (_, Just R.HRefl) -> withPrim @a $ Just (BVTermView b)+ _ -> Nothing+ _ -> Nothing++pattern BVTerm ::+ forall a.+ (SupportedPrim a) =>+ forall bv n.+ (KnownNat n, 1 <= n, PEvalBitwiseTerm (bv n), Eq (bv n), Num (bv n)) =>+ Term (bv n) -> Term a+pattern BVTerm x <- (bvTermViewPattern -> Just (BVTermView x))++-- | Partial evaluation for imply terms.+pevalImplyTerm :: Term Bool -> Term Bool -> Term Bool+pevalImplyTerm l r | termImplies l r = trueTerm+pevalImplyTerm l r = pevalOrTerm (pevalNotTerm l) r++-- | Partial evaluation for xor terms.+pevalXorTerm :: Term Bool -> Term Bool -> Term Bool+pevalXorTerm l r = pevalOrTerm (pevalAndTerm (pevalNotTerm l) r) (pevalAndTerm l (pevalNotTerm r))++termImplies :: Term Bool -> Term Bool -> Bool+termImplies (ConTerm False) _ = True+termImplies _ (ConTerm True) = True+termImplies+ (EqTerm (e1 :: Term a) (ec1@ConTerm {} :: Term b))+ (DistinctTerm ((DynTerm (e2 :: Term a)) :| [(DynTerm (ec2@ConTerm {} :: Term b))]))+ | e1 == e2 && ec1 /= ec2 = True+termImplies+ (EqTerm (e1 :: Term a) (ec1@ConTerm {} :: Term b))+ (NotTerm (EqTerm (DynTerm (e2 :: Term a)) ((DynTerm (ec2@ConTerm {} :: Term b)))))+ | e1 == e2 && ec1 /= ec2 = True+termImplies a (OrTermAll _ _ s) | HS.member a s = True+termImplies (AndTermAll _ _ s) b | HS.member b s = True+termImplies (AndTermAll _ _ s) (OrTermAll _ _ s2) | HS.intersection s s2 /= HS.empty = True+termImplies (AndTermAll _ _ s) (AndTermAll _ _ s2) | s2 `HS.isSubsetOf` s = True+termImplies (OrTermAll _ _ s) (OrTermAll _ _ s2) | s `HS.isSubsetOf` s2 = True+termImplies a b+ | a == b = True+ | otherwise = False+{-# INLINE termImplies #-}++pevalITEBoolLeftNot :: Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)+pevalITEBoolLeftNot cond nIfTrue ifFalse+ -- need test+ | cond == nIfTrue = Just $ pevalAndTerm (pevalNotTerm cond) ifFalse+ | otherwise = case nIfTrue of+ AndTerm nt1 nt2 -> ra+ where+ ra+ | termImplies cond nt1 =+ Just $ pevalITETerm cond (pevalNotTerm nt2) ifFalse+ | termImplies cond nt2 =+ Just $ pevalITETerm cond (pevalNotTerm nt1) ifFalse+ | termImplies cond (pevalNotTerm nt1)+ || termImplies cond (pevalNotTerm nt2) =+ Just $ pevalOrTerm cond ifFalse+ | otherwise = Nothing+ OrTerm nt1 nt2 -> ra+ where+ ra+ | termImplies cond nt1 || termImplies cond nt2 =+ Just $ pevalAndTerm (pevalNotTerm cond) ifFalse+ | termImplies cond (pevalNotTerm nt1) =+ Just $ pevalITETerm cond (pevalNotTerm nt2) ifFalse+ | termImplies cond (pevalNotTerm nt2) =+ Just $ pevalITETerm cond (pevalNotTerm nt1) ifFalse+ | otherwise = Nothing+ _ -> Nothing++pevalITEBoolBothNot :: Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)+pevalITEBoolBothNot cond nIfTrue nIfFalse =+ Just $ pevalNotTerm $ pevalITETerm cond nIfTrue nIfFalse++pevalITEBoolRightNot :: Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)+pevalITEBoolRightNot cond ifTrue nIfFalse+ -- need test+ | cond == nIfFalse = Just $ pevalOrTerm (pevalNotTerm cond) ifTrue+ | otherwise = Nothing -- need work++pevalInferImplies :: Term Bool -> Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)+pevalInferImplies+ (EqTerm (e1 :: Term a) (ec1@ConTerm {} :: Term b))+ (NotTerm (EqTerm (DynTerm (e2 :: Term a)) (DynTerm (ec2@ConTerm {} :: Term b))))+ trueRes+ _+ | e1 == e2 && ec1 /= ec2 = Just trueRes+pevalInferImplies cond (NotTerm nt1) _ falseRes+ | cond == nt1 = Just falseRes+ | otherwise = Nothing+-- \| otherwise = case (cond, nt1) of+-- ( EqTerm _ (e1 :: Term a) (ec1@(ConTerm _ _ _ _) :: Term b),+-- EqTerm _ (Dyn (e2 :: Term a)) (Dyn (ec2@(ConTerm _ _ _ _) :: Term b))+-- )+-- | e1 == e2 && ec1 /= ec2 -> Just trueRes+-- _ -> Nothing+pevalInferImplies+ (EqTerm (e1 :: Term a) (ec1@ConTerm {} :: Term b))+ (DistinctTerm ((DynTerm (e2 :: Term a)) :| [DynTerm (ec2@ConTerm {} :: Term b)]))+ trueRes+ _+ | e1 == e2 && ec1 /= ec2 = Just trueRes+pevalInferImplies+ (EqTerm (e1 :: Term a) (ec1@ConTerm {} :: Term b))+ (EqTerm (DynTerm (e2 :: Term a)) (DynTerm (ec2@ConTerm {} :: Term b)))+ _+ falseRes+ | e1 == e2 && ec1 /= ec2 = Just falseRes+pevalInferImplies _ _ _ _ = Nothing++pevalITEBoolLeftAnd :: Term Bool -> Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)+pevalITEBoolLeftAnd cond t1 t2 ifFalse+ | t1 == ifFalse = Just $ pevalAndTerm t1 $ pevalImplyTerm cond t2+ | t2 == ifFalse = Just $ pevalAndTerm t2 $ pevalImplyTerm cond t1+ | cond == t1 = Just $ pevalITETerm cond t2 ifFalse+ | cond == t2 = Just $ pevalITETerm cond t1 ifFalse+ | otherwise =+ msum+ [ pevalInferImplies cond t1 (pevalITETerm cond t2 ifFalse) (pevalAndTerm (pevalNotTerm cond) ifFalse),+ pevalInferImplies cond t2 (pevalITETerm cond t1 ifFalse) (pevalAndTerm (pevalNotTerm cond) ifFalse)+ ]++pevalITEBoolBothAnd :: Term Bool -> Term Bool -> Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)+pevalITEBoolBothAnd cond t1 t2 f1 f2+ | t1 == f1 = Just $ pevalAndTerm t1 $ pevalITETerm cond t2 f2+ | t1 == f2 = Just $ pevalAndTerm t1 $ pevalITETerm cond t2 f1+ | t2 == f1 = Just $ pevalAndTerm t2 $ pevalITETerm cond t1 f2+ | t2 == f2 = Just $ pevalAndTerm t2 $ pevalITETerm cond t1 f1+ | otherwise = Nothing++pevalITEBoolRightAnd :: Term Bool -> Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)+pevalITEBoolRightAnd cond ifTrue f1 f2+ | f1 == ifTrue = Just $ pevalAndTerm f1 $ pevalOrTerm cond f2+ | f2 == ifTrue = Just $ pevalAndTerm f2 $ pevalOrTerm cond f1+ | otherwise = Nothing++pevalITEBoolLeftOr :: Term Bool -> Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)+pevalITEBoolLeftOr cond t1 t2 ifFalse+ | t1 == ifFalse = Just $ pevalOrTerm t1 $ pevalAndTerm cond t2+ | t2 == ifFalse = Just $ pevalOrTerm t2 $ pevalAndTerm cond t1+ | cond == t1 = Just $ pevalOrTerm cond ifFalse+ | cond == t2 = Just $ pevalOrTerm cond ifFalse+ | otherwise =+ msum+ [ pevalInferImplies cond t1 (pevalOrTerm cond ifFalse) (pevalITETerm cond t2 ifFalse),+ pevalInferImplies cond t2 (pevalOrTerm cond ifFalse) (pevalITETerm cond t1 ifFalse)+ ]++pevalITEBoolBothOr :: Term Bool -> Term Bool -> Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)+pevalITEBoolBothOr cond t1 t2 f1 f2+ | t1 == f1 = Just $ pevalOrTerm t1 $ pevalITETerm cond t2 f2+ | t1 == f2 = Just $ pevalOrTerm t1 $ pevalITETerm cond t2 f1+ | t2 == f1 = Just $ pevalOrTerm t2 $ pevalITETerm cond t1 f2+ | t2 == f2 = Just $ pevalOrTerm t2 $ pevalITETerm cond t1 f1+ | otherwise = Nothing++pevalITEBoolRightOr :: Term Bool -> Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)+pevalITEBoolRightOr cond ifTrue f1 f2+ | f1 == ifTrue = Just $ pevalOrTerm f1 $ pevalAndTerm (pevalNotTerm cond) f2+ | f2 == ifTrue = Just $ pevalOrTerm f2 $ pevalAndTerm (pevalNotTerm cond) f1+ | otherwise = Nothing++pevalITEBoolLeft :: Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)+pevalITEBoolLeft cond (AndTerm t1 t2) ifFalse =+ msum+ [ pevalITEBoolLeftAnd cond t1 t2 ifFalse,+ case ifFalse of+ AndTerm f1 f2 -> pevalITEBoolBothAnd cond t1 t2 f1 f2+ _ -> Nothing+ ]+pevalITEBoolLeft cond (OrTerm t1 t2) ifFalse =+ msum+ [ pevalITEBoolLeftOr cond t1 t2 ifFalse,+ case ifFalse of+ OrTerm f1 f2 -> pevalITEBoolBothOr cond t1 t2 f1 f2+ _ -> Nothing+ ]+pevalITEBoolLeft cond (NotTerm nIfTrue) ifFalse =+ msum+ [ pevalITEBoolLeftNot cond nIfTrue ifFalse,+ case ifFalse of+ NotTerm nIfFalse ->+ pevalITEBoolBothNot cond nIfTrue nIfFalse+ _ -> Nothing+ ]+pevalITEBoolLeft _ _ _ = Nothing++pevalITEBoolNoLeft :: Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)+pevalITEBoolNoLeft cond ifTrue (AndTerm f1 f2) = pevalITEBoolRightAnd cond ifTrue f1 f2+pevalITEBoolNoLeft cond ifTrue (OrTerm f1 f2) = pevalITEBoolRightOr cond ifTrue f1 f2+pevalITEBoolNoLeft cond ifTrue (NotTerm nIfFalse) = pevalITEBoolRightNot cond ifTrue nIfFalse+pevalITEBoolNoLeft _ _ _ = Nothing++-- | Basic partial evaluation for ITE terms.+pevalITEBasic :: (SupportedPrim a) => Term Bool -> Term a -> Term a -> Maybe (Term a)+pevalITEBasic (ConTerm True) ~ifTrue ~_ = Just ifTrue+pevalITEBasic (ConTerm False) ~_ ~ifFalse = Just ifFalse+pevalITEBasic (NotTerm ncond) ifTrue ifFalse = Just $ pevalITETerm ncond ifFalse ifTrue+pevalITEBasic _ ifTrue ifFalse | ifTrue == ifFalse = Just ifTrue+pevalITEBasic (ITETerm cc ct cf) (ITETerm tc tt tf) (ITETerm fc ft ff) -- later+ | cc == tc && cc == fc = Just $ pevalITETerm cc (pevalITETerm ct tt ft) (pevalITETerm cf tf ff)+pevalITEBasic cond (ITETerm tc tt tf) ifFalse -- later+ | tt == ifFalse = Just $ pevalITETerm (pevalOrTerm (pevalNotTerm cond) tc) tt tf+ | tf == ifFalse = Just $ pevalITETerm (pevalAndTerm cond tc) tt tf+ | termImplies cond tc = Just $ pevalITETerm cond tt ifFalse+pevalITEBasic cond (ITETerm (AndTerm c1 c2) tt tf) ifFalse+ | cond == c1 = Just $ pevalITETerm cond (pevalITETerm c2 tt tf) ifFalse+ | cond == c2 = Just $ pevalITETerm cond (pevalITETerm c1 tt tf) ifFalse+pevalITEBasic cond ifTrue (ITETerm fc ft ff) -- later+ | ifTrue == ft = Just $ pevalITETerm (pevalOrTerm cond fc) ifTrue ff+ | ifTrue == ff = Just $ pevalITETerm (pevalOrTerm cond (pevalNotTerm fc)) ifTrue ft+ | termImplies fc cond = Just $ pevalITETerm cond ifTrue ff+pevalITEBasic cond ifTrue (ITETerm (OrTerm c1 c2) ft ff)+ | cond == c1 = Just $ pevalITETerm cond ifTrue (pevalITETerm c2 ft ff)+ | cond == c2 = Just $ pevalITETerm cond ifTrue (pevalITETerm c1 ft ff)+pevalITEBasic _ _ _ = Nothing++pevalITEBoolBasic :: Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)+pevalITEBoolBasic cond ifTrue ifFalse+ | cond == ifTrue = Just $ pevalOrTerm cond ifFalse+ | cond == ifFalse = Just $ pevalAndTerm cond ifTrue+pevalITEBoolBasic cond (ConTerm v) ifFalse+ | v = Just $ pevalOrTerm cond ifFalse+ | otherwise = Just $ pevalAndTerm (pevalNotTerm cond) ifFalse+pevalITEBoolBasic cond ifTrue (ConTerm v)+ | v = Just $ pevalOrTerm (pevalNotTerm cond) ifTrue+ | otherwise = Just $ pevalAndTerm cond ifTrue+pevalITEBoolBasic _ _ _ = Nothing++pevalITEBool :: Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)+pevalITEBool cond ~ifTrue ~ifFalse =+ msum+ [ pevalITEBasic cond ifTrue ifFalse,+ pevalITEBoolBasic cond ifTrue ifFalse,+ pevalITEBoolLeft cond ifTrue ifFalse,+ pevalITEBoolNoLeft cond ifTrue ifFalse+ ]++-- | Basic partial evaluation for ITE terms.+pevalITEBasicTerm :: (SupportedPrim a) => Term Bool -> Term a -> Term a -> Term a+pevalITEBasicTerm cond ~ifTrue ~ifFalse =+ fromMaybe (iteTerm cond ifTrue ifFalse) $+ pevalITEBasic cond ifTrue ifFalse++-- | Default partial evaluation for equality terms.+pevalDefaultEqTerm :: (SupportedNonFuncPrim a) => Term a -> Term a -> Term Bool+pevalDefaultEqTerm l@ConTerm {} r@ConTerm {} = conTerm $ l == r+pevalDefaultEqTerm l@ConTerm {} r = pevalDefaultEqTerm r l+pevalDefaultEqTerm l (BoolConTerm rv) =+ if rv+ then unsafeCoerce l+ else pevalNotTerm (unsafeCoerce l)+pevalDefaultEqTerm (NotTerm lv) r+ | lv == r = falseTerm+pevalDefaultEqTerm l (NotTerm rv)+ | l == rv = falseTerm+pevalDefaultEqTerm (AddNumTerm (ConTerm c) v) (ConTerm c2) =+ pevalDefaultEqTerm v (conTerm $ c2 - c)+pevalDefaultEqTerm l (ITETerm c t f)+ | l == t = pevalOrTerm c (pevalDefaultEqTerm l f)+ | l == f = pevalOrTerm (pevalNotTerm c) (pevalDefaultEqTerm l t)+pevalDefaultEqTerm (ITETerm c t f) r+ | t == r = pevalOrTerm c (pevalDefaultEqTerm f r)+ | f == r = pevalOrTerm (pevalNotTerm c) (pevalDefaultEqTerm t r)+pevalDefaultEqTerm l r+ | l == r = trueTerm+ | otherwise = eqTerm l r+{-# INLINEABLE pevalDefaultEqTerm #-}++instance SBVRep Bool where+ type SBVType Bool = SBV.SBV Bool++instance SupportedPrimConstraint Bool++instance SupportedPrim Bool where+ pformatCon True = "true"+ pformatCon False = "false"+ defaultValue = defaultValueForBool+ pevalITETerm cond ~ifTrue ~ifFalse =+ fromMaybe (iteTerm cond ifTrue ifFalse) $+ pevalITEBool cond ifTrue ifFalse+ pevalEqTerm (EqTerm (DynTerm (l1 :: Term Bool)) l2) (EqTerm r1 r2)+ | l1 == unsafeCoerce r1 = pevalEqTerm l2 (unsafeCoerce r2)+ | l1 == unsafeCoerce r2 = pevalEqTerm l2 (unsafeCoerce r1)+ | l2 == unsafeCoerce r1 = pevalEqTerm (unsafeCoerce l1) r2+ | l2 == unsafeCoerce r2 = pevalEqTerm (unsafeCoerce l1) r1+ pevalEqTerm (EqTerm (DynTerm (l1 :: Term (WordN 1))) l2) (EqTerm r1 r2)+ | l1 == unsafeCoerce r1 = pevalEqTerm l2 (unsafeCoerce r2)+ | l1 == unsafeCoerce r2 = pevalEqTerm l2 (unsafeCoerce r1)+ | l2 == unsafeCoerce r1 = pevalEqTerm (unsafeCoerce l1) r2+ | l2 == unsafeCoerce r2 = pevalEqTerm (unsafeCoerce l1) r1+ pevalEqTerm (EqTerm (DynTerm (l1 :: Term (IntN 1))) l2) (EqTerm r1 r2)+ | l1 == unsafeCoerce r1 = pevalEqTerm l2 (unsafeCoerce r2)+ | l1 == unsafeCoerce r2 = pevalEqTerm l2 (unsafeCoerce r1)+ | l2 == unsafeCoerce r1 = pevalEqTerm (unsafeCoerce l1) r2+ | l2 == unsafeCoerce r2 = pevalEqTerm (unsafeCoerce l1) r1+ pevalEqTerm l r = pevalDefaultEqTerm l r+ pevalDistinctTerm (_ :| []) = conTerm True+ pevalDistinctTerm (a :| [b]) = pevalNotTerm $ pevalEqTerm a b+ pevalDistinctTerm _ = conTerm False+ conSBVTerm n = if n then SBV.sTrue else SBV.sFalse+ symSBVName symbol _ = show symbol+ symSBVTerm = sbvFresh+ withPrim r = r+ parseSMTModelResult _ = parseScalarSMTModelResult id+ castTypedSymbol ::+ forall knd knd'.+ (IsSymbolKind knd') =>+ TypedSymbol knd Bool ->+ Maybe (TypedSymbol knd' Bool)+ castTypedSymbol (TypedSymbol s) =+ case decideSymbolKind @knd' of+ Left HRefl -> Just $ TypedSymbol s+ Right HRefl -> Just $ TypedSymbol s+ funcDummyConstraint _ = SBV.sTrue++instance NonFuncSBVRep Bool where+ type NonFuncSBVBaseType Bool = Bool++instance SupportedNonFuncPrim Bool where+ conNonFuncSBVTerm = conSBVTerm+ symNonFuncSBVTerm = symSBVTerm @Bool+ withNonFuncPrim r = r++data PhantomDict a where+ PhantomDict :: (SupportedPrim a) => PhantomDict a++data PhantomNonFuncDict a where+ PhantomNonFuncDict ::+ (SupportedNonFuncPrim a) => PhantomNonFuncDict a++{-# NOINLINE phantomDictCache #-}+phantomDictCache :: IORef (HM.HashMap SomeTypeRep (PhantomDict Any))+phantomDictCache = unsafePerformIO $ newIORef HM.empty++-- TODO+{-# NOINLINE getPhantomDict #-}+getPhantomDict :: forall a. (SupportedPrim a) => PhantomDict a+getPhantomDict = unsafePerformIO $ do+ cache <- readIORef phantomDictCache+ let !tr = SomeTypeRep $ primTypeRep @a+ case HM.lookup tr cache of+ Just p -> return $ unsafeCoerce p+ Nothing -> do+ let r = PhantomDict :: PhantomDict a+ atomicModifyIORefCAS_ phantomDictCache $ HM.insert tr $ unsafeCoerce r+ return r++{-# NOINLINE phantomNonFuncDictCache #-}+phantomNonFuncDictCache ::+ IORef (HM.HashMap SomeTypeRep (PhantomNonFuncDict Any))+phantomNonFuncDictCache = unsafePerformIO $ newIORef HM.empty++-- TODO+{-# NOINLINE getPhantomNonFuncDict #-}+getPhantomNonFuncDict ::+ forall a. (SupportedNonFuncPrim a) => PhantomNonFuncDict a+getPhantomNonFuncDict = unsafePerformIO $ do+ cache <- readIORef phantomNonFuncDictCache+ let !tr = SomeTypeRep $ primTypeRep @a+ case HM.lookup tr cache of+ Just p -> return $ unsafeCoerce p+ Nothing -> do+ let r = PhantomNonFuncDict :: PhantomNonFuncDict a+ atomicModifyIORefCAS_ phantomNonFuncDictCache $+ HM.insert tr $+ unsafeCoerce r+ return r++defaultValueForInteger :: Integer+defaultValueForInteger = 0++-- Basic Integer+instance SBVRep Integer where+ type SBVType Integer = SBV.SBV Integer++instance SupportedPrimConstraint Integer where+ type PrimConstraint Integer = (Integral (NonFuncSBVBaseType Integer))++pairwiseHasConcreteEqual :: (SupportedNonFuncPrim a) => [Term a] -> Bool+pairwiseHasConcreteEqual [] = False+pairwiseHasConcreteEqual [_] = False+pairwiseHasConcreteEqual (x : xs) =+ go x xs || pairwiseHasConcreteEqual xs+ where+ go _ [] = False+ go x (y : ys) = x == y || go x ys++getAllConcrete :: [Term a] -> Maybe [a]+getAllConcrete [] = return []+getAllConcrete (ConTerm x : xs) = (x :) <$> getAllConcrete xs+getAllConcrete _ = Nothing++checkConcreteDistinct :: (Eq t) => [t] -> Bool+checkConcreteDistinct [] = True+checkConcreteDistinct (x : xs) = check0 x xs && checkConcreteDistinct xs+ where+ check0 _ [] = True+ check0 x (y : ys) = x /= y && check0 x ys++pevalGeneralDistinct ::+ (SupportedNonFuncPrim a) => NonEmpty (Term a) -> Term Bool+pevalGeneralDistinct (_ :| []) = conTerm True+pevalGeneralDistinct (a :| [b]) = pevalNotTerm $ pevalEqTerm a b+pevalGeneralDistinct l | pairwiseHasConcreteEqual $ toList l = conTerm False+pevalGeneralDistinct l =+ case getAllConcrete (toList l) of+ Nothing -> distinctTerm l+ Just xs -> conTerm $ checkConcreteDistinct xs++instance SupportedPrim Integer where+ pformatCon = show+ defaultValue = defaultValueForInteger+ pevalITETerm = pevalITEBasicTerm+ pevalEqTerm = pevalDefaultEqTerm+ pevalDistinctTerm = pevalGeneralDistinct+ conSBVTerm n = fromInteger n+ symSBVName symbol _ = show symbol+ symSBVTerm name = sbvFresh name+ parseSMTModelResult _ = parseScalarSMTModelResult id+ castTypedSymbol ::+ forall knd knd'.+ (IsSymbolKind knd') =>+ TypedSymbol knd Integer ->+ Maybe (TypedSymbol knd' Integer)+ castTypedSymbol s =+ case decideSymbolKind @knd' of+ Left HRefl -> Just $ typedConstantSymbol $ unTypedSymbol s+ Right HRefl -> Just $ typedAnySymbol $ unTypedSymbol s+ funcDummyConstraint _ = SBV.sTrue++instance NonFuncSBVRep Integer where+ type NonFuncSBVBaseType Integer = Integer++instance SupportedNonFuncPrim Integer where+ conNonFuncSBVTerm = conSBVTerm+ symNonFuncSBVTerm = symSBVTerm @Integer+ withNonFuncPrim r = r++pevalITEBVTerm ::+ forall bv n.+ ( KnownNat n,+ 1 <= n,+ forall m. (KnownNat m, 1 <= m) => SupportedPrim (bv m),+ forall m. (KnownNat m, 1 <= m) => Show (bv m),+ PEvalBVTerm bv+ ) =>+ Term Bool -> Term (bv n) -> Term (bv n) -> Maybe (Term (bv n))+pevalITEBVTerm+ ( EqTerm+ (DynTerm (l :: Term (bv n)))+ (DynTerm (ConTerm (r :: bv n)))+ )+ (ConTerm t)+ (ConTerm f)+ | natVal (Proxy @n) == 1 && r == 1 && t == 0 && f == 1 = Just $ pevalComplementBitsTerm l+ | natVal (Proxy @n) == 1 && r == 1 && t == 1 && f == 0 = Just l+ | natVal (Proxy @n) == 1 && r == 0 && t == 0 && f == 1 = Just l+ | natVal (Proxy @n) == 1 && r == 0 && t == 1 && f == 0 = Just $ pevalComplementBitsTerm l+pevalITEBVTerm+ (EqTerm (DynTerm (l :: Term (bv 1))) (DynTerm (ConTerm (r :: bv 1))))+ (ConTerm t)+ f+ | n > 1 && (t == 0 || t == -1) && (r == -1 || r == 0) =+ Just $+ (if t == 0 then pevalAndBitsTerm else pevalOrBitsTerm)+ ( unsafePevalBVExtendTerm+ (natRepr @1)+ (natRepr @n)+ True+ (if (r == 0) == (t == 0) then l else pevalComplementBitsTerm l)+ )+ f+ where+ n = natVal (Proxy @n)+pevalITEBVTerm+ (EqTerm (DynTerm (_ :: Term (bv 1))) (DynTerm (ConTerm (_ :: bv 1))))+ (ConTerm _)+ (ConTerm _) = Nothing+pevalITEBVTerm+ (EqTerm (DynTerm (l :: Term (bv 1))) (DynTerm (ConTerm (r :: bv 1))))+ t+ f@(ConTerm _) = pevalITEBVTerm (eqTerm l (conTerm $ complement r)) f t+pevalITEBVTerm+ cond+ (BVConcatTerm (a :: Term (bv a)) (b :: Term (bv b)))+ (BVConcatTerm (DynTerm (c :: Term (bv a))) d) =+ Just $+ pevalBVConcatTerm+ (pevalITETerm cond a c)+ (pevalITETerm cond b (unsafeCoerce d))+pevalITEBVTerm+ cond+ (BVExtendTerm True pl (a :: Term (bv a)))+ (BVExtendTerm True _ (DynTerm (b :: Term (bv a)))) =+ Just $+ pevalBVExtendTerm+ True+ pl+ (pevalITETerm cond a b)+pevalITEBVTerm cond (AndBitsTerm a b) (AndBitsTerm c d)+ | a == c = Just $ andBitsTerm a $ pevalITETerm cond b d+ | a == d = Just $ andBitsTerm a $ pevalITETerm cond b c+ | b == c = Just $ andBitsTerm b $ pevalITETerm cond a d+ | b == d = Just $ andBitsTerm b $ pevalITETerm cond a c+pevalITEBVTerm cond (AndBitsTerm a b) c+ | a == c = Just $ andBitsTerm c $ pevalOrBitsTerm (boolToBVTerm $ pevalNotTerm cond) b+ | b == c = Just $ andBitsTerm c $ pevalOrBitsTerm (boolToBVTerm $ pevalNotTerm cond) a+pevalITEBVTerm cond a (AndBitsTerm b c)+ | a == b = Just $ andBitsTerm a $ pevalOrBitsTerm (boolToBVTerm cond) c+ | a == c = Just $ andBitsTerm a $ pevalOrBitsTerm (boolToBVTerm cond) b+pevalITEBVTerm cond (OrBitsTerm a b) (OrBitsTerm c d)+ | a == c = Just $ orBitsTerm a $ pevalITETerm cond b d+ | a == d = Just $ orBitsTerm a $ pevalITETerm cond b c+ | b == c = Just $ orBitsTerm b $ pevalITETerm cond a d+ | b == d = Just $ orBitsTerm b $ pevalITETerm cond a c+pevalITEBVTerm cond (OrBitsTerm a b) c+ | a == c = Just $ orBitsTerm c $ pevalAndBitsTerm (boolToBVTerm cond) b+ | b == c = Just $ orBitsTerm c $ pevalAndBitsTerm (boolToBVTerm cond) a+pevalITEBVTerm cond a (OrBitsTerm b c)+ | a == b = Just $ orBitsTerm a $ pevalAndBitsTerm (boolToBVTerm $ pevalNotTerm cond) c+ | a == c = Just $ orBitsTerm a $ pevalAndBitsTerm (boolToBVTerm $ pevalNotTerm cond) b+pevalITEBVTerm _ _ _ = Nothing++-- | Convert boolean term to a 1-bit bitvector term.+boolToBVTerm ::+ forall bv n.+ ( PEvalBVTerm bv,+ KnownNat n,+ 1 <= n,+ forall m. (KnownNat m, 1 <= m) => SupportedPrim (bv m)+ ) =>+ Term Bool -> Term (bv n)+boolToBVTerm cond =+ let bv =+ case cond of+ NotTerm c -> iteTerm c (conTerm 0) (conTerm 1)+ _ -> iteTerm cond (conTerm 1 :: Term (bv 1)) (conTerm 0) :: Term (bv 1)+ in if natVal (Proxy @n) == 1+ then unsafeCoerce bv+ else bvExtendTerm True (natRepr @n) bv++-- Signed BV+instance (KnownNat w, 1 <= w) => SupportedPrimConstraint (IntN w) where+ type PrimConstraint (IntN w) = (KnownNat w, 1 <= w, BVIsNonZero w)++instance (KnownNat w, 1 <= w) => SBVRep (IntN w) where+ type SBVType (IntN w) = SBV.SBV (SBV.IntN w)++instance (KnownNat w, 1 <= w) => SupportedPrim (IntN w) where+ sbvDistinct = withPrim @(IntN w) $ SBV.distinct . toList+ sbvEq = withPrim @(IntN w) (SBV..==)+ pformatCon = show+ defaultValue = 0+ pevalITETerm cond ifTrue ifFalse =+ fromMaybe (iteTerm cond ifTrue ifFalse) $+ msum+ [ pevalITEBasic cond ifTrue ifFalse,+ pevalITEBVTerm cond ifTrue ifFalse+ ]+ pevalEqTerm = pevalDefaultEqTerm+ pevalDistinctTerm = pevalGeneralDistinct+ conSBVTerm n = bvIsNonZeroFromGEq1 (Proxy @w) $ fromIntegral n+ symSBVName symbol _ = show symbol+ symSBVTerm name = bvIsNonZeroFromGEq1 (Proxy @w) $ sbvFresh name+ withPrim r = bvIsNonZeroFromGEq1 (Proxy @w) r+ {-# INLINE withPrim #-}+ parseSMTModelResult _ cv =+ withPrim @(IntN w) $+ parseScalarSMTModelResult (\(x :: SBV.IntN w) -> fromIntegral x) cv+ castTypedSymbol ::+ forall knd knd'.+ (IsSymbolKind knd') =>+ TypedSymbol knd (IntN w) ->+ Maybe (TypedSymbol knd' (IntN w))+ castTypedSymbol s =+ case decideSymbolKind @knd' of+ Left HRefl -> Just $ typedConstantSymbol $ unTypedSymbol s+ Right HRefl -> Just $ typedAnySymbol $ unTypedSymbol s+ funcDummyConstraint _ = SBV.sTrue++-- | Construct the 'SBV.BVIsNonZero' constraint from the proof that the width is+-- at least 1.+bvIsNonZeroFromGEq1 ::+ forall w r proxy.+ (1 <= w) =>+ proxy w ->+ ((SBV.BVIsNonZero w) => r) ->+ r+bvIsNonZeroFromGEq1 _ r1 = case unsafeAxiom :: w :~: 1 of+ Refl -> r1+{-# INLINE bvIsNonZeroFromGEq1 #-}++instance (KnownNat w, 1 <= w) => NonFuncSBVRep (IntN w) where+ type NonFuncSBVBaseType (IntN w) = SBV.IntN w++instance (KnownNat w, 1 <= w) => SupportedNonFuncPrim (IntN w) where+ conNonFuncSBVTerm = conSBVTerm+ symNonFuncSBVTerm = symSBVTerm @(IntN w)+ withNonFuncPrim r = bvIsNonZeroFromGEq1 (Proxy @w) r++-- Unsigned BV+instance (KnownNat w, 1 <= w) => SupportedPrimConstraint (WordN w) where+ type PrimConstraint (WordN w) = (KnownNat w, 1 <= w, BVIsNonZero w)++instance (KnownNat w, 1 <= w) => SBVRep (WordN w) where+ type SBVType (WordN w) = SBV.SBV (SBV.WordN w)++instance (KnownNat w, 1 <= w) => SupportedPrim (WordN w) where+ sbvDistinct = withPrim @(WordN w) $ SBV.distinct . toList+ sbvEq = withPrim @(WordN w) (SBV..==)+ pformatCon = show+ defaultValue = 0+ pevalITETerm cond ifTrue ifFalse =+ fromMaybe (iteTerm cond ifTrue ifFalse) $+ msum+ [ pevalITEBasic cond ifTrue ifFalse,+ pevalITEBVTerm cond ifTrue ifFalse+ ]+ pevalEqTerm = pevalDefaultEqTerm+ pevalDistinctTerm = pevalGeneralDistinct+ conSBVTerm n = bvIsNonZeroFromGEq1 (Proxy @w) $ fromIntegral n+ symSBVName symbol _ = show symbol+ symSBVTerm name = bvIsNonZeroFromGEq1 (Proxy @w) $ sbvFresh name+ withPrim r = bvIsNonZeroFromGEq1 (Proxy @w) r+ {-# INLINE withPrim #-}+ parseSMTModelResult _ cv =+ withPrim @(WordN w) $+ parseScalarSMTModelResult (\(x :: SBV.WordN w) -> fromIntegral x) cv+ castTypedSymbol ::+ forall knd knd'.+ (IsSymbolKind knd') =>+ TypedSymbol knd (WordN w) ->+ Maybe (TypedSymbol knd' (WordN w))+ castTypedSymbol s =+ case decideSymbolKind @knd' of+ Left HRefl -> Just $ typedConstantSymbol $ unTypedSymbol s+ Right HRefl -> Just $ typedAnySymbol $ unTypedSymbol s+ funcDummyConstraint _ = SBV.sTrue++instance (KnownNat w, 1 <= w) => NonFuncSBVRep (WordN w) where+ type NonFuncSBVBaseType (WordN w) = SBV.WordN w++instance (KnownNat w, 1 <= w) => SupportedNonFuncPrim (WordN w) where+ conNonFuncSBVTerm = conSBVTerm+ symNonFuncSBVTerm = symSBVTerm @(WordN w)+ withNonFuncPrim r = bvIsNonZeroFromGEq1 (Proxy @w) r++-- FP+instance (ValidFP eb sb) => SupportedPrimConstraint (FP eb sb) where+ type PrimConstraint (FP eb sb) = ValidFP eb sb++instance (ValidFP eb sb) => SBVRep (FP eb sb) where+ type SBVType (FP eb sb) = SBV.SBV (SBV.FloatingPoint eb sb)++instance (ValidFP eb sb) => SupportedPrim (FP eb sb) where+ sameCon a b+ | isNaN a = isNaN b+ | fpIsPositiveZero a = fpIsPositiveZero b+ | fpIsNegativeZero a = fpIsNegativeZero b+ | otherwise = a == b+ hashConWithSalt s a+ | isNaN a = hashWithSalt s (2654435761 :: Int)+ | otherwise = hashWithSalt s a+ defaultValue = 0+ pevalITETerm = pevalITEBasicTerm+ pevalEqTerm (ConTerm l) (ConTerm r) = conTerm $ l == r+ pevalEqTerm l@ConTerm {} r = pevalEqTerm r l+ pevalEqTerm l r = eqTerm l r+ pevalDistinctTerm (_ :| []) = conTerm True+ pevalDistinctTerm (a :| [b]) = pevalNotTerm $ pevalEqTerm a b+ pevalDistinctTerm l =+ case getAllConcrete (toList l) of+ Nothing -> distinctTerm l+ Just xs | any isNaN xs -> distinctTerm l+ Just xs -> conTerm $ checkConcreteDistinct xs+ conSBVTerm (FP fp) = SBV.literal fp+ symSBVName symbol _ = show symbol+ symSBVTerm name = sbvFresh name+ parseSMTModelResult _ cv =+ withPrim @(FP eb sb) $+ parseScalarSMTModelResult (\(x :: SBV.FloatingPoint eb sb) -> coerce x) cv+ funcDummyConstraint _ = SBV.sTrue++ -- Workaround for sbv#702.+ sbvIte = withPrim @(FP eb sb) $ \c a b ->+ case (SBV.unliteral a, SBV.unliteral b) of+ (Just a', Just b')+ | isInfinite a' && isInfinite b' ->+ let correspondingZero x = if x > 0 then 0 else -0+ in 1+ / sbvIte @(FP eb sb)+ c+ (conSBVTerm @(FP eb sb) $ correspondingZero a')+ (conSBVTerm @(FP eb sb) $ correspondingZero b')+ _ -> SBV.ite c a b+ castTypedSymbol ::+ forall knd knd'.+ (IsSymbolKind knd') =>+ TypedSymbol knd (FP eb sb) ->+ Maybe (TypedSymbol knd' (FP eb sb))+ castTypedSymbol s =+ case decideSymbolKind @knd' of+ Left HRefl -> Just $ typedConstantSymbol $ unTypedSymbol s+ Right HRefl -> Just $ typedAnySymbol $ unTypedSymbol s++instance (ValidFP eb sb) => NonFuncSBVRep (FP eb sb) where+ type NonFuncSBVBaseType (FP eb sb) = SBV.FloatingPoint eb sb++instance (ValidFP eb sb) => SupportedNonFuncPrim (FP eb sb) where+ conNonFuncSBVTerm = conSBVTerm+ symNonFuncSBVTerm = symSBVTerm @(FP eb sb)+ withNonFuncPrim r = r++-- FPRoundingMode+instance SupportedPrimConstraint FPRoundingMode++instance SBVRep FPRoundingMode where+ type SBVType FPRoundingMode = SBV.SBV SBV.RoundingMode++instance SupportedPrim FPRoundingMode where+ defaultValue = RNE+ pevalITETerm = pevalITEBasicTerm+ pevalEqTerm (ConTerm l) (ConTerm r) = conTerm $ l == r+ pevalEqTerm l@ConTerm {} r = pevalEqTerm r l+ pevalEqTerm l r = eqTerm l r+ pevalDistinctTerm = pevalGeneralDistinct+ conSBVTerm RNE = SBV.sRNE+ conSBVTerm RNA = SBV.sRNA+ conSBVTerm RTP = SBV.sRTP+ conSBVTerm RTN = SBV.sRTN+ conSBVTerm RTZ = SBV.sRTZ+ symSBVName symbol _ = show symbol+ symSBVTerm name = sbvFresh name+ parseSMTModelResult _ cv =+ withPrim @(FPRoundingMode) $+ parseScalarSMTModelResult+ ( \(x :: SBV.RoundingMode) -> case x of+ SBV.RoundNearestTiesToEven -> RNE+ SBV.RoundNearestTiesToAway -> RNA+ SBV.RoundTowardPositive -> RTP+ SBV.RoundTowardNegative -> RTN+ SBV.RoundTowardZero -> RTZ+ )+ cv+ castTypedSymbol ::+ forall knd knd'.+ (IsSymbolKind knd') =>+ TypedSymbol knd FPRoundingMode ->+ Maybe (TypedSymbol knd' FPRoundingMode)+ castTypedSymbol s =+ case decideSymbolKind @knd' of+ Left HRefl -> Just $ typedConstantSymbol $ unTypedSymbol s+ Right HRefl -> Just $ typedAnySymbol $ unTypedSymbol s+ funcDummyConstraint _ = SBV.sTrue++instance NonFuncSBVRep FPRoundingMode where+ type NonFuncSBVBaseType FPRoundingMode = SBV.RoundingMode++instance SupportedNonFuncPrim FPRoundingMode where+ conNonFuncSBVTerm = conSBVTerm+ symNonFuncSBVTerm = symSBVTerm @FPRoundingMode+ withNonFuncPrim r = r++-- AlgReal++instance SupportedPrimConstraint AlgReal++instance SBVRep AlgReal where+ type SBVType AlgReal = SBV.SBV SBV.AlgReal++instance SupportedPrim AlgReal where+ defaultValue = 0+ pevalITETerm = pevalITEBasicTerm+ pevalEqTerm (ConTerm l) (ConTerm r) = conTerm $ l == r+ pevalEqTerm l@ConTerm {} r = pevalEqTerm r l+ pevalEqTerm l r = eqTerm l r+ pevalDistinctTerm = pevalGeneralDistinct+ conSBVTerm = SBV.literal . toSBVAlgReal+ symSBVName symbol _ = show symbol+ symSBVTerm name = sbvFresh name+ parseSMTModelResult _ cv =+ withPrim @AlgReal $+ parseScalarSMTModelResult fromSBVAlgReal cv+ castTypedSymbol ::+ forall knd knd'.+ (IsSymbolKind knd') =>+ TypedSymbol knd AlgReal ->+ Maybe (TypedSymbol knd' AlgReal)+ castTypedSymbol s =+ case decideSymbolKind @knd' of+ Left HRefl -> Just $ typedConstantSymbol $ unTypedSymbol s+ Right HRefl -> Just $ typedAnySymbol $ unTypedSymbol s+ funcDummyConstraint _ = SBV.sTrue++instance NonFuncSBVRep AlgReal where+ type NonFuncSBVBaseType AlgReal = SBV.AlgReal++instance SupportedNonFuncPrim AlgReal where+ conNonFuncSBVTerm = conSBVTerm+ symNonFuncSBVTerm = symSBVTerm @AlgReal+ withNonFuncPrim r = r++-- Bitwise++bitOpOnConcat ::+ forall bv m.+ ( forall n. (KnownNat n, 1 <= n) => SupportedPrim (bv n),+ PEvalBVTerm bv,+ KnownNat m,+ 1 <= m+ ) =>+ ( forall n.+ (KnownNat n, 1 <= n) =>+ Term (bv n) -> Term (bv n) -> Term (bv n)+ ) ->+ Term (bv m) ->+ Term (bv m) ->+ Maybe (Term (bv m))+bitOpOnConcat+ peval+ (BVConcatTerm (l0 :: Term (bv l)) (r0 :: Term (bv r)))+ (BVConcatTerm (DynTerm (l :: Term (bv l))) (DynTerm (r :: Term (bv r)))) =+ let r' = peval r0 r+ l' = peval l0 l+ in Just $ pevalBVConcatTerm l' r'+bitOpOnConcat+ peval+ at@(ConTerm _)+ (BVConcatTerm (l :: Term (bv l)) (r :: Term (bv r))) =+ let nzero = natRepr @0+ nr = natRepr @r+ nl = natRepr @l+ nlpr = natRepr @(l + r)+ ar =+ unsafePevalBVSelectTerm+ nlpr+ nzero+ nr+ (unsafeCoerce at :: Term (bv (l + r)))+ al =+ unsafePevalBVSelectTerm+ nlpr+ nr+ nl+ (unsafeCoerce at :: Term (bv (l + r)))+ r' = peval ar r+ l' = peval al l+ in Just $ pevalBVConcatTerm l' r'+bitOpOnConcat+ peval+ (BVExtendTerm True pl (l :: Term (bv n)))+ (BVExtendTerm True _ (DynTerm (r :: Term (bv n)))) =+ Just $ pevalBVExtendTerm True pl (peval l r)+bitOpOnConcat _ _ _ = Nothing++doPevalAndBitsTerm ::+ forall bv m.+ ( forall n. (KnownNat n, 1 <= n) => SupportedPrim (bv n),+ PEvalBVTerm bv,+ KnownNat m,+ 1 <= m+ ) =>+ Term (bv m) ->+ Term (bv m) ->+ Maybe (Term (bv m))+doPevalAndBitsTerm (ConTerm a) (ConTerm b) =+ Just $ conTerm (a .&. b)+doPevalAndBitsTerm (ConTerm a) b+ | a == zeroBits = Just $ conTerm zeroBits+ | a == complement zeroBits = Just b+ | aok || acok =+ case ( mkPositiveNatRepr $ fromIntegral leadingBits,+ mkPositiveNatRepr $ fromIntegral trailingBits+ ) of+ ( SomePositiveNatRepr (pleadingBits :: NatRepr leadingBits),+ SomePositiveNatRepr (ptrailingBitsRepr :: NatRepr trailingBits)+ ) ->+ case ( unsafeAxiom @(leadingBits + trailingBits) @m,+ unsafeAxiom @(trailingBits + leadingBits) @m,+ unsafeLeqProof @trailingBits @m+ ) of+ (Refl, Refl, LeqProof) ->+ if aok+ then+ Just $+ pevalBVConcatTerm (conTerm 0 :: Term (bv leadingBits)) $+ pevalBVSelectTerm (natRepr @0) ptrailingBitsRepr b+ else+ Just $+ pevalBVConcatTerm+ (pevalBVSelectTerm ptrailingBitsRepr pleadingBits b)+ (conTerm 0 :: Term (bv trailingBits))+ where+ leadingBits = if aok then countLeadingZeros a else countLeadingZeros ac+ trailingBits = fromIntegral (natVal @m a) - leadingBits+ ac = complement a+ aok = a .&. (a + 1) == 0+ acok = ac .&. (ac + 1) == 0+doPevalAndBitsTerm a b@(ConTerm _) = doPevalAndBitsTerm b a+doPevalAndBitsTerm a b | a == b = Just a+doPevalAndBitsTerm (ITETerm cond a@(ConTerm av) b@(ConTerm bv)) c+ | av `elem` [0, -1] || bv `elem` [0, -1] =+ Just $ pevalITETerm cond (pevalAndBitsTerm a c) (pevalAndBitsTerm b c)+doPevalAndBitsTerm a (ITETerm cond b@(ConTerm bv) c@(ConTerm cv))+ | bv `elem` [0, -1] || cv `elem` [0, -1] =+ Just $ pevalITETerm cond (pevalAndBitsTerm a b) (pevalAndBitsTerm a c)+doPevalAndBitsTerm (ITETerm cond a@(ConTerm v) b) c+ | v == 0 = Just $ pevalITETerm cond a (pevalAndBitsTerm b c)+doPevalAndBitsTerm (ITETerm cond a b@(ConTerm v)) c+ | v == 0 = Just $ pevalITETerm cond (pevalAndBitsTerm a c) b+doPevalAndBitsTerm a (ITETerm cond b@(ConTerm v) c)+ | v == 0 = Just $ pevalITETerm cond b (pevalAndBitsTerm a c)+doPevalAndBitsTerm a (ITETerm cond b c@(ConTerm v))+ | v == 0 = Just $ pevalITETerm cond (pevalAndBitsTerm a b) c+doPevalAndBitsTerm (BVExtendTerm True pl (ITETerm cond at@(ConTerm a) bt@(ConTerm b))) c+ | a `elem` [0, -1] && b `elem` [0, -1] =+ Just $+ pevalITETerm+ cond+ (pevalAndBitsTerm (pevalBVExtendTerm True pl at) c)+ (pevalAndBitsTerm (pevalBVExtendTerm True pl bt) c)+doPevalAndBitsTerm a (BVExtendTerm True pl (ITETerm cond bt@(ConTerm b) ct@(ConTerm c)))+ | b `elem` [0, -1] && c `elem` [0, -1] =+ Just $+ pevalITETerm+ cond+ (pevalAndBitsTerm a (pevalBVExtendTerm True pl bt))+ (pevalAndBitsTerm a (pevalBVExtendTerm True pl ct))+doPevalAndBitsTerm a b = bitOpOnConcat @bv @m pevalDefaultAndBitsTerm a b++pevalDefaultAndBitsTerm ::+ forall bv m.+ ( forall n. (KnownNat n, 1 <= n) => SupportedPrim (bv n),+ PEvalBVTerm bv,+ KnownNat m,+ 1 <= m+ ) =>+ Term (bv m) ->+ Term (bv m) ->+ Term (bv m)+pevalDefaultAndBitsTerm = binaryUnfoldOnce doPevalAndBitsTerm andBitsTerm++doPevalOrBitsTerm ::+ forall bv m.+ ( forall n. (KnownNat n, 1 <= n) => SupportedPrim (bv n),+ PEvalBVTerm bv,+ KnownNat m,+ 1 <= m+ ) =>+ Term (bv m) ->+ Term (bv m) ->+ Maybe (Term (bv m))+doPevalOrBitsTerm (ConTerm a) (ConTerm b) = Just $ conTerm (a .|. b)+doPevalOrBitsTerm (ConTerm a) b+ | a == zeroBits = Just b+ | a == complement zeroBits = Just $ conTerm $ complement zeroBits+ | aok || acok =+ case ( mkPositiveNatRepr $ fromIntegral leadingBits,+ mkPositiveNatRepr $ fromIntegral trailingBits+ ) of+ ( SomePositiveNatRepr (pleadingBits :: NatRepr leadingBits),+ SomePositiveNatRepr (ptrailingBitsRepr :: NatRepr trailingBits)+ ) ->+ case ( unsafeAxiom @(leadingBits + trailingBits) @m,+ unsafeAxiom @(trailingBits + leadingBits) @m,+ unsafeLeqProof @trailingBits @m+ ) of+ (Refl, Refl, LeqProof) ->+ if acok+ then+ Just $+ pevalBVConcatTerm (conTerm $ -1 :: Term (bv leadingBits)) $+ pevalBVSelectTerm (natRepr @0) ptrailingBitsRepr b+ else+ Just $+ pevalBVConcatTerm+ (pevalBVSelectTerm ptrailingBitsRepr pleadingBits b)+ (conTerm $ -1 :: Term (bv trailingBits))+ where+ leadingBits = if aok then countLeadingZeros a else countLeadingZeros ac+ trailingBits = fromIntegral (natVal @m a) - leadingBits+ ac = complement a+ aok = a .&. (a + 1) == 0+ acok = ac .&. (ac + 1) == 0+doPevalOrBitsTerm a b@(ConTerm _) = doPevalOrBitsTerm b a+doPevalOrBitsTerm a b | a == b = Just a+doPevalOrBitsTerm (ITETerm cond a@(ConTerm _) b@(ConTerm _)) c =+ Just $ pevalITETerm cond (pevalOrBitsTerm a c) (pevalOrBitsTerm b c)+doPevalOrBitsTerm a (ITETerm cond b@(ConTerm _) c@(ConTerm _)) =+ Just $ pevalITETerm cond (pevalOrBitsTerm a b) (pevalOrBitsTerm a c)+doPevalOrBitsTerm (ITETerm cond a@(ConTerm v) b) c+ | v == -1 = Just $ pevalITETerm cond a (pevalOrBitsTerm b c)+doPevalOrBitsTerm (ITETerm cond a b@(ConTerm v)) c+ | v == -1 = Just $ pevalITETerm cond (pevalOrBitsTerm a c) b+doPevalOrBitsTerm a (ITETerm cond b@(ConTerm v) c)+ | v == -1 = Just $ pevalITETerm cond b (pevalOrBitsTerm a c)+doPevalOrBitsTerm a (ITETerm cond b c@(ConTerm v))+ | v == -1 = Just $ pevalITETerm cond (pevalOrBitsTerm a b) c+doPevalOrBitsTerm (BVExtendTerm True pl (ITETerm cond at@(ConTerm a) bt@(ConTerm b))) c+ | a `elem` [0, -1] && b `elem` [0, -1] =+ Just $+ pevalITETerm+ cond+ (pevalOrBitsTerm (pevalBVExtendTerm True pl at) c)+ (pevalOrBitsTerm (pevalBVExtendTerm True pl bt) c)+doPevalOrBitsTerm a (BVExtendTerm True pl (ITETerm cond bt@(ConTerm b) ct@(ConTerm c)))+ | b `elem` [0, -1] && c `elem` [0, -1] =+ Just $+ pevalITETerm+ cond+ (pevalOrBitsTerm a (pevalBVExtendTerm True pl bt))+ (pevalOrBitsTerm a (pevalBVExtendTerm True pl ct))+doPevalOrBitsTerm a b = bitOpOnConcat @bv @m pevalDefaultOrBitsTerm a b++pevalDefaultOrBitsTerm ::+ forall bv m.+ ( KnownNat m,+ 1 <= m,+ forall n. (KnownNat n, 1 <= n) => SupportedPrim (bv n),+ PEvalBVTerm bv+ ) =>+ Term (bv m) -> Term (bv m) -> Term (bv m)+pevalDefaultOrBitsTerm = binaryUnfoldOnce doPevalOrBitsTerm orBitsTerm++pevalDefaultXorBitsTerm ::+ forall bv m.+ ( forall n. (KnownNat n, 1 <= n) => SupportedPrim (bv n),+ PEvalBVTerm bv,+ KnownNat m,+ 1 <= m+ ) =>+ Term (bv m) -> Term (bv m) -> Term (bv m)+pevalDefaultXorBitsTerm = binaryUnfoldOnce doPevalXorBitsTerm xorBitsTerm+ where+ doPevalXorBitsTerm (ConTerm a) (ConTerm b) =+ Just $ conTerm (a `xor` b)+ doPevalXorBitsTerm (ConTerm a) b+ | a == zeroBits = Just b+ | a == complement zeroBits = Just $ pevalComplementBitsTerm b+ doPevalXorBitsTerm a b@(ConTerm _) = doPevalXorBitsTerm b a+ doPevalXorBitsTerm a b | a == b = Just $ conTerm zeroBits+ doPevalXorBitsTerm (ComplementBitsTerm i) (ComplementBitsTerm j) =+ Just $ pevalXorBitsTerm i j+ doPevalXorBitsTerm (ComplementBitsTerm i) j =+ Just $ pevalComplementBitsTerm $ pevalXorBitsTerm i j+ doPevalXorBitsTerm i (ComplementBitsTerm j) =+ Just $ pevalComplementBitsTerm $ pevalXorBitsTerm i j+ doPevalXorBitsTerm a b = bitOpOnConcat @bv @m pevalDefaultXorBitsTerm a b++pevalDefaultComplementBitsTerm ::+ (Bits a, SupportedPrim a, PEvalBitwiseTerm a) => Term a -> Term a+pevalDefaultComplementBitsTerm =+ unaryUnfoldOnce doPevalComplementBitsTerm complementBitsTerm+ where+ doPevalComplementBitsTerm (ConTerm a) = Just $ conTerm $ complement a+ doPevalComplementBitsTerm (ComplementBitsTerm a) = Just a+ doPevalComplementBitsTerm (BVConcatTerm l r) =+ Just $+ pevalBVConcatTerm+ (pevalComplementBitsTerm l)+ (pevalComplementBitsTerm r)+ doPevalComplementBitsTerm (BVExtendTerm True pr t) =+ Just $ pevalBVExtendTerm True pr $ pevalComplementBitsTerm t+ doPevalComplementBitsTerm _ = Nothing++instance (KnownNat n, 1 <= n) => PEvalBitwiseTerm (WordN n) where+ pevalAndBitsTerm = pevalDefaultAndBitsTerm+ pevalOrBitsTerm = pevalDefaultOrBitsTerm+ pevalXorBitsTerm = pevalDefaultXorBitsTerm+ pevalComplementBitsTerm = pevalDefaultComplementBitsTerm+ withSbvBitwiseTermConstraint r = withPrim @(WordN n) r++instance (KnownNat n, 1 <= n) => PEvalBitwiseTerm (IntN n) where+ pevalAndBitsTerm = pevalDefaultAndBitsTerm+ pevalOrBitsTerm = pevalDefaultOrBitsTerm+ pevalXorBitsTerm = pevalDefaultXorBitsTerm+ pevalComplementBitsTerm = pevalDefaultComplementBitsTerm+ withSbvBitwiseTermConstraint r = withPrim @(IntN n) r++-- BVTerm++pevalDefaultBVSelectTerm ::+ forall (bv2 :: Nat -> Type) bv n ix w p q.+ ( KnownNat n,+ KnownNat ix,+ KnownNat w,+ 1 <= n,+ 1 <= w,+ ix + w <= n,+ PEvalBVTerm bv,+ forall x. (KnownNat x, 1 <= x) => PEvalBitCastTerm (bv2 x) (bv x),+ PEvalBVTerm bv2,+ Typeable bv,+ SupportedPrim (bv w),+ SupportedPrim (bv2 n)+ ) =>+ p ix ->+ q w ->+ Term (bv n) ->+ Term (bv w)+pevalDefaultBVSelectTerm ix w =+ unaryUnfoldOnce (doPevalDefaultBVSelectTerm @bv2 ix w) (bvSelectTerm ix w)++-- | Unsafe version of `pevalBVSelectTerm`. Use `NatRepr` for the bit-width+-- representations.+unsafePevalBVSelectTerm ::+ forall bv n ix w.+ (PEvalBVTerm bv) =>+ NatRepr n ->+ NatRepr ix ->+ NatRepr w ->+ Term (bv n) ->+ Term (bv w)+unsafePevalBVSelectTerm n ix w term =+ withKnownNat n $+ withKnownNat ix $+ withKnownNat w $+ case ( unsafeLeqProof @1 @n,+ unsafeLeqProof @1 @w,+ unsafeLeqProof @(ix + w) @n+ ) of+ (LeqProof, LeqProof, LeqProof) -> pevalBVSelectTerm ix w term++doPevalDefaultBVSelectTerm ::+ forall (bv2 :: Nat -> Type) bv n ix w p q.+ ( KnownNat n,+ KnownNat ix,+ KnownNat w,+ forall x. (KnownNat x, 1 <= x) => PEvalBitCastTerm (bv2 x) (bv x),+ 1 <= n,+ 1 <= w,+ ix + w <= n,+ PEvalBVTerm bv,+ PEvalBVTerm bv2,+ Typeable bv,+ SupportedPrim (bv w),+ SupportedPrim (bv2 n)+ ) =>+ p ix ->+ q w ->+ Term (bv n) ->+ Maybe (Term (bv w))+doPevalDefaultBVSelectTerm _ _ rhs+ | isJust (sameNat (Proxy @ix) (Proxy @0))+ && isJust (sameNat (Proxy @w) (Proxy @n)) =+ Just rhs >>= castTerm+doPevalDefaultBVSelectTerm ix w (ConTerm b) =+ Just $ conTerm $ sizedBVSelect ix w b+doPevalDefaultBVSelectTerm ix w (BitCastTerm (DynTerm (b :: Term (bv2 n)))) =+ Just $ pevalBitCastTerm $ pevalBVSelectTerm ix w b+doPevalDefaultBVSelectTerm ix w (AddNumTerm t1 t2)+ | natVal @ix ix == 0 =+ Just $+ AddNumTerm+ (pevalDefaultBVSelectTerm @bv2 @bv ix w t1)+ (pevalDefaultBVSelectTerm @bv2 @bv ix w t2)+doPevalDefaultBVSelectTerm ix w (MulNumTerm t1 t2)+ | natVal @ix ix == 0 =+ Just $+ MulNumTerm+ (pevalDefaultBVSelectTerm @bv2 @bv ix w t1)+ (pevalDefaultBVSelectTerm @bv2 @bv ix w t2)+doPevalDefaultBVSelectTerm ix w (AndBitsTerm t1 t2) =+ Just $+ AndBitsTerm+ (pevalDefaultBVSelectTerm @bv2 @bv ix w t1)+ (pevalDefaultBVSelectTerm @bv2 @bv ix w t2)+doPevalDefaultBVSelectTerm ix w (OrBitsTerm t1 t2) =+ Just $+ OrBitsTerm+ (pevalDefaultBVSelectTerm @bv2 @bv ix w t1)+ (pevalDefaultBVSelectTerm @bv2 @bv ix w t2)+doPevalDefaultBVSelectTerm ix w (XorBitsTerm t1 t2) =+ Just $+ XorBitsTerm+ (pevalDefaultBVSelectTerm @bv2 @bv ix w t1)+ (pevalDefaultBVSelectTerm @bv2 @bv ix w t2)+doPevalDefaultBVSelectTerm+ pix+ pw+ (BVConcatTerm (b1 :: Term (bv n1)) (b2 :: Term (bv n2)))+ | ix + w <= n2 = Just $ unsafePevalBVSelectTerm n2Repr ixRepr wRepr b2+ | ix >= n2 =+ case mkNatRepr (ix - n2) of+ SomeNatRepr ixpn2Repr ->+ Just $ unsafePevalBVSelectTerm n1Repr ixpn2Repr wRepr b1+ | otherwise =+ case (mkNatRepr (w + ix - n2), mkNatRepr (n2 - ix)) of+ (SomeNatRepr wixpn2Repr, SomeNatRepr n2pixRepr) ->+ let b1Part =+ unsafePevalBVSelectTerm n1Repr (natRepr @0) wixpn2Repr b1+ b2Part = unsafePevalBVSelectTerm n2Repr ixRepr n2pixRepr b2+ in Just $+ unsafePevalBVConcatTerm+ wixpn2Repr+ n2pixRepr+ wRepr+ b1Part+ b2Part+ where+ ixRepr = natRepr @ix+ wRepr = natRepr @w+ n1Repr = natRepr @n1+ n2Repr = natRepr @n2+ ix = natVal @ix pix+ w = natVal @w pw+ n2 = natVal @n2 (Proxy @n2)+doPevalDefaultBVSelectTerm+ _+ _+ (BVSelectTerm (_ :: proxy ix1) _ (b :: Term (bv n1))) =+ Just $+ unsafePevalBVSelectTerm+ (natRepr @n1)+ (addNat (natRepr @ix) (natRepr @ix1))+ (natRepr @w)+ b+doPevalDefaultBVSelectTerm+ pix+ pw+ (BVExtendTerm signed _ (b :: Term (bv n1)))+ | ix + w <= n1 = Just $ unsafePevalBVSelectTerm n1Repr ixRepr wRepr b+ | ix < n1 =+ case mkNatRepr (n1 - ix) of+ SomeNatRepr n1pixRepr ->+ let bPart = unsafePevalBVSelectTerm n1Repr ixRepr n1pixRepr b+ in Just $ unsafePevalBVExtendTerm n1pixRepr wRepr signed bPart+ | otherwise = Nothing+ where+ ixRepr = natRepr @ix+ wRepr = natRepr @w+ n1Repr = natRepr @n1+ ix = natVal @ix pix+ w = natVal @w pw+ n1 = natVal @n1 (Proxy @n1)+doPevalDefaultBVSelectTerm _ _ _ = Nothing++pevalDefaultBVExtendTerm ::+ forall proxy l r bv.+ ( PEvalBVTerm bv,+ KnownNat l,+ KnownNat r,+ 1 <= l,+ 1 <= r,+ l <= r,+ Typeable bv,+ forall n. (KnownNat n, 1 <= n) => SupportedPrim (bv n)+ ) =>+ Bool ->+ proxy r ->+ Term (bv l) ->+ Term (bv r)+pevalDefaultBVExtendTerm signed p =+ unaryUnfoldOnce (doPevalDefaultBVExtendTerm signed p) (bvExtendTerm signed p)++-- | Unsafe version of `pevalBVExtendTerm`. Use `NatRepr` for the bit-width+-- representations.+unsafePevalBVExtendTerm ::+ forall bv l r.+ (PEvalBVTerm bv) =>+ NatRepr l ->+ NatRepr r ->+ Bool ->+ Term (bv l) ->+ Term (bv r)+unsafePevalBVExtendTerm lRepr rRepr signed v =+ case (unsafeLeqProof @1 @l, unsafeLeqProof @1 @r, unsafeLeqProof @l @r) of+ (LeqProof, LeqProof, LeqProof) ->+ withKnownNat lRepr $+ withKnownNat rRepr $+ pevalBVExtendTerm signed (Proxy @r) v++doPevalDefaultBVExtendTerm ::+ forall proxy l r bv.+ ( PEvalBVTerm bv,+ KnownNat l,+ KnownNat r,+ 1 <= l,+ 1 <= r,+ l <= r,+ Typeable bv,+ forall n. (KnownNat n, 1 <= n) => SupportedPrim (bv n)+ ) =>+ Bool ->+ proxy r ->+ Term (bv l) ->+ Maybe (Term (bv r))+doPevalDefaultBVExtendTerm signed p (ConTerm b) =+ Just $ conTerm $ if signed then sizedBVSext p b else sizedBVZext p b+doPevalDefaultBVExtendTerm _ _ b+ | isJust $ sameNat (Proxy @l) (Proxy @r) =+ Just b >>= castTerm+doPevalDefaultBVExtendTerm False pr b =+ case (mkPositiveNatRepr $ r - l) of+ SomePositiveNatRepr (rplRepr :: NatRepr lpr) ->+ Just $+ unsafePevalBVConcatTerm+ rplRepr+ lRepr+ rRepr+ (conTerm $ sizedBVFromIntegral 0)+ b+ where+ lRepr = natRepr @l+ rRepr = natRepr @r+ l = natVal @l (Proxy @l)+ r = natVal @r pr+doPevalDefaultBVExtendTerm True p (BVExtendTerm True _ (b :: Term (bv l1))) =+ case unsafeLeqProof @l1 @r of+ LeqProof -> Just $ pevalBVExtendTerm True p b+doPevalDefaultBVExtendTerm _ _ _ = Nothing++pevalDefaultBVConcatTerm ::+ forall bv a b.+ ( KnownNat a,+ KnownNat b,+ 1 <= a,+ 1 <= b,+ PEvalBVTerm bv,+ forall n. (KnownNat n, 1 <= n) => SupportedPrim (bv n)+ ) =>+ Term (bv a) ->+ Term (bv b) ->+ Term (bv (a + b))+pevalDefaultBVConcatTerm =+ withKnownNat (addNat (natRepr @a) (natRepr @b)) $+ case (unsafeLeqProof @1 @(a + b)) of+ LeqProof ->+ binaryUnfoldOnce doPevalDefaultBVConcatTerm bvConcatTerm++unsafeBVConcatTerm ::+ forall bv n1 n2 r.+ (PEvalBVTerm bv, forall n. (KnownNat n, 1 <= n) => SupportedPrim (bv n)) =>+ NatRepr n1 ->+ NatRepr n2 ->+ NatRepr r ->+ Term (bv n1) ->+ Term (bv n2) ->+ Term (bv r)+unsafeBVConcatTerm n1Repr n2Repr rRepr lhs rhs =+ case ( unsafeAxiom :: (n1 + n2) :~: r,+ unsafeLeqProof @1 @r,+ unsafeLeqProof @1 @n1,+ unsafeLeqProof @1 @n2+ ) of+ (Refl, LeqProof, LeqProof, LeqProof) ->+ withKnownNat n1Repr $+ withKnownNat n2Repr $+ withKnownNat rRepr $+ bvConcatTerm lhs rhs++-- | Unsafe version of `pevalBVConcatTerm`. Use `NatRepr` for the bit-width+-- representations.+unsafePevalBVConcatTerm ::+ forall bv n1 n2 r.+ (PEvalBVTerm bv) =>+ NatRepr n1 ->+ NatRepr n2 ->+ NatRepr r ->+ Term (bv n1) ->+ Term (bv n2) ->+ Term (bv r)+unsafePevalBVConcatTerm n1Repr n2Repr rRepr lhs rhs =+ case ( unsafeAxiom :: (n1 + n2) :~: r,+ unsafeLeqProof @1 @r,+ unsafeLeqProof @1 @n1,+ unsafeLeqProof @1 @n2+ ) of+ (Refl, LeqProof, LeqProof, LeqProof) ->+ withKnownNat n1Repr $+ withKnownNat n2Repr $+ withKnownNat rRepr $+ pevalBVConcatTerm lhs rhs++doPevalDefaultBVConcatTerm ::+ forall bv l r.+ ( KnownNat l,+ KnownNat r,+ KnownNat (l + r),+ 1 <= l,+ 1 <= r,+ 1 <= (l + r),+ PEvalBVTerm bv,+ forall n. (KnownNat n, 1 <= n) => SupportedPrim (bv n)+ ) =>+ Term (bv l) ->+ Term (bv r) ->+ Maybe (Term (bv (l + r)))+-- 1. [c1 c2] -> c1c2+doPevalDefaultBVConcatTerm (ConTerm v) (ConTerm v') =+ withKnownNat (addNat (natRepr @l) (natRepr @r)) $+ Just $+ conTerm $+ sizedBVConcat v v'+-- 2. [c1 (c2 ?)] -> (c1c2 ?)+doPevalDefaultBVConcatTerm+ (ConTerm vl)+ (BVConcatTerm (ConTerm (vrl :: bv rl)) (rr :: Term (bv rr))) =+ case unsafeLeqProof @1 @(l + rl) of+ LeqProof ->+ Just $+ withKnownNat lRlRepr $+ unsafeBVConcatTerm+ lRlRepr+ (natRepr @rr)+ (addNat (natRepr @l) (natRepr @r))+ (conTerm $ sizedBVConcat vl vrl)+ rr+ where+ lRlRepr = addNat (natRepr @l) (natRepr @rl)+-- 3. [c1 (s c2)] -> (c1 (s c2))+doPevalDefaultBVConcatTerm (ConTerm {}) (BVConcatTerm _ ConTerm {}) = Nothing+-- 4. [(c s) ?) -> (c [s ?])+doPevalDefaultBVConcatTerm+ (BVConcatTerm (ll@ConTerm {} :: Term (bv ll)) (lr :: Term (bv lr)))+ r =+ Just $ unsafeBVConcatTerm llRepr lrRRepr lRRepr ll rhs+ where+ llRepr = natRepr @ll+ lrRepr = natRepr @lr+ lRepr = natRepr @l+ rRepr = natRepr @r+ lrRRepr = addNat lrRepr rRepr+ lRRepr = addNat lRepr rRepr+ rhs :: Term (bv (lr + r))+ rhs = unsafePevalBVConcatTerm lrRepr rRepr lrRRepr lr r+-- 5. [? (c1 (s2 c2))] -> (([? c1] s2) c2)+doPevalDefaultBVConcatTerm+ l+ ( BVConcatTerm+ (rl@ConTerm {} :: Term (bv rl))+ (BVConcatTerm (rrl :: Term (bv rrl)) (rrr@ConTerm {} :: Term (bv rrr)))+ ) =+ Just $ unsafeBVConcatTerm lRlRrlRepr rrrRepr lRRepr lRlRrl rrr+ where+ lRepr = natRepr @l+ rlRepr = natRepr @rl+ rrlRepr = natRepr @rrl+ rrrRepr = natRepr @rrr+ lRlRepr = addNat lRepr rlRepr+ rRepr = natRepr @r+ lRRepr = addNat lRepr rRepr+ lRl = unsafePevalBVConcatTerm lRepr rlRepr lRlRepr l rl+ lRlRrlRepr = addNat lRlRepr rrlRepr+ lRlRrl = unsafeBVConcatTerm lRlRepr rrlRepr lRlRrlRepr lRl rrl+-- 6. [(s1 c1) c2] -> (s1 c1c2)+doPevalDefaultBVConcatTerm+ (BVConcatTerm (ll :: Term (bv ll)) ((ConTerm vlr) :: Term (bv lr)))+ (ConTerm vr) =+ Just $ unsafeBVConcatTerm llRepr lrRRepr lRRepr ll rhs+ where+ llRepr = natRepr @ll+ lrRepr = natRepr @lr+ lRepr = natRepr @l+ rRepr = natRepr @r+ lrRRepr = addNat lrRepr rRepr+ lRRepr = addNat lRepr rRepr+ rhs :: Term (bv (lr + r))+ rhs = case unsafeLeqProof @1 @(lr + r) of+ LeqProof ->+ withKnownNat lrRRepr $ conTerm $ sizedBVConcat vlr vr+-- 7. [(s1 c1) (c2 s2)] -> (s1 (c1c2 s2))+doPevalDefaultBVConcatTerm+ (BVConcatTerm (ll :: Term (bv ll)) ((ConTerm vlr) :: Term (bv lr)))+ (BVConcatTerm ((ConTerm vrl) :: Term (bv rl)) (rr :: Term (bv rr))) =+ Just $ unsafeBVConcatTerm llRepr lrRlRrRepr lRRepr ll lrRlRR+ where+ lRepr = natRepr @l+ rRepr = natRepr @r+ llRepr = natRepr @ll+ lrRepr = natRepr @lr+ rlRepr = natRepr @rl+ rrRepr = natRepr @rr+ lRRepr = addNat lRepr rRepr+ lrRlRepr :: NatRepr (lr + rl)+ lrRlRepr = addNat lrRepr rlRepr+ lrRlRrRepr :: NatRepr ((lr + rl) + rr)+ lrRlRrRepr = addNat lrRlRepr rrRepr+ lrRl :: Term (bv (lr + rl))+ lrRl = case unsafeLeqProof @1 @(lr + rl) of+ LeqProof -> withKnownNat lrRlRepr $ conTerm $ sizedBVConcat vlr vrl+ lrRlRR :: Term (bv ((lr + rl) + rr))+ lrRlRR = unsafeBVConcatTerm lrRlRepr rrRepr lrRlRrRepr lrRl rr+-- 8. [?notc (s2 c)] -> ((s1 s2) c)+doPevalDefaultBVConcatTerm+ l+ (BVConcatTerm (rl :: Term (bv rl)) (rr@ConTerm {} :: Term (bv rr))) =+ Just $+ unsafeBVConcatTerm+ lRlRepr+ (natRepr @rr)+ (addNat (natRepr @l) (natRepr @r))+ lhs+ rr+ where+ lRepr = natRepr @l+ rlRepr = natRepr @rl+ lRlRepr = addNat lRepr rlRepr+ lhs :: Term (bv (l + rl))+ lhs = unsafeBVConcatTerm lRepr rlRepr lRlRepr l rl+doPevalDefaultBVConcatTerm+ (BVSelectTerm ix0 (_ :: p w0) (bv0 :: Term (bv n)))+ (BVSelectTerm (ix1 :: p ix1) (w1 :: p w1) (DynTerm (bv1 :: Term (bv n))))+ | ix1v + w1v == ix0v && bv0 == bv1 =+ Just $ unsafePevalBVSelectTerm nRepr ix1Repr (addNat w0Repr w1Repr) bv0+ where+ nRepr = natRepr @n+ w1v = natVal w1+ ix0v = natVal ix0+ ix1v = natVal ix1+ ix1Repr = natRepr @ix1+ w0Repr = natRepr @w0+ w1Repr = natRepr @w1+doPevalDefaultBVConcatTerm _ _ = Nothing++instance PEvalBVTerm WordN where+ pevalBVSelectTerm = pevalDefaultBVSelectTerm @IntN+ pevalBVConcatTerm = pevalDefaultBVConcatTerm+ pevalBVExtendTerm = pevalDefaultBVExtendTerm+ sbvBVConcatTerm pl pr l r =+ bvIsNonZeroFromGEq1 pl $+ bvIsNonZeroFromGEq1 pr $+ l SBV.# r+ sbvBVSelectTerm (pix :: p0 ix) (pw :: p1 w) (pn :: p2 n) bv =+ bvIsNonZeroFromGEq1 (Proxy @n) $+ bvIsNonZeroFromGEq1 (Proxy @w) $+ sbvDefaultBVSelectTerm pix pw pn bv+ sbvBVExtendTerm (_ :: p0 l) (_ :: p1 r) signed bv =+ withKnownProof+ (unsafeKnownProof @(r - l) (natVal (Proxy @r) - natVal (Proxy @l)))+ $ case (unsafeLeqProof @(l + 1) @r, unsafeLeqProof @1 @(r - l)) of+ (LeqProof, LeqProof) ->+ bvIsNonZeroFromGEq1 (Proxy @r) $+ bvIsNonZeroFromGEq1 (Proxy @l) $+ bvIsNonZeroFromGEq1 (Proxy @(r - l)) $+ if signed then SBV.signExtend bv else SBV.zeroExtend bv++instance PEvalBVTerm IntN where+ pevalBVSelectTerm = pevalDefaultBVSelectTerm @WordN+ pevalBVConcatTerm = pevalDefaultBVConcatTerm+ pevalBVExtendTerm = pevalDefaultBVExtendTerm+ sbvBVConcatTerm (pl :: p l) (pr :: q r) l r =+ bvIsNonZeroFromGEq1 pl $+ bvIsNonZeroFromGEq1 pr $+ withKnownNat (addNat (natRepr @l) (natRepr @r)) $+ case unsafeLeqProof @1 @(l + r) of+ LeqProof ->+ bvIsNonZeroFromGEq1 (Proxy @(l + r)) $+ sbvBitCast @(WordN (l + r)) @(IntN (l + r)) $+ (sbvBitCast @(IntN l) @(WordN l) l)+ SBV.# (sbvBitCast @(IntN r) @(WordN r) r)+ sbvBVSelectTerm (pix :: p0 ix) (pw :: p1 w) (pn :: p2 n) bv =+ bvIsNonZeroFromGEq1 (Proxy @n) $+ bvIsNonZeroFromGEq1 (Proxy @w) $+ sbvDefaultBVSelectTerm pix pw pn bv+ sbvBVExtendTerm (_ :: p0 l) (_ :: p1 r) signed bv =+ withKnownProof+ (unsafeKnownProof @(r - l) (natVal (Proxy @r) - natVal (Proxy @l)))+ $ case (unsafeLeqProof @(l + 1) @r, unsafeLeqProof @1 @(r - l)) of+ (LeqProof, LeqProof) ->+ bvIsNonZeroFromGEq1 (Proxy @r) $+ bvIsNonZeroFromGEq1 (Proxy @l) $+ bvIsNonZeroFromGEq1 (Proxy @(r - l)) $+ if signed+ then SBV.signExtend bv+ else+ SBV.sFromIntegral+ ( SBV.zeroExtend+ (SBV.sFromIntegral bv :: SBV.SBV (SBV.WordN l)) ::+ SBV.SBV (SBV.WordN r)+ )++sbvDefaultBVSelectTerm ::+ ( KnownNat ix,+ KnownNat w,+ KnownNat n,+ 1 <= n,+ 1 <= w,+ (ix + w) <= n,+ SBV.SymVal (bv n)+ ) =>+ p1 ix ->+ p2 w ->+ p3 n ->+ SBV.SBV (bv n) ->+ SBV.SBV (bv w)+sbvDefaultBVSelectTerm (_ :: p0 ix) (_ :: p1 w) (_ :: p2 n) bv =+ withKnownProof+ ( unsafeKnownProof @(w + ix - 1)+ (natVal (Proxy @w) + natVal (Proxy @ix) - 1)+ )+ $ case ( unsafeAxiom @(w + ix - 1 - ix + 1) @w,+ unsafeLeqProof @(((w + ix) - 1) + 1) @n,+ unsafeLeqProof @ix @(w + ix - 1)+ ) of+ (Refl, LeqProof, LeqProof) ->+ bvIsNonZeroFromGEq1 (Proxy @n) $+ bvIsNonZeroFromGEq1 (Proxy @w) $+ SBV.bvExtract (Proxy @(w + ix - 1)) (Proxy @ix) bv++doPevalBitCastSameType ::+ forall x b. (SupportedPrim b) => Term x -> Maybe (Term b)+doPevalBitCastSameType (BitCastTerm (DynTerm (b :: Term b))) = Just b+doPevalBitCastSameType (BitCastTerm x) = doPevalBitCastSameType x+doPevalBitCastSameType _ = Nothing++-- | Partially evaluate a bitcast term. If no reduction is performed, return+-- Nothing.+doPevalBitCast :: (PEvalBitCastTerm a b, SupportedPrim b) => Term a -> Maybe (Term b)+doPevalBitCast (ConTerm v) = Just $ conTerm $ bitCast v+doPevalBitCast t = doPevalBitCastSameType t++instance (KnownNat n, 1 <= n) => PEvalBitCastTerm (WordN n) (IntN n) where+ pevalBitCastTerm = unaryUnfoldOnce doPevalBitCastBV bitCastTerm+ where+ doPevalBitCastBV :: Term (WordN n) -> Maybe (Term (IntN n))+ doPevalBitCastBV+ (BVConcatTerm (l :: Term (WordN l)) (r :: Term (WordN r))) =+ Just $+ pevalBVConcatTerm+ (pevalBitCastTerm @(WordN l) @(IntN l) l)+ (pevalBitCastTerm @(WordN r) @(IntN r) r)+ doPevalBitCastBV (BVExtendTerm signed pr (b :: Term (WordN l))) =+ Just $+ pevalBVExtendTerm signed pr $+ pevalBitCastTerm @(WordN l) @(IntN l) b+ doPevalBitCastBV v = doPevalBitCast v+ sbvBitCast = bvIsNonZeroFromGEq1 (Proxy @n) SBV.sFromIntegral++instance (KnownNat n, 1 <= n) => PEvalBitCastTerm (IntN n) (WordN n) where+ pevalBitCastTerm = unaryUnfoldOnce doPevalBitCastBV bitCastTerm+ where+ doPevalBitCastBV :: Term (IntN n) -> Maybe (Term (WordN n))+ doPevalBitCastBV+ (BVConcatTerm (l :: Term (IntN l)) (r :: Term (IntN r))) =+ Just $+ pevalBVConcatTerm+ (pevalBitCastTerm @(IntN l) @(WordN l) l)+ (pevalBitCastTerm @(IntN r) @(WordN r) r)+ doPevalBitCastBV (BVExtendTerm signed pr (b :: Term (IntN l))) =+ Just $+ pevalBVExtendTerm signed pr $+ pevalBitCastTerm @(IntN l) @(WordN l) b+ doPevalBitCastBV v = doPevalBitCast v+ sbvBitCast = bvIsNonZeroFromGEq1 (Proxy @n) SBV.sFromIntegral++-- Num++-- | Default partial evaluation of addition of numerical terms.+pevalDefaultAddNumTerm :: (PEvalNumTerm a, Eq a) => Term a -> Term a -> Term a+pevalDefaultAddNumTerm l@SupportedTerm r =+ binaryUnfoldOnce+ doPevalDefaultAddNumTerm+ (\a b -> normalizeAddNum $ addNumTerm a b)+ l+ r++doPevalDefaultAddNumTerm ::+ (PEvalNumTerm a, Eq a) => Term a -> Term a -> Maybe (Term a)+doPevalDefaultAddNumTerm (ConTerm a) (ConTerm b) = Just $ conTerm $ a + b+doPevalDefaultAddNumTerm l@(ConTerm a) b = case (a, b) of+ (0, k) -> Just k+ (l1, AddNumTerm (ConTerm j) k) ->+ Just $ pevalAddNumTerm (conTerm $ l1 + j) k+ _ -> doPevalDefaultAddNumTermNoCon l b+doPevalDefaultAddNumTerm a r@(ConTerm {}) = doPevalDefaultAddNumTerm r a+doPevalDefaultAddNumTerm l r = doPevalDefaultAddNumTermNoCon l r++doPevalDefaultAddNumTermNoCon ::+ (PEvalNumTerm a) => Term a -> Term a -> Maybe (Term a)+doPevalDefaultAddNumTermNoCon (AddNumTerm i@ConTerm {} j) k =+ Just $ pevalAddNumTerm i $ pevalAddNumTerm j k+doPevalDefaultAddNumTermNoCon i (AddNumTerm j@ConTerm {} k) =+ Just $ pevalAddNumTerm j $ pevalAddNumTerm i k+doPevalDefaultAddNumTermNoCon (NegNumTerm i) (NegNumTerm j) =+ Just $ pevalNegNumTerm $ pevalAddNumTerm i j+doPevalDefaultAddNumTermNoCon+ (MulNumTerm (ConTerm i) j)+ (MulNumTerm (ConTerm k) l)+ | j == l = Just $ pevalMulNumTerm (conTerm $ i + k) j+doPevalDefaultAddNumTermNoCon+ (MulNumTerm i@ConTerm {} j)+ (MulNumTerm k@(ConTerm {}) l)+ | i == k = Just $ pevalMulNumTerm i (pevalAddNumTerm j l)+doPevalDefaultAddNumTermNoCon _ _ = Nothing++normalizeAddNum :: (PEvalNumTerm a) => Term a -> Term a+normalizeAddNum (AddNumTerm l r@(ConTerm {})) = addNumTerm r l+normalizeAddNum v = v++-- | Default partial evaluation of negation of numerical terms.+pevalDefaultNegNumTerm :: (PEvalNumTerm a, Eq a) => Term a -> Term a+pevalDefaultNegNumTerm l@SupportedTerm =+ unaryUnfoldOnce doPevalDefaultNegNumTerm negNumTerm l++doPevalDefaultNegNumTerm :: (PEvalNumTerm a) => Term a -> Maybe (Term a)+doPevalDefaultNegNumTerm (ConTerm a) = Just $ conTerm $ -a+doPevalDefaultNegNumTerm (NegNumTerm v) = Just v+doPevalDefaultNegNumTerm (AddNumTerm (ConTerm l) r) =+ Just $ pevalSubNumTerm (conTerm $ -l) r+doPevalDefaultNegNumTerm (AddNumTerm (NegNumTerm l) r) =+ Just $ pevalAddNumTerm l (pevalNegNumTerm r)+doPevalDefaultNegNumTerm (AddNumTerm l (NegNumTerm r)) =+ Just $ pevalAddNumTerm (pevalNegNumTerm l) r+doPevalDefaultNegNumTerm (MulNumTerm (ConTerm l) r) =+ Just $ pevalMulNumTerm (conTerm $ -l) r+doPevalDefaultNegNumTerm (MulNumTerm (NegNumTerm {}) _) =+ error "Should not happen"+doPevalDefaultNegNumTerm (MulNumTerm _ (NegNumTerm {})) =+ error "Should not happen"+doPevalDefaultNegNumTerm (AddNumTerm _ ConTerm {}) = error "Should not happen"+doPevalDefaultNegNumTerm _ = Nothing++-- Mul++-- | Default partial evaluation of multiplication of numerical terms.+pevalDefaultMulNumTerm :: (PEvalNumTerm a, Eq a) => Term a -> Term a -> Term a+pevalDefaultMulNumTerm l@SupportedTerm r =+ binaryUnfoldOnce+ doPevalDefaultMulNumTerm+ (\a b -> normalizeMulNum $ mulNumTerm a b)+ l+ r++normalizeMulNum :: (PEvalNumTerm a) => Term a -> Term a+normalizeMulNum (MulNumTerm l r@(ConTerm {})) = mulNumTerm r l+normalizeMulNum v = v++doPevalDefaultMulNumTerm ::+ (PEvalNumTerm a, Eq a) => Term a -> Term a -> Maybe (Term a)+doPevalDefaultMulNumTerm (ConTerm a) (ConTerm b) =+ Just $ conTerm $ a * b+doPevalDefaultMulNumTerm l@(ConTerm a) b = case (a, b) of+ (0, _) -> Just $ conTerm 0+ (1, k) -> Just k+ (-1, k) -> Just $ pevalNegNumTerm k+ (l1, MulNumTerm (ConTerm j) k) ->+ Just $ pevalMulNumTerm (conTerm $ l1 * j) k+ (l1, AddNumTerm (ConTerm j) k) ->+ Just $ pevalAddNumTerm (conTerm $ l1 * j) (pevalMulNumTerm (conTerm l1) k)+ (l1, NegNumTerm j) -> Just (pevalMulNumTerm (conTerm $ -l1) j)+ (_, MulNumTerm _ ConTerm {}) -> error "Should not happen"+ (_, AddNumTerm _ ConTerm {}) -> error "Should not happen"+ _ -> doPevalDefaultMulNumTermNoCon l b+doPevalDefaultMulNumTerm a r@(ConTerm {}) = doPevalDefaultMulNumTerm r a+doPevalDefaultMulNumTerm l r = doPevalDefaultMulNumTermNoCon l r++doPevalDefaultMulNumTermNoCon ::+ (PEvalNumTerm a) => Term a -> Term a -> Maybe (Term a)+doPevalDefaultMulNumTermNoCon (MulNumTerm i@ConTerm {} j) k =+ Just $ pevalMulNumTerm i $ pevalMulNumTerm j k+doPevalDefaultMulNumTermNoCon i (MulNumTerm j@ConTerm {} k) =+ Just $ pevalMulNumTerm j $ pevalMulNumTerm i k+doPevalDefaultMulNumTermNoCon (NegNumTerm i) j =+ Just $ pevalNegNumTerm $ pevalMulNumTerm i j+doPevalDefaultMulNumTermNoCon i (NegNumTerm j) =+ Just $ pevalNegNumTerm $ pevalMulNumTerm i j+doPevalDefaultMulNumTermNoCon i j@ConTerm {} = Just $ pevalMulNumTerm j i+doPevalDefaultMulNumTermNoCon (MulNumTerm _ ConTerm {}) _ =+ error "Should not happen"+doPevalDefaultMulNumTermNoCon _ (MulNumTerm _ ConTerm {}) =+ error "Should not happen"+doPevalDefaultMulNumTermNoCon _ _ = Nothing++-- Abs++-- | Default partial evaluation of absolute value of finite-bit numerical terms.+pevalBitsAbsNumTerm :: (PEvalNumTerm a, Bits a) => Term a -> Term a+pevalBitsAbsNumTerm l@SupportedTerm =+ unaryUnfoldOnce doPevalBitsAbsNumTerm absNumTerm l++doPevalGeneralAbsNumTerm :: (PEvalNumTerm a) => Term a -> Maybe (Term a)+doPevalGeneralAbsNumTerm (ConTerm a) = Just $ conTerm $ abs a+doPevalGeneralAbsNumTerm (NegNumTerm v) = Just $ pevalAbsNumTerm v+doPevalGeneralAbsNumTerm t@(AbsNumTerm {}) = Just t+doPevalGeneralAbsNumTerm _ = Nothing++doPevalBitsAbsNumTerm ::+ forall a. (PEvalNumTerm a, Bits a) => Term a -> Maybe (Term a)+doPevalBitsAbsNumTerm t =+ msum+ [ if isSigned (undefined :: a) then Nothing else Just t,+ doPevalGeneralAbsNumTerm t+ ]++-- | Partial evaluation of absolute value of numerical terms that does not+-- overflow.+doPevalNoOverflowAbsNumTerm :: (PEvalNumTerm a) => Term a -> Maybe (Term a)+doPevalNoOverflowAbsNumTerm t =+ msum+ [ doPevalGeneralAbsNumTerm t,+ case t of+ MulNumTerm l r ->+ Just $ pevalMulNumTerm (pevalAbsNumTerm l) $ pevalAbsNumTerm r+ _ -> Nothing+ ]++-- Signum++-- | Default partial evaluation of signum of numerical terms.+pevalGeneralSignumNumTerm :: (PEvalNumTerm a) => Term a -> Term a+pevalGeneralSignumNumTerm l@SupportedTerm =+ unaryUnfoldOnce doPevalGeneralSignumNumTerm signumNumTerm l++doPevalGeneralSignumNumTerm :: (PEvalNumTerm a) => Term a -> Maybe (Term a)+doPevalGeneralSignumNumTerm (ConTerm a) = Just $ conTerm $ signum a+doPevalGeneralSignumNumTerm _ = Nothing++-- | Partial evaluation of signum of numerical terms that does not overflow.+doPevalNoOverflowSignumNumTerm :: (PEvalNumTerm a) => Term a -> Maybe (Term a)+doPevalNoOverflowSignumNumTerm t =+ msum+ [ doPevalGeneralSignumNumTerm t,+ case t of+ NegNumTerm v -> Just $ pevalNegNumTerm $ pevalSignumNumTerm v+ MulNumTerm l r ->+ Just $+ pevalMulNumTerm (pevalSignumNumTerm l) $+ pevalSignumNumTerm r+ _ -> Nothing+ ]++instance (KnownNat n, 1 <= n) => PEvalNumTerm (WordN n) where+ pevalAddNumTerm = pevalDefaultAddNumTerm+ pevalNegNumTerm = pevalDefaultNegNumTerm+ pevalMulNumTerm = pevalDefaultMulNumTerm+ pevalAbsNumTerm = pevalBitsAbsNumTerm+ pevalSignumNumTerm = pevalGeneralSignumNumTerm+ withSbvNumTermConstraint r = withPrim @(WordN n) r++instance (KnownNat n, 1 <= n) => PEvalNumTerm (IntN n) where+ pevalAddNumTerm = pevalDefaultAddNumTerm+ pevalNegNumTerm = pevalDefaultNegNumTerm+ pevalMulNumTerm = pevalDefaultMulNumTerm+ pevalAbsNumTerm = pevalBitsAbsNumTerm+ pevalSignumNumTerm = pevalGeneralSignumNumTerm+ withSbvNumTermConstraint r = withPrim @(IntN n) r++-- Partial evaluation++-- | A partial function from a to b.+type PartialFun a b = a -> Maybe b++-- | A partial rule for unary operations.+type PartialRuleUnary a b = PartialFun (Term a) (Term b)++-- | A total rule for unary operations.+type TotalRuleUnary a b = Term a -> Term b++-- | A partial rule for binary operations.+type PartialRuleBinary a b c = Term a -> PartialFun (Term b) (Term c)++-- | A total rule for binary operations.+type TotalRuleBinary a b c = Term a -> Term b -> Term c++-- | Totalize a partial function with a fallback function.+totalize :: PartialFun a b -> (a -> b) -> a -> b+totalize partial fallback a =+ case partial a of+ Just b -> b+ Nothing -> fallback a++-- | Totalize a binary partial function with a fallback function.+totalize2 :: (a -> PartialFun b c) -> (a -> b -> c) -> a -> b -> c+totalize2 partial fallback a b =+ case partial a b of+ Just c -> c+ Nothing -> fallback a b++-- | A strategy for partially evaluating unary operations.+class UnaryPartialStrategy tag a b | tag a -> b where+ extractor :: tag -> Term a -> Maybe a+ constantHandler :: tag -> a -> Maybe (Term b)+ nonConstantHandler :: tag -> Term a -> Maybe (Term b)++-- | Partially evaluate a unary operation.+unaryPartial :: forall tag a b. (UnaryPartialStrategy tag a b) => tag -> PartialRuleUnary a b+unaryPartial tag a = case extractor tag a of+ Nothing -> nonConstantHandler tag a+ Just a' -> constantHandler tag a'++-- | A strategy for partially evaluating commutative binary operations.+class BinaryCommPartialStrategy tag a c | tag a -> c where+ singleConstantHandler :: tag -> a -> Term a -> Maybe (Term c)++-- | A strategy for partially evaluating operations.+class BinaryPartialStrategy tag a b c | tag a b -> c where+ extractora :: tag -> Term a -> Maybe a+ extractorb :: tag -> Term b -> Maybe b+ allConstantHandler :: tag -> a -> b -> Maybe (Term c)+ leftConstantHandler :: tag -> a -> Term b -> Maybe (Term c)+ default leftConstantHandler :: (a ~ b, BinaryCommPartialStrategy tag a c) => tag -> a -> Term b -> Maybe (Term c)+ leftConstantHandler = singleConstantHandler @tag @a+ rightConstantHandler :: tag -> Term a -> b -> Maybe (Term c)+ default rightConstantHandler :: (a ~ b, BinaryCommPartialStrategy tag a c) => tag -> Term a -> b -> Maybe (Term c)+ rightConstantHandler tag = flip $ singleConstantHandler @tag @a tag+ nonBinaryConstantHandler :: tag -> Term a -> Term b -> Maybe (Term c)++-- | Partially evaluate a binary operation.+binaryPartial :: forall tag a b c. (BinaryPartialStrategy tag a b c) => tag -> PartialRuleBinary a b c+binaryPartial tag a b = case (extractora @tag @a @b @c tag a, extractorb @tag @a @b @c tag b) of+ (Nothing, Nothing) -> nonBinaryConstantHandler @tag @a @b @c tag a b+ (Just a', Nothing) ->+ leftConstantHandler @tag @a @b @c tag a' b+ `catchError` \_ -> nonBinaryConstantHandler @tag @a @b @c tag a b+ (Nothing, Just b') ->+ rightConstantHandler @tag @a @b @c tag a b'+ `catchError` \_ -> nonBinaryConstantHandler @tag @a @b @c tag a b+ (Just a', Just b') ->+ allConstantHandler @tag @a @b @c tag a' b'++unaryPartialUnfoldOnce ::+ forall a b.+ (SupportedPrim b) =>+ PartialRuleUnary a b ->+ TotalRuleUnary a b ->+ PartialRuleUnary a b+unaryPartialUnfoldOnce partial fallback = ret+ where+ oneLevel :: TotalRuleUnary a b -> PartialRuleUnary a b+ oneLevel fallback' x = case (x, partial x) of+ (ITETerm cond vt vf, pr) ->+ let pt = partial vt+ pf = partial vf+ in case (pt, pf) of+ (Nothing, Nothing) -> pr+ (mt, mf) ->+ pevalITETerm cond+ <$> catchError mt (\_ -> Just $ totalize (oneLevel fallback') fallback' vt)+ <*> catchError mf (\_ -> Just $ totalize (oneLevel fallback') fallback vf)+ (_, pr) -> pr+ ret :: PartialRuleUnary a b+ ret = oneLevel (totalize @(Term a) @(Term b) partial fallback)++-- | Unfold a unary operation once.+unaryUnfoldOnce ::+ forall a b.+ (SupportedPrim b) =>+ PartialRuleUnary a b ->+ TotalRuleUnary a b ->+ TotalRuleUnary a b+unaryUnfoldOnce partial fallback = totalize (unaryPartialUnfoldOnce partial fallback) fallback++binaryPartialUnfoldOnce ::+ forall a b c.+ (SupportedPrim c) =>+ PartialRuleBinary a b c ->+ TotalRuleBinary a b c ->+ PartialRuleBinary a b c+binaryPartialUnfoldOnce partial fallback = ret+ where+ oneLevel :: PartialRuleBinary x y c -> TotalRuleBinary x y c -> PartialRuleBinary x y c+ oneLevel partial' fallback' x y =+ catchError+ (partial' x y)+ ( \_ ->+ case (x, y) of+ (ITETerm _ ITETerm {} _, ITETerm {}) -> Nothing+ (ITETerm _ _ ITETerm {}, ITETerm {}) -> Nothing+ (ITETerm {}, ITETerm _ ITETerm {} _) -> Nothing+ (ITETerm {}, ITETerm _ _ ITETerm {}) -> Nothing+ (ITETerm cond vt vf, _) ->+ left cond vt vf y partial' fallback'+ (_, ITETerm cond vt vf) ->+ left cond vt vf x (flip partial') (flip fallback')+ _ -> Nothing+ )+ left ::+ Term Bool ->+ Term x ->+ Term x ->+ Term y ->+ PartialRuleBinary x y c ->+ TotalRuleBinary x y c ->+ Maybe (Term c)+ left cond vt vf y partial' fallback' =+ let pt = partial' vt y+ pf = partial' vf y+ in case (pt, pf) of+ (Nothing, Nothing) -> Nothing+ (mt, mf) ->+ pevalITETerm cond+ <$> catchError mt (\_ -> Just $ totalize2 (oneLevel partial' fallback') fallback' vt y)+ <*> catchError mf (\_ -> Just $ totalize2 (oneLevel partial' fallback') fallback' vf y)+ ret :: PartialRuleBinary a b c+ ret = oneLevel partial (totalize2 @(Term a) @(Term b) @(Term c) partial fallback)++-- | Unfold a binary operation once.+binaryUnfoldOnce ::+ forall a b c.+ (SupportedPrim c) =>+ PartialRuleBinary a b c ->+ TotalRuleBinary a b c ->+ TotalRuleBinary a b c+binaryUnfoldOnce partial fallback = totalize2 (binaryPartialUnfoldOnce partial fallback) fallback++-- | Unfold a unary operation once.+generalUnaryUnfolded ::+ forall a b.+ (Typeable a, SupportedPrim b) =>+ (a -> b) ->+ (Term a -> Term b) ->+ Term a ->+ Term b+generalUnaryUnfolded compute =+ unaryUnfoldOnce+ ( \case+ ConTerm lv -> Just $ conTerm $ compute lv+ _ -> Nothing+ )++-- | Unfold a binary operation once.+generalBinaryUnfolded ::+ forall a b c.+ (Typeable a, Typeable b, SupportedPrim c) =>+ (a -> b -> c) ->+ (Term a -> Term b -> Term c) ->+ Term a ->+ Term b ->+ Term c+generalBinaryUnfolded compute =+ binaryUnfoldOnce+ ( \l r -> case (l, r) of+ (ConTerm lv, ConTerm rv) -> Just $ conTerm $ compute lv rv+ _ -> Nothing+ )
src/Grisette/Internal/SymPrim/Prim/Internal/Unfold.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE LambdaCase #-}+{-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-}@@ -31,8 +32,10 @@ ) import Grisette.Internal.SymPrim.Prim.Internal.Term ( SupportedPrim (pevalITETerm),- Term (ConTerm, ITETerm),+ Term, conTerm,+ pattern ConTerm,+ pattern ITETerm, ) unaryPartialUnfoldOnce ::@@ -45,7 +48,7 @@ where oneLevel :: TotalRuleUnary a b -> PartialRuleUnary a b oneLevel fallback' x = case (x, partial x) of- (ITETerm _ _ _ _ cond vt vf, pr) ->+ (ITETerm cond vt vf, pr) -> let pt = partial vt pf = partial vf in case (pt, pf) of@@ -81,13 +84,13 @@ (partial' x y) ( \_ -> case (x, y) of- (ITETerm _ _ _ _ _ ITETerm {} _, ITETerm {}) -> Nothing- (ITETerm _ _ _ _ _ _ ITETerm {}, ITETerm {}) -> Nothing- (ITETerm {}, ITETerm _ _ _ _ _ ITETerm {} _) -> Nothing- (ITETerm {}, ITETerm _ _ _ _ _ _ ITETerm {}) -> Nothing- (ITETerm _ _ _ _ cond vt vf, _) ->+ (ITETerm _ ITETerm {} _, ITETerm {}) -> Nothing+ (ITETerm _ _ ITETerm {}, ITETerm {}) -> Nothing+ (ITETerm {}, ITETerm _ ITETerm {} _) -> Nothing+ (ITETerm {}, ITETerm _ _ ITETerm {}) -> Nothing+ (ITETerm cond vt vf, _) -> left cond vt vf y partial' fallback'- (_, ITETerm _ _ _ _ cond vt vf) ->+ (_, ITETerm cond vt vf) -> left cond vt vf x (flip partial') (flip fallback') _ -> Nothing )@@ -131,7 +134,7 @@ generalUnaryUnfolded compute = unaryUnfoldOnce ( \case- ConTerm _ _ _ _ lv -> Just $ conTerm $ compute lv+ ConTerm lv -> Just $ conTerm $ compute lv _ -> Nothing ) @@ -147,6 +150,6 @@ generalBinaryUnfolded compute = binaryUnfoldOnce ( \l r -> case (l, r) of- (ConTerm _ _ _ _ lv, ConTerm _ _ _ _ rv) -> Just $ conTerm $ compute lv rv+ (ConTerm lv, ConTerm rv) -> Just $ conTerm $ compute lv rv _ -> Nothing )
src/Grisette/Internal/SymPrim/Prim/Model.hs view
@@ -9,6 +9,7 @@ {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE InstanceSigs #-} {-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-}@@ -90,7 +91,7 @@ symTerm, toModelValue, unsafeFromModelValue,- withSymbolSupported,+ pattern SupportedTypedSymbol, ) import Language.Haskell.TH.Syntax (Lift) @@ -179,7 +180,7 @@ -- | Given a typed symbol and a model, return the equation (symbol = value) -- encoded in the model. equation :: TypedAnySymbol a -> Model -> Maybe (Term Bool)-equation tsym m = withSymbolSupported tsym $+equation tsym@SupportedTypedSymbol m = case valueOf tsym m of Just v -> Just $ pevalEqTerm (symTerm tsym) (conTerm v) Nothing -> Nothing@@ -363,10 +364,8 @@ emptyModel = Model M.empty isEmptyModel (Model m) = M.null m valueOf :: forall t. TypedAnySymbol t -> Model -> Maybe t- valueOf sym (Model m) =- withSymbolSupported sym $- (unsafeFromModelValue @t)- <$> M.lookup (someTypedSymbol sym) m+ valueOf sym@SupportedTypedSymbol (Model m) =+ (unsafeFromModelValue @t) <$> M.lookup (someTypedSymbol sym) m modelContains sym (Model m) = M.member (someTypedSymbol sym) m exceptFor (SymbolSet s) (Model m) = Model $ S.foldl' (flip M.delete) m s exceptFor' s (Model m) = Model $ M.delete (someTypedSymbol s) m@@ -382,16 +381,16 @@ extendTo (SymbolSet s) (Model m) = Model $ S.foldl'- ( \acc sym@(SomeTypedSymbol (tsym :: TypedAnySymbol t)) -> case M.lookup sym acc of- Just _ -> acc- Nothing -> withSymbolSupported tsym $ M.insert sym (defaultValueDynamic (Proxy @t)) acc+ ( \acc+ sym@(SomeTypedSymbol (SupportedTypedSymbol :: TypedAnySymbol t)) ->+ case M.lookup sym acc of+ Just _ -> acc+ Nothing -> M.insert sym (defaultValueDynamic (Proxy @t)) acc ) m s- insertValue sym (v :: t) (Model m) =- withSymbolSupported sym $- Model $- M.insert (someTypedSymbol sym) (toModelValue v) m+ insertValue sym@SupportedTypedSymbol (v :: t) (Model m) =+ Model $ M.insert (someTypedSymbol sym) (toModelValue v) m -- | Evaluate a term in the given model. evalTerm ::@@ -403,15 +402,14 @@ Term a evalTerm fillDefault (Model ma) = generalSubstSomeTerm- ( \(sym :: TypedSymbol 'AnyKind a) ->- withSymbolSupported sym $- case (M.lookup (someTypedSymbol sym) ma) of- Nothing ->- if fillDefault- then conTerm (defaultValue @a)- else symTerm sym- Just dy ->- conTerm (unsafeFromModelValue @a dy)+ ( \(sym@SupportedTypedSymbol :: TypedSymbol 'AnyKind a) ->+ case (M.lookup (someTypedSymbol sym) ma) of+ Nothing ->+ if fillDefault+ then conTerm (defaultValue @a)+ else symTerm sym+ Just dy ->+ conTerm (unsafeFromModelValue @a dy) ) -- |
+ src/Grisette/Internal/SymPrim/Prim/Pattern.hs view
@@ -0,0 +1,132 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE ViewPatterns #-}++-- |+-- Module : Grisette.Internal.SymPrim.Prim.Pattern+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.SymPrim.Prim.Pattern+ ( pattern SubTerms,+ )+where++import Data.Foldable (Foldable (toList))+import Grisette.Internal.SymPrim.Prim.Internal.Term+ ( Term,+ pattern AbsNumTerm,+ pattern AddNumTerm,+ pattern AndBitsTerm,+ pattern AndTerm,+ pattern ApplyTerm,+ pattern BVConcatTerm,+ pattern BVExtendTerm,+ pattern BVSelectTerm,+ pattern BitCastOrTerm,+ pattern BitCastTerm,+ pattern ComplementBitsTerm,+ pattern ConTerm,+ pattern DistinctTerm,+ pattern DivIntegralTerm,+ pattern EqTerm,+ pattern ExistsTerm,+ pattern FPBinaryTerm,+ pattern FPFMATerm,+ pattern FPRoundingBinaryTerm,+ pattern FPRoundingUnaryTerm,+ pattern FPTraitTerm,+ pattern FPUnaryTerm,+ pattern FdivTerm,+ pattern FloatingUnaryTerm,+ pattern ForallTerm,+ pattern FromFPOrTerm,+ pattern FromIntegralTerm,+ pattern ITETerm,+ pattern LeOrdTerm,+ pattern LtOrdTerm,+ pattern ModIntegralTerm,+ pattern MulNumTerm,+ pattern NegNumTerm,+ pattern NotTerm,+ pattern OrBitsTerm,+ pattern OrTerm,+ pattern PowerTerm,+ pattern QuotIntegralTerm,+ pattern RecipTerm,+ pattern RemIntegralTerm,+ pattern RotateLeftTerm,+ pattern RotateRightTerm,+ pattern ShiftLeftTerm,+ pattern ShiftRightTerm,+ pattern SignumNumTerm,+ pattern SymTerm,+ pattern ToFPTerm,+ pattern XorBitsTerm,+ )+import Grisette.Internal.SymPrim.Prim.SomeTerm (SomeTerm (SomeTerm))++subTermsViewPattern :: Term a -> Maybe [SomeTerm]+subTermsViewPattern (ConTerm _) = return []+subTermsViewPattern (SymTerm _) = return []+subTermsViewPattern (ForallTerm _ t) = return [SomeTerm t]+subTermsViewPattern (ExistsTerm _ t) = return [SomeTerm t]+subTermsViewPattern (NotTerm t) = return [SomeTerm t]+subTermsViewPattern (OrTerm t1 t2) = return [SomeTerm t1, SomeTerm t2]+subTermsViewPattern (AndTerm t1 t2) = return [SomeTerm t1, SomeTerm t2]+subTermsViewPattern (EqTerm t1 t2) = return [SomeTerm t1, SomeTerm t2]+subTermsViewPattern (DistinctTerm t) = return (SomeTerm <$> toList t)+subTermsViewPattern (ITETerm t1 t2 t3) =+ return [SomeTerm t1, SomeTerm t2, SomeTerm t3]+subTermsViewPattern (AddNumTerm t1 t2) = return [SomeTerm t1, SomeTerm t2]+subTermsViewPattern (NegNumTerm t) = return [SomeTerm t]+subTermsViewPattern (MulNumTerm t1 t2) = return [SomeTerm t1, SomeTerm t2]+subTermsViewPattern (AbsNumTerm t) = return [SomeTerm t]+subTermsViewPattern (SignumNumTerm t) = return [SomeTerm t]+subTermsViewPattern (LtOrdTerm t1 t2) = return [SomeTerm t1, SomeTerm t2]+subTermsViewPattern (LeOrdTerm t1 t2) = return [SomeTerm t1, SomeTerm t2]+subTermsViewPattern (AndBitsTerm t1 t2) = return [SomeTerm t1, SomeTerm t2]+subTermsViewPattern (OrBitsTerm t1 t2) = return [SomeTerm t1, SomeTerm t2]+subTermsViewPattern (XorBitsTerm t1 t2) = return [SomeTerm t1, SomeTerm t2]+subTermsViewPattern (ComplementBitsTerm t) = return [SomeTerm t]+subTermsViewPattern (ShiftLeftTerm t1 t2) = return [SomeTerm t1, SomeTerm t2]+subTermsViewPattern (ShiftRightTerm t1 t2) = return [SomeTerm t1, SomeTerm t2]+subTermsViewPattern (RotateLeftTerm t1 t2) = return [SomeTerm t1, SomeTerm t2]+subTermsViewPattern (RotateRightTerm t1 t2) = return [SomeTerm t1, SomeTerm t2]+subTermsViewPattern (BitCastTerm t1) = return [SomeTerm t1]+subTermsViewPattern (BitCastOrTerm t1 t2) = return [SomeTerm t1, SomeTerm t2]+subTermsViewPattern (BVConcatTerm t1 t2) = return [SomeTerm t1, SomeTerm t2]+subTermsViewPattern (BVSelectTerm _ _ t1) = return [SomeTerm t1]+subTermsViewPattern (BVExtendTerm _ _ t1) = return [SomeTerm t1]+subTermsViewPattern (ApplyTerm t1 t2) = return [SomeTerm t1, SomeTerm t2]+subTermsViewPattern (DivIntegralTerm t1 t2) = return [SomeTerm t1, SomeTerm t2]+subTermsViewPattern (ModIntegralTerm t1 t2) = return [SomeTerm t1, SomeTerm t2]+subTermsViewPattern (QuotIntegralTerm t1 t2) = return [SomeTerm t1, SomeTerm t2]+subTermsViewPattern (RemIntegralTerm t1 t2) = return [SomeTerm t1, SomeTerm t2]+subTermsViewPattern (FPTraitTerm _ t1) = return [SomeTerm t1]+subTermsViewPattern (FdivTerm t1 t2) = return [SomeTerm t1, SomeTerm t2]+subTermsViewPattern (RecipTerm t) = return [SomeTerm t]+subTermsViewPattern (FloatingUnaryTerm _ t) = return [SomeTerm t]+subTermsViewPattern (PowerTerm t1 t2) = return [SomeTerm t1, SomeTerm t2]+subTermsViewPattern (FPUnaryTerm _ t) = return [SomeTerm t]+subTermsViewPattern (FPBinaryTerm _ t1 t2) = return [SomeTerm t1, SomeTerm t2]+subTermsViewPattern (FPRoundingUnaryTerm _ rd t) = return [SomeTerm rd, SomeTerm t]+subTermsViewPattern (FPRoundingBinaryTerm _ rd t1 t2) = return [SomeTerm rd, SomeTerm t1, SomeTerm t2]+subTermsViewPattern (FPFMATerm rd t1 t2 t3) =+ return [SomeTerm rd, SomeTerm t1, SomeTerm t2, SomeTerm t3]+subTermsViewPattern (FromIntegralTerm t) = return [SomeTerm t]+subTermsViewPattern (FromFPOrTerm t1 rd t2) = return [SomeTerm t1, SomeTerm rd, SomeTerm t2]+subTermsViewPattern (ToFPTerm rd t1 _ _) = return [SomeTerm rd, SomeTerm t1]++-- | Extract all the subterms of a term.+pattern SubTerms :: [SomeTerm] -> Term a+pattern SubTerms ts <- (subTermsViewPattern -> Just ts)++#if MIN_VERSION_base(4, 16, 4)+{-# COMPLETE SubTerms #-}+{-# INLINE SubTerms #-}+#endif
src/Grisette/Internal/SymPrim/Prim/SomeTerm.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE ExplicitNamespaces #-} {-# LANGUAGE GADTs #-}+{-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-}@@ -25,9 +26,8 @@ import Grisette.Internal.SymPrim.Prim.Internal.Term ( SupportedPrim (primTypeRep), Term,- introSupportedPrimConstraint, termId,- withSupportedPrimTypeable,+ pattern SupportedTerm, ) -- | Existential wrapper for symbolic Grisette terms.@@ -36,11 +36,9 @@ instance Eq SomeTerm where (SomeTerm (t1 :: Term a)) == (SomeTerm (t2 :: Term b)) =- withSupportedPrimTypeable @a $- withSupportedPrimTypeable @b $- case eqT @a @b of- Just Refl -> t1 == t2- Nothing -> False+ case eqT @a @b of+ Just Refl -> t1 == t2+ Nothing -> False instance Hashable SomeTerm where hashWithSalt s (SomeTerm t) = hashWithSalt s t@@ -51,7 +49,7 @@ -- | Wrap a symbolic term into t'SomeTerm'. someTerm :: Term a -> SomeTerm-someTerm v = introSupportedPrimConstraint v $ SomeTerm v+someTerm v@SupportedTerm = SomeTerm v {-# INLINE someTerm #-} -- | Get the unique identifier of a symbolic term.
src/Grisette/Internal/SymPrim/Prim/Term.hs view
@@ -10,29 +10,24 @@ -- Portability : GHC only module Grisette.Internal.SymPrim.Prim.Term ( module Grisette.Internal.SymPrim.Prim.Internal.Term,- module Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP, module Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalShiftTerm, module Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalRotateTerm,- module Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalNumTerm, module Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalOrdTerm, module Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalDivModIntegralTerm, module Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalIEEEFPConvertibleTerm, ) where -import Grisette.Internal.SymPrim.Prim.Internal.Instances.BVPEval () import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalBitCastTerm ()-import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalBitwiseTerm () import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalDivModIntegralTerm-import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP+import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP () import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFloatingTerm () import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFractionalTerm () import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFromIntegralTerm () import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalIEEEFPConvertibleTerm-import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalNumTerm+import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalNumTerm () import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalOrdTerm import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalRotateTerm import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalShiftTerm-import Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim () import Grisette.Internal.SymPrim.Prim.Internal.Serialize () import Grisette.Internal.SymPrim.Prim.Internal.Term
src/Grisette/Internal/SymPrim/Prim/TermUtils.hs view
@@ -33,7 +33,7 @@ modify', ) import Data.Data (cast)-import Data.Foldable (Foldable (toList), traverse_)+import Data.Foldable (traverse_) import qualified Data.HashSet as HS import Grisette.Internal.Core.Data.MemoUtils (htmemo) import Grisette.Internal.SymPrim.GeneralFun (type (-->) (GeneralFun))@@ -42,60 +42,16 @@ SomeTypedConstantSymbol, SomeTypedSymbol (SomeTypedSymbol), SupportedPrim (castTypedSymbol, primTypeRep),- Term- ( AbsNumTerm,- AddNumTerm,- AndBitsTerm,- AndTerm,- ApplyTerm,- BVConcatTerm,- BVExtendTerm,- BVSelectTerm,- BitCastOrTerm,- BitCastTerm,- ComplementBitsTerm,- ConTerm,- DistinctTerm,- DivIntegralTerm,- EqTerm,- ExistsTerm,- FPBinaryTerm,- FPFMATerm,- FPRoundingBinaryTerm,- FPRoundingUnaryTerm,- FPTraitTerm,- FPUnaryTerm,- FdivTerm,- FloatingUnaryTerm,- ForallTerm,- FromFPOrTerm,- FromIntegralTerm,- ITETerm,- LeOrdTerm,- LtOrdTerm,- ModIntegralTerm,- MulNumTerm,- NegNumTerm,- NotTerm,- OrBitsTerm,- OrTerm,- PowerTerm,- QuotIntegralTerm,- RecipTerm,- RemIntegralTerm,- RotateLeftTerm,- RotateRightTerm,- ShiftLeftTerm,- ShiftRightTerm,- SignumNumTerm,- SymTerm,- ToFPTerm,- XorBitsTerm- ),+ Term, TypedAnySymbol,- introSupportedPrimConstraint, someTypedSymbol,+ pattern ConTerm,+ pattern ExistsTerm,+ pattern ForallTerm,+ pattern SupportedTerm,+ pattern SymTerm, )+import Grisette.Internal.SymPrim.Prim.Pattern (pattern SubTerms) import Grisette.Internal.SymPrim.Prim.SomeTerm ( SomeTerm (SomeTerm), someTerm,@@ -124,8 +80,7 @@ ) -> Term a -> Maybe (HS.HashSet (SomeTypedSymbol knd))- gotyped memo a =- introSupportedPrimConstraint a $ memo (SomeTerm a)+ gotyped memo a = memo (someTerm a) initialMemo :: SomeTerm -> Maybe (HS.HashSet (SomeTypedSymbol knd))@@ -139,13 +94,13 @@ HS.HashSet (SomeTypedConstantSymbol) -> SomeTerm -> Maybe (HS.HashSet (SomeTypedSymbol knd))- go _ bs (SomeTerm (SymTerm _ _ _ _ (sym :: TypedAnySymbol a))) =+ go _ bs (SomeTerm (SymTerm (sym :: TypedAnySymbol a))) = case (castTypedSymbol sym, castTypedSymbol sym) of (Just sym', _) | HS.member (someTypedSymbol sym') bs -> return HS.empty (_, Just sym') -> return $ HS.singleton $ SomeTypedSymbol sym' _ -> Nothing- go _ bs (SomeTerm (ConTerm _ _ _ _ cv :: Term v)) =+ go _ bs (SomeTerm (ConTerm cv :: Term v)) = case (primTypeRep :: TypeRep v) of App (App gf _) _ -> case eqTypeRep (typeRep @(-->)) gf of@@ -157,100 +112,17 @@ in gotyped newmemo tm Nothing -> return HS.empty _ -> return HS.empty- go _ bs (SomeTerm (ForallTerm _ _ _ _ sym arg)) =+ go _ bs (SomeTerm (ForallTerm sym arg)) = let newBounded = HS.insert (someTypedSymbol sym) bs newmemo = htmemo (go newmemo newBounded) {-# NOINLINE newmemo #-}- in goUnary newmemo arg- go _ bs (SomeTerm (ExistsTerm _ _ _ _ sym arg)) =+ in gotyped newmemo arg+ go _ bs (SomeTerm (ExistsTerm sym arg)) = let newBounded = HS.insert (someTypedSymbol sym) bs newmemo = htmemo (go newmemo newBounded) {-# NOINLINE newmemo #-}- in goUnary newmemo arg- go memo _ (SomeTerm (NotTerm _ _ _ _ arg)) = goUnary memo arg- go memo _ (SomeTerm (OrTerm _ _ _ _ arg1 arg2)) = goBinary memo arg1 arg2- go memo _ (SomeTerm (AndTerm _ _ _ _ arg1 arg2)) = goBinary memo arg1 arg2- go memo _ (SomeTerm (EqTerm _ _ _ _ arg1 arg2)) = goBinary memo arg1 arg2- go memo _ (SomeTerm (DistinctTerm _ _ _ _ args)) =- combineAllSets $ map (gotyped memo) $ toList args- go memo _ (SomeTerm (ITETerm _ _ _ _ cond arg1 arg2)) =- goTernary memo cond arg1 arg2- go memo _ (SomeTerm (AddNumTerm _ _ _ _ arg1 arg2)) = goBinary memo arg1 arg2- go memo _ (SomeTerm (NegNumTerm _ _ _ _ arg)) = goUnary memo arg- go memo _ (SomeTerm (MulNumTerm _ _ _ _ arg1 arg2)) = goBinary memo arg1 arg2- go memo _ (SomeTerm (AbsNumTerm _ _ _ _ arg)) = goUnary memo arg- go memo _ (SomeTerm (SignumNumTerm _ _ _ _ arg)) = goUnary memo arg- go memo _ (SomeTerm (LtOrdTerm _ _ _ _ arg1 arg2)) = goBinary memo arg1 arg2- go memo _ (SomeTerm (LeOrdTerm _ _ _ _ arg1 arg2)) = goBinary memo arg1 arg2- go memo _ (SomeTerm (AndBitsTerm _ _ _ _ arg1 arg2)) = goBinary memo arg1 arg2- go memo _ (SomeTerm (OrBitsTerm _ _ _ _ arg1 arg2)) = goBinary memo arg1 arg2- go memo _ (SomeTerm (XorBitsTerm _ _ _ _ arg1 arg2)) = goBinary memo arg1 arg2- go memo _ (SomeTerm (ComplementBitsTerm _ _ _ _ arg)) = goUnary memo arg- go memo _ (SomeTerm (ShiftLeftTerm _ _ _ _ arg n1)) = goBinary memo arg n1- go memo _ (SomeTerm (ShiftRightTerm _ _ _ _ arg n1)) = goBinary memo arg n1- go memo _ (SomeTerm (RotateLeftTerm _ _ _ _ arg n1)) = goBinary memo arg n1- go memo _ (SomeTerm (RotateRightTerm _ _ _ _ arg n1)) = goBinary memo arg n1- go memo _ (SomeTerm (BitCastTerm _ _ _ _ arg)) = goUnary memo arg- go memo _ (SomeTerm (BitCastOrTerm _ _ _ _ d arg)) = goBinary memo d arg- go memo _ (SomeTerm (BVConcatTerm _ _ _ _ arg1 arg2)) =- goBinary memo arg1 arg2- go memo _ (SomeTerm (BVSelectTerm _ _ _ _ _ _ arg)) = goUnary memo arg- go memo _ (SomeTerm (BVExtendTerm _ _ _ _ _ _ arg)) = goUnary memo arg- go memo _ (SomeTerm (ApplyTerm _ _ _ _ func arg)) = goBinary memo func arg- go memo _ (SomeTerm (DivIntegralTerm _ _ _ _ arg1 arg2)) =- goBinary memo arg1 arg2- go memo _ (SomeTerm (ModIntegralTerm _ _ _ _ arg1 arg2)) =- goBinary memo arg1 arg2- go memo _ (SomeTerm (QuotIntegralTerm _ _ _ _ arg1 arg2)) =- goBinary memo arg1 arg2- go memo _ (SomeTerm (RemIntegralTerm _ _ _ _ arg1 arg2)) =- goBinary memo arg1 arg2- go memo _ (SomeTerm (FPTraitTerm _ _ _ _ _ arg)) = goUnary memo arg- go memo _ (SomeTerm (FdivTerm _ _ _ _ arg1 arg2)) = goBinary memo arg1 arg2- go memo _ (SomeTerm (RecipTerm _ _ _ _ arg)) = goUnary memo arg- go memo _ (SomeTerm (FloatingUnaryTerm _ _ _ _ _ arg)) = goUnary memo arg- go memo _ (SomeTerm (PowerTerm _ _ _ _ arg1 arg2)) = goBinary memo arg1 arg2- go memo _ (SomeTerm (FPUnaryTerm _ _ _ _ _ arg)) = goUnary memo arg- go memo _ (SomeTerm (FPBinaryTerm _ _ _ _ _ arg1 arg2)) =- goBinary memo arg1 arg2- go memo _ (SomeTerm (FPRoundingUnaryTerm _ _ _ _ _ _ arg)) = goUnary memo arg- go memo _ (SomeTerm (FPRoundingBinaryTerm _ _ _ _ _ _ arg1 arg2)) =- goBinary memo arg1 arg2- go memo _ (SomeTerm (FPFMATerm _ _ _ _ mode arg1 arg2 arg3)) =- combineAllSets- [ gotyped memo mode,- gotyped memo arg1,- gotyped memo arg2,- gotyped memo arg3- ]- go memo _ (SomeTerm (FromIntegralTerm _ _ _ _ arg)) = goUnary memo arg- go memo _ (SomeTerm (FromFPOrTerm _ _ _ _ d mode arg)) =- goTernary memo d mode arg- go memo _ (SomeTerm (ToFPTerm _ _ _ _ mode arg _ _)) = goBinary memo mode arg- goUnary ::- (SomeTerm -> Maybe (HS.HashSet (SomeTypedSymbol knd))) ->- Term a ->- Maybe (HS.HashSet (SomeTypedSymbol knd))- goUnary = gotyped- goBinary ::- (SomeTerm -> Maybe (HS.HashSet (SomeTypedSymbol knd))) ->- Term a ->- Term b ->- Maybe (HS.HashSet (SomeTypedSymbol knd))- goBinary memo arg1 arg2 =- combineSet (gotyped memo arg1) (gotyped memo arg2)- goTernary ::- (SomeTerm -> Maybe (HS.HashSet (SomeTypedSymbol knd))) ->- Term a ->- Term b ->- Term c ->- Maybe (HS.HashSet (SomeTypedSymbol knd))- goTernary memo arg1 arg2 arg3 =- combineAllSets- [ gotyped memo arg1,- gotyped memo arg2,- gotyped memo arg3- ]+ in gotyped newmemo arg+ go memo _ (SomeTerm (SubTerms ts)) = combineAllSets $ map memo ts combineSet (Just a) (Just b) = Just $ HS.union a b combineSet _ _ = Nothing combineAllSets = foldl1 combineSet@@ -267,7 +139,7 @@ -- | Cast a term to another type. castTerm :: forall a b. (Typeable b) => Term a -> Maybe (Term b)-castTerm t = introSupportedPrimConstraint t $ cast t+castTerm t@SupportedTerm = cast t {-# INLINE castTerm #-} -- | Compute the size of a list of terms. Do not count the same term twice.@@ -281,97 +153,13 @@ go :: forall b. Term b -> State (HS.HashSet SomeTerm) () go t@ConTerm {} = add t go t@SymTerm {} = add t- go t@(ForallTerm _ _ _ _ _ arg) = goUnary t arg- go t@(ExistsTerm _ _ _ _ _ arg) = goUnary t arg- go t@(NotTerm _ _ _ _ arg) = goUnary t arg- go t@(OrTerm _ _ _ _ arg1 arg2) = goBinary t arg1 arg2- go t@(AndTerm _ _ _ _ arg1 arg2) = goBinary t arg1 arg2- go t@(EqTerm _ _ _ _ arg1 arg2) = goBinary t arg1 arg2- go t@(DistinctTerm _ _ _ _ args) = do- b <- exists t- if b- then return ()- else do- add t- traverse_ go args- go t@(ITETerm _ _ _ _ cond arg1 arg2) = goTernary t cond arg1 arg2- go t@(AddNumTerm _ _ _ _ arg1 arg2) = goBinary t arg1 arg2- go t@(NegNumTerm _ _ _ _ arg) = goUnary t arg- go t@(MulNumTerm _ _ _ _ arg1 arg2) = goBinary t arg1 arg2- go t@(AbsNumTerm _ _ _ _ arg) = goUnary t arg- go t@(SignumNumTerm _ _ _ _ arg) = goUnary t arg- go t@(LtOrdTerm _ _ _ _ arg1 arg2) = goBinary t arg1 arg2- go t@(LeOrdTerm _ _ _ _ arg1 arg2) = goBinary t arg1 arg2- go t@(AndBitsTerm _ _ _ _ arg1 arg2) = goBinary t arg1 arg2- go t@(OrBitsTerm _ _ _ _ arg1 arg2) = goBinary t arg1 arg2- go t@(XorBitsTerm _ _ _ _ arg1 arg2) = goBinary t arg1 arg2- go t@(ComplementBitsTerm _ _ _ _ arg) = goUnary t arg- go t@(ShiftLeftTerm _ _ _ _ arg n) = goBinary t arg n- go t@(ShiftRightTerm _ _ _ _ arg n) = goBinary t arg n- go t@(RotateLeftTerm _ _ _ _ arg n) = goBinary t arg n- go t@(RotateRightTerm _ _ _ _ arg n) = goBinary t arg n- go t@(BitCastTerm _ _ _ _ arg) = goUnary t arg- go t@(BitCastOrTerm _ _ _ _ d arg) = goBinary t d arg- go t@(BVConcatTerm _ _ _ _ arg1 arg2) = goBinary t arg1 arg2- go t@(BVSelectTerm _ _ _ _ _ _ arg) = goUnary t arg- go t@(BVExtendTerm _ _ _ _ _ _ arg) = goUnary t arg- go t@(ApplyTerm _ _ _ _ func arg) = goBinary t func arg- go t@(DivIntegralTerm _ _ _ _ arg1 arg2) = goBinary t arg1 arg2- go t@(ModIntegralTerm _ _ _ _ arg1 arg2) = goBinary t arg1 arg2- go t@(QuotIntegralTerm _ _ _ _ arg1 arg2) = goBinary t arg1 arg2- go t@(RemIntegralTerm _ _ _ _ arg1 arg2) = goBinary t arg1 arg2- go t@(FPTraitTerm _ _ _ _ _ arg) = goUnary t arg- go t@(FdivTerm _ _ _ _ arg1 arg2) = goBinary t arg1 arg2- go t@(RecipTerm _ _ _ _ arg) = goUnary t arg- go t@(FloatingUnaryTerm _ _ _ _ _ arg) = goUnary t arg- go t@(PowerTerm _ _ _ _ arg1 arg2) = goBinary t arg1 arg2- go t@(FPUnaryTerm _ _ _ _ _ arg) = goUnary t arg- go t@(FPBinaryTerm _ _ _ _ _ arg1 arg2) = goBinary t arg1 arg2- go t@(FPRoundingUnaryTerm _ _ _ _ _ _ arg) = goUnary t arg- go t@(FPRoundingBinaryTerm _ _ _ _ _ _ arg1 arg2) = goBinary t arg1 arg2- go t@(FPFMATerm _ _ _ _ _ arg1 arg2 arg3) = goTernary t arg1 arg2 arg3- go t@(FromIntegralTerm _ _ _ _ arg) = goUnary t arg- go t@(FromFPOrTerm _ _ _ _ d mode arg) =- goTernary t d mode arg- go t@(ToFPTerm _ _ _ _ mode arg _ _) = goBinary t mode arg- goUnary :: forall a b. (SupportedPrim a) => Term a -> Term b -> State (HS.HashSet SomeTerm) ()- goUnary t arg = do- b <- exists t- if b- then return ()- else do- add t- go arg- goBinary ::- forall a b c.- Term a ->- Term b ->- Term c ->- State (HS.HashSet SomeTerm) ()- goBinary t arg1 arg2 = do- b <- exists t- if b- then return ()- else do- add t- go arg1- go arg2- goTernary ::- forall a b c d.- Term a ->- Term b ->- Term c ->- Term d ->- State (HS.HashSet SomeTerm) ()- goTernary t arg1 arg2 arg3 = do+ go t@(SubTerms ts) = do b <- exists t if b then return () else do add t- go arg1- go arg2- go arg3+ traverse_ goSome ts {-# INLINEABLE someTermsSize #-} -- | Compute the size of a list of terms. Do not count the same term twice.@@ -381,9 +169,7 @@ -- | Compute the size of a list of terms. Do not count the same term twice. termsSize :: [Term a] -> Int-termsSize terms =- someTermsSize $- (\x -> introSupportedPrimConstraint x $ SomeTerm x) <$> terms+termsSize terms = someTermsSize $ someTerm <$> terms {-# INLINEABLE termsSize #-} -- | Compute the size of a term.
src/Grisette/Internal/SymPrim/SomeBV.hs view
@@ -801,8 +801,13 @@ bvSelect ix w (SomeBV (a :: bv n)) | ix + w > n = error $- "bvSelect: trying to select a bitvector outside the bounds of the "- <> "inserialize"+ "bvSelect: trying to select a bitvector outside the bounds, "+ <> "ix = "+ <> show ix+ <> ", w = "+ <> show w+ <> ", n = "+ <> show n | w == 0 = error "bvSelect: trying to select a bitvector of size 0" | otherwise = res (Proxy @n) (Proxy @n) where
src/Grisette/Internal/SymPrim/SymAlgReal.hs view
@@ -3,6 +3,7 @@ {-# LANGUAGE DeriveLift #-} {-# LANGUAGE DerivingStrategies #-} {-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE TypeFamilies #-} -- |@@ -61,10 +62,11 @@ LinkedRep (underlyingTerm, wrapTerm), PEvalNumTerm (pevalAddNumTerm), SymRep (SymType),- Term (ConTerm),+ Term, conTerm, pformatTerm, symTerm,+ pattern ConTerm, ) import Language.Haskell.TH.Syntax (Lift) @@ -99,7 +101,7 @@ instance Solvable AlgReal SymAlgReal where con = SymAlgReal . conTerm sym = SymAlgReal . symTerm . typedConstantSymbol- conView (SymAlgReal (ConTerm _ _ _ _ t)) = Just t+ conView (SymAlgReal (ConTerm t)) = Just t conView _ = Nothing instance Show SymAlgReal where
src/Grisette/Internal/SymPrim/SymBV.hs view
@@ -132,7 +132,7 @@ PEvalShiftTerm (pevalShiftLeftTerm, pevalShiftRightTerm), SupportedPrim (pevalITETerm), SymRep (SymType),- Term (ConTerm),+ Term, conTerm, pevalEqTerm, pevalGeOrdTerm,@@ -142,6 +142,7 @@ pformatTerm, symTerm, typedConstantSymbol,+ pattern ConTerm, ) import Grisette.Internal.SymPrim.SymBool (SymBool (SymBool)) import Grisette.Internal.Utils.Parameterized@@ -253,7 +254,7 @@ instance (KnownNat n, 1 <= n) => Solvable (contype n) (symtype n) where \ con = symtype . conTerm; \ sym = symtype . symTerm . typedConstantSymbol; \- conView (symtype (ConTerm _ _ _ _ t)) = Just t; \+ conView (symtype (ConTerm t)) = Just t; \ conView _ = Nothing #if 1
src/Grisette/Internal/SymPrim/SymBool.hs view
@@ -2,6 +2,7 @@ {-# LANGUAGE DeriveLift #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE TypeFamilies #-} -- |@@ -33,11 +34,12 @@ ( ConRep (ConType), LinkedRep (underlyingTerm, wrapTerm), SymRep (SymType),- Term (ConTerm),+ Term, conTerm, pformatTerm, symTerm, typedConstantSymbol,+ pattern ConTerm, ) import Language.Haskell.TH.Syntax (Lift) @@ -82,7 +84,7 @@ instance Solvable Bool SymBool where con = SymBool . conTerm sym = SymBool . symTerm . typedConstantSymbol- conView (SymBool (ConTerm _ _ _ _ t)) = Just t+ conView (SymBool (ConTerm t)) = Just t conView _ = Nothing instance IsString SymBool where
src/Grisette/Internal/SymPrim/SymFP.hs view
@@ -5,6 +5,7 @@ {-# LANGUAGE DeriveLift #-} {-# LANGUAGE DerivingStrategies #-} {-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeFamilies #-}@@ -107,14 +108,7 @@ ValidFP, withValidFPProofs, )-import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP- ( pevalFPBinaryTerm,- pevalFPFMATerm,- pevalFPRoundingBinaryTerm,- pevalFPRoundingUnaryTerm,- pevalFPTraitTerm,- pevalFPUnaryTerm,- )+import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP () import Grisette.Internal.SymPrim.Prim.Internal.Term ( ConRep (ConType), FPBinaryOp (FPMaximum, FPMaximumNumber, FPMinimum, FPMinimumNumber, FPRem),@@ -139,6 +133,14 @@ LinkedRep (underlyingTerm, wrapTerm), PEvalBitCastOrTerm (pevalBitCastOrTerm), PEvalBitCastTerm (pevalBitCastTerm),+ PEvalFPTerm+ ( pevalFPBinaryTerm,+ pevalFPFMATerm,+ pevalFPRoundingBinaryTerm,+ pevalFPRoundingUnaryTerm,+ pevalFPTraitTerm,+ pevalFPUnaryTerm+ ), PEvalFloatingTerm (pevalFloatingUnaryTerm), PEvalFractionalTerm (pevalFdivTerm, pevalRecipTerm), PEvalIEEEFPConvertibleTerm (pevalFromFPOrTerm, pevalToFPTerm),@@ -150,12 +152,13 @@ pevalSignumNumTerm ), SymRep (SymType),- Term (ConTerm),+ Term, conTerm, pevalSubNumTerm, pformatTerm, symTerm, typedConstantSymbol,+ pattern ConTerm, ) import Grisette.Internal.SymPrim.SymAlgReal (SymAlgReal (SymAlgReal)) import Grisette.Internal.SymPrim.SymBV (SymIntN (SymIntN), SymWordN (SymWordN))@@ -218,7 +221,7 @@ instance (ValidFP eb sb) => Solvable (FP eb sb) (SymFP eb sb) where con = SymFP . conTerm sym = SymFP . symTerm . typedConstantSymbol- conView (SymFP (ConTerm _ _ _ _ t)) = Just t+ conView (SymFP (ConTerm t)) = Just t conView _ = Nothing instance (ValidFP eb sb) => Show (SymFP eb sb) where@@ -290,7 +293,7 @@ instance Solvable FPRoundingMode SymFPRoundingMode where con = SymFPRoundingMode . conTerm sym = SymFPRoundingMode . symTerm . typedConstantSymbol- conView (SymFPRoundingMode (ConTerm _ _ _ _ t)) = Just t+ conView (SymFPRoundingMode (ConTerm t)) = Just t conView _ = Nothing instance Show SymFPRoundingMode where
src/Grisette/Internal/SymPrim/SymGeneralFun.hs view
@@ -7,6 +7,7 @@ {-# LANGUAGE GADTs #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-}@@ -53,12 +54,13 @@ SupportedNonFuncPrim, SupportedPrim, SymRep (SymType),- Term (ConTerm),+ Term, TypedConstantSymbol, conTerm, pformatTerm, symTerm, typedAnySymbol,+ pattern ConTerm, ) import Language.Haskell.TH.Syntax (Lift (liftTyped)) @@ -177,7 +179,7 @@ where con = SymGeneralFun . conTerm sym = SymGeneralFun . symTerm . typedAnySymbol- conView (SymGeneralFun (ConTerm _ _ _ _ t)) = Just t+ conView (SymGeneralFun (ConTerm t)) = Just t conView _ = Nothing instance
src/Grisette/Internal/SymPrim/SymInteger.hs view
@@ -2,6 +2,7 @@ {-# LANGUAGE DeriveLift #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE TypeFamilies #-} -- |@@ -40,12 +41,13 @@ pevalSignumNumTerm ), SymRep (SymType),- Term (ConTerm),+ Term, conTerm, pevalSubNumTerm, pformatTerm, symTerm, typedConstantSymbol,+ pattern ConTerm, ) import Language.Haskell.TH.Syntax (Lift) @@ -97,7 +99,7 @@ instance Solvable Integer SymInteger where con = SymInteger . conTerm sym = SymInteger . symTerm . typedConstantSymbol- conView (SymInteger (ConTerm _ _ _ _ t)) = Just t+ conView (SymInteger (ConTerm t)) = Just t conView _ = Nothing instance IsString SymInteger where
src/Grisette/Internal/SymPrim/SymPrim.hs view
@@ -1,6 +1,8 @@ {-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeOperators #-} -- | -- Module : Grisette.Internal.SymPrim.SymPrim@@ -19,7 +21,7 @@ import Data.Serialize (Serialize) import Grisette.Internal.Core.Data.Class.EvalSym (EvalSym) import Grisette.Internal.Core.Data.Class.ExtractSym (ExtractSym)-import Grisette.Internal.Core.Data.Class.Function (Apply)+import Grisette.Internal.Core.Data.Class.Function (Apply (FunType)) import Grisette.Internal.Core.Data.Class.GenSym (GenSymSimple) import Grisette.Internal.Core.Data.Class.ITEOp (ITEOp) import Grisette.Internal.Core.Data.Class.Mergeable (Mergeable)@@ -35,6 +37,7 @@ import Grisette.Internal.SymPrim.Prim.Internal.Term ( ConRep (ConType), LinkedRep,+ SupportedNonFuncPrim, ) import Language.Haskell.TH.Syntax (Lift) import Type.Reflection (Typeable)@@ -78,10 +81,12 @@ ( SymPrim a, SimpleMergeable a, GenSymSimple () a,- Apply a, Solvable (ConType a) a, ConRep a, LinkedRep (ConType a) a, ToCon a (ConType a),- ToSym (ConType a) a+ ToSym (ConType a) a,+ Apply a,+ a ~ FunType a,+ SupportedNonFuncPrim (ConType a) )
src/Grisette/Internal/SymPrim/SymTabularFun.hs view
@@ -2,6 +2,7 @@ {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-}@@ -47,11 +48,12 @@ SupportedNonFuncPrim, SupportedPrim, SymRep (SymType),- Term (ConTerm),+ Term, conTerm, pformatTerm, symTerm, typedAnySymbol,+ pattern ConTerm, ) import Grisette.Internal.SymPrim.TabularFun (type (=->)) import Language.Haskell.TH.Syntax (Lift (liftTyped))@@ -131,7 +133,7 @@ where con = SymTabularFun . conTerm sym = SymTabularFun . symTerm . typedAnySymbol- conView (SymTabularFun (ConTerm _ _ _ _ t)) = Just t+ conView (SymTabularFun (ConTerm t)) = Just t conView _ = Nothing instance
src/Grisette/Internal/SymPrim/TabularFun.hs view
@@ -6,6 +6,7 @@ {-# HLINT ignore "Eta reduce" #-} {-# LANGUAGE InstanceSigs #-} {-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE QuantifiedConstraints #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TemplateHaskell #-}@@ -59,12 +60,14 @@ withPrim ), SupportedPrimConstraint (PrimConstraint),- Term (ConTerm),+ Term, applyTerm, conTerm, partitionCVArg, pevalEqTerm, pevalITEBasicTerm,+ pattern ConTerm,+ pattern ITETerm, ) import Language.Haskell.TH.Syntax (Lift) @@ -131,12 +134,14 @@ Term (a =-> b) -> Term a -> Maybe (Term b)- doPevalApplyTerm (ConTerm _ _ _ _ f) (ConTerm _ _ _ _ a) = Just $ conTerm $ f # a- doPevalApplyTerm (ConTerm _ _ _ _ (TabularFun f d)) a = Just $ go f+ doPevalApplyTerm (ConTerm f) (ConTerm a) = Just $ conTerm $ f # a+ doPevalApplyTerm (ConTerm (TabularFun f d)) a = Just $ go f where go [] = conTerm d go ((x, y) : xs) = pevalITETerm (pevalEqTerm a (conTerm x)) (conTerm y) (go xs)+ doPevalApplyTerm (ITETerm cond t f) v =+ Just $ pevalITETerm cond (pevalApplyTerm t v) (pevalApplyTerm f v) doPevalApplyTerm _ _ = Nothing sbvApplyTerm f a = withPrim @(a =-> b) $ withNonFuncPrim @a $ f a
src/Grisette/Internal/TH/Ctor/UnifiedConstructor.hs view
@@ -24,7 +24,7 @@ prefixTransformer, withNameTransformer, )-import Grisette.Internal.TH.GADT.Common (ctxForVar)+import Grisette.Internal.TH.Derivation.Common (ctxForVar) import Grisette.Internal.TH.Util (constructorInfoToType, putHaddock, tvIsMode) import Grisette.Internal.Unified.EvalModeTag (EvalModeTag) import Grisette.Internal.Unified.UnifiedData
+ src/Grisette/Internal/TH/Derivation/BinaryOpCommon.hs view
@@ -0,0 +1,389 @@+{-# LANGUAGE ExplicitNamespaces #-}+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TupleSections #-}++-- |+-- Module : Grisette.Internal.TH.Derivation.BinaryOpCommon+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.TH.Derivation.BinaryOpCommon+ ( BinaryOpClassConfig (..),+ BinaryOpFieldConfig (..),+ FieldFunExp,+ defaultFieldFunExp,+ genBinaryOpClause,+ genBinaryOpClass,+ )+where++import Control.Monad (replicateM, unless, when, zipWithM)+import Control.Monad.Identity (IdentityT)+import qualified Data.List as List+import qualified Data.Map as M+import Data.Maybe (catMaybes, mapMaybe)+import Data.Proxy (Proxy (Proxy))+import qualified Data.Set as S+import Grisette.Internal.TH.Derivation.Common+ ( CheckArgsResult+ ( argVars,+ constructors,+ keptVars+ ),+ DeriveConfig (unconstrainedPositions),+ checkArgs,+ ctxForVar,+ evalModeSpecializeList,+ extraConstraint,+ freshenCheckArgsResult,+ isVarUsedInFields,+ specializeResult,+ )+import Language.Haskell.TH+ ( Clause,+ Dec (FunD, InstanceD),+ Exp (VarE),+ Kind,+ Name,+ Pat (VarP, WildP),+ Q,+ Type (AppT, ConT, VarT),+ clause,+ conP,+ funD,+ nameBase,+ newName,+ normalB,+ recP,+ sigP,+ varE,+ varP,+ varT,+ wildP,+ )+import Language.Haskell.TH.Datatype+ ( ConstructorInfo (constructorFields, constructorName, constructorVars),+ TypeSubstitution (freeVariables),+ resolveTypeSynonyms,+ tvName,+ )+import Type.Reflection+ ( TypeRep,+ eqTypeRep,+ someTypeRep,+ typeRep,+ type (:~~:) (HRefl),+ )++-- | Type of field function expression generator.+type FieldFunExp = M.Map Name Name -> Type -> Q Exp++-- | Default field function expression generator.+defaultFieldFunExp :: [Name] -> FieldFunExp+defaultFieldFunExp binaryOpFunNames argToFunPat = go+ where+ go ty = do+ let allArgNames = M.keysSet argToFunPat+ let typeHasNoArg ty =+ S.fromList (freeVariables [ty])+ `S.intersection` allArgNames+ == S.empty+ let fun0 = varE $ head binaryOpFunNames+ fun1 b = [|$(varE $ binaryOpFunNames !! 1) $(go b)|]+ fun2 b c = [|$(varE $ binaryOpFunNames !! 2) $(go b) $(go c)|]+ fun3 b c d =+ [|$(varE $ binaryOpFunNames !! 3) $(go b) $(go c) $(go d)|]+ case ty of+ AppT (AppT (AppT (VarT _) b) c) d -> fun3 b c d+ AppT (AppT (VarT _) b) c -> fun2 b c+ AppT (VarT _) b -> fun1 b+ _ | typeHasNoArg ty -> fun0+ AppT a b | typeHasNoArg a -> fun1 b+ AppT (AppT a b) c | typeHasNoArg a -> fun2 b c+ AppT (AppT (AppT a b) c) d | typeHasNoArg a -> fun3 b c d+ VarT nm -> case M.lookup nm argToFunPat of+ Just pname -> varE pname+ _ -> fail $ "defaultFieldFunExp: unsupported type: " <> show ty+ _ -> fail $ "defaultFieldFunExp: unsupported type: " <> show ty++funPatAndExps ::+ FieldFunExp ->+ [(Type, Kind)] ->+ [Type] ->+ Q ([Pat], [Exp])+funPatAndExps fieldFunExpGen argTypes fields = do+ let usedArgs = S.fromList $ freeVariables fields+ args <-+ traverse+ ( \(ty, _) ->+ case ty of+ VarT nm ->+ if S.member nm usedArgs+ then do+ pname <- newName "p"+ return (nm, Just pname)+ else return ('undefined, Nothing)+ _ -> return ('undefined, Nothing)+ )+ argTypes+ let argToFunPat =+ M.fromList $ mapMaybe (\(ty, mpat) -> fmap (ty,) mpat) args+ let funPats = fmap (maybe WildP VarP . snd) args+ defaultFieldFunExps <- traverse (fieldFunExpGen argToFunPat) fields+ return (funPats, defaultFieldFunExps)++-- | Configuration for a binary operation field generation on a GADT.+data BinaryOpFieldConfig = BinaryOpFieldConfig+ { extraPatNames :: [String],+ fieldResFun :: [Exp] -> (Exp, Exp) -> Exp -> Q (Exp, [Bool]),+ fieldCombineFun :: Name -> [Exp] -> Q (Exp, [Bool]),+ fieldDifferentExistentialFun :: Exp -> Q Exp,+ fieldLMatchResult :: Q Exp,+ fieldRMatchResult :: Q Exp,+ fieldFunExp :: FieldFunExp,+ fieldFunNames :: [Name]+ }++-- | Generate a clause for a binary operation on a GADT.+genBinaryOpClause ::+ BinaryOpFieldConfig ->+ [(Type, Kind)] ->+ [(Type, Kind)] ->+ Bool ->+ ConstructorInfo ->+ ConstructorInfo ->+ Q [Clause]+genBinaryOpClause+ (BinaryOpFieldConfig {..})+ lhsArgNewVars+ _rhsArgNewVars+ isLast+ lhsConstructors+ rhsConstructors =+ do+ lhsFields <- mapM resolveTypeSynonyms $ constructorFields lhsConstructors+ rhsFields <- mapM resolveTypeSynonyms $ constructorFields rhsConstructors+ (funPats, defaultFieldFunExps) <-+ funPatAndExps fieldFunExp lhsArgNewVars lhsFields+ unless (null extraPatNames) $+ unless isLast $+ fail "Should not happen"+ extraPatNames <- traverse newName extraPatNames+ let extraPats = fmap VarP extraPatNames+ let extraPatExps = fmap VarE extraPatNames+ lhsFieldsPatNames <- replicateM (length lhsFields) $ newName "lhsField"+ rhsFieldsPatNames <- replicateM (length rhsFields) $ newName "rhsField"+ let lhsFieldPats =+ conP+ (constructorName lhsConstructors)+ ( zipWith+ (\nm field -> sigP (varP nm) (return field))+ lhsFieldsPatNames+ lhsFields+ )+ let rhsFieldPats =+ conP+ (constructorName rhsConstructors)+ ( zipWith+ (\nm field -> sigP (varP nm) (return field))+ rhsFieldsPatNames+ rhsFields+ )+ let singleMatchPat =+ if null lhsFields+ then conP (constructorName lhsConstructors) []+ else recP (constructorName rhsConstructors) []+ let lhsFieldPatExps = fmap VarE lhsFieldsPatNames+ let rhsFieldPatExps = fmap VarE rhsFieldsPatNames++ fieldResExpsAndArgsUsed <-+ zipWithM+ (fieldResFun extraPatExps)+ (zip lhsFieldPatExps rhsFieldPatExps)+ defaultFieldFunExps+ let fieldResExps = fst <$> fieldResExpsAndArgsUsed+ let extraArgsUsedByFields = snd <$> fieldResExpsAndArgsUsed+ (resExp, extraArgsUsedByResult) <-+ fieldCombineFun+ (constructorName lhsConstructors)+ fieldResExps++ let eqt l r =+ [|+ eqTypeRep+ (typeRep :: TypeRep $(varT $ tvName l))+ (typeRep :: TypeRep $(varT $ tvName r))+ |]+ let eqx trueCont l r = do+ cmp <-+ [|+ compare+ (someTypeRep (Proxy :: Proxy $(varT $ tvName l)))+ (someTypeRep (Proxy :: Proxy $(varT $ tvName r)))+ |]+ [|+ case $(eqt l r) of+ Just HRefl -> $(trueCont)+ _ ->+ $(fieldDifferentExistentialFun cmp)+ |]+ let construct [] = return resExp+ construct ((l, r) : xs) = [|$(eqx (construct xs) l r)|]++ let extraArgsUsed =+ fmap or $+ List.transpose $+ extraArgsUsedByResult : extraArgsUsedByFields+ let extraArgsPats =+ zipWith+ (\pat used -> if used then pat else WildP)+ extraPats+ extraArgsUsed+ bothMatched <-+ clause+ ((return <$> funPats ++ extraArgsPats) ++ [lhsFieldPats, rhsFieldPats])+ ( normalB+ [|+ $( construct $+ zip+ (constructorVars lhsConstructors)+ (constructorVars rhsConstructors)+ )+ |]+ )+ []+ lhsMatched <-+ clause+ ((wildP <$ funPats) ++ [singleMatchPat, wildP])+ (normalB [|$(fieldLMatchResult)|])+ []+ rhsMatched <-+ clause+ ((wildP <$ funPats) ++ [wildP, singleMatchPat])+ (normalB [|$(fieldRMatchResult)|])+ []+ if isLast+ then return [bothMatched]+ else return [bothMatched, lhsMatched, rhsMatched]++-- | Configuration for a binary operation type class generation on a GADT.+data BinaryOpClassConfig = BinaryOpClassConfig+ { binaryOpFieldConfigs :: [BinaryOpFieldConfig],+ binaryOpInstanceNames :: [Name],+ binaryOpAllowSumType :: Bool,+ binaryOpAllowExistential :: Bool+ }++-- | Generate a function for a binary operation on a GADT.+genBinaryOpFun ::+ BinaryOpFieldConfig ->+ Int ->+ [(Type, Kind)] ->+ [(Type, Kind)] ->+ [ConstructorInfo] ->+ [ConstructorInfo] ->+ Q Dec+genBinaryOpFun config n _ _ [] [] =+ funD+ (fieldFunNames config !! n)+ [clause [] (normalB [|error "impossible"|]) []]+genBinaryOpFun+ config+ n+ lhsArgNewVars+ rhsArgNewVars+ lhsConstructors+ rhsConstructors = do+ clauses <-+ zipWithM+ (genBinaryOpClause config lhsArgNewVars rhsArgNewVars False)+ (init lhsConstructors)+ (init rhsConstructors)+ lastClause <-+ genBinaryOpClause+ config+ lhsArgNewVars+ rhsArgNewVars+ True+ (last lhsConstructors)+ (last rhsConstructors)+ let instanceFunName = (fieldFunNames config) !! n+ return $ FunD instanceFunName (concat clauses ++ lastClause)++-- | Generate a type class instance for a binary operation on a GADT.+genBinaryOpClass ::+ DeriveConfig -> BinaryOpClassConfig -> Int -> Name -> Q [Dec]+genBinaryOpClass deriveConfig (BinaryOpClassConfig {..}) n typName = do+ lhsResult <-+ specializeResult (evalModeSpecializeList deriveConfig)+ =<< freshenCheckArgsResult True+ =<< checkArgs+ (nameBase $ head binaryOpInstanceNames)+ (length binaryOpInstanceNames - 1)+ typName+ (n == 0 && binaryOpAllowExistential)+ n+ when (not binaryOpAllowSumType && length (constructors lhsResult) > 1) $+ fail $+ "Cannot derive "+ <> nameBase (binaryOpInstanceNames !! n)+ <> " for sum type"+ rhsResult <-+ specializeResult (evalModeSpecializeList deriveConfig)+ =<< checkArgs+ (nameBase $ head binaryOpInstanceNames)+ (length binaryOpInstanceNames - 1)+ typName+ (n == 0)+ n+ let keptVars' = keptVars lhsResult+ when (typName == ''IdentityT) $+ fail $+ show keptVars'+ let isTypeUsedInFields' (VarT nm) = isVarUsedInFields lhsResult nm+ isTypeUsedInFields' _ = False+ ctxs <-+ traverse (uncurry $ ctxForVar (fmap ConT binaryOpInstanceNames)) $+ filter (isTypeUsedInFields' . fst) $+ fmap snd $+ filter (not . (`elem` unconstrainedPositions deriveConfig) . fst) $+ zip [0 ..] keptVars'+ let keptType = foldl AppT (ConT typName) $ fmap fst keptVars'+ instanceFuns <-+ traverse+ ( \config ->+ genBinaryOpFun+ config+ n+ (argVars lhsResult)+ (argVars rhsResult)+ (constructors lhsResult)+ (constructors rhsResult)+ )+ binaryOpFieldConfigs+ let instanceName = binaryOpInstanceNames !! n+ let instanceType = AppT (ConT instanceName) keptType+ extraPreds <-+ extraConstraint+ deriveConfig+ typName+ instanceName+ []+ keptVars'+ (constructors lhsResult)+ return+ [ InstanceD+ Nothing+ ( extraPreds+ ++ if null (constructors lhsResult)+ then []+ else catMaybes ctxs+ )+ instanceType+ instanceFuns+ ]
+ src/Grisette/Internal/TH/Derivation/Common.hs view
@@ -0,0 +1,465 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeOperators #-}++-- |+-- Module : Grisette.Internal.TH.Derivation.Common+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.TH.Derivation.Common+ ( CheckArgsResult (..),+ checkArgs,+ ctxForVar,+ EvalModeConfig (..),+ DeriveConfig (..),+ extraEvalModeConstraint,+ extraBitSizeConstraint,+ extraFpBitSizeConstraint,+ extraExtraMergeableConstraint,+ extraConstraint,+ specializeResult,+ evalModeSpecializeList,+ isVarUsedInFields,+ freshenCheckArgsResult,+ )+where++import Control.Monad (foldM, unless, when, zipWithM)+import Data.Bifunctor (first)+import qualified Data.Map as M+import Data.Maybe (catMaybes, mapMaybe)+import qualified Data.Set as S+import GHC.TypeLits (KnownNat, Nat, type (<=))+import Grisette.Internal.Internal.Decl.Core.Data.Class.Mergeable+ ( Mergeable,+ Mergeable1,+ Mergeable2,+ )+import Grisette.Internal.SymPrim.FP (ValidFP)+import Grisette.Internal.Unified.EvalModeTag (EvalModeTag (C, S))+import Grisette.Internal.Unified.Util (DecideEvalMode)+import Language.Haskell.TH+ ( Kind,+ Name,+ Pred,+ Q,+ Type (AppT, ArrowT, ConT, PromotedT, StarT, VarT),+ conT,+ nameBase,+ newName,+ )+import Language.Haskell.TH.Datatype+ ( ConstructorInfo (constructorFields, constructorName, constructorVars),+ DatatypeInfo (datatypeCons, datatypeVars),+ TypeSubstitution (applySubstitution, freeVariables),+ reifyDatatype,+ tvName,+ )+import Language.Haskell.TH.Datatype.TyVarBndr (mapTVName, tvKind)++-- | Result of 'checkArgs' for a data type.+data CheckArgsResult = CheckArgsResult+ { constructors :: [ConstructorInfo],+ keptVars :: [(Type, Kind)],+ argVars :: [(Type, Kind)]+ }++-- | Specialize the evaluation mode tags for the t'CheckArgsResult'.+specializeResult :: [(Int, EvalModeTag)] -> CheckArgsResult -> Q CheckArgsResult+specializeResult evalModeConfigs result = do+ let modeToName C = 'C+ modeToName S = 'S+ map <-+ foldM+ ( \lst (n, tag) -> do+ let (_, knd) = lst !! n+ return $+ take n lst+ ++ [(PromotedT $ modeToName tag, knd)]+ ++ drop (n + 1) lst+ )+ (keptVars result)+ evalModeConfigs+ return $ result {keptVars = map}++freshenConstructorInfo :: ConstructorInfo -> Q ConstructorInfo+freshenConstructorInfo conInfo = do+ let vars = constructorVars conInfo+ newNames <- traverse (newName . nameBase . tvName) vars+ let newVars = zipWith (mapTVName . const) newNames vars+ let substMap = M.fromList $ zip (tvName <$> vars) $ VarT <$> newNames+ return $ applySubstitution substMap conInfo {constructorVars = newVars}++-- | Freshen the type variables in the t'CheckArgsResult'.+freshenCheckArgsResult :: Bool -> CheckArgsResult -> Q CheckArgsResult+freshenCheckArgsResult freshenNats result = do+ let genNewName :: (Type, Kind) -> Q (Maybe Name)+ genNewName (VarT _, knd) =+ if not freshenNats && knd == ConT ''Nat+ then return Nothing+ else Just <$> newName "a"+ genNewName _ = return Nothing+ keptNewNames <- traverse genNewName (keptVars result)+ argNewNames <- traverse genNewName (argVars result)++ let substMap =+ M.fromList+ $ mapMaybe+ ( \(newName, oldVar) ->+ case (newName, oldVar) of+ (Just newName, (VarT oldName, _)) ->+ Just (oldName, VarT newName)+ _ -> Nothing+ )+ $ zip+ (keptNewNames ++ argNewNames)+ (keptVars result ++ argVars result)+ constructors <-+ mapM freshenConstructorInfo $+ applySubstitution substMap $+ constructors result+ let newKeptVars = first (applySubstitution substMap) <$> (keptVars result)+ let newArgVars = first (applySubstitution substMap) <$> (argVars result)+ return $+ result+ { constructors = constructors,+ keptVars = newKeptVars,+ argVars = newArgVars+ }++-- | Check if the number of type parameters is valid for a data type, and return+-- new names for the type variables, split into kept and arg parts.+checkArgs ::+ String ->+ Int ->+ Name ->+ Bool ->+ Int ->+ Q CheckArgsResult+checkArgs clsName maxArgNum typName allowExistential n = do+ when (n < 0) $+ fail $+ unlines+ [ "Cannot derive "+ ++ clsName+ ++ " instance with negative type parameters",+ "\tRequested: " ++ show n,+ "\tHint: Use a non-negative number of type parameters"+ ]+ when (n > maxArgNum) $+ fail $+ unlines+ [ "Cannot derive "+ <> clsName+ <> " instance with more than "+ <> show maxArgNum+ <> " type parameters",+ "\tRequested: " <> show n+ ]+ d <- reifyDatatype typName+ let dvars = datatypeVars d+ when (length dvars < n) $+ fail $+ unlines+ [ "Cannot derive "+ <> clsName+ <> show n+ <> " instance for the type "+ <> show typName,+ "\tReason: The type "+ <> show typName+ <> " has only "+ <> show (length dvars)+ <> " type variables."+ ]+ let keptVars =+ (\bndr -> (VarT $ tvName bndr, tvKind bndr))+ <$> take (length dvars - n) dvars+ let argVars =+ (\bndr -> (VarT $ tvName bndr, tvKind bndr))+ <$> drop (length dvars - n) dvars+ let constructors = datatypeCons d+ unless allowExistential $+ mapM_+ ( \c ->+ when (constructorVars c /= []) $+ fail $+ unlines+ [ "Cannot derive "+ <> clsName+ <> show n+ <> " instance for the type "+ <> show typName,+ "\tReason: The constructor "+ <> nameBase (constructorName c)+ <> " has existential variables"+ ]+ )+ constructors+ mapM_+ ( \c -> do+ let fields = constructorFields c+ let existentialVars = tvName <$> constructorVars c+ let fieldReferencedVars = freeVariables fields+ let notReferencedVars =+ S.fromList existentialVars S.\\ S.fromList fieldReferencedVars+ unless (null notReferencedVars) $+ fail $+ unlines+ [ "Cannot derive "+ <> clsName+ <> show n+ <> " instance for the type "+ <> show typName,+ "Reason: Ambiguous existential variable in the constructor: "+ <> nameBase (constructorName c)+ <> ", this is not supported. Please consider binding the "+ <> "existential variable to a field. You can use Proxy type to "+ <> "do this."+ ]+ )+ constructors+ return $ CheckArgsResult {..}++isVarUsedInConstructorFields :: [ConstructorInfo] -> Name -> Bool+isVarUsedInConstructorFields constructors var =+ let allFields = concatMap constructorFields constructors+ allFieldsFreeVars = S.fromList $ freeVariables allFields+ in S.member var allFieldsFreeVars++-- | Check if a variable is used in the fields of a constructor.+isVarUsedInFields :: CheckArgsResult -> Name -> Bool+isVarUsedInFields CheckArgsResult {..} =+ isVarUsedInConstructorFields constructors++-- | Generate a context for a variable in a GADT.+ctxForVar :: [Type] -> Type -> Kind -> Q (Maybe Pred)+ctxForVar instanceExps ty knd = case knd of+ StarT ->+ Just+ <$> [t|$(return $ head instanceExps) $(return ty)|]+ AppT (AppT ArrowT StarT) StarT ->+ Just+ <$> [t|$(return $ instanceExps !! 1) $(return ty)|]+ AppT (AppT (AppT ArrowT StarT) StarT) StarT ->+ Just+ <$> [t|$(return $ instanceExps !! 2) $(return ty)|]+ AppT (AppT (AppT (AppT ArrowT StarT) StarT) StarT) StarT ->+ Just+ <$> [t|$(return $ instanceExps !! 3) $(return ty)|]+ AppT (AppT (AppT (AppT ArrowT StarT) StarT) StarT) _ ->+ fail $ "Unsupported kind: " <> show knd+ _ -> return Nothing++-- | Configuration for constraints for evaluation modes tag.+--+-- * 'EvalModeConstraints' specifies a list of constraints for the tag, for+-- example, we may use 'Grisette.Unified.EvalModeBase' and+-- 'Grisette.Unified.EvalModeBV' to specify that the evaluation mode must+-- support both base (boolean and data types) and bit vectors. This should be+-- used when the data type uses bit vectors.+--+-- * 'EvalModeSpecified' specifies a that an evaluation mode tag should be+-- specialized to a specific tag for all the instances.+data EvalModeConfig+ = EvalModeConstraints [Name]+ | EvalModeSpecified EvalModeTag++-- | Configuration for deriving instances for a data type.+data DeriveConfig = DeriveConfig+ { evalModeConfig :: [(Int, EvalModeConfig)],+ bitSizePositions :: [Int],+ fpBitSizePositions :: [(Int, Int)],+ unconstrainedPositions :: [Int],+ needExtraMergeableUnderEvalMode :: Bool,+ needExtraMergeableWithConcretizedEvalMode :: Bool,+ useNoStrategy :: Bool,+ useSerialForCerealAndBinary :: Bool+ }++-- | Get all the evaluation modes to specialize in the t'DeriveConfig'.+evalModeSpecializeList :: DeriveConfig -> [(Int, EvalModeTag)]+evalModeSpecializeList DeriveConfig {..} =+ mapMaybe+ ( \(n, cfg) ->+ case cfg of+ EvalModeConstraints _ -> Nothing+ EvalModeSpecified tag -> Just (n, tag)+ )+ evalModeConfig++instance Semigroup DeriveConfig where+ l <> r =+ DeriveConfig+ { evalModeConfig = evalModeConfig l <> evalModeConfig r,+ bitSizePositions = bitSizePositions l <> bitSizePositions r,+ fpBitSizePositions = fpBitSizePositions l <> fpBitSizePositions r,+ unconstrainedPositions = unconstrainedPositions l <> unconstrainedPositions r,+ needExtraMergeableUnderEvalMode =+ needExtraMergeableUnderEvalMode l+ || needExtraMergeableUnderEvalMode r,+ needExtraMergeableWithConcretizedEvalMode =+ needExtraMergeableWithConcretizedEvalMode l+ || needExtraMergeableWithConcretizedEvalMode r,+ useNoStrategy = useNoStrategy l || useNoStrategy r,+ useSerialForCerealAndBinary =+ useSerialForCerealAndBinary l && useSerialForCerealAndBinary r+ }++instance Monoid DeriveConfig where+ mempty = DeriveConfig [] [] [] [] False False False True+ mappend = (<>)++-- | Generate extra constraints for evaluation modes.+extraEvalModeConstraint ::+ Name -> Name -> [(Type, Kind)] -> (Int, EvalModeConfig) -> Q [Pred]+extraEvalModeConstraint+ tyName+ instanceName+ args+ (n, EvalModeConstraints names)+ | n >= length args = return []+ | otherwise = do+ let (arg, argKind) = args !! n+ when (argKind /= ConT ''EvalModeTag) $+ fail $+ "Cannot introduce EvalMode constraint for the "+ <> show n+ <> "th argument of "+ <> show tyName+ <> " when deriving the "+ <> show instanceName+ <> " instance because it is not an EvalModeTag."+ traverse (\nm -> [t|$(conT nm) $(return arg)|]) names+extraEvalModeConstraint _ _ _ (_, EvalModeSpecified _) = return []++-- | Generate extra constraints for bit vectors.+extraBitSizeConstraint :: Name -> Name -> [(Type, Kind)] -> Int -> Q [Pred]+extraBitSizeConstraint tyName instanceName args n+ | n >= length args = return []+ | otherwise = do+ let (arg, argKind) = args !! n+ when (argKind /= ConT ''Nat) $+ fail $+ "Cannot introduce BitSize constraint for the "+ <> show n+ <> "th argument of "+ <> show tyName+ <> " when deriving the "+ <> show instanceName+ <> " instance because it is not a Nat."+ predKnown <- [t|KnownNat $(return arg)|]+ predPositive <- [t|1 <= $(return arg)|]+ return [predKnown, predPositive]++-- | Generate extra constraints for floating point exponents and significands.+extraFpBitSizeConstraint ::+ Name -> Name -> [(Type, Kind)] -> (Int, Int) -> Q [Pred]+extraFpBitSizeConstraint tyName instanceName args (eb, sb)+ | eb >= length args || sb >= length args = return []+ | otherwise = do+ let (argEb, argEbKind) = args !! eb+ let (argSb, argSbKind) = args !! sb+ when (argEbKind /= ConT ''Nat || argSbKind /= ConT ''Nat) $+ fail $+ "Cannot introduce ValidFP constraint for the "+ <> show eb+ <> "th and "+ <> show sb+ <> "th arguments of "+ <> show tyName+ <> " when deriving the "+ <> show instanceName+ <> " instance because they are not Nats."+ pred <- [t|ValidFP $(return argEb) $(return argSb)|]+ return [pred]++-- | Generate extra constraints for 'Mergeable' instances.+extraExtraMergeableConstraint ::+ DeriveConfig -> [ConstructorInfo] -> [(Type, Kind)] -> Q [Pred]+extraExtraMergeableConstraint deriveConfig constructors args = do+ let isTypeUsedInFields' (VarT nm) =+ isVarUsedInConstructorFields constructors nm+ isTypeUsedInFields' _ = False+ catMaybes+ <$> zipWithM+ ( \position (arg, knd) ->+ if isTypeUsedInFields' arg+ && notElem position (unconstrainedPositions deriveConfig)+ then+ ctxForVar+ [ ConT ''Mergeable,+ ConT ''Mergeable1,+ ConT ''Mergeable2+ ]+ arg+ knd+ else return Nothing+ )+ [0 ..]+ args++-- | Generate extra constraints for a data type.+extraConstraint ::+ DeriveConfig ->+ Name ->+ Name ->+ [(Type, Kind)] ->+ [(Type, Kind)] ->+ [ConstructorInfo] ->+ Q [Pred]+extraConstraint+ deriveConfig@DeriveConfig {..}+ tyName+ instanceName+ extraArgs+ keptArgs+ constructors = do+ evalModePreds <-+ traverse+ (extraEvalModeConstraint tyName instanceName keptArgs)+ evalModeConfig+ extraArgEvalModePreds <-+ if null evalModeConfig+ then+ traverse+ ( \(arg, kind) ->+ if kind == ConT ''EvalModeTag+ then (: []) <$> [t|DecideEvalMode $(return arg)|]+ else return []+ )+ extraArgs+ else return []+ bitSizePreds <-+ traverse+ (extraBitSizeConstraint tyName instanceName keptArgs)+ bitSizePositions+ fpBitSizePreds <-+ traverse+ (extraFpBitSizeConstraint tyName instanceName keptArgs)+ fpBitSizePositions+ extraMergeablePreds <-+ if needExtraMergeableUnderEvalMode+ && ( any+ ( \case+ (_, EvalModeConstraints _) -> True+ (_, EvalModeSpecified _) -> False+ )+ evalModeConfig+ || needExtraMergeableWithConcretizedEvalMode+ )+ then extraExtraMergeableConstraint deriveConfig constructors keptArgs+ else return []+ return $+ concat (extraArgEvalModePreds ++ evalModePreds)+ ++ if null constructors+ then []+ else extraMergeablePreds ++ concat (bitSizePreds ++ fpBitSizePreds)
+ src/Grisette/Internal/TH/Derivation/ConvertOpCommon.hs view
@@ -0,0 +1,453 @@+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TupleSections #-}+{-# LANGUAGE TypeApplications #-}++-- |+-- Module : Grisette.Internal.TH.Derivation.ConvertOpCommon+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.TH.Derivation.ConvertOpCommon+ ( genConvertOpClass,+ ConvertOpClassConfig (..),+ defaultFieldFunExp,+ )+where++import Control.Monad (foldM, replicateM, zipWithM)+import qualified Data.Map as M+import Data.Maybe (catMaybes, mapMaybe)+import qualified Data.Set as S+import Grisette.Internal.Core.Data.Class.PlainUnion (unionToCon)+import Grisette.Internal.Internal.Decl.Core.Control.Monad.Union (Union)+import Grisette.Internal.Internal.Decl.Core.Data.Class.TryMerge (toUnionSym)+import Grisette.Internal.TH.Derivation.Common+ ( CheckArgsResult (argVars, constructors, keptVars),+ DeriveConfig+ ( DeriveConfig,+ bitSizePositions,+ evalModeConfig,+ fpBitSizePositions,+ needExtraMergeableUnderEvalMode,+ needExtraMergeableWithConcretizedEvalMode,+ unconstrainedPositions+ ),+ EvalModeConfig (EvalModeConstraints, EvalModeSpecified),+ checkArgs,+ extraBitSizeConstraint,+ extraEvalModeConstraint,+ extraExtraMergeableConstraint,+ extraFpBitSizeConstraint,+ freshenCheckArgsResult,+ isVarUsedInFields,+ )+import Grisette.Internal.TH.Util (allUsedNames)+import Grisette.Internal.Unified.EvalModeTag (EvalModeTag (C, S))+import Grisette.Internal.Unified.Util+ ( EvalModeConvertible (withModeConvertible'),+ )+import Language.Haskell.TH+ ( Body (NormalB),+ Clause (Clause),+ Dec (FunD, InstanceD),+ Exp (VarE),+ Kind,+ Name,+ Overlap (Incoherent),+ Pat (VarP, WildP),+ Pred,+ Q,+ Type (AppT, ArrowT, ConT, StarT, VarT),+ clause,+ conP,+ funD,+ nameBase,+ newName,+ normalB,+ varE,+ varP,+ )+import Language.Haskell.TH.Datatype+ ( ConstructorInfo (constructorFields, constructorName),+ TypeSubstitution (freeVariables),+ resolveTypeSynonyms,+ )++type FieldFunExp = M.Map Name Name -> Type -> Q Exp++-- | Default field transformation function.+defaultFieldFunExp :: [Name] -> FieldFunExp+defaultFieldFunExp binaryOpFunNames argToFunPat = go+ where+ go ty = do+ let allArgNames = M.keysSet argToFunPat+ let typeHasNoArg ty =+ S.fromList (freeVariables [ty])+ `S.intersection` allArgNames+ == S.empty+ let fun0 = varE $ head binaryOpFunNames+ fun1 b = [|$(varE $ binaryOpFunNames !! 1) $(go b)|]+ fun2 b c = [|$(varE $ binaryOpFunNames !! 2) $(go b) $(go c)|]+ fun3 b c d =+ [|$(varE $ binaryOpFunNames !! 3) $(go b) $(go c) $(go d)|]+ case ty of+ AppT (AppT (AppT (VarT _) b) c) d -> fun3 b c d+ AppT (AppT (VarT _) b) c -> fun2 b c+ AppT (VarT _) b -> fun1 b+ _ | typeHasNoArg ty -> fun0+ AppT a b | typeHasNoArg a -> fun1 b+ AppT (AppT a b) c | typeHasNoArg a -> fun2 b c+ AppT (AppT (AppT a b) c) d | typeHasNoArg a -> fun3 b c d+ VarT nm -> case M.lookup nm argToFunPat of+ Just pname -> varE pname+ _ -> fail $ "defaultFieldFunExp: unsupported type: " <> show ty+ _ -> fail $ "defaultFieldFunExp: unsupported type: " <> show ty++funPatAndExps ::+ FieldFunExp ->+ [(Type, Kind)] ->+ [Type] ->+ Q ([Pat], [Exp])+funPatAndExps fieldFunExpGen argTypes fields = do+ let usedArgs = S.fromList $ freeVariables fields+ args <-+ traverse+ ( \(ty, _) ->+ case ty of+ VarT nm ->+ if S.member nm usedArgs+ then do+ pname <- newName "p"+ return (nm, Just pname)+ else return ('undefined, Nothing)+ _ -> return ('undefined, Nothing)+ )+ argTypes+ let argToFunPat =+ M.fromList $ mapMaybe (\(ty, mpat) -> fmap (ty,) mpat) args+ let funPats = fmap (maybe WildP VarP . snd) args+ defaultFieldFunExps <- traverse (fieldFunExpGen argToFunPat) fields+ return (funPats, defaultFieldFunExps)++tagPair ::+ DeriveConfig ->+ EvalModeTag ->+ [(Type, Kind)] ->+ [(Type, Kind)] ->+ [(Type, Type)]+tagPair deriveConfig convertOpTarget lhsKeptVars rhsKeptVars =+ let conKeptVars =+ if convertOpTarget == S then lhsKeptVars else rhsKeptVars+ symKeptVars =+ if convertOpTarget == S then rhsKeptVars else lhsKeptVars+ in mapMaybe+ ( \case+ (n, EvalModeConstraints _)+ | n < length conKeptVars && n >= 0 ->+ Just (fst $ conKeptVars !! n, fst $ symKeptVars !! n)+ _ -> Nothing+ )+ (evalModeConfig deriveConfig)++caseSplitTagPairs ::+ DeriveConfig ->+ EvalModeTag ->+ [(Type, Kind)] ->+ [(Type, Kind)] ->+ Exp ->+ Q Exp+caseSplitTagPairs deriveConfig convertOpTarget lhsKeptVars rhsKeptVars exp = do+ let tags = tagPair deriveConfig convertOpTarget lhsKeptVars rhsKeptVars+ foldM+ ( \exp (lty, rty) ->+ [|+ withModeConvertible'+ @($(return lty))+ @($(return rty))+ $(return exp)+ $(return exp)+ $(return exp)+ |]+ )+ exp+ tags++genConvertOpFieldClause ::+ DeriveConfig ->+ ConvertOpClassConfig ->+ [(Type, Kind)] ->+ [(Type, Kind)] ->+ [(Type, Kind)] ->+ [(Type, Kind)] ->+ ConstructorInfo ->+ Q Clause+genConvertOpFieldClause+ deriveConfig@DeriveConfig {..}+ ConvertOpClassConfig {..}+ lhsKeptTypes+ rhsKeptTypes+ lhsArgTypes+ _rhsArgTypes+ lhsConInfo = do+ fields <- mapM resolveTypeSynonyms $ constructorFields lhsConInfo+ (funPats, defaultFieldFunExps) <- funPatAndExps convertFieldFunExp lhsArgTypes fields+ fieldsPatNames <- replicateM (length fields) $ newName "field"+ fieldPats <- conP (constructorName lhsConInfo) (fmap varP fieldsPatNames)+ let fieldPatExps = fmap VarE fieldsPatNames+ fieldResExps <- zipWithM convertFieldResFun fieldPatExps defaultFieldFunExps+ resExp <- convertFieldCombineFun (constructorName lhsConInfo) fieldResExps+ let resUsedNames = allUsedNames resExp+ let transformPat (VarP nm) =+ if S.member nm resUsedNames then VarP nm else WildP+ transformPat p = p+ resExpWithTags <-+ caseSplitTagPairs+ deriveConfig+ convertOpTarget+ lhsKeptTypes+ rhsKeptTypes+ resExp+ return $+ Clause+ (fmap transformPat $ funPats ++ [fieldPats])+ (NormalB resExpWithTags)+ []++genConvertOpFun ::+ DeriveConfig ->+ ConvertOpClassConfig ->+ Int ->+ [(Type, Kind)] ->+ [(Type, Kind)] ->+ [(Type, Kind)] ->+ [(Type, Kind)] ->+ [ConstructorInfo] ->+ Q Dec+genConvertOpFun _ convertOpClassConfig n _ _ _ _ [] = do+ let instanceFunName = (convertOpFunNames convertOpClassConfig) !! n+ funD instanceFunName [clause [] (normalB [|error "impossible"|]) []]+genConvertOpFun+ deriveConfig+ convertOpClassConfig+ n+ lhsKeptTypes+ rhsKeptTypes+ lhsArgTypes+ rhsArgTypes+ lhsConstructors = do+ clauses <-+ traverse+ ( genConvertOpFieldClause+ deriveConfig+ convertOpClassConfig+ lhsKeptTypes+ rhsKeptTypes+ lhsArgTypes+ rhsArgTypes+ )+ lhsConstructors+ let instanceFunName = (convertOpFunNames convertOpClassConfig) !! n+ return $ FunD instanceFunName clauses++-- | Configuration for a convert operation class.+data ConvertOpClassConfig = ConvertOpClassConfig+ { convertOpTarget :: EvalModeTag,+ convertOpInstanceNames :: [Name],+ convertOpFunNames :: [Name],+ convertFieldResFun :: Exp -> Exp -> Q Exp,+ convertFieldCombineFun :: Name -> [Exp] -> Q Exp,+ convertFieldFunExp :: FieldFunExp+ }++convertCtxForVar :: [Type] -> Type -> Type -> Kind -> Q (Maybe Pred)+convertCtxForVar instanceExps lty rty knd = case knd of+ StarT ->+ Just+ <$> [t|$(return $ head instanceExps) $(return lty) $(return rty)|]+ AppT (AppT ArrowT StarT) StarT ->+ Just+ <$> [t|$(return $ instanceExps !! 1) $(return lty) $(return rty)|]+ AppT (AppT (AppT ArrowT StarT) StarT) StarT ->+ Just+ <$> [t|$(return $ instanceExps !! 2) $(return lty) $(return rty)|]+ AppT (AppT (AppT StarT StarT) StarT) _ ->+ fail $ "Unsupported kind: " <> show knd+ _ -> return Nothing++-- | Generate extra constraints for a data type.+extraConstraintConvert ::+ DeriveConfig ->+ EvalModeTag ->+ Name ->+ Name ->+ [(Type, Kind)] ->+ [(Type, Kind)] ->+ [ConstructorInfo] ->+ Q [Pred]+extraConstraintConvert+ deriveConfig@DeriveConfig {..}+ convertOpTarget+ tyName+ instanceName+ lhsKeptArgs+ rhsKeptArgs+ rhsConstructors = do+ let conKeptVars = if convertOpTarget == S then lhsKeptArgs else rhsKeptArgs+ let symKeptVars = if convertOpTarget == S then rhsKeptArgs else lhsKeptArgs++ rhsEvalModePreds <-+ if convertOpTarget == S && needExtraMergeableWithConcretizedEvalMode+ then+ traverse+ (extraEvalModeConstraint tyName instanceName rhsKeptArgs)+ evalModeConfig+ else return []+ extraArgEvalModePreds <-+ traverse+ ( \case+ (n, EvalModeConstraints _)+ | n < length lhsKeptArgs && n >= 0 ->+ (: [])+ <$> [t|+ EvalModeConvertible+ $(return $ fst $ conKeptVars !! n)+ $(return $ fst $ symKeptVars !! n)+ |]+ _ -> return []+ )+ evalModeConfig+ bitSizePreds <-+ traverse+ (extraBitSizeConstraint tyName instanceName lhsKeptArgs)+ bitSizePositions+ fpBitSizePreds <-+ traverse+ (extraFpBitSizeConstraint tyName instanceName lhsKeptArgs)+ fpBitSizePositions+ extraMergeablePreds <-+ if convertOpTarget == S+ && ( any+ ( \case+ (_, EvalModeConstraints _) -> True+ (_, EvalModeSpecified _) -> False+ )+ evalModeConfig+ || needExtraMergeableWithConcretizedEvalMode+ )+ then extraExtraMergeableConstraint deriveConfig rhsConstructors rhsKeptArgs+ else return []+ return $+ concat+ ( rhsEvalModePreds+ ++ extraArgEvalModePreds+ ++ bitSizePreds+ ++ fpBitSizePreds+ ++ [extraMergeablePreds]+ )++-- | Generate a convert operation class instance.+genConvertOpClass ::+ DeriveConfig -> ConvertOpClassConfig -> Int -> Name -> Q [Dec]+genConvertOpClass deriveConfig (ConvertOpClassConfig {..}) n typName = do+ oldLhsResult <-+ freshenCheckArgsResult True+ =<< checkArgs+ (nameBase $ head convertOpInstanceNames)+ (length convertOpInstanceNames - 1)+ typName+ False+ n+ oldRhsResult <- freshenCheckArgsResult False oldLhsResult+ let lResult = oldLhsResult+ let rResult = oldRhsResult+ let instanceName = convertOpInstanceNames !! n+ let lKeptVars = keptVars lResult+ let rKeptVars = keptVars rResult+ let lConstructors = constructors lResult+ let rConstructors = constructors rResult+ let lKeptType = foldl AppT (ConT typName) $ fmap fst lKeptVars+ let rKeptType = foldl AppT (ConT typName) $ fmap fst rKeptVars+ extraPreds <-+ extraConstraintConvert+ deriveConfig+ convertOpTarget+ typName+ instanceName+ lKeptVars+ rKeptVars+ rConstructors+ unionExtraPreds <-+ extraConstraintConvert+ deriveConfig {needExtraMergeableWithConcretizedEvalMode = True}+ convertOpTarget+ typName+ instanceName+ lKeptVars+ rKeptVars+ rConstructors++ let instanceType = AppT (AppT (ConT instanceName) lKeptType) rKeptType+ let isTypeUsedInFields (VarT nm) = isVarUsedInFields lResult nm+ isTypeUsedInFields _ = False+ ctxs <-+ traverse+ ( \(position, ((lty, knd), (rty, _))) ->+ if position `elem` unconstrainedPositions deriveConfig+ then return Nothing+ else convertCtxForVar (ConT <$> convertOpInstanceNames) lty rty knd+ )+ $ filter (isTypeUsedInFields . fst . fst . snd)+ $ zip [0 ..]+ $ zip lKeptVars rKeptVars++ instanceFun <-+ genConvertOpFun+ deriveConfig+ (ConvertOpClassConfig {..})+ n+ (keptVars lResult)+ (keptVars rResult)+ (argVars lResult)+ (argVars rResult)+ lConstructors++ let instanceUnionType =+ case convertOpTarget of+ S ->+ AppT+ (AppT (ConT instanceName) lKeptType)+ (AppT (ConT ''Union) rKeptType)+ C ->+ AppT+ (AppT (ConT instanceName) (AppT (ConT ''Union) lKeptType))+ rKeptType+ instanceUnionFun <- do+ resExp <-+ if convertOpTarget == S+ then varE 'toUnionSym+ else varE 'unionToCon+ funD (head convertOpFunNames) [clause [] (normalB $ return resExp) []]++ return $+ InstanceD+ (Just Incoherent)+ (extraPreds ++ if null (constructors lResult) then [] else catMaybes ctxs)+ instanceType+ [instanceFun]+ : ( [ InstanceD+ (Just Incoherent)+ ( unionExtraPreds+ ++ if null (constructors lResult)+ then []+ else catMaybes ctxs+ )+ instanceUnionType+ [instanceUnionFun]+ | n == 0+ ]+ )
+ src/Grisette/Internal/TH/Derivation/Derive.hs view
@@ -0,0 +1,968 @@+{-# LANGUAGE LambdaCase #-}+{-# HLINT ignore "Unused LANGUAGE pragma" #-}+{-# LANGUAGE MultiWayIf #-}+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}++-- |+-- Module : Grisette.Internal.TH.Derivation.Derive+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.TH.Derivation.Derive+ ( derive,+ deriveWith,+ allClasses0,+ allClasses01,+ allClasses012,+ basicClasses0,+ noExistentialClasses0,+ concreteOrdClasses0,+ basicClasses1,+ noExistentialClasses1,+ concreteOrdClasses1,+ basicClasses2,+ noExistentialClasses2,+ concreteOrdClasses2,+ showClasses,+ pprintClasses,+ evalSymClasses,+ extractSymClasses,+ substSymClasses,+ allSymsClasses,+ eqClasses,+ ordClasses,+ symOrdClasses,+ symEqClasses,+ unifiedSymOrdClasses,+ unifiedSymEqClasses,+ mergeableClasses,+ nfDataClasses,+ hashableClasses,+ toSymClasses,+ toConClasses,+ serialClasses,+ simpleMergeableClasses,+ unifiedSimpleMergeableClasses,+ filterExactNumArgs,+ filterLeqNumArgs,+ )+where++import Control.Arrow (Arrow (second))+import Control.DeepSeq (NFData, NFData1, NFData2)+import Data.Binary (Binary)+import Data.Bytes.Serial (Serial, Serial1, Serial2)+import Data.Functor.Classes (Eq1, Eq2, Ord1, Ord2, Show1, Show2)+import Data.Hashable (Hashable)+import Data.Hashable.Lifted (Hashable1, Hashable2)+import qualified Data.Map as M+import Data.Serialize (Serialize)+import qualified Data.Set as S+import Grisette.Internal.Internal.Decl.Core.Data.Class.EvalSym+ ( EvalSym,+ EvalSym1,+ EvalSym2,+ )+import Grisette.Internal.Internal.Decl.Core.Data.Class.ExtractSym+ ( ExtractSym,+ ExtractSym1,+ ExtractSym2,+ )+import Grisette.Internal.Internal.Decl.Core.Data.Class.Mergeable+ ( Mergeable,+ Mergeable1,+ Mergeable2,+ Mergeable3,+ )+import Grisette.Internal.Internal.Decl.Core.Data.Class.PPrint+ ( PPrint,+ PPrint1,+ PPrint2,+ )+import Grisette.Internal.Internal.Decl.Core.Data.Class.SimpleMergeable+ ( SimpleMergeable,+ SimpleMergeable1,+ SimpleMergeable2,+ )+import Grisette.Internal.Internal.Decl.Core.Data.Class.SubstSym+ ( SubstSym,+ SubstSym1,+ SubstSym2,+ )+import Grisette.Internal.Internal.Decl.Core.Data.Class.SymEq+ ( SymEq,+ SymEq1,+ SymEq2,+ )+import Grisette.Internal.Internal.Decl.Core.Data.Class.SymOrd+ ( SymOrd,+ SymOrd1,+ SymOrd2,+ )+import Grisette.Internal.Internal.Decl.Core.Data.Class.ToCon+ ( ToCon,+ ToCon1,+ ToCon2,+ )+import Grisette.Internal.Internal.Decl.Core.Data.Class.ToSym+ ( ToSym,+ ToSym1,+ ToSym2,+ )+import Grisette.Internal.Internal.Decl.SymPrim.AllSyms+ ( AllSyms,+ AllSyms1,+ AllSyms2,+ )+import Grisette.Internal.Internal.Decl.Unified.Class.UnifiedSimpleMergeable+ ( UnifiedSimpleMergeable,+ UnifiedSimpleMergeable1,+ UnifiedSimpleMergeable2,+ )+import Grisette.Internal.Internal.Decl.Unified.Class.UnifiedSymEq+ ( UnifiedSymEq,+ UnifiedSymEq1,+ UnifiedSymEq2,+ )+import Grisette.Internal.Internal.Decl.Unified.Class.UnifiedSymOrd+ ( UnifiedSymOrd,+ UnifiedSymOrd1,+ UnifiedSymOrd2,+ )+import Grisette.Internal.TH.Derivation.Common+ ( DeriveConfig+ ( evalModeConfig,+ needExtraMergeableUnderEvalMode,+ needExtraMergeableWithConcretizedEvalMode+ ),+ EvalModeConfig (EvalModeConstraints, EvalModeSpecified),+ )+import Grisette.Internal.TH.Derivation.DeriveAllSyms+ ( deriveAllSyms,+ deriveAllSyms1,+ deriveAllSyms2,+ )+import Grisette.Internal.TH.Derivation.DeriveBinary (deriveBinary)+import Grisette.Internal.TH.Derivation.DeriveCereal (deriveCereal)+import Grisette.Internal.TH.Derivation.DeriveEq+ ( deriveEq,+ deriveEq1,+ deriveEq2,+ )+import Grisette.Internal.TH.Derivation.DeriveEvalSym+ ( deriveEvalSym,+ deriveEvalSym1,+ deriveEvalSym2,+ )+import Grisette.Internal.TH.Derivation.DeriveExtractSym+ ( deriveExtractSym,+ deriveExtractSym1,+ deriveExtractSym2,+ )+import Grisette.Internal.TH.Derivation.DeriveHashable+ ( deriveHashable,+ deriveHashable1,+ deriveHashable2,+ )+import Grisette.Internal.TH.Derivation.DeriveMergeable (genMergeableList)+import Grisette.Internal.TH.Derivation.DeriveNFData+ ( deriveNFData,+ deriveNFData1,+ deriveNFData2,+ )+import Grisette.Internal.TH.Derivation.DeriveOrd+ ( deriveOrd,+ deriveOrd1,+ deriveOrd2,+ )+import Grisette.Internal.TH.Derivation.DerivePPrint+ ( derivePPrint,+ derivePPrint1,+ derivePPrint2,+ )+import Grisette.Internal.TH.Derivation.DeriveSerial+ ( deriveSerial,+ deriveSerial1,+ deriveSerial2,+ )+import Grisette.Internal.TH.Derivation.DeriveShow+ ( deriveShow,+ deriveShow1,+ deriveShow2,+ )+import Grisette.Internal.TH.Derivation.DeriveSimpleMergeable+ ( deriveSimpleMergeable,+ deriveSimpleMergeable1,+ deriveSimpleMergeable2,+ )+import Grisette.Internal.TH.Derivation.DeriveSubstSym+ ( deriveSubstSym,+ deriveSubstSym1,+ deriveSubstSym2,+ )+import Grisette.Internal.TH.Derivation.DeriveSymEq+ ( deriveSymEq,+ deriveSymEq1,+ deriveSymEq2,+ )+import Grisette.Internal.TH.Derivation.DeriveSymOrd+ ( deriveSymOrd,+ deriveSymOrd1,+ deriveSymOrd2,+ )+import Grisette.Internal.TH.Derivation.DeriveToCon+ ( deriveToCon,+ deriveToCon1,+ deriveToCon2,+ )+import Grisette.Internal.TH.Derivation.DeriveToSym+ ( deriveToSym,+ deriveToSym1,+ deriveToSym2,+ )+import Grisette.Internal.TH.Derivation.DeriveUnifiedSimpleMergeable+ ( deriveUnifiedSimpleMergeable,+ deriveUnifiedSimpleMergeable1,+ deriveUnifiedSimpleMergeable2,+ )+import Grisette.Internal.TH.Derivation.DeriveUnifiedSymEq+ ( deriveUnifiedSymEq,+ deriveUnifiedSymEq1,+ deriveUnifiedSymEq2,+ )+import Grisette.Internal.TH.Derivation.DeriveUnifiedSymOrd+ ( deriveUnifiedSymOrd,+ deriveUnifiedSymOrd1,+ deriveUnifiedSymOrd2,+ )+import Grisette.Internal.Unified.EvalModeTag (EvalModeTag (C, S))+import Language.Haskell.TH (Dec, Name, Q)++deriveProcedureMap :: M.Map Name (DeriveConfig -> Name -> Q [Dec])+deriveProcedureMap =+ M.fromList+ [ (''EvalSym, deriveEvalSym),+ (''EvalSym1, deriveEvalSym1),+ (''EvalSym2, deriveEvalSym2),+ (''ExtractSym, deriveExtractSym),+ (''ExtractSym1, deriveExtractSym1),+ (''ExtractSym2, deriveExtractSym2),+ (''SubstSym, deriveSubstSym),+ (''SubstSym1, deriveSubstSym1),+ (''SubstSym2, deriveSubstSym2),+ (''NFData, deriveNFData),+ (''NFData1, deriveNFData1),+ (''NFData2, deriveNFData2),+ (''Hashable, deriveHashable),+ (''Hashable1, deriveHashable1),+ (''Hashable2, deriveHashable2),+ (''Show, deriveShow),+ (''Show1, deriveShow1),+ (''Show2, deriveShow2),+ (''PPrint, derivePPrint),+ (''PPrint1, derivePPrint1),+ (''PPrint2, derivePPrint2),+ (''AllSyms, deriveAllSyms),+ (''AllSyms1, deriveAllSyms1),+ (''AllSyms2, deriveAllSyms2),+ (''Eq, deriveEq),+ (''Eq1, deriveEq1),+ (''Eq2, deriveEq2),+ (''Ord, deriveOrd),+ (''Ord1, deriveOrd1),+ (''Ord2, deriveOrd2),+ (''SymOrd, deriveSymOrd),+ (''SymOrd1, deriveSymOrd1),+ (''SymOrd2, deriveSymOrd2),+ (''SymEq, deriveSymEq),+ (''SymEq1, deriveSymEq1),+ (''SymEq2, deriveSymEq2),+ (''UnifiedSymEq, deriveUnifiedSymEq),+ (''UnifiedSymEq1, deriveUnifiedSymEq1),+ (''UnifiedSymEq2, deriveUnifiedSymEq2),+ (''UnifiedSymOrd, deriveUnifiedSymOrd),+ (''UnifiedSymOrd1, deriveUnifiedSymOrd1),+ (''UnifiedSymOrd2, deriveUnifiedSymOrd2),+ (''ToSym, deriveToSym),+ (''ToSym1, deriveToSym1),+ (''ToSym2, deriveToSym2),+ (''ToCon, deriveToCon),+ (''ToCon1, deriveToCon1),+ (''ToCon2, deriveToCon2),+ (''Serial, deriveSerial),+ (''Serial1, deriveSerial1),+ (''Serial2, deriveSerial2),+ (''SimpleMergeable, deriveSimpleMergeable),+ (''SimpleMergeable1, deriveSimpleMergeable1),+ (''SimpleMergeable2, deriveSimpleMergeable2),+ (''UnifiedSimpleMergeable, deriveUnifiedSimpleMergeable),+ (''UnifiedSimpleMergeable1, deriveUnifiedSimpleMergeable1),+ (''UnifiedSimpleMergeable2, deriveUnifiedSimpleMergeable2),+ (''Binary, deriveBinary),+ (''Serialize, deriveCereal)+ ]++deriveSingle :: DeriveConfig -> Name -> Name -> Q [Dec]+deriveSingle deriveConfig typName className = do+ let newExtra+ | className+ `elem` [ ''Eq,+ ''Eq1,+ ''Eq2,+ ''SymEq,+ ''SymEq1,+ ''SymEq2,+ ''SymOrd,+ ''SymOrd1,+ ''SymOrd2,+ ''UnifiedSymEq,+ ''UnifiedSymEq1,+ ''UnifiedSymEq2,+ ''UnifiedSymOrd,+ ''UnifiedSymOrd1,+ ''UnifiedSymOrd2,+ ''UnifiedSimpleMergeable,+ ''UnifiedSimpleMergeable1,+ ''UnifiedSimpleMergeable2+ ] =+ deriveConfig+ { needExtraMergeableUnderEvalMode = False,+ needExtraMergeableWithConcretizedEvalMode = False+ }+ | className+ `elem` [''SimpleMergeable, ''SimpleMergeable1, ''SimpleMergeable2] =+ deriveConfig+ { evalModeConfig =+ second+ ( \case+ EvalModeConstraints _ -> EvalModeSpecified S+ EvalModeSpecified tag -> EvalModeSpecified tag+ )+ <$> evalModeConfig deriveConfig,+ needExtraMergeableUnderEvalMode = False,+ needExtraMergeableWithConcretizedEvalMode = False+ }+ | className `elem` [''Ord, ''Ord1, ''Ord2] =+ deriveConfig+ { evalModeConfig =+ second+ ( \case+ EvalModeConstraints _ -> EvalModeSpecified C+ EvalModeSpecified tag -> EvalModeSpecified tag+ )+ <$> evalModeConfig deriveConfig,+ needExtraMergeableUnderEvalMode = False,+ needExtraMergeableWithConcretizedEvalMode = False+ }+ | otherwise = deriveConfig+ case M.lookup className deriveProcedureMap of+ Just procedure -> procedure newExtra typName+ Nothing ->+ fail $ "No derivation available for class " ++ show className++deriveWith' :: DeriveConfig -> Name -> [Name] -> Q [Dec]+deriveWith' deriveConfig typName classNameList = do+ let classNames = S.fromList classNameList+ let (ns, ms) = splitMergeable $ S.toList classNames+ decs <- mapM (deriveSingle deriveConfig typName) ns+ decMergeables <- deriveMergeables ms+ return $ concat decs ++ decMergeables+ where+ configWithOutExtraMergeable :: DeriveConfig+ configWithOutExtraMergeable =+ deriveConfig {needExtraMergeableUnderEvalMode = False}+ deriveMergeables :: [Int] -> Q [Dec]+ deriveMergeables = genMergeableList configWithOutExtraMergeable typName+ splitMergeable :: [Name] -> ([Name], [Int])+ splitMergeable [] = ([], [])+ splitMergeable (x : xs) =+ let (ns, is) = splitMergeable xs+ in if+ | x == ''Mergeable -> (ns, 0 : is)+ | x == ''Mergeable1 -> (ns, 1 : is)+ | x == ''Mergeable2 -> (ns, 2 : is)+ | x == ''Mergeable3 -> (ns, 3 : is)+ | otherwise -> (x : ns, is)++-- | Derive the specified classes for a data type with the given name.+--+-- Support the following classes for both vanilla data types and GADTs.+--+-- * 'Mergeable'+-- * 'Mergeable1'+-- * 'Mergeable2'+-- * 'Mergeable3'+-- * 'EvalSym'+-- * 'EvalSym1'+-- * 'EvalSym2'+-- * 'ExtractSym'+-- * 'ExtractSym1'+-- * 'ExtractSym2'+-- * 'SubstSym'+-- * 'SubstSym1'+-- * 'SubstSym2'+-- * 'NFData'+-- * 'NFData1'+-- * 'NFData2'+-- * 'Hashable'+-- * 'Hashable1'+-- * 'Hashable2'+-- * 'Show'+-- * 'Show1'+-- * 'Show2'+-- * 'PPrint'+-- * 'PPrint1'+-- * 'PPrint2'+-- * 'AllSyms'+-- * 'AllSyms1'+-- * 'AllSyms2'+-- * 'Eq'+-- * 'Eq1'+-- * 'Eq2'+-- * 'Ord'+-- * 'Ord1'+-- * 'Ord2'+-- * 'SymOrd'+-- * 'SymOrd1'+-- * 'SymOrd2'+-- * 'SymEq'+-- * 'SymEq1'+-- * 'SymEq2'+-- * 'UnifiedSymEq'+-- * 'UnifiedSymEq1'+-- * 'UnifiedSymEq2'+-- * 'UnifiedSymOrd'+-- * 'UnifiedSymOrd1'+-- * 'UnifiedSymOrd2'+-- * 'ToSym'+-- * 'ToSym1'+-- * 'ToSym2'+-- * 'ToCon'+-- * 'ToCon1'+-- * 'ToCon2'+-- * 'Serial'+-- * 'Serial1'+-- * 'Serial2'+-- * 'SimpleMergeable'+-- * 'SimpleMergeable1'+-- * 'SimpleMergeable2'+-- * 'Binary'+-- * 'Serialize'+--+-- Note that the following type classes cannot be derived for GADTs with+-- existential type variables.+--+-- * 'ToCon'+-- * 'ToCon1'+-- * 'ToCon2'+-- * 'ToSym'+-- * 'ToSym1'+-- * 'ToSym2'+-- * 'Serial'+-- * 'Serial1'+-- * 'Serial2'+-- * 'Binary'+-- * 'Serialize'+deriveWith :: DeriveConfig -> [Name] -> [Name] -> Q [Dec]+deriveWith deriveConfig typeNameList classNameList = do+ let typeNames = S.toList $ S.fromList typeNameList+ concat+ <$> traverse+ (\typeName -> deriveWith' deriveConfig typeName classNameList)+ typeNames++-- | Derive the specified classes for a data type with the given name.+--+-- See 'deriveWith' for more details.+derive :: [Name] -> [Name] -> Q [Dec]+derive = deriveWith mempty++-- | All the classes that can be derived for GADTs.+--+-- This includes:+--+-- * 'Mergeable'+-- * 'EvalSym'+-- * 'ExtractSym'+-- * 'SubstSym'+-- * 'NFData'+-- * 'Hashable'+-- * 'Show'+-- * 'PPrint'+-- * 'AllSyms'+-- * 'Eq'+-- * 'SymEq'+-- * 'SymOrd'+-- * 'UnifiedSymEq'+-- * 'Ord'+-- * 'UnifiedSymOrd'+-- * 'Serial'+-- * 'ToCon'+-- * 'ToSym'+allClasses0 :: [Name]+allClasses0 = basicClasses0 ++ concreteOrdClasses0 ++ noExistentialClasses0++-- | All the @*1@ classes that can be derived for GADT functors.+--+-- This includes:+--+-- * 'Mergeable1'+-- * 'EvalSym1'+-- * 'ExtractSym1'+-- * 'SubstSym1'+-- * 'NFData1'+-- * 'Hashable1'+-- * 'Show1'+-- * 'PPrint1'+-- * 'AllSyms1'+-- * 'Eq1'+-- * 'SymEq1'+-- * 'SymOrd1'+-- * 'UnifiedSymEq1'+-- * 'Ord1'+-- * 'UnifiedSymOrd1'+-- * 'Serial1'+-- * 'ToCon1'+-- * 'ToSym1'+allClasses1 :: [Name]+allClasses1 = basicClasses1 ++ concreteOrdClasses1 ++ noExistentialClasses1++-- | All the classes that can be derived for GADT functors.+--+-- This includes all the classes in 'allClasses0' and 'allClasses1'.+allClasses01 :: [Name]+allClasses01 = allClasses0 ++ allClasses1++-- | All the @*2@ classes that can be derived for GADT functors.+--+-- This includes:+--+-- * 'Mergeable2'+-- * 'EvalSym2'+-- * 'ExtractSym2'+-- * 'SubstSym2'+-- * 'NFData2'+-- * 'Hashable2'+-- * 'Show2'+-- * 'PPrint2'+-- * 'AllSyms2'+-- * 'Eq2'+-- * 'SymEq2'+-- * 'SymOrd2'+-- * 'UnifiedSymEq2'+-- * 'Ord2'+-- * 'UnifiedSymOrd2'+-- * 'Serial2'+-- * 'ToCon2'+-- * 'ToSym2'+allClasses2 :: [Name]+allClasses2 = basicClasses2 ++ concreteOrdClasses2 ++ noExistentialClasses2++-- | All the classes that can be derived for GADT functors.+--+-- This includes all the classes in 'allClasses0', 'allClasses1',+-- and 'allClasses2'.+allClasses012 :: [Name]+allClasses012 = allClasses0 ++ allClasses1 ++ allClasses2++-- | Basic classes for GADTs.+--+-- This includes:+--+-- * 'Mergeable'+-- * 'EvalSym'+-- * 'ExtractSym'+-- * 'SubstSym'+-- * 'NFData'+-- * 'Hashable'+-- * 'Show'+-- * 'PPrint'+-- * 'AllSyms'+-- * 'Eq'+-- * 'SymEq'+-- * 'SymOrd'+-- * 'UnifiedSymEq'+--+-- These classes can be derived for most GADTs.+basicClasses0 :: [Name]+basicClasses0 =+ [ ''Mergeable,+ ''EvalSym,+ ''ExtractSym,+ ''SubstSym,+ ''NFData,+ ''Hashable,+ ''Show,+ ''PPrint,+ ''AllSyms,+ ''Eq,+ ''SymEq,+ ''SymOrd,+ ''UnifiedSymEq+ ]++-- | Classes that can only be derived for GADTs without existential type+-- variables.+--+-- This includes:+--+-- * 'Serial'+-- * 'Serialize'+-- * 'Binary'+-- * 'ToCon'+-- * 'ToSym'+noExistentialClasses0 :: [Name]+noExistentialClasses0 = [''Serial, ''ToCon, ''ToSym, ''Serialize, ''Binary]++-- | Concrete ordered classes that can be derived for GADTs that+--+-- * uses unified evaluation mode, or+-- * does not contain any symbolic variables.+--+-- This includes:+--+-- * 'Ord'+-- * 'UnifiedSymOrd'+concreteOrdClasses0 :: [Name]+concreteOrdClasses0 = [''Ord, ''UnifiedSymOrd]++-- | Basic classes for GADT functors.+--+-- This includes:+--+-- * 'Mergeable1'+-- * 'EvalSym1'+-- * 'ExtractSym1'+-- * 'SubstSym1'+-- * 'NFData1'+-- * 'Hashable1'+-- * 'Show1'+-- * 'PPrint1'+-- * 'AllSyms1'+-- * 'Eq1'+-- * 'SymEq1'+-- * 'SymOrd1'+-- * 'UnifiedSymEq1'+basicClasses1 :: [Name]+basicClasses1 =+ [ ''Mergeable1,+ ''EvalSym1,+ ''ExtractSym1,+ ''SubstSym1,+ ''NFData1,+ ''Hashable1,+ ''Show1,+ ''PPrint1,+ ''AllSyms1,+ ''Eq1,+ ''SymEq1,+ ''SymOrd1,+ ''UnifiedSymEq1+ ]++-- | @*1@ classes that can only be derived for GADT functors without existential+-- type variables.+--+-- This includes:+--+-- * 'Serial1'+-- * 'ToCon1'+-- * 'ToSym1'+noExistentialClasses1 :: [Name]+noExistentialClasses1 = [''Serial1, ''ToCon1, ''ToSym1]++-- | @*1@ concrete ordered classes that can be derived for GADT functors that+--+-- * uses unified evaluation mode, or+-- * does not contain any symbolic variables.+--+-- This includes:+--+-- * 'Ord1'+-- * 'UnifiedSymOrd1'+concreteOrdClasses1 :: [Name]+concreteOrdClasses1 = [''Ord1, ''UnifiedSymOrd1]++-- | Basic classes for GADT functors.+--+-- This includes:+--+-- * 'Mergeable2'+-- * 'EvalSym2'+-- * 'ExtractSym2'+-- * 'SubstSym2'+-- * 'NFData2'+-- * 'Hashable2'+-- * 'Show2'+-- * 'PPrint2'+-- * 'AllSyms2'+-- * 'Eq2'+-- * 'SymEq2'+-- * 'SymOrd2'+-- * 'UnifiedSymEq2'+basicClasses2 :: [Name]+basicClasses2 =+ [ ''Mergeable2,+ ''EvalSym2,+ ''ExtractSym2,+ ''SubstSym2,+ ''NFData2,+ ''Hashable2,+ ''Show2,+ ''PPrint2,+ ''AllSyms2,+ ''Eq2,+ ''SymEq2,+ ''SymOrd2,+ ''UnifiedSymEq2+ ]++-- | @*2@ classes that can only be derived for GADT functors without existential+-- type variables.+--+-- This includes:+--+-- * 'Serial2'+-- * 'ToCon2'+-- * 'ToSym2'+noExistentialClasses2 :: [Name]+noExistentialClasses2 = [''Serial2, ''ToCon2, ''ToSym2]++-- | @*2@ concrete ordered classes that can be derived for GADT functors that+--+-- * uses unified evaluation mode, or+-- * does not contain any symbolic variables.+--+-- This includes:+--+-- * 'Ord2'+-- * 'UnifiedSymOrd2'+concreteOrdClasses2 :: [Name]+concreteOrdClasses2 = [''Ord2, ''UnifiedSymOrd2]++-- | 'Show' classes that can be derived for GADTs.+--+-- This includes:+--+-- * 'Show'+-- * 'Show1'+-- * 'Show2'+showClasses :: [Name]+showClasses = [''Show, ''Show1, ''Show2]++-- | 'PPrint' classes that can be derived for GADTs.+--+-- This includes:+--+-- * 'PPrint'+-- * 'PPrint1'+-- * 'PPrint2'+pprintClasses :: [Name]+pprintClasses = [''PPrint, ''PPrint1, ''PPrint2]++-- | 'EvalSym' classes that can be derived for GADTs.+--+-- This includes:+--+-- * 'EvalSym'+-- * 'EvalSym1'+-- * 'EvalSym2'+evalSymClasses :: [Name]+evalSymClasses = [''EvalSym, ''EvalSym1, ''EvalSym2]++-- | 'ExtractSym' classes that can be derived for GADTs.+--+-- This includes:+--+-- * 'ExtractSym'+-- * 'ExtractSym1'+-- * 'ExtractSym2'+extractSymClasses :: [Name]+extractSymClasses = [''ExtractSym, ''ExtractSym1, ''ExtractSym2]++-- | 'SubstSym' classes that can be derived for GADTs.+--+-- This includes:+--+-- * 'SubstSym'+-- * 'SubstSym1'+-- * 'SubstSym2'+substSymClasses :: [Name]+substSymClasses = [''SubstSym, ''SubstSym1, ''SubstSym2]++-- | 'AllSyms' classes that can be derived for GADTs.+--+-- This includes:+--+-- * 'AllSyms'+-- * 'AllSyms1'+-- * 'AllSyms2'+allSymsClasses :: [Name]+allSymsClasses = [''AllSyms, ''AllSyms1, ''AllSyms2]++-- | 'Eq' classes that can be derived for GADTs.+--+-- This includes:+--+-- * 'Eq'+-- * 'Eq1'+-- * 'Eq2'+eqClasses :: [Name]+eqClasses = [''Eq, ''Eq1, ''Eq2]++-- | 'SymEq' classes that can be derived for GADTs.+--+-- This includes:+--+-- * 'SymEq'+-- * 'SymEq1'+-- * 'SymEq2'+symEqClasses :: [Name]+symEqClasses = [''SymEq, ''SymEq1, ''SymEq2]++-- | 'UnifiedSymEq' classes that can be derived for GADTs.+--+-- This includes:+--+-- * 'UnifiedSymEq'+-- * 'UnifiedSymEq1'+-- * 'UnifiedSymEq2'+unifiedSymEqClasses :: [Name]+unifiedSymEqClasses = [''UnifiedSymEq, ''UnifiedSymEq1, ''UnifiedSymEq2]++-- | 'Ord' classes that can be derived for GADTs.+--+-- This includes:+--+-- * 'Ord'+-- * 'Ord1'+-- * 'Ord2'+ordClasses :: [Name]+ordClasses = [''Ord, ''Ord1, ''Ord2]++-- | 'SymOrd' classes that can be derived for GADTs.+--+-- This includes:+--+-- * 'SymOrd'+-- * 'SymOrd1'+-- * 'SymOrd2'+symOrdClasses :: [Name]+symOrdClasses = [''SymOrd, ''SymOrd1, ''SymOrd2]++-- | 'UnifiedSymOrd' classes that can be derived for GADTs.+--+-- This includes:+--+-- * 'UnifiedSymOrd'+-- * 'UnifiedSymOrd1'+-- * 'UnifiedSymOrd2'+unifiedSymOrdClasses :: [Name]+unifiedSymOrdClasses = [''UnifiedSymOrd, ''UnifiedSymOrd1, ''UnifiedSymOrd2]++-- | 'Mergeable' classes that can be derived for GADTs.+--+-- This includes:+--+-- * 'Mergeable'+-- * 'Mergeable1'+-- * 'Mergeable2'+-- * 'Mergeable3'+mergeableClasses :: [Name]+mergeableClasses = [''Mergeable, ''Mergeable1, ''Mergeable2, ''Mergeable3]++-- | 'NFData' classes that can be derived for GADTs.+--+-- This includes:+--+-- * 'NFData'+-- * 'NFData1'+-- * 'NFData2'+nfDataClasses :: [Name]+nfDataClasses = [''NFData, ''NFData1, ''NFData2]++-- | 'Hashable' classes that can be derived for GADTs.+--+-- This includes:+--+-- * 'Hashable'+-- * 'Hashable1'+-- * 'Hashable2'+hashableClasses :: [Name]+hashableClasses = [''Hashable, ''Hashable1, ''Hashable2]++-- | 'ToSym' classes that can be derived for GADTs.+--+-- This includes:+--+-- * 'ToSym'+-- * 'ToSym1'+-- * 'ToSym2'+toSymClasses :: [Name]+toSymClasses = [''ToSym, ''ToSym1, ''ToSym2]++-- | 'ToCon' classes that can be derived for GADTs.+--+-- This includes:+--+-- * 'ToCon'+-- * 'ToCon1'+-- * 'ToCon2'+toConClasses :: [Name]+toConClasses = [''ToCon, ''ToCon1, ''ToCon2]++-- | 'Serial' classes that can be derived for GADTs.+--+-- This includes:+--+-- * 'Serial'+-- * 'Serial1'+-- * 'Serial2'+serialClasses :: [Name]+serialClasses = [''Serial, ''Serial1, ''Serial2]++-- | 'SimpleMergeable' classes that can be derived for GADTs.+--+-- This includes:+--+-- * 'SimpleMergeable'+-- * 'SimpleMergeable1'+-- * 'SimpleMergeable2'+simpleMergeableClasses :: [Name]+simpleMergeableClasses =+ [''SimpleMergeable, ''SimpleMergeable1, ''SimpleMergeable2]++-- | 'UnifiedSimpleMergeable' classes that can be derived for GADTs.+--+-- This includes:+--+-- * 'UnifiedSimpleMergeable'+-- * 'UnifiedSimpleMergeable1'+-- * 'UnifiedSimpleMergeable2'+unifiedSimpleMergeableClasses :: [Name]+unifiedSimpleMergeableClasses =+ [ ''UnifiedSimpleMergeable,+ ''UnifiedSimpleMergeable1,+ ''UnifiedSimpleMergeable2+ ]++clsArgNumArgs :: Name -> Int+clsArgNumArgs cls =+ if+ | cls `elem` allClasses0 -> 0+ | cls `elem` allClasses1 -> 1+ | cls `elem` allClasses2 -> 2+ | cls == ''Mergeable3 -> 3+ | otherwise -> error $ "clsArgNumArgs: unknown class: " ++ show cls++-- | Filter classes that accepts type constructors with exactly @n@ arguments.+filterExactNumArgs :: Int -> [Name] -> [Name]+filterExactNumArgs n = filter (\cls -> clsArgNumArgs cls == n)++-- | Filter classes that accepts type constructors with at most @n@ arguments.+filterLeqNumArgs :: Int -> [Name] -> [Name]+filterLeqNumArgs n = filter (\cls -> clsArgNumArgs cls <= n)
+ src/Grisette/Internal/TH/Derivation/DeriveAllSyms.hs view
@@ -0,0 +1,90 @@+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}++{-# HLINT ignore "Unused LANGUAGE pragma" #-}++-- |+-- Module : Grisette.Internal.TH.Derivation.DeriveAllSyms+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.TH.Derivation.DeriveAllSyms+ ( deriveAllSyms,+ deriveAllSyms1,+ deriveAllSyms2,+ )+where++import Grisette.Internal.Internal.Decl.SymPrim.AllSyms+ ( AllSyms (allSymsS),+ AllSyms1 (liftAllSymsS),+ AllSyms2 (liftAllSymsS2),+ )+import Grisette.Internal.TH.Derivation.Common (DeriveConfig)+import Grisette.Internal.TH.Derivation.UnaryOpCommon+ ( UnaryOpClassConfig+ ( UnaryOpClassConfig,+ unaryOpAllowExistential,+ unaryOpConfigs,+ unaryOpContextNames,+ unaryOpExtraVars,+ unaryOpInstanceNames,+ unaryOpInstanceTypeFromConfig+ ),+ UnaryOpConfig (UnaryOpConfig),+ UnaryOpFieldConfig+ ( UnaryOpFieldConfig,+ extraLiftedPatNames,+ extraPatNames,+ fieldCombineFun,+ fieldFunExp,+ fieldResFun+ ),+ defaultFieldFunExp,+ defaultFieldResFun,+ defaultUnaryOpInstanceTypeFromConfig,+ genUnaryOpClass,+ )+import Language.Haskell.TH (Dec, Exp (AppE, ListE, VarE), Name, Q)++allSymsConfig :: UnaryOpClassConfig+allSymsConfig =+ UnaryOpClassConfig+ { unaryOpConfigs =+ [ UnaryOpConfig+ UnaryOpFieldConfig+ { extraPatNames = [],+ extraLiftedPatNames = const [],+ fieldResFun = defaultFieldResFun,+ fieldCombineFun = \_ _ _ _ _ exp ->+ return (AppE (VarE 'mconcat) $ ListE exp, False <$ exp),+ fieldFunExp =+ defaultFieldFunExp+ [ 'allSymsS,+ 'liftAllSymsS,+ 'liftAllSymsS2+ ]+ }+ ['allSymsS, 'liftAllSymsS, 'liftAllSymsS2]+ ],+ unaryOpInstanceNames = [''AllSyms, ''AllSyms1, ''AllSyms2],+ unaryOpExtraVars = const $ return [],+ unaryOpInstanceTypeFromConfig = defaultUnaryOpInstanceTypeFromConfig,+ unaryOpAllowExistential = True,+ unaryOpContextNames = Nothing+ }++-- | Derive 'AllSyms' instance for a data type.+deriveAllSyms :: DeriveConfig -> Name -> Q [Dec]+deriveAllSyms deriveConfig = genUnaryOpClass deriveConfig allSymsConfig 0++-- | Derive 'AllSyms1' instance for a data type.+deriveAllSyms1 :: DeriveConfig -> Name -> Q [Dec]+deriveAllSyms1 deriveConfig = genUnaryOpClass deriveConfig allSymsConfig 1++-- | Derive 'AllSyms2' instance for a data type.+deriveAllSyms2 :: DeriveConfig -> Name -> Q [Dec]+deriveAllSyms2 deriveConfig = genUnaryOpClass deriveConfig allSymsConfig 2
+ src/Grisette/Internal/TH/Derivation/DeriveBinary.hs view
@@ -0,0 +1,48 @@+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TupleSections #-}+{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}++{-# HLINT ignore "Unused LANGUAGE pragma" #-}++-- |+-- Module : Grisette.Internal.TH.Derivation.DeriveBinary+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.TH.Derivation.DeriveBinary (deriveBinary) where++import Data.Binary (Binary (get, put))+import Grisette.Internal.TH.Derivation.Common+ ( DeriveConfig (useSerialForCerealAndBinary),+ )+import Grisette.Internal.TH.Derivation.SerializeCommon+ ( serializeConfig,+ serializeWithSerialConfig,+ )+import Grisette.Internal.TH.Derivation.UnaryOpCommon+ ( UnaryOpClassConfig,+ genUnaryOpClass,+ )+import Language.Haskell.TH (Dec, Name, Q)++binaryConfig :: UnaryOpClassConfig+binaryConfig = serializeConfig [''Binary] ['put] ['get]++binaryWithSerialConfig :: UnaryOpClassConfig+binaryWithSerialConfig =+ serializeWithSerialConfig [''Binary] ['put] ['get]++-- | Derive 'Binary' instance for a data type.+deriveBinary :: DeriveConfig -> Name -> Q [Dec]+deriveBinary deriveConfig =+ genUnaryOpClass+ deriveConfig+ ( if useSerialForCerealAndBinary deriveConfig+ then binaryWithSerialConfig+ else binaryConfig+ )+ 0
+ src/Grisette/Internal/TH/Derivation/DeriveCereal.hs view
@@ -0,0 +1,48 @@+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TupleSections #-}+{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}++{-# HLINT ignore "Unused LANGUAGE pragma" #-}++-- |+-- Module : Grisette.Internal.TH.Derivation.DeriveCereal+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.TH.Derivation.DeriveCereal (deriveCereal) where++import Data.Serialize (Serialize (get, put))+import Grisette.Internal.TH.Derivation.Common+ ( DeriveConfig (useSerialForCerealAndBinary),+ )+import Grisette.Internal.TH.Derivation.SerializeCommon+ ( serializeConfig,+ serializeWithSerialConfig,+ )+import Grisette.Internal.TH.Derivation.UnaryOpCommon+ ( UnaryOpClassConfig,+ genUnaryOpClass,+ )+import Language.Haskell.TH (Dec, Name, Q)++cerealConfig :: UnaryOpClassConfig+cerealConfig = serializeConfig [''Serialize] ['put] ['get]++cerealWithSerialConfig :: UnaryOpClassConfig+cerealWithSerialConfig =+ serializeWithSerialConfig [''Serialize] ['put] ['get]++-- | Derive 'Serialize' instance for a data type.+deriveCereal :: DeriveConfig -> Name -> Q [Dec]+deriveCereal deriveConfig =+ genUnaryOpClass+ deriveConfig+ ( if useSerialForCerealAndBinary deriveConfig+ then cerealWithSerialConfig+ else cerealConfig+ )+ 0
+ src/Grisette/Internal/TH/Derivation/DeriveEq.hs view
@@ -0,0 +1,79 @@+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TupleSections #-}++-- |+-- Module : Grisette.Internal.TH.Derivation.DeriveEq+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.TH.Derivation.DeriveEq+ ( deriveEq,+ deriveEq1,+ deriveEq2,+ )+where++import Data.Functor.Classes (Eq1 (liftEq), Eq2 (liftEq2))+import Grisette.Internal.TH.Derivation.BinaryOpCommon+ ( BinaryOpClassConfig+ ( BinaryOpClassConfig,+ binaryOpAllowSumType,+ binaryOpFieldConfigs,+ binaryOpInstanceNames+ ),+ BinaryOpFieldConfig+ ( BinaryOpFieldConfig,+ extraPatNames,+ fieldCombineFun,+ fieldDifferentExistentialFun,+ fieldFunExp,+ fieldFunNames,+ fieldLMatchResult,+ fieldRMatchResult,+ fieldResFun+ ),+ binaryOpAllowExistential,+ defaultFieldFunExp,+ genBinaryOpClass,+ )+import Grisette.Internal.TH.Derivation.Common (DeriveConfig)+import Language.Haskell.TH (Dec, Exp (ListE), Q)+import Language.Haskell.TH.Syntax (Name)++eqConfig :: BinaryOpClassConfig+eqConfig =+ BinaryOpClassConfig+ { binaryOpFieldConfigs =+ [ BinaryOpFieldConfig+ { extraPatNames = [],+ fieldResFun = \_ (lhs, rhs) f ->+ (,[]) <$> [|$(return f) $(return lhs) $(return rhs)|],+ fieldCombineFun = \_ lst ->+ (,[]) <$> [|and $(return $ ListE lst)|],+ fieldDifferentExistentialFun = const [|False|],+ fieldFunExp = defaultFieldFunExp ['(==), 'liftEq, 'liftEq2],+ fieldFunNames = ['(==), 'liftEq, 'liftEq2],+ fieldLMatchResult = [|False|],+ fieldRMatchResult = [|False|]+ }+ ],+ binaryOpInstanceNames = [''Eq, ''Eq1, ''Eq2],+ binaryOpAllowSumType = True,+ binaryOpAllowExistential = True+ }++-- | Derive 'Eq' instance for a data type.+deriveEq :: DeriveConfig -> Name -> Q [Dec]+deriveEq deriveConfig = genBinaryOpClass deriveConfig eqConfig 0++-- | Derive 'Eq1' instance for a data type.+deriveEq1 :: DeriveConfig -> Name -> Q [Dec]+deriveEq1 deriveConfig = genBinaryOpClass deriveConfig eqConfig 1++-- | Derive 'Eq2' instance for a data type.+deriveEq2 :: DeriveConfig -> Name -> Q [Dec]+deriveEq2 deriveConfig = genBinaryOpClass deriveConfig eqConfig 2
+ src/Grisette/Internal/TH/Derivation/DeriveEvalSym.hs view
@@ -0,0 +1,96 @@+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE NamedFieldPuns #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TupleSections #-}+{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}++{-# HLINT ignore "Unused LANGUAGE pragma" #-}++-- |+-- Module : Grisette.Internal.TH.Derivation.DeriveEvalSym+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.TH.Derivation.DeriveEvalSym+ ( deriveEvalSym,+ deriveEvalSym1,+ deriveEvalSym2,+ )+where++import Grisette.Internal.Internal.Decl.Core.Data.Class.EvalSym+ ( EvalSym (evalSym),+ EvalSym1 (liftEvalSym),+ EvalSym2 (liftEvalSym2),+ )+import Grisette.Internal.TH.Derivation.Common (DeriveConfig)+import Grisette.Internal.TH.Derivation.UnaryOpCommon+ ( UnaryOpClassConfig+ ( UnaryOpClassConfig,+ unaryOpAllowExistential,+ unaryOpConfigs,+ unaryOpContextNames,+ unaryOpExtraVars,+ unaryOpInstanceNames,+ unaryOpInstanceTypeFromConfig+ ),+ UnaryOpConfig (UnaryOpConfig),+ UnaryOpFieldConfig+ ( UnaryOpFieldConfig,+ extraLiftedPatNames,+ extraPatNames,+ fieldCombineFun,+ fieldFunExp,+ fieldResFun+ ),+ defaultFieldFunExp,+ defaultFieldResFun,+ defaultUnaryOpInstanceTypeFromConfig,+ genUnaryOpClass,+ )+import Language.Haskell.TH+ ( Dec,+ Exp (AppE, ConE),+ Name,+ Q,+ )++evalSymConfig :: UnaryOpClassConfig+evalSymConfig =+ UnaryOpClassConfig+ { unaryOpConfigs =+ [ UnaryOpConfig+ UnaryOpFieldConfig+ { extraPatNames = ["fillDefault", "model"],+ extraLiftedPatNames = const [],+ fieldResFun = defaultFieldResFun,+ fieldCombineFun = \_ _ _ con extraPat exp -> do+ return (foldl AppE (ConE con) exp, False <$ extraPat),+ fieldFunExp =+ defaultFieldFunExp ['evalSym, 'liftEvalSym, 'liftEvalSym2]+ }+ ['evalSym, 'liftEvalSym, 'liftEvalSym2]+ ],+ unaryOpInstanceNames =+ [''EvalSym, ''EvalSym1, ''EvalSym2],+ unaryOpExtraVars = const $ return [],+ unaryOpInstanceTypeFromConfig = defaultUnaryOpInstanceTypeFromConfig,+ unaryOpAllowExistential = True,+ unaryOpContextNames = Nothing+ }++-- | Derive 'EvalSym' instance for a data type.+deriveEvalSym :: DeriveConfig -> Name -> Q [Dec]+deriveEvalSym deriveConfig = genUnaryOpClass deriveConfig evalSymConfig 0++-- | Derive 'EvalSym1' instance for a data type.+deriveEvalSym1 :: DeriveConfig -> Name -> Q [Dec]+deriveEvalSym1 deriveConfig = genUnaryOpClass deriveConfig evalSymConfig 1++-- | Derive 'EvalSym2' instance for a data type.+deriveEvalSym2 :: DeriveConfig -> Name -> Q [Dec]+deriveEvalSym2 deriveConfig = genUnaryOpClass deriveConfig evalSymConfig 2
+ src/Grisette/Internal/TH/Derivation/DeriveExtractSym.hs view
@@ -0,0 +1,101 @@+{-# LANGUAGE TemplateHaskell #-}+{-# HLINT ignore "Unused LANGUAGE pragma" #-}+{-# LANGUAGE TupleSections #-}+{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}++-- |+-- Module : Grisette.Internal.TH.Derivation.DeriveExtractSym+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.TH.Derivation.DeriveExtractSym+ ( deriveExtractSym,+ deriveExtractSym1,+ deriveExtractSym2,+ )+where++import Grisette.Internal.Internal.Decl.Core.Data.Class.ExtractSym+ ( ExtractSym (extractSymMaybe),+ ExtractSym1 (liftExtractSymMaybe),+ ExtractSym2 (liftExtractSymMaybe2),+ )+import Grisette.Internal.TH.Derivation.Common (DeriveConfig)+import Grisette.Internal.TH.Derivation.UnaryOpCommon+ ( UnaryOpClassConfig+ ( UnaryOpClassConfig,+ unaryOpAllowExistential,+ unaryOpConfigs,+ unaryOpContextNames,+ unaryOpExtraVars,+ unaryOpInstanceNames,+ unaryOpInstanceTypeFromConfig+ ),+ UnaryOpConfig (UnaryOpConfig),+ UnaryOpFieldConfig+ ( UnaryOpFieldConfig,+ extraLiftedPatNames,+ extraPatNames,+ fieldCombineFun,+ fieldFunExp,+ fieldResFun+ ),+ defaultFieldFunExp,+ defaultFieldResFun,+ defaultUnaryOpInstanceTypeFromConfig,+ genUnaryOpClass,+ )+import Language.Haskell.TH+ ( Dec,+ Exp (AppE, ListE, VarE),+ Name,+ Q,+ )++extractSymConfig :: UnaryOpClassConfig+extractSymConfig =+ UnaryOpClassConfig+ { unaryOpConfigs =+ [ UnaryOpConfig+ UnaryOpFieldConfig+ { extraPatNames = [],+ extraLiftedPatNames = const [],+ fieldResFun = defaultFieldResFun,+ fieldCombineFun = \_ _ _ _ _ exp ->+ if null exp+ then (,[]) <$> [|return mempty|]+ else return (AppE (VarE 'mconcat) $ ListE exp, False <$ exp),+ fieldFunExp =+ defaultFieldFunExp+ [ 'extractSymMaybe,+ 'liftExtractSymMaybe,+ 'liftExtractSymMaybe2+ ]+ }+ [ 'extractSymMaybe,+ 'liftExtractSymMaybe,+ 'liftExtractSymMaybe2+ ]+ ],+ unaryOpInstanceNames =+ [''ExtractSym, ''ExtractSym1, ''ExtractSym2],+ unaryOpExtraVars = const $ return [],+ unaryOpInstanceTypeFromConfig = defaultUnaryOpInstanceTypeFromConfig,+ unaryOpAllowExistential = True,+ unaryOpContextNames = Nothing+ }++-- | Derive 'ExtractSym' instance for a data type.+deriveExtractSym :: DeriveConfig -> Name -> Q [Dec]+deriveExtractSym deriveConfig = genUnaryOpClass deriveConfig extractSymConfig 0++-- | Derive 'ExtractSym1' instance for a data type.+deriveExtractSym1 :: DeriveConfig -> Name -> Q [Dec]+deriveExtractSym1 deriveConfig = genUnaryOpClass deriveConfig extractSymConfig 1++-- | Derive 'ExtractSym2' instance for a data type.+deriveExtractSym2 :: DeriveConfig -> Name -> Q [Dec]+deriveExtractSym2 deriveConfig = genUnaryOpClass deriveConfig extractSymConfig 2
+ src/Grisette/Internal/TH/Derivation/DeriveHashable.hs view
@@ -0,0 +1,92 @@+{-# LANGUAGE TemplateHaskell #-}++-- |+-- Module : Grisette.Internal.TH.Derivation.DeriveHashable+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.TH.Derivation.DeriveHashable+ ( deriveHashable,+ deriveHashable1,+ deriveHashable2,+ )+where++import Data.Hashable (Hashable (hashWithSalt))+import Data.Hashable.Lifted+ ( Hashable1 (liftHashWithSalt),+ Hashable2 (liftHashWithSalt2),+ )+import Grisette.Internal.TH.Derivation.Common (DeriveConfig)+import Grisette.Internal.TH.Derivation.UnaryOpCommon+ ( UnaryOpClassConfig+ ( UnaryOpClassConfig,+ unaryOpAllowExistential,+ unaryOpConfigs,+ unaryOpContextNames,+ unaryOpExtraVars,+ unaryOpInstanceNames,+ unaryOpInstanceTypeFromConfig+ ),+ UnaryOpConfig (UnaryOpConfig),+ UnaryOpFieldConfig+ ( UnaryOpFieldConfig,+ extraLiftedPatNames,+ extraPatNames,+ fieldCombineFun,+ fieldFunExp,+ fieldResFun+ ),+ defaultFieldFunExp,+ defaultUnaryOpInstanceTypeFromConfig,+ genUnaryOpClass,+ )+import Language.Haskell.TH (Dec, Name, Q)++hashableConfig :: UnaryOpClassConfig+hashableConfig =+ UnaryOpClassConfig+ { unaryOpConfigs =+ [ UnaryOpConfig+ UnaryOpFieldConfig+ { extraPatNames = ["salt"],+ extraLiftedPatNames = const [],+ fieldCombineFun =+ \_ _ _ _ [salt] exp -> do+ r <-+ foldl+ (\salt exp -> [|$(return exp) $salt|])+ (return salt)+ exp+ return (r, [True]),+ fieldResFun = \_ _ _ _ fieldPat fieldFun -> do+ r <- [|\salt -> $(return fieldFun) salt $(return fieldPat)|]+ return (r, [False]),+ fieldFunExp =+ defaultFieldFunExp+ ['hashWithSalt, 'liftHashWithSalt, 'liftHashWithSalt2]+ }+ ['hashWithSalt, 'liftHashWithSalt, 'liftHashWithSalt2]+ ],+ unaryOpInstanceNames =+ [''Hashable, ''Hashable1, ''Hashable2],+ unaryOpExtraVars = const $ return [],+ unaryOpInstanceTypeFromConfig = defaultUnaryOpInstanceTypeFromConfig,+ unaryOpAllowExistential = True,+ unaryOpContextNames = Nothing+ }++-- | Derive 'Hashable' instance for a data type.+deriveHashable :: DeriveConfig -> Name -> Q [Dec]+deriveHashable deriveConfig = genUnaryOpClass deriveConfig hashableConfig 0++-- | Derive 'Hashable1' instance for a data type.+deriveHashable1 :: DeriveConfig -> Name -> Q [Dec]+deriveHashable1 deriveConfig = genUnaryOpClass deriveConfig hashableConfig 1++-- | Derive 'Hashable2' instance for a data type.+deriveHashable2 :: DeriveConfig -> Name -> Q [Dec]+deriveHashable2 deriveConfig = genUnaryOpClass deriveConfig hashableConfig 2
+ src/Grisette/Internal/TH/Derivation/DeriveMergeable.hs view
@@ -0,0 +1,857 @@+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE MultiWayIf #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TupleSections #-}+{-# LANGUAGE TypeApplications #-}++-- |+-- Module : Grisette.Internal.TH.Derivation.DeriveMergeable+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.TH.Derivation.DeriveMergeable+ ( deriveMergeable,+ deriveMergeable1,+ deriveMergeable2,+ deriveMergeable3,+ genMergeableAndGetMergingInfoResult,+ genMergeable,+ genMergeable',+ genMergeableNoExistential,+ genMergeableNoStrategy,+ genMergeableList,+ )+where++import Control.Monad (foldM, replicateM, zipWithM)+import qualified Data.Map as M+import Data.Maybe (catMaybes, isJust, mapMaybe)+import qualified Data.Set as S+import Data.Word (Word16, Word32, Word64, Word8)+import Grisette.Internal.Internal.Decl.Core.Data.Class.Mergeable+ ( Mergeable (rootStrategy),+ Mergeable1 (liftRootStrategy),+ Mergeable2 (liftRootStrategy2),+ Mergeable3 (liftRootStrategy3),+ MergingStrategy (NoStrategy, SimpleStrategy, SortedStrategy),+ product2Strategy,+ wrapStrategy,+ )+import Grisette.Internal.TH.Derivation.Common+ ( CheckArgsResult+ ( CheckArgsResult,+ argVars,+ constructors,+ keptVars+ ),+ DeriveConfig (unconstrainedPositions, useNoStrategy),+ checkArgs,+ evalModeSpecializeList,+ extraConstraint,+ isVarUsedInFields,+ specializeResult,+ )+import Grisette.Internal.TH.Derivation.UnaryOpCommon+ ( FieldFunExp,+ UnaryOpClassConfig+ ( UnaryOpClassConfig,+ unaryOpAllowExistential,+ unaryOpConfigs,+ unaryOpContextNames,+ unaryOpExtraVars,+ unaryOpInstanceNames,+ unaryOpInstanceTypeFromConfig+ ),+ UnaryOpConfig (UnaryOpConfig),+ UnaryOpFunConfig (genUnaryOpFun),+ defaultUnaryOpInstanceTypeFromConfig,+ genUnaryOpClass,+ )+import Grisette.Internal.TH.Util (dataTypeHasExistential, integerE, mangleName)+import Language.Haskell.TH+ ( Bang (Bang),+ Body (NormalB),+ Clause (Clause),+ Con (ForallC, GadtC),+ Dec (DataD, FunD, InstanceD, PragmaD, SigD),+ Exp (AppE, ConE, VarE),+ Inline (Inline),+ Kind,+ Name,+ Pat (SigP, VarP, WildP),+ Phases (AllPhases),+ Pragma (InlineP),+ Pred,+ Q,+ RuleMatch (FunLike),+ SourceStrictness (NoSourceStrictness),+ SourceUnpackedness (NoSourceUnpackedness),+ Type (AppT, ArrowT, ConT, ForallT, StarT, VarT),+ appE,+ caseE,+ conE,+ conT,+ integerL,+ lamE,+ litP,+ lookupTypeName,+ mkName,+ nameBase,+ newName,+ normalB,+ recP,+ sigP,+ tupP,+ varE,+ varP,+ varT,+ wildP,+ )+import Language.Haskell.TH.Datatype+ ( ConstructorInfo+ ( constructorContext,+ constructorFields,+ constructorName,+ constructorVars+ ),+ DatatypeInfo (datatypeCons, datatypeName, datatypeVars),+ TypeSubstitution (applySubstitution, freeVariables),+ reifyDatatype,+ resolveTypeSynonyms,+ tvName,+ )+import Language.Haskell.TH.Datatype.TyVarBndr+ ( TyVarBndrUnit,+ kindedTVSpecified,+ plainTVFlag,+ specifiedSpec,+ )+import Language.Haskell.TH.Lib (clause, conP, litE, match, stringL)+import Type.Reflection (SomeTypeRep (SomeTypeRep), TypeRep, typeRep)+import Unsafe.Coerce (unsafeCoerce)++genMergingInfoCon ::+ [TyVarBndrUnit] ->+ Name ->+ Bool ->+ ConstructorInfo ->+ Q (Con, Name, [Clause], [Clause], [Clause])+genMergingInfoCon dataTypeVars tyName isLast con = do+ let conName = mangleName $ constructorName con+ let newConName = mkName $ conName <> "MergingInfo"+ let oriVars = dataTypeVars ++ constructorVars con+ newDataTypeVars <- traverse (newName . nameBase . tvName) dataTypeVars+ newConstructorVars <-+ traverse (newName . nameBase . tvName) $ constructorVars con+ let newNames = newDataTypeVars ++ newConstructorVars+ -- newNames <- traverse (newName . nameBase . tvName) oriVars+ let newVars = fmap VarT newNames+ let substMap = M.fromList $ zip (tvName <$> oriVars) newVars+ let fields =+ zip [0 ..] $+ applySubstitution substMap $+ constructorFields con+ let tyFields =+ AppT (ConT ''TypeRep)+ <$> applySubstitution+ substMap+ ((VarT . tvName) <$> constructorVars con)+ let strategyFields = fmap (AppT (ConT ''MergingStrategy) . snd) fields+ tyFieldNamesL <- traverse (const $ newName "p") tyFields+ tyFieldNamesR <- traverse (const $ newName "p") tyFields+ let tyFieldPatsL = fmap varP tyFieldNamesL+ let tyFieldPatsR = fmap varP tyFieldNamesR+ let tyFieldVarsL = fmap varE tyFieldNamesL+ let tyFieldVarsR = fmap varE tyFieldNamesR+ let strategyFieldPats = replicate (length strategyFields) wildP+ let patsL = tyFieldPatsL ++ strategyFieldPats+ let patsR = tyFieldPatsR ++ strategyFieldPats+ let allWildcards = fmap (const wildP) $ tyFieldPatsL ++ strategyFieldPats+ let eqCont l r cont =+ [|+ SomeTypeRep $l == SomeTypeRep $r+ && $cont+ |]+ let eqExp =+ foldl (\cont (l, r) -> eqCont l r cont) (conE 'True) $+ zip tyFieldVarsL tyFieldVarsR+ eqClause <-+ clause+ [conP newConName patsL, conP newConName patsR]+ (normalB eqExp)+ []+ let cmpCont l r cont =+ [|+ case SomeTypeRep $l `compare` SomeTypeRep $r of+ EQ -> $cont+ x -> x+ |]+ let cmpExp =+ foldl (\cont (l, r) -> cmpCont l r cont) (conE 'EQ) $+ zip tyFieldVarsL tyFieldVarsR+ cmpClause0 <-+ clause+ [conP newConName patsL, conP newConName patsR]+ (normalB cmpExp)+ []+ cmpClause1 <-+ clause+ [conP newConName allWildcards, wildP]+ (normalB $ conE 'LT)+ []+ cmpClause2 <-+ clause+ [wildP, conP newConName allWildcards]+ (normalB $ conE 'GT)+ []+ let cmpClauses =+ if isLast+ then [cmpClause0]+ else [cmpClause0, cmpClause1, cmpClause2]+ let showCont t cont =+ [|$cont <> " " <> show $t|]+ let showExp = foldl (flip showCont) (litE $ stringL conName) tyFieldVarsL+ showClause <-+ clause+ [conP newConName patsL]+ (normalB showExp)+ []+ let ctx = applySubstitution substMap $ constructorContext con+ let ctxAndGadtUsedVars =+ S.fromList (freeVariables ctx)+ <> S.fromList (freeVariables tyFields)+ <> S.fromList (freeVariables strategyFields)+ let isCtxAndGadtUsedVar nm = S.member nm ctxAndGadtUsedVars+ return+ ( ForallC+ ( (`plainTVFlag` specifiedSpec)+ <$> filter isCtxAndGadtUsedVar newDataTypeVars ++ newConstructorVars+ )+ ctx+ $ GadtC+ [newConName]+ ( (Bang NoSourceUnpackedness NoSourceStrictness,)+ <$> tyFields ++ strategyFields+ )+ (ConT tyName),+ newConName,+ [eqClause],+ cmpClauses,+ [showClause]+ )++data MergingInfoResult = MergingInfoResult+ { _infoName :: Name,+ _conInfoNames :: [Name]+ }++genMergingInfo :: Name -> Q (MergingInfoResult, [Dec])+genMergingInfo typName = do+ d <- reifyDatatype typName+ let originalName = mangleName $ datatypeName d+ let newName = originalName <> "MergingInfo"+ found <- lookupTypeName newName+ let constructors = datatypeCons d+ let name = mkName newName+ r <-+ if null constructors+ then return []+ else do+ cons0 <-+ traverse (genMergingInfoCon (datatypeVars d) name False) $+ init constructors+ consLast <-+ genMergingInfoCon (datatypeVars d) name True $+ last constructors+ return $ cons0 ++ [consLast]+ let cons = fmap (\(a, _, _, _, _) -> a) r+ let eqClauses =+ concatMap (\(_, _, a, _, _) -> a) r+ ++ [ Clause [WildP, WildP] (NormalB $ ConE 'False) []+ | length constructors > 1+ ]+ let cmpClauses = concatMap (\(_, _, _, a, _) -> a) r+ let showClauses = concatMap (\(_, _, _, _, a) -> a) r+ return+ ( MergingInfoResult+ name+ (fmap (\(_, a, _, _, _) -> a) r),+ if isJust found+ then []+ else+ [ DataD [] name [] Nothing cons [],+ InstanceD+ Nothing+ []+ (ConT ''Eq `AppT` ConT name)+ [FunD '(==) eqClauses],+ InstanceD+ Nothing+ []+ (ConT ''Ord `AppT` ConT name)+ [FunD 'compare cmpClauses],+ InstanceD+ Nothing+ []+ (ConT ''Show `AppT` ConT name)+ [FunD 'show showClauses]+ ]+ )++-- | Generate 'Mergeable' instance and merging information for a data type.+genMergeableAndGetMergingInfoResult ::+ DeriveConfig -> Name -> Int -> Q (MergingInfoResult, [Dec])+genMergeableAndGetMergingInfoResult deriveConfig typName n = do+ (infoResult, infoDec) <- genMergingInfo typName+ (_, decs) <- genMergeable' deriveConfig infoResult typName n+ return (infoResult, infoDec ++ decs)++constructMergingStrategyExp :: ConstructorInfo -> [Exp] -> Q Exp+constructMergingStrategyExp _ [] = [|SimpleStrategy $ \_ t _ -> t|]+constructMergingStrategyExp conInfo [x] = do+ upname <- newName "a"+ let unwrapPat = conP (constructorName conInfo) [varP upname]+ let unwrapFun = lamE [unwrapPat] $ appE (varE 'unsafeCoerce) (varE upname)+ [|+ wrapStrategy+ $(return x)+ (unsafeCoerce . $(conE $ constructorName conInfo))+ $unwrapFun+ |]+constructMergingStrategyExp conInfo l = do+ let takeHalf l = take (length l `div` 2) l+ let dropHalf l = drop (length l `div` 2) l+ let num = length l+ upnames <- replicateM num $ newName "a"+ let wrapPat1 [] = error "Should not happen"+ wrapPat1 [x] = varP x+ wrapPat1 l = tupP [wrapPat1 (takeHalf l), wrapPat1 (dropHalf l)]+ let wrapped = foldl AppE (ConE $ constructorName conInfo) $ fmap VarE upnames+ let wrapFun =+ lamE+ [wrapPat1 (takeHalf upnames), wrapPat1 (dropHalf upnames)]+ [|unsafeCoerce ($(return wrapped))|]+ let unwrapPat = conP (constructorName conInfo) $ fmap varP upnames+ let unwrapExp1 [] = error "Should not happen"+ unwrapExp1 [x] = [|(unsafeCoerce $(varE x))|]+ unwrapExp1 l = [|($(unwrapExp1 (takeHalf l)), $(unwrapExp1 (dropHalf l)))|]+ let unwrapFun = lamE [unwrapPat] (unwrapExp1 upnames)+ let strategyx [] = error "Should not happen"+ strategyx [x] = return x+ strategyx l =+ [|product2Strategy (,) id $(strategyx (takeHalf l)) $(strategyx (dropHalf l))|]+ [|+ product2Strategy+ $wrapFun+ $unwrapFun+ $(strategyx $ takeHalf l)+ $(strategyx $ dropHalf l)+ |]++genMergeFunClause' :: Name -> ConstructorInfo -> Q Clause+genMergeFunClause' conInfoName con = do+ let numExistential = length $ constructorVars con+ let numFields = length $ constructorFields con+ let argWildCards = replicate numExistential wildP :: [Q Pat]++ pnames <- replicateM numFields $ newName "s"+ clause+ ([conP conInfoName $ argWildCards ++ fmap varP pnames])+ (normalB (constructMergingStrategyExp con (map VarE pnames)))+ []++constructVarPats :: ConstructorInfo -> Q Pat+constructVarPats conInfo = do+ let fields = constructorFields conInfo+ capture n = return $ SigP WildP $ fields !! n+ conP (constructorName conInfo) $ capture <$> [0 .. length fields - 1]++genMergingInfoFunClause' ::+ [(Type, Kind)] -> Name -> ConstructorInfo -> Q Clause+genMergingInfoFunClause' argTypes conInfoName con = do+ let conVars = constructorVars con+ capturedVarTyReps <-+ traverse (\bndr -> [|typeRep @($(varT $ tvName bndr))|]) conVars+ varPat <- constructVarPats con+ let infoExpWithTypeReps = foldl AppE (ConE conInfoName) capturedVarTyReps++ let fields = constructorFields con+ let usedArgs = S.fromList $ freeVariables fields++ strategyNames <-+ traverse+ ( \(ty, _) ->+ case ty of+ VarT nm ->+ if S.member nm usedArgs+ then do+ pname <- newName "p"+ return (nm, Just pname)+ else return ('undefined, Nothing)+ _ -> return ('undefined, Nothing)+ )+ argTypes+ let argToStrategyPat =+ mapMaybe (\(nm, mpat) -> fmap (nm,) mpat) strategyNames+ let strategyPats = fmap (maybe WildP VarP . snd) strategyNames++ let argNameSet =+ S.fromList $+ mapMaybe+ ( \(ty, _) -> case ty of+ VarT nm -> Just nm+ _ -> Nothing+ )+ argTypes+ let containsArg :: Type -> Bool+ containsArg ty =+ S.intersection argNameSet (S.fromList (freeVariables [ty])) /= S.empty+ let typeHasNoArg = not . containsArg++ let fieldStrategyExp ty =+ if not (containsArg ty)+ then [|rootStrategy :: MergingStrategy $(return ty)|]+ else case ty of+ _+ | typeHasNoArg ty ->+ [|rootStrategy :: MergingStrategy $(return ty)|]+ AppT a b+ | typeHasNoArg a ->+ [|+ liftRootStrategy+ $(fieldStrategyExp b) ::+ MergingStrategy $(return ty)+ |]+ AppT (AppT a b) c+ | typeHasNoArg a ->+ [|+ liftRootStrategy2+ $(fieldStrategyExp b)+ $(fieldStrategyExp c) ::+ MergingStrategy $(return ty)+ |]+ AppT (AppT (AppT a b) c) d+ | typeHasNoArg a ->+ [|+ liftRootStrategy3+ $(fieldStrategyExp b)+ $(fieldStrategyExp c)+ $(fieldStrategyExp d) ::+ MergingStrategy $(return ty)+ |]+ VarT nm -> do+ case lookup nm argToStrategyPat of+ Just pname -> varE pname+ _ -> fail "BUG: fieldStrategyExp"+ _ -> fail $ "fieldStrategyExp: unsupported type: " <> show ty+ fieldStrategyExps <- traverse fieldStrategyExp fields+ let infoExp = foldl AppE infoExpWithTypeReps fieldStrategyExps+ -- fail $ show infoExp+ return $ Clause (strategyPats ++ [varPat]) (NormalB infoExp) []++mergeableFieldFunExp :: [Name] -> FieldFunExp+mergeableFieldFunExp unaryOpFunNames argToFunPat _ = go+ where+ go ty = do+ let allArgNames = M.keysSet argToFunPat+ let typeHasNoArg ty =+ S.fromList (freeVariables [ty])+ `S.intersection` allArgNames+ == S.empty+ let fun0a a = [|$(varE $ head unaryOpFunNames) @($(return a))|]+ fun1a a b = [|$(varE $ unaryOpFunNames !! 1) @($(return a)) $(go b)|]+ fun2a a b c =+ [|+ $(varE $ unaryOpFunNames !! 2)+ @($(return a))+ $(go b)+ $(go c)+ |]+ fun3a a b c d =+ [|+ $(varE $ unaryOpFunNames !! 3)+ @($(return a))+ $(go b)+ $(go c)+ $(go d)+ |]++ case ty of+ AppT (AppT (AppT a@(VarT _) b) c) d -> fun3a a b c d+ AppT (AppT a@(VarT _) b) c -> fun2a a b c+ AppT a@(VarT _) b -> fun1a a b+ _ | typeHasNoArg ty -> fun0a ty+ AppT a b | typeHasNoArg a -> fun1a a b+ AppT (AppT a b) c | typeHasNoArg a -> fun2a a b c+ AppT (AppT (AppT a b) c) d | typeHasNoArg a -> fun3a a b c d+ VarT nm -> case M.lookup nm argToFunPat of+ Just pname -> varE pname+ _ -> fail $ "defaultFieldFunExp: unsupported type: " <> show ty+ _ -> fail $ "defaultFieldFunExp: unsupported type: " <> show ty++mergeableInstanceNames :: [Name]+mergeableInstanceNames =+ [ ''Mergeable,+ ''Mergeable1,+ ''Mergeable2,+ ''Mergeable3+ ]++getMergeableInstanceName :: Int -> Name+getMergeableInstanceName n = mergeableInstanceNames !! n++rootStrategyFunNames :: [Name]+rootStrategyFunNames =+ [ 'rootStrategy,+ 'liftRootStrategy,+ 'liftRootStrategy2,+ 'liftRootStrategy3+ ]++getMergeableFunName :: Int -> Name+getMergeableFunName n = rootStrategyFunNames !! n++mergeableNoExistentialConfig :: UnaryOpClassConfig+mergeableNoExistentialConfig =+ UnaryOpClassConfig+ { unaryOpConfigs =+ [ UnaryOpConfig+ MergeableNoExistentialConfig+ { mergeableNoExistentialFun =+ mergeableFieldFunExp rootStrategyFunNames+ }+ rootStrategyFunNames+ ],+ unaryOpInstanceNames =+ [''Mergeable, ''Mergeable1, ''Mergeable2, ''Mergeable3],+ unaryOpExtraVars = const $ return [],+ unaryOpInstanceTypeFromConfig = defaultUnaryOpInstanceTypeFromConfig,+ unaryOpAllowExistential = False,+ unaryOpContextNames = Nothing+ }++newtype MergeableNoExistentialConfig = MergeableNoExistentialConfig+ { mergeableNoExistentialFun :: FieldFunExp+ }++instance UnaryOpFunConfig MergeableNoExistentialConfig where+ genUnaryOpFun+ _+ MergeableNoExistentialConfig {..}+ funNames+ n+ _+ _+ argTypes+ _+ constructors = do+ allFields <-+ mapM resolveTypeSynonyms $+ concatMap constructorFields constructors+ let usedArgs = S.fromList $ freeVariables allFields+ args <-+ traverse+ ( \(ty, _) -> do+ case ty of+ VarT nm ->+ if S.member nm usedArgs+ then do+ pname <- newName "p"+ return (nm, Just pname)+ else return ('undefined, Nothing)+ _ -> return ('undefined, Nothing)+ )+ argTypes+ let argToFunPat =+ M.fromList $ mapMaybe (\(nm, mpat) -> fmap (nm,) mpat) args+ let funPats = fmap (maybe WildP VarP . snd) args+ let genAuxFunExp conInfo = do+ fields <- mapM resolveTypeSynonyms $ constructorFields conInfo+ defaultFieldFunExps <-+ traverse+ (mergeableNoExistentialFun argToFunPat M.empty)+ fields+ constructMergingStrategyExp conInfo defaultFieldFunExps+ auxExps <- mapM genAuxFunExp constructors+ funExp <- case auxExps of+ [] -> [|NoStrategy|]+ [singleExp] -> return singleExp+ _ -> do+ p <- newName "p"+ let numConstructors = length constructors+ let getIdx i =+ if numConstructors <= 2+ then if i == 0 then [|False|] else [|True|]+ else integerE i+ let getIdxPat i =+ if numConstructors <= 2+ then conP (if i == 0 then 'False else 'True) []+ else do+ let w8Bound = fromIntegral (maxBound @Word8)+ let w16Bound = fromIntegral (maxBound @Word16)+ let w32Bound = fromIntegral (maxBound @Word32)+ let w64Bound = fromIntegral (maxBound @Word64)+ sigP+ (litP (integerL i))+ ( conT $+ if+ | numConstructors <= w8Bound + 1 -> ''Word8+ | numConstructors <= w16Bound + 1 -> ''Word16+ | numConstructors <= w32Bound + 1 -> ''Word32+ | numConstructors <= w64Bound + 1 -> ''Word64+ | otherwise -> ''Integer+ )+ let idxFun =+ lamE [varP p] $+ caseE+ (varE p)+ ( zipWith+ ( \conIdx conInfo -> do+ match+ (recP (constructorName conInfo) [])+ (normalB (getIdx conIdx))+ []+ )+ [0 ..]+ constructors+ )+ let auxFun =+ lamE [varP p] $+ caseE+ (varE p)+ ( zipWith+ ( \conIdx exp -> do+ match+ (getIdxPat conIdx)+ (normalB (return exp))+ []+ )+ [0 ..]+ auxExps+ ++ [match wildP (normalB [|undefined|]) []]+ )+ [|+ SortedStrategy $idxFun $auxFun+ |]+ let instanceFunName = funNames !! n+ return $+ FunD+ instanceFunName+ [ Clause+ funPats+ (NormalB funExp)+ []+ ]++-- | Generate 'Mergeable' instance for a data type, using a given merging info+-- result.+genMergeable' ::+ DeriveConfig -> MergingInfoResult -> Name -> Int -> Q (Name, [Dec])+genMergeable' deriveConfig (MergingInfoResult infoName conInfoNames) typName n = do+ result@CheckArgsResult {..} <-+ specializeResult (evalModeSpecializeList deriveConfig)+ =<< checkArgs "Mergeable" 3 typName True n++ d <- reifyDatatype typName+ let ctxForVar :: (Type, Kind) -> Q (Maybe Pred)+ ctxForVar (ty, kind) = case kind of+ StarT -> Just <$> [t|Mergeable $(return ty)|]+ AppT (AppT ArrowT StarT) StarT ->+ Just <$> [t|Mergeable1 $(return ty)|]+ AppT (AppT (AppT ArrowT StarT) StarT) StarT ->+ Just <$> [t|Mergeable2 $(return ty)|]+ AppT (AppT (AppT (AppT ArrowT StarT) StarT) StarT) StarT ->+ Just <$> [t|Mergeable3 $(return ty)|]+ AppT (AppT (AppT (AppT ArrowT StarT) StarT) StarT) _ ->+ fail $ "Unsupported kind: " <> show kind+ _ -> return Nothing+ let isTypeUsedInFields (VarT nm) = isVarUsedInFields result nm+ isTypeUsedInFields _ = False+ mergeableContexts <-+ traverse ctxForVar $+ filter (isTypeUsedInFields . fst) $+ fmap snd $+ filter (not . (`elem` unconstrainedPositions deriveConfig) . fst) $+ zip [0 ..] keptVars++ let instanceName = getMergeableInstanceName n+ let instanceHead = ConT instanceName+ extraPreds <-+ extraConstraint+ deriveConfig+ typName+ instanceName+ []+ keptVars+ constructors++ let targetType =+ foldl+ (\ty (var, _) -> AppT ty var)+ (ConT typName)+ (keptVars ++ argVars)+ let infoType = ConT infoName+ let mergingInfoFunFinalType = AppT (AppT ArrowT targetType) infoType++ let mergingInfoFunTypeWithoutCtx =+ foldr+ (((AppT . AppT ArrowT) . AppT (ConT ''MergingStrategy)) . fst)+ mergingInfoFunFinalType+ argVars++ let mergingInfoFunType =+ ForallT+ ( mapMaybe+ ( \(ty, knd) -> case ty of+ VarT nm -> Just $ kindedTVSpecified nm knd+ _ -> Nothing+ )+ $ keptVars ++ argVars+ )+ (extraPreds ++ catMaybes mergeableContexts)+ mergingInfoFunTypeWithoutCtx+ let mangledName = mangleName (datatypeName d)+ let mergingInfoFunName =+ mkName $+ "mergingInfo"+ <> (if n /= 0 then show n else "")+ <> mangledName+ let mergingInfoFunSigD = SigD mergingInfoFunName mergingInfoFunType+ clauses <-+ traverse (uncurry (genMergingInfoFunClause' argVars)) $+ zip conInfoNames constructors+ let mergingInfoFunDec = FunD mergingInfoFunName clauses++ let mergeFunType =+ AppT (AppT ArrowT infoType) (AppT (ConT ''MergingStrategy) targetType)+ let mergeFunName =+ mkName $+ "merge"+ <> (if n /= 0 then show n else "")+ <> mangledName+ let mergeFunSigD = SigD mergeFunName mergeFunType+ mergeFunClauses <- zipWithM genMergeFunClause' conInfoNames constructors+ let mergeFunDec = FunD mergeFunName mergeFunClauses++ let instanceType =+ AppT+ instanceHead+ (foldl AppT (ConT typName) $ fmap fst keptVars)++ let mergeInstanceFunName = getMergeableFunName n+ mergeInstanceFunPatNames <- replicateM n $ newName "rootStrategy"+ let mergeInstanceFunPats = VarP <$> mergeInstanceFunPatNames++ mergeInstanceFunBody <-+ [|+ SortedStrategy+ $( foldM+ (\exp name -> appE (return exp) $ varE name)+ (VarE mergingInfoFunName)+ mergeInstanceFunPatNames+ )+ $(varE mergeFunName)+ |]++ let mergeInstanceFunClause =+ Clause mergeInstanceFunPats (NormalB mergeInstanceFunBody) []++ return+ ( mergingInfoFunName,+ [ PragmaD (InlineP mergingInfoFunName Inline FunLike AllPhases),+ mergingInfoFunSigD,+ mergingInfoFunDec,+ PragmaD (InlineP mergeFunName Inline FunLike AllPhases),+ mergeFunSigD,+ mergeFunDec,+ InstanceD+ Nothing+ (extraPreds ++ catMaybes mergeableContexts)+ instanceType+ [FunD mergeInstanceFunName [mergeInstanceFunClause]]+ ]+ )++-- | Generate 'Mergeable' instance for a data type without existential variables.+genMergeableNoExistential :: DeriveConfig -> Name -> Int -> Q [Dec]+genMergeableNoExistential deriveConfig typName n = do+ genUnaryOpClass deriveConfig mergeableNoExistentialConfig n typName++-- | Generate 'Mergeable' instance for a data type, using 'NoStrategy'.+genMergeableNoStrategy :: DeriveConfig -> Name -> Int -> Q [Dec]+genMergeableNoStrategy deriveConfig typName n = do+ CheckArgsResult {..} <-+ specializeResult (evalModeSpecializeList deriveConfig)+ =<< checkArgs "Mergeable" 3 typName True n+ let instanceName = getMergeableInstanceName n+ let instanceHead = ConT instanceName+ let instanceType =+ AppT+ instanceHead+ (foldl AppT (ConT typName) $ fmap fst keptVars)+ let mergeInstanceFunName = getMergeableFunName n++ let mergeInstanceFunClause =+ Clause (replicate n WildP) (NormalB (ConE 'NoStrategy)) []+ return+ [ InstanceD+ Nothing+ []+ instanceType+ [FunD mergeInstanceFunName [mergeInstanceFunClause]]+ ]++-- | Generate 'Mergeable' instance for a data type.+genMergeable :: DeriveConfig -> Name -> Int -> Q [Dec]+genMergeable deriveConfig typName n = do+ hasExistential <- dataTypeHasExistential typName+ if+ | useNoStrategy deriveConfig ->+ genMergeableNoStrategy deriveConfig typName n+ | hasExistential -> do+ (infoResult, infoDec) <- genMergingInfo typName+ (_, decs) <- genMergeable' deriveConfig infoResult typName n+ return $ infoDec ++ decs+ | otherwise -> genMergeableNoExistential deriveConfig typName n++-- | Generate multiple 'Mergeable' instances for a data type.+genMergeableList :: DeriveConfig -> Name -> [Int] -> Q [Dec]+genMergeableList _ _ [] = return []+genMergeableList deriveConfig typName [n] = genMergeable deriveConfig typName n+genMergeableList deriveConfig typName l@(n : ns) = do+ hasExistential <- dataTypeHasExistential typName+ if+ | useNoStrategy deriveConfig ->+ concat <$> traverse (genMergeableNoStrategy deriveConfig typName) l+ | hasExistential -> do+ (info, dn) <-+ genMergeableAndGetMergingInfoResult+ deriveConfig+ typName+ n+ dns <-+ traverse (genMergeable' deriveConfig info typName) ns+ return $ dn ++ concatMap snd dns+ | otherwise ->+ concat <$> traverse (genMergeableNoExistential deriveConfig typName) l++-- | Derive 'Mergeable' instance for GADT.+deriveMergeable :: DeriveConfig -> Name -> Q [Dec]+deriveMergeable deriveConfig nm = genMergeable deriveConfig nm 0++-- | Derive 'Mergeable1' instance for GADT.+deriveMergeable1 :: DeriveConfig -> Name -> Q [Dec]+deriveMergeable1 deriveConfig nm = genMergeable deriveConfig nm 1++-- | Derive 'Mergeable2' instance for GADT.+deriveMergeable2 :: DeriveConfig -> Name -> Q [Dec]+deriveMergeable2 deriveConfig nm = genMergeable deriveConfig nm 2++-- | Derive 'Mergeable3' instance for GADT.+deriveMergeable3 :: DeriveConfig -> Name -> Q [Dec]+deriveMergeable3 deriveConfig nm = genMergeable deriveConfig nm 3
+ src/Grisette/Internal/TH/Derivation/DeriveNFData.hs view
@@ -0,0 +1,84 @@+{-# LANGUAGE TemplateHaskell #-}++-- |+-- Module : Grisette.Internal.TH.Derivation.DeriveNFData+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.TH.Derivation.DeriveNFData+ ( deriveNFData,+ deriveNFData1,+ deriveNFData2,+ )+where++import Control.DeepSeq (NFData (rnf), NFData1 (liftRnf), NFData2 (liftRnf2))+import Grisette.Internal.TH.Derivation.Common (DeriveConfig)+import Grisette.Internal.TH.Derivation.UnaryOpCommon+ ( UnaryOpClassConfig+ ( UnaryOpClassConfig,+ unaryOpAllowExistential,+ unaryOpConfigs,+ unaryOpContextNames,+ unaryOpExtraVars,+ unaryOpInstanceNames,+ unaryOpInstanceTypeFromConfig+ ),+ UnaryOpConfig (UnaryOpConfig),+ UnaryOpFieldConfig+ ( UnaryOpFieldConfig,+ extraLiftedPatNames,+ extraPatNames,+ fieldCombineFun,+ fieldFunExp,+ fieldResFun+ ),+ defaultFieldFunExp,+ defaultFieldResFun,+ defaultUnaryOpInstanceTypeFromConfig,+ genUnaryOpClass,+ )+import Language.Haskell.TH (Dec, Name)+import Language.Haskell.TH.Syntax (Q)++nfdataConfig :: UnaryOpClassConfig+nfdataConfig =+ UnaryOpClassConfig+ { unaryOpConfigs =+ [ UnaryOpConfig+ UnaryOpFieldConfig+ { extraPatNames = [],+ extraLiftedPatNames = const [],+ fieldCombineFun = \_ _ _ _ _ exps -> do+ r <-+ foldl+ (\acc exp -> [|$acc `seq` $(return exp)|])+ ([|()|])+ exps+ return (r, []),+ fieldResFun = defaultFieldResFun,+ fieldFunExp = defaultFieldFunExp ['rnf, 'liftRnf, 'liftRnf2]+ }+ ['rnf, 'liftRnf, 'liftRnf2]+ ],+ unaryOpInstanceNames = [''NFData, ''NFData1, ''NFData2],+ unaryOpExtraVars = const $ return [],+ unaryOpInstanceTypeFromConfig = defaultUnaryOpInstanceTypeFromConfig,+ unaryOpAllowExistential = True,+ unaryOpContextNames = Nothing+ }++-- | Derive 'NFData' instance for a data type.+deriveNFData :: DeriveConfig -> Name -> Q [Dec]+deriveNFData deriveConfig = genUnaryOpClass deriveConfig nfdataConfig 0++-- | Derive 'NFData1' instance for a data type.+deriveNFData1 :: DeriveConfig -> Name -> Q [Dec]+deriveNFData1 deriveConfig = genUnaryOpClass deriveConfig nfdataConfig 1++-- | Derive 'NFData2' instance for a data type.+deriveNFData2 :: DeriveConfig -> Name -> Q [Dec]+deriveNFData2 deriveConfig = genUnaryOpClass deriveConfig nfdataConfig 2
+ src/Grisette/Internal/TH/Derivation/DeriveOrd.hs view
@@ -0,0 +1,78 @@+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TupleSections #-}++-- |+-- Module : Grisette.Internal.TH.Derivation.DeriveOrd+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.TH.Derivation.DeriveOrd+ ( deriveOrd,+ deriveOrd1,+ deriveOrd2,+ )+where++import Data.Functor.Classes (Ord1 (liftCompare), Ord2 (liftCompare2))+import Grisette.Internal.TH.Derivation.BinaryOpCommon+ ( BinaryOpClassConfig+ ( BinaryOpClassConfig,+ binaryOpAllowSumType,+ binaryOpFieldConfigs,+ binaryOpInstanceNames+ ),+ BinaryOpFieldConfig+ ( BinaryOpFieldConfig,+ extraPatNames,+ fieldCombineFun,+ fieldDifferentExistentialFun,+ fieldFunExp,+ fieldFunNames,+ fieldLMatchResult,+ fieldRMatchResult,+ fieldResFun+ ),+ binaryOpAllowExistential,+ defaultFieldFunExp,+ genBinaryOpClass,+ )+import Grisette.Internal.TH.Derivation.Common (DeriveConfig)+import Language.Haskell.TH (Dec, Exp (ListE), Name, Q)++ordConfig :: BinaryOpClassConfig+ordConfig =+ BinaryOpClassConfig+ { binaryOpFieldConfigs =+ [ BinaryOpFieldConfig+ { extraPatNames = [],+ fieldResFun = \_ (lhs, rhs) f ->+ (,[]) <$> [|$(return f) $(return lhs) $(return rhs)|],+ fieldCombineFun = \_ lst ->+ (,[]) <$> [|mconcat $(return $ ListE lst)|],+ fieldDifferentExistentialFun = return,+ fieldFunExp =+ defaultFieldFunExp ['compare, 'liftCompare, 'liftCompare2],+ fieldFunNames = ['compare, 'liftCompare, 'liftCompare2],+ fieldLMatchResult = [|LT|],+ fieldRMatchResult = [|GT|]+ }+ ],+ binaryOpInstanceNames = [''Ord, ''Ord1, ''Ord2],+ binaryOpAllowSumType = True,+ binaryOpAllowExistential = True+ }++-- | Derive 'Ord' instance for a data type.+deriveOrd :: DeriveConfig -> Name -> Q [Dec]+deriveOrd deriveConfig = genBinaryOpClass deriveConfig ordConfig 0++-- | Derive 'Ord1' instance for a data type.+deriveOrd1 :: DeriveConfig -> Name -> Q [Dec]+deriveOrd1 deriveConfig = genBinaryOpClass deriveConfig ordConfig 1++-- | Derive 'Ord2' instance for a data type.+deriveOrd2 :: DeriveConfig -> Name -> Q [Dec]+deriveOrd2 deriveConfig = genBinaryOpClass deriveConfig ordConfig 2
+ src/Grisette/Internal/TH/Derivation/DerivePPrint.hs view
@@ -0,0 +1,211 @@+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TupleSections #-}++-- |+-- Module : Grisette.Internal.TH.Derivation.DerivePPrint+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.TH.Derivation.DerivePPrint+ ( derivePPrint,+ derivePPrint1,+ derivePPrint2,+ )+where++import Data.Maybe (fromMaybe)+import Data.String (IsString (fromString))+import GHC.Show (appPrec1)+import Grisette.Internal.Internal.Decl.Core.Data.Class.PPrint+ ( PPrint (pformatList, pformatPrec),+ PPrint1 (liftPFormatList, liftPFormatPrec),+ PPrint2 (liftPFormatList2, liftPFormatPrec2),+ align,+ condEnclose,+ flatAlt,+ group,+ groupedEnclose,+ nest,+ pformatWithConstructorNoAlign,+ vcat,+ vsep,+ (<+>),+ )+import Grisette.Internal.TH.Derivation.Common (DeriveConfig)+import Grisette.Internal.TH.Derivation.ShowPPrintCommon (showPrintFieldFunExp)+import Grisette.Internal.TH.Derivation.UnaryOpCommon+ ( UnaryOpClassConfig+ ( UnaryOpClassConfig,+ unaryOpAllowExistential,+ unaryOpConfigs,+ unaryOpContextNames,+ unaryOpExtraVars,+ unaryOpInstanceNames,+ unaryOpInstanceTypeFromConfig+ ),+ UnaryOpConfig (UnaryOpConfig),+ UnaryOpFieldConfig+ ( UnaryOpFieldConfig,+ extraLiftedPatNames,+ extraPatNames,+ fieldCombineFun,+ fieldFunExp,+ fieldResFun+ ),+ defaultUnaryOpInstanceTypeFromConfig,+ genUnaryOpClass,+ )+import Grisette.Internal.TH.Util (integerE, isNonUnitTuple)+import Language.Haskell.TH+ ( Dec,+ Exp (ListE),+ Fixity (Fixity),+ Name,+ defaultFixity,+ listE,+ nameBase,+ stringE,+ )+import Language.Haskell.TH.Datatype+ ( ConstructorVariant (InfixConstructor, NormalConstructor, RecordConstructor),+ reifyFixityCompat,+ )+import Language.Haskell.TH.Syntax (Q)++pprintConfig :: UnaryOpClassConfig+pprintConfig =+ UnaryOpClassConfig+ { unaryOpConfigs =+ [ UnaryOpConfig+ UnaryOpFieldConfig+ { extraPatNames = ["prec"],+ extraLiftedPatNames = \i -> (["pl" | i /= 0]),+ fieldCombineFun = \_ _ variant conName [prec] exps -> do+ let initExps =+ ( \e ->+ [|+ $(return e)+ <> (fromString ",")+ <> flatAlt (fromString "") (fromString " ")+ |]+ )+ <$> init exps+ lastExp = [|$(return $ last exps)|]+ commaSeped = initExps ++ [lastExp]+ case (variant, exps) of+ (NormalConstructor, []) -> do+ r <- [|fromString $(stringE $ nameBase conName)|]+ return (r, [False])+ (NormalConstructor, [exp]) -> do+ r <-+ [|+ pformatWithConstructorNoAlign+ $(return prec)+ (fromString $(stringE $ nameBase conName))+ [$(return exp)]+ |]+ return (r, [True])+ (NormalConstructor, _) | isNonUnitTuple conName -> do+ r <-+ [|+ groupedEnclose (fromString "(") (fromString ")") $+ vcat $+ $(listE commaSeped)+ |]+ return (r, [False])+ (NormalConstructor, _) -> do+ r <-+ [|+ pformatWithConstructorNoAlign+ $(return prec)+ (fromString $(stringE $ nameBase conName))+ [vsep $(return $ ListE exps)]+ |]+ return (r, [True])+ (RecordConstructor _, _) -> do+ r <-+ [|+ pformatWithConstructorNoAlign+ $(return prec)+ (fromString $(stringE $ nameBase conName))+ [ groupedEnclose (fromString "{") (fromString "}") $+ vcat $+ $(listE commaSeped)+ ]+ |]+ return (r, [True])+ (InfixConstructor, [l, r]) -> do+ fi <-+ fromMaybe defaultFixity `fmap` reifyFixityCompat conName+ let conPrec = case fi of Fixity prec _ -> prec+ r <-+ [|+ group+ $ condEnclose+ ($(return prec) > $(integerE conPrec))+ (fromString "(")+ (fromString ")")+ $ nest 2+ $ vsep+ [ align $ $(return l),+ fromString $(stringE $ nameBase conName)+ <+> $(return r)+ ]+ |]+ return (r, [True])+ _ ->+ fail "derivePPrint: unexpected constructor variant",+ fieldResFun = \variant conName _ pos fieldPat fieldFun -> do+ let makePPrintField p =+ [|+ $(return fieldFun)+ $(integerE p)+ $(return fieldPat)+ |]+ let attachUsedInfo = ((,[False]) <$>)+ case variant of+ NormalConstructor+ | isNonUnitTuple conName ->+ attachUsedInfo $ makePPrintField 0+ NormalConstructor ->+ attachUsedInfo $ makePPrintField appPrec1+ RecordConstructor names ->+ attachUsedInfo+ [|+ fromString $(stringE $ nameBase (names !! pos) ++ " = ")+ <> $(makePPrintField 0)+ |]+ InfixConstructor -> do+ fi <-+ fromMaybe defaultFixity `fmap` reifyFixityCompat conName+ let conPrec = case fi of Fixity prec _ -> prec+ attachUsedInfo $ makePPrintField (conPrec + 1),+ fieldFunExp =+ showPrintFieldFunExp+ ['pformatPrec, 'liftPFormatPrec, 'liftPFormatPrec2]+ ['pformatList, 'liftPFormatList, 'liftPFormatList2]+ }+ ['pformatPrec, 'liftPFormatPrec, 'liftPFormatPrec2]+ ],+ unaryOpExtraVars = const $ return [],+ unaryOpInstanceNames = [''PPrint, ''PPrint1, ''PPrint2],+ unaryOpInstanceTypeFromConfig = defaultUnaryOpInstanceTypeFromConfig,+ unaryOpAllowExistential = True,+ unaryOpContextNames = Nothing+ }++-- | Derive 'PPrint' instance for a data type.+derivePPrint :: DeriveConfig -> Name -> Q [Dec]+derivePPrint deriveConfig = genUnaryOpClass deriveConfig pprintConfig 0++-- | Derive 'PPrint1' instance for a data type.+derivePPrint1 :: DeriveConfig -> Name -> Q [Dec]+derivePPrint1 deriveConfig = genUnaryOpClass deriveConfig pprintConfig 1++-- | Derive 'PPrint2' instance for a data type.+derivePPrint2 :: DeriveConfig -> Name -> Q [Dec]+derivePPrint2 deriveConfig = genUnaryOpClass deriveConfig pprintConfig 2
+ src/Grisette/Internal/TH/Derivation/DeriveSerial.hs view
@@ -0,0 +1,53 @@+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TupleSections #-}+{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}++{-# HLINT ignore "Unused LANGUAGE pragma" #-}++-- |+-- Module : Grisette.Internal.TH.Derivation.DeriveSerial+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.TH.Derivation.DeriveSerial+ ( deriveSerial,+ deriveSerial1,+ deriveSerial2,+ )+where++import Data.Bytes.Serial+ ( Serial (deserialize, serialize),+ Serial1 (deserializeWith, serializeWith),+ Serial2 (deserializeWith2, serializeWith2),+ )+import Grisette.Internal.TH.Derivation.Common (DeriveConfig)+import Grisette.Internal.TH.Derivation.SerializeCommon (serializeConfig)+import Grisette.Internal.TH.Derivation.UnaryOpCommon+ ( UnaryOpClassConfig,+ genUnaryOpClass,+ )+import Language.Haskell.TH (Dec, Name, Q)++serialConfig :: UnaryOpClassConfig+serialConfig =+ serializeConfig+ [''Serial, ''Serial1, ''Serial2]+ ['serialize, 'serializeWith, 'serializeWith2]+ ['deserialize, 'deserializeWith, 'deserializeWith2]++-- | Derive 'Serial' instance for a data type.+deriveSerial :: DeriveConfig -> Name -> Q [Dec]+deriveSerial deriveConfig = genUnaryOpClass deriveConfig serialConfig 0++-- | Derive 'Serial1' instance for a data type.+deriveSerial1 :: DeriveConfig -> Name -> Q [Dec]+deriveSerial1 deriveConfig = genUnaryOpClass deriveConfig serialConfig 1++-- | Derive 'Serial2' instance for a data type.+deriveSerial2 :: DeriveConfig -> Name -> Q [Dec]+deriveSerial2 deriveConfig = genUnaryOpClass deriveConfig serialConfig 2
+ src/Grisette/Internal/TH/Derivation/DeriveShow.hs view
@@ -0,0 +1,197 @@+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TupleSections #-}++-- |+-- Module : Grisette.Internal.TH.Derivation.DeriveShow+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.TH.Derivation.DeriveShow+ ( deriveShow,+ deriveShow1,+ deriveShow2,+ )+where++import Data.Functor.Classes+ ( Show1 (liftShowList, liftShowsPrec),+ Show2 (liftShowList2, liftShowsPrec2),+ )+import qualified Data.List as List+import Data.Maybe (fromMaybe)+import GHC.Show (appPrec, appPrec1)+import Grisette.Internal.TH.Derivation.Common (DeriveConfig)+import Grisette.Internal.TH.Derivation.ShowPPrintCommon (showPrintFieldFunExp)+import Grisette.Internal.TH.Derivation.UnaryOpCommon+ ( UnaryOpClassConfig+ ( UnaryOpClassConfig,+ unaryOpAllowExistential,+ unaryOpConfigs,+ unaryOpContextNames,+ unaryOpExtraVars,+ unaryOpInstanceNames,+ unaryOpInstanceTypeFromConfig+ ),+ UnaryOpConfig (UnaryOpConfig),+ UnaryOpFieldConfig+ ( UnaryOpFieldConfig,+ extraLiftedPatNames,+ extraPatNames,+ fieldCombineFun,+ fieldFunExp,+ fieldResFun+ ),+ defaultUnaryOpInstanceTypeFromConfig,+ genUnaryOpClass,+ )+import Grisette.Internal.TH.Util (integerE, isNonUnitTuple)+import Language.Haskell.TH+ ( Dec,+ Fixity (Fixity),+ Name,+ Q,+ defaultFixity,+ integerL,+ listE,+ litE,+ nameBase,+ stringE,+ )+import Language.Haskell.TH.Datatype+ ( ConstructorVariant (InfixConstructor, NormalConstructor, RecordConstructor),+ reifyFixityCompat,+ )++showConfig :: UnaryOpClassConfig+showConfig =+ UnaryOpClassConfig+ { unaryOpConfigs =+ [ UnaryOpConfig+ UnaryOpFieldConfig+ { extraPatNames = ["prec"],+ extraLiftedPatNames = \i -> (["sl" | i /= 0]),+ fieldCombineFun =+ \_ _ variant conName [prec] exps -> do+ case (variant, exps) of+ (NormalConstructor, []) -> do+ r <- [|showString $(stringE $ nameBase conName)|]+ return (r, [False])+ (NormalConstructor, [exp]) -> do+ r <-+ [|+ showParen+ ($(return prec) > $(integerE appPrec))+ ( showString $(stringE $ nameBase conName)+ . showChar ' '+ . $(return exp)+ )+ |]+ return (r, [True])+ (NormalConstructor, _) | isNonUnitTuple conName -> do+ let commaSeped =+ List.intersperse [|showChar ','|] $+ return <$> exps+ r <-+ [|+ showChar '('+ . foldr1 (.) $(listE commaSeped)+ . showChar ')'+ |]+ return (r, [False])+ (NormalConstructor, _) -> do+ let spaceSeped =+ List.intersperse [|showChar ' '|] $+ return <$> exps+ r <-+ [|+ showParen+ ($(return prec) > $(integerE appPrec))+ ( showString $(stringE $ nameBase conName)+ . showChar ' '+ . (foldr1 (.) $(listE spaceSeped))+ )+ |]+ return (r, [True])+ (RecordConstructor _, _) -> do+ let commaSpaceSeped =+ List.intersperse [|showString ", "|] $+ return <$> exps+ r <-+ [|+ showString $(stringE $ nameBase conName)+ . showString " {"+ . foldr1 (.) $(listE commaSpaceSeped)+ . showString "}"+ |]+ return (r, [False])+ (InfixConstructor, [l, r]) -> do+ fi <-+ fromMaybe defaultFixity `fmap` reifyFixityCompat conName+ let conPrec = case fi of Fixity prec _ -> prec+ r <-+ [|+ showParen+ ($(return prec) > $(integerE conPrec))+ ( $(return l)+ . showChar ' '+ . showString $(stringE $ nameBase conName)+ . showChar ' '+ . $(return r)+ )+ |]+ return (r, [True])+ _ ->+ fail "deriveShow: unexpected constructor variant",+ fieldResFun = \variant conName _ pos fieldPat fieldFun -> do+ let makeShowField p =+ [|+ $(return fieldFun)+ $(litE $ integerL $ fromIntegral p)+ $(return fieldPat)+ |]+ let attachUsedInfo = ((,[False]) <$>)+ case variant of+ NormalConstructor+ | isNonUnitTuple conName ->+ attachUsedInfo $ makeShowField 0+ NormalConstructor ->+ attachUsedInfo $ makeShowField appPrec1+ RecordConstructor names ->+ attachUsedInfo+ [|+ showString $(stringE $ nameBase (names !! pos) ++ " = ")+ . $(makeShowField 0)+ |]+ InfixConstructor -> do+ fi <-+ fromMaybe defaultFixity `fmap` reifyFixityCompat conName+ let conPrec = case fi of Fixity prec _ -> prec+ attachUsedInfo $ makeShowField (conPrec + 1),+ fieldFunExp =+ showPrintFieldFunExp+ ['showsPrec, 'liftShowsPrec, 'liftShowsPrec2]+ ['showList, 'liftShowList, 'liftShowList2]+ }+ ['showsPrec, 'liftShowsPrec, 'liftShowsPrec2]+ ],+ unaryOpInstanceNames = [''Show, ''Show1, ''Show2],+ unaryOpExtraVars = const $ return [],+ unaryOpInstanceTypeFromConfig = defaultUnaryOpInstanceTypeFromConfig,+ unaryOpAllowExistential = True,+ unaryOpContextNames = Nothing+ }++-- | Derive 'Show' instance for a data type.+deriveShow :: DeriveConfig -> Name -> Q [Dec]+deriveShow deriveConfig = genUnaryOpClass deriveConfig showConfig 0++-- | Derive 'Show1' instance for a data type.+deriveShow1 :: DeriveConfig -> Name -> Q [Dec]+deriveShow1 deriveConfig = genUnaryOpClass deriveConfig showConfig 1++-- | Derive 'Show2' instance for a data type.+deriveShow2 :: DeriveConfig -> Name -> Q [Dec]+deriveShow2 deriveConfig = genUnaryOpClass deriveConfig showConfig 2
+ src/Grisette/Internal/TH/Derivation/DeriveSimpleMergeable.hs view
@@ -0,0 +1,87 @@+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TupleSections #-}++-- |+-- Module : Grisette.Internal.TH.Derivation.DeriveSimpleMergeable+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.TH.Derivation.DeriveSimpleMergeable+ ( deriveSimpleMergeable,+ deriveSimpleMergeable1,+ deriveSimpleMergeable2,+ )+where++import Grisette.Internal.Internal.Decl.Core.Data.Class.SimpleMergeable+ ( SimpleMergeable (mrgIte),+ SimpleMergeable1 (liftMrgIte),+ SimpleMergeable2 (liftMrgIte2),+ )+import Grisette.Internal.TH.Derivation.BinaryOpCommon+ ( BinaryOpClassConfig+ ( BinaryOpClassConfig,+ binaryOpAllowSumType,+ binaryOpFieldConfigs,+ binaryOpInstanceNames+ ),+ BinaryOpFieldConfig+ ( BinaryOpFieldConfig,+ extraPatNames,+ fieldCombineFun,+ fieldDifferentExistentialFun,+ fieldFunExp,+ fieldFunNames,+ fieldLMatchResult,+ fieldRMatchResult,+ fieldResFun+ ),+ binaryOpAllowExistential,+ defaultFieldFunExp,+ genBinaryOpClass,+ )+import Grisette.Internal.TH.Derivation.Common (DeriveConfig)+import Language.Haskell.TH (Dec, Exp (AppE, ConE), Name, Q)++simpleMergeableConfig :: BinaryOpClassConfig+simpleMergeableConfig =+ BinaryOpClassConfig+ { binaryOpFieldConfigs =+ [ BinaryOpFieldConfig+ { extraPatNames = ["c"],+ fieldResFun = \[c] (lhs, rhs) f ->+ (,[True])+ <$> [|$(return f) $(return c) $(return lhs) $(return rhs)|],+ fieldCombineFun =+ \con lst -> return (foldl AppE (ConE con) lst, [False]),+ fieldDifferentExistentialFun = const [|undefined|],+ fieldFunExp =+ defaultFieldFunExp ['mrgIte, 'liftMrgIte, 'liftMrgIte2],+ fieldFunNames = ['mrgIte, 'liftMrgIte, 'liftMrgIte2],+ fieldLMatchResult = [|undefined|],+ fieldRMatchResult = [|undefined|]+ }+ ],+ binaryOpInstanceNames =+ [''SimpleMergeable, ''SimpleMergeable1, ''SimpleMergeable2],+ binaryOpAllowSumType = False,+ binaryOpAllowExistential = True+ }++-- | Derive 'SimpleMergeable' instance for a data type.+deriveSimpleMergeable :: DeriveConfig -> Name -> Q [Dec]+deriveSimpleMergeable deriveConfig =+ genBinaryOpClass deriveConfig simpleMergeableConfig 0++-- | Derive 'SimpleMergeable1' instance for a data type.+deriveSimpleMergeable1 :: DeriveConfig -> Name -> Q [Dec]+deriveSimpleMergeable1 deriveConfig =+ genBinaryOpClass deriveConfig simpleMergeableConfig 1++-- | Derive 'SimpleMergeable2' instance for a data type.+deriveSimpleMergeable2 :: DeriveConfig -> Name -> Q [Dec]+deriveSimpleMergeable2 deriveConfig =+ genBinaryOpClass deriveConfig simpleMergeableConfig 2
+ src/Grisette/Internal/TH/Derivation/DeriveSubstSym.hs view
@@ -0,0 +1,89 @@+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}++{-# HLINT ignore "Unused LANGUAGE pragma" #-}++-- |+-- Module : Grisette.Internal.TH.Derivation.DeriveSubstSym+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.TH.Derivation.DeriveSubstSym+ ( deriveSubstSym,+ deriveSubstSym1,+ deriveSubstSym2,+ )+where++import Grisette.Internal.Internal.Decl.Core.Data.Class.SubstSym+ ( SubstSym (substSym),+ SubstSym1 (liftSubstSym),+ SubstSym2 (liftSubstSym2),+ )+import Grisette.Internal.TH.Derivation.Common (DeriveConfig)+import Grisette.Internal.TH.Derivation.UnaryOpCommon+ ( UnaryOpClassConfig+ ( UnaryOpClassConfig,+ unaryOpAllowExistential,+ unaryOpConfigs,+ unaryOpContextNames,+ unaryOpExtraVars,+ unaryOpInstanceNames,+ unaryOpInstanceTypeFromConfig+ ),+ UnaryOpConfig (UnaryOpConfig),+ UnaryOpFieldConfig+ ( UnaryOpFieldConfig,+ extraLiftedPatNames,+ extraPatNames,+ fieldCombineFun,+ fieldFunExp,+ fieldResFun+ ),+ defaultFieldFunExp,+ defaultFieldResFun,+ defaultUnaryOpInstanceTypeFromConfig,+ genUnaryOpClass,+ )+import Language.Haskell.TH (Dec, Exp (AppE, ConE), Name)+import Language.Haskell.TH.Syntax (Q)++substSymConfig :: UnaryOpClassConfig+substSymConfig =+ UnaryOpClassConfig+ { unaryOpConfigs =+ [ UnaryOpConfig+ UnaryOpFieldConfig+ { extraPatNames = ["symbol", "newVal"],+ extraLiftedPatNames = const [],+ fieldResFun = defaultFieldResFun,+ fieldCombineFun = \_ _ _ con extraPat exp ->+ return (foldl AppE (ConE con) exp, False <$ extraPat),+ fieldFunExp =+ defaultFieldFunExp+ ['substSym, 'liftSubstSym, 'liftSubstSym2]+ }+ ['substSym, 'liftSubstSym, 'liftSubstSym2]+ ],+ unaryOpInstanceNames =+ [''SubstSym, ''SubstSym1, ''SubstSym2],+ unaryOpExtraVars = const $ return [],+ unaryOpInstanceTypeFromConfig = defaultUnaryOpInstanceTypeFromConfig,+ unaryOpAllowExistential = True,+ unaryOpContextNames = Nothing+ }++-- | Derive 'SubstSym' instance for a data type.+deriveSubstSym :: DeriveConfig -> Name -> Q [Dec]+deriveSubstSym deriveConfig = genUnaryOpClass deriveConfig substSymConfig 0++-- | Derive 'SubstSym1' instance for a data type.+deriveSubstSym1 :: DeriveConfig -> Name -> Q [Dec]+deriveSubstSym1 deriveConfig = genUnaryOpClass deriveConfig substSymConfig 1++-- | Derive 'SubstSym2' instance for a data type.+deriveSubstSym2 :: DeriveConfig -> Name -> Q [Dec]+deriveSubstSym2 deriveConfig = genUnaryOpClass deriveConfig substSymConfig 2
+ src/Grisette/Internal/TH/Derivation/DeriveSymEq.hs view
@@ -0,0 +1,85 @@+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TupleSections #-}++-- |+-- Module : Grisette.Internal.TH.Derivation.DeriveSymEq+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.TH.Derivation.DeriveSymEq+ ( deriveSymEq,+ deriveSymEq1,+ deriveSymEq2,+ )+where++import Grisette.Internal.Core.Data.Class.LogicalOp+ ( LogicalOp (false, true, (.&&)),+ )+import Grisette.Internal.Internal.Decl.Core.Data.Class.SymEq+ ( SymEq ((.==)),+ SymEq1 (liftSymEq),+ SymEq2 (liftSymEq2),+ )+import Grisette.Internal.TH.Derivation.BinaryOpCommon+ ( BinaryOpClassConfig+ ( BinaryOpClassConfig,+ binaryOpAllowSumType,+ binaryOpFieldConfigs,+ binaryOpInstanceNames+ ),+ BinaryOpFieldConfig+ ( BinaryOpFieldConfig,+ extraPatNames,+ fieldCombineFun,+ fieldDifferentExistentialFun,+ fieldFunExp,+ fieldFunNames,+ fieldLMatchResult,+ fieldRMatchResult,+ fieldResFun+ ),+ binaryOpAllowExistential,+ defaultFieldFunExp,+ genBinaryOpClass,+ )+import Grisette.Internal.TH.Derivation.Common (DeriveConfig)+import Language.Haskell.TH (Dec, Exp (ListE), Name, Q)++symEqConfig :: BinaryOpClassConfig+symEqConfig =+ BinaryOpClassConfig+ { binaryOpFieldConfigs =+ [ BinaryOpFieldConfig+ { extraPatNames = [],+ fieldResFun = \_ (lhs, rhs) f ->+ (,[]) <$> [|$(return f) $(return lhs) $(return rhs)|],+ fieldCombineFun =+ \_ lst -> (,[]) <$> [|foldl (.&&) true $(return $ ListE lst)|],+ fieldDifferentExistentialFun = const [|false|],+ fieldFunExp =+ defaultFieldFunExp ['(.==), 'liftSymEq, 'liftSymEq2],+ fieldFunNames = ['(.==), 'liftSymEq, 'liftSymEq2],+ fieldLMatchResult = [|false|],+ fieldRMatchResult = [|false|]+ }+ ],+ binaryOpInstanceNames = [''SymEq, ''SymEq1, ''SymEq2],+ binaryOpAllowSumType = True,+ binaryOpAllowExistential = True+ }++-- | Derive 'SymEq' instance for a data type.+deriveSymEq :: DeriveConfig -> Name -> Q [Dec]+deriveSymEq deriveConfig = genBinaryOpClass deriveConfig symEqConfig 0++-- | Derive 'SymEq1' instance for a data type.+deriveSymEq1 :: DeriveConfig -> Name -> Q [Dec]+deriveSymEq1 deriveConfig = genBinaryOpClass deriveConfig symEqConfig 1++-- | Derive 'SymEq2' instance for a data type.+deriveSymEq2 :: DeriveConfig -> Name -> Q [Dec]+deriveSymEq2 deriveConfig = genBinaryOpClass deriveConfig symEqConfig 2
+ src/Grisette/Internal/TH/Derivation/DeriveSymOrd.hs view
@@ -0,0 +1,99 @@+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TupleSections #-}++-- |+-- Module : Grisette.Internal.TH.Derivation.DeriveSymOrd+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.TH.Derivation.DeriveSymOrd+ ( deriveSymOrd,+ deriveSymOrd1,+ deriveSymOrd2,+ )+where++import Grisette.Internal.Internal.Decl.Core.Data.Class.SymOrd+ ( SymOrd (symCompare),+ SymOrd1 (liftSymCompare),+ SymOrd2 (liftSymCompare2),+ )+import Grisette.Internal.Internal.Decl.Core.Data.Class.TryMerge+ ( mrgSingle,+ )+import Grisette.Internal.TH.Derivation.BinaryOpCommon+ ( BinaryOpClassConfig+ ( BinaryOpClassConfig,+ binaryOpAllowSumType,+ binaryOpFieldConfigs,+ binaryOpInstanceNames+ ),+ BinaryOpFieldConfig+ ( BinaryOpFieldConfig,+ extraPatNames,+ fieldCombineFun,+ fieldDifferentExistentialFun,+ fieldFunExp,+ fieldFunNames,+ fieldLMatchResult,+ fieldRMatchResult,+ fieldResFun+ ),+ binaryOpAllowExistential,+ defaultFieldFunExp,+ genBinaryOpClass,+ )+import Grisette.Internal.TH.Derivation.Common (DeriveConfig)+import Language.Haskell.TH (Dec, Name, Q)++symOrdConfig :: BinaryOpClassConfig+symOrdConfig =+ BinaryOpClassConfig+ { binaryOpFieldConfigs =+ [ BinaryOpFieldConfig+ { extraPatNames = [],+ fieldResFun =+ \_ (lhs, rhs) f ->+ (,[]) <$> [|$(return f) $(return lhs) $(return rhs)|],+ fieldCombineFun =+ \_ lst -> do+ let go [] = [|mrgSingle EQ|]+ go [x] = [|$(return x)|]+ go (x : xs) =+ [|+ do+ a <- $(return x)+ case a of+ EQ -> $(go xs)+ _ -> mrgSingle a+ |]+ (,[]) <$> go lst,+ fieldDifferentExistentialFun =+ \exp -> [|mrgSingle $(return exp)|],+ fieldFunExp =+ defaultFieldFunExp+ ['symCompare, 'liftSymCompare, 'liftSymCompare2],+ fieldFunNames = ['symCompare, 'liftSymCompare, 'liftSymCompare2],+ fieldLMatchResult = [|mrgSingle LT|],+ fieldRMatchResult = [|mrgSingle GT|]+ }+ ],+ binaryOpInstanceNames = [''SymOrd, ''SymOrd1, ''SymOrd2],+ binaryOpAllowSumType = True,+ binaryOpAllowExistential = True+ }++-- | Derive 'SymOrd' instance for a data type.+deriveSymOrd :: DeriveConfig -> Name -> Q [Dec]+deriveSymOrd deriveConfig = genBinaryOpClass deriveConfig symOrdConfig 0++-- | Derive 'SymOrd1' instance for a data type.+deriveSymOrd1 :: DeriveConfig -> Name -> Q [Dec]+deriveSymOrd1 deriveConfig = genBinaryOpClass deriveConfig symOrdConfig 1++-- | Derive 'SymOrd2' instance for a data type.+deriveSymOrd2 :: DeriveConfig -> Name -> Q [Dec]+deriveSymOrd2 deriveConfig = genBinaryOpClass deriveConfig symOrdConfig 2
+ src/Grisette/Internal/TH/Derivation/DeriveToCon.hs view
@@ -0,0 +1,67 @@+{-# LANGUAGE TemplateHaskell #-}++-- |+-- Module : Grisette.Internal.TH.Derivation.DeriveToCon+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.TH.Derivation.DeriveToCon+ ( deriveToCon,+ deriveToCon1,+ deriveToCon2,+ )+where++import Grisette.Internal.Internal.Decl.Core.Data.Class.ToCon+ ( ToCon (toCon),+ ToCon1 (liftToCon),+ ToCon2 (liftToCon2),+ )+import Grisette.Internal.TH.Derivation.Common (DeriveConfig)+import Grisette.Internal.TH.Derivation.ConvertOpCommon+ ( ConvertOpClassConfig+ ( ConvertOpClassConfig,+ convertFieldCombineFun,+ convertFieldFunExp,+ convertFieldResFun,+ convertOpFunNames,+ convertOpInstanceNames,+ convertOpTarget+ ),+ defaultFieldFunExp,+ genConvertOpClass,+ )+import Grisette.Internal.Unified.EvalModeTag (EvalModeTag (C))+import Language.Haskell.TH (Dec, Name, Q, conE)++toConClassConfig :: ConvertOpClassConfig+toConClassConfig =+ ConvertOpClassConfig+ { convertFieldResFun = \v f -> [|$(return f) $(return v)|],+ convertFieldCombineFun = \f args ->+ foldl+ (\acc arg -> [|$(acc) <*> $arg|])+ [|return $(conE f)|]+ $ fmap return args,+ convertFieldFunExp = defaultFieldFunExp ['toCon, 'liftToCon, 'liftToCon2],+ convertOpTarget = C,+ convertOpInstanceNames = [''ToCon, ''ToCon1, ''ToCon2],+ convertOpFunNames = ['toCon, 'liftToCon, 'liftToCon2]+ }++-- | Derive 'ToCon' instance for a data type.+deriveToCon :: DeriveConfig -> Name -> Q [Dec]+deriveToCon deriveConfig = genConvertOpClass deriveConfig toConClassConfig 0++-- | Derive 'ToCon1' instance for a data type.+deriveToCon1 :: DeriveConfig -> Name -> Q [Dec]+deriveToCon1 deriveConfig =+ genConvertOpClass deriveConfig toConClassConfig 1++-- | Derive 'ToCon2' instance for a data type.+deriveToCon2 :: DeriveConfig -> Name -> Q [Dec]+deriveToCon2 deriveConfig =+ genConvertOpClass deriveConfig toConClassConfig 2
+ src/Grisette/Internal/TH/Derivation/DeriveToSym.hs view
@@ -0,0 +1,67 @@+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}++{-# HLINT ignore "Unused LANGUAGE pragma" #-}++-- |+-- Module : Grisette.Internal.TH.Derivation.DeriveToSym+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.TH.Derivation.DeriveToSym+ ( deriveToSym,+ deriveToSym1,+ deriveToSym2,+ )+where++import Grisette.Internal.Internal.Decl.Core.Data.Class.ToSym+ ( ToSym (toSym),+ ToSym1 (liftToSym),+ ToSym2 (liftToSym2),+ )+import Grisette.Internal.TH.Derivation.Common (DeriveConfig)+import Grisette.Internal.TH.Derivation.ConvertOpCommon+ ( ConvertOpClassConfig+ ( ConvertOpClassConfig,+ convertFieldCombineFun,+ convertFieldFunExp,+ convertFieldResFun,+ convertOpInstanceNames,+ convertOpTarget+ ),+ convertOpFunNames,+ defaultFieldFunExp,+ genConvertOpClass,+ )+import Grisette.Internal.Unified.EvalModeTag (EvalModeTag (S))+import Language.Haskell.TH (Dec, Name, Q, appE, conE)++toSymClassConfig :: ConvertOpClassConfig+toSymClassConfig =+ ConvertOpClassConfig+ { convertFieldResFun = \v f -> [|$(return f) $(return v)|],+ convertFieldCombineFun =+ \f args -> foldl appE (conE f) $ fmap return args,+ convertFieldFunExp = defaultFieldFunExp ['toSym, 'liftToSym, 'liftToSym2],+ convertOpTarget = S,+ convertOpInstanceNames = [''ToSym, ''ToSym1, ''ToSym2],+ convertOpFunNames = ['toSym, 'liftToSym, 'liftToSym2]+ }++-- | Derive 'ToSym' instance for a data type.+deriveToSym :: DeriveConfig -> Name -> Q [Dec]+deriveToSym deriveConfig = genConvertOpClass deriveConfig toSymClassConfig 0++-- | Derive 'ToSym1' instance for a data type.+deriveToSym1 :: DeriveConfig -> Name -> Q [Dec]+deriveToSym1 deriveConfig =+ genConvertOpClass deriveConfig toSymClassConfig 1++-- | Derive 'ToSym2' instance for a data type.+deriveToSym2 :: DeriveConfig -> Name -> Q [Dec]+deriveToSym2 deriveConfig =+ genConvertOpClass deriveConfig toSymClassConfig 2
+ src/Grisette/Internal/TH/Derivation/DeriveUnifiedSimpleMergeable.hs view
@@ -0,0 +1,114 @@+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}++{-# HLINT ignore "Unused LANGUAGE pragma" #-}++-- |+-- Module : Grisette.Internal.TH.Derivation.DeriveUnifiedSimpleMergeable+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.TH.Derivation.DeriveUnifiedSimpleMergeable+ ( deriveUnifiedSimpleMergeable,+ deriveUnifiedSimpleMergeable1,+ deriveUnifiedSimpleMergeable2,+ )+where++import Grisette.Internal.Internal.Decl.Unified.Class.UnifiedSimpleMergeable+ ( UnifiedSimpleMergeable (withBaseSimpleMergeable),+ UnifiedSimpleMergeable1 (withBaseSimpleMergeable1),+ UnifiedSimpleMergeable2 (withBaseSimpleMergeable2),+ )+import Grisette.Internal.TH.Derivation.Common (DeriveConfig (evalModeConfig))+import Grisette.Internal.TH.Derivation.UnaryOpCommon+ ( UnaryOpClassConfig+ ( UnaryOpClassConfig,+ unaryOpAllowExistential,+ unaryOpConfigs,+ unaryOpContextNames,+ unaryOpExtraVars,+ unaryOpInstanceNames,+ unaryOpInstanceTypeFromConfig+ ),+ UnaryOpConfig (UnaryOpConfig),+ genUnaryOpClass,+ )+import Grisette.Internal.TH.Derivation.UnifiedOpCommon+ ( UnaryOpUnifiedConfig (UnaryOpUnifiedConfig, unifiedFun),+ defaultUnaryOpUnifiedFun,+ )+import Grisette.Internal.Unified.EvalModeTag (EvalModeTag)+import Language.Haskell.TH+ ( Dec,+ Name,+ Q,+ Type (ConT, VarT),+ appT,+ conT,+ newName,+ )++unifiedSimpleMergeableConfig :: UnaryOpClassConfig+unifiedSimpleMergeableConfig =+ UnaryOpClassConfig+ { unaryOpConfigs =+ [ UnaryOpConfig+ UnaryOpUnifiedConfig+ { unifiedFun =+ defaultUnaryOpUnifiedFun+ [ 'withBaseSimpleMergeable,+ 'withBaseSimpleMergeable1,+ 'withBaseSimpleMergeable2+ ]+ }+ [ 'withBaseSimpleMergeable,+ 'withBaseSimpleMergeable1,+ 'withBaseSimpleMergeable2+ ]+ ],+ unaryOpInstanceNames =+ [ ''UnifiedSimpleMergeable,+ ''UnifiedSimpleMergeable1,+ ''UnifiedSimpleMergeable2+ ],+ unaryOpExtraVars = \config -> do+ let modeConfigs = evalModeConfig config+ case modeConfigs of+ [] -> do+ nm <- newName "mode"+ return [(VarT nm, ConT ''EvalModeTag)]+ [_] -> return []+ _ -> fail "UnifiedSimpleMergeable does not support multiple evaluation modes",+ unaryOpInstanceTypeFromConfig =+ \config newModeVars keptNewVars con -> do+ let modeConfigs = evalModeConfig config+ modeVar <- case modeConfigs of+ [] -> return $ head newModeVars+ [(i, _)] -> do+ if i >= length keptNewVars+ then fail "UnifiedSimpleMergeable reference to a non-existent mode variable"+ else return $ keptNewVars !! i+ _ -> fail "UnifiedSimpleMergeable does not support multiple evaluation modes"+ appT (conT con) (return $ fst modeVar),+ unaryOpAllowExistential = True,+ unaryOpContextNames = Nothing+ }++-- | Derive 'UnifiedSimpleMergeable' instance for a data type.+deriveUnifiedSimpleMergeable :: DeriveConfig -> Name -> Q [Dec]+deriveUnifiedSimpleMergeable deriveConfig =+ genUnaryOpClass deriveConfig unifiedSimpleMergeableConfig 0++-- | Derive 'UnifiedSimpleMergeable1' instance for a data type.+deriveUnifiedSimpleMergeable1 :: DeriveConfig -> Name -> Q [Dec]+deriveUnifiedSimpleMergeable1 deriveConfig =+ genUnaryOpClass deriveConfig unifiedSimpleMergeableConfig 1++-- | Derive 'UnifiedSimpleMergeable2' instance for a data type.+deriveUnifiedSimpleMergeable2 :: DeriveConfig -> Name -> Q [Dec]+deriveUnifiedSimpleMergeable2 deriveConfig =+ genUnaryOpClass deriveConfig unifiedSimpleMergeableConfig 2
+ src/Grisette/Internal/TH/Derivation/DeriveUnifiedSymEq.hs view
@@ -0,0 +1,104 @@+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}++{-# HLINT ignore "Unused LANGUAGE pragma" #-}++-- |+-- Module : Grisette.Internal.TH.Derivation.DeriveUnifiedSymEq+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.TH.Derivation.DeriveUnifiedSymEq+ ( deriveUnifiedSymEq,+ deriveUnifiedSymEq1,+ deriveUnifiedSymEq2,+ )+where++import Grisette.Internal.Internal.Decl.Unified.Class.UnifiedSymEq+ ( UnifiedSymEq (withBaseSymEq),+ UnifiedSymEq1 (withBaseSymEq1),+ UnifiedSymEq2 (withBaseSymEq2),+ )+import Grisette.Internal.TH.Derivation.Common (DeriveConfig (evalModeConfig))+import Grisette.Internal.TH.Derivation.UnaryOpCommon+ ( UnaryOpClassConfig+ ( UnaryOpClassConfig,+ unaryOpAllowExistential,+ unaryOpConfigs,+ unaryOpContextNames,+ unaryOpExtraVars,+ unaryOpInstanceNames,+ unaryOpInstanceTypeFromConfig+ ),+ UnaryOpConfig (UnaryOpConfig),+ genUnaryOpClass,+ )+import Grisette.Internal.TH.Derivation.UnifiedOpCommon+ ( UnaryOpUnifiedConfig (UnaryOpUnifiedConfig, unifiedFun),+ defaultUnaryOpUnifiedFun,+ )+import Grisette.Internal.Unified.EvalModeTag (EvalModeTag)+import Language.Haskell.TH+ ( Dec,+ Name,+ Q,+ Type (ConT, VarT),+ appT,+ conT,+ newName,+ )++unifiedSymEqConfig :: UnaryOpClassConfig+unifiedSymEqConfig =+ UnaryOpClassConfig+ { unaryOpConfigs =+ [ UnaryOpConfig+ UnaryOpUnifiedConfig+ { unifiedFun =+ defaultUnaryOpUnifiedFun+ ['withBaseSymEq, 'withBaseSymEq1, 'withBaseSymEq2]+ }+ ['withBaseSymEq, 'withBaseSymEq1, 'withBaseSymEq2]+ ],+ unaryOpInstanceNames = [''UnifiedSymEq, ''UnifiedSymEq1, ''UnifiedSymEq2],+ unaryOpExtraVars = \config -> do+ let modeConfigs = evalModeConfig config+ case modeConfigs of+ [] -> do+ nm <- newName "mode"+ return [(VarT nm, ConT ''EvalModeTag)]+ [_] -> return []+ _ -> fail "UnifiedSymEq does not support multiple evaluation modes",+ unaryOpInstanceTypeFromConfig =+ \config newModeVars keptNewVars con -> do+ let modeConfigs = evalModeConfig config+ modeVar <- case modeConfigs of+ [] -> return $ head newModeVars+ [(i, _)] -> do+ if i >= length keptNewVars+ then fail "UnifiedSymEq reference to a non-existent mode variable"+ else return $ keptNewVars !! i+ _ -> fail "UnifiedSymEq does not support multiple evaluation modes"+ appT (conT con) (return $ fst modeVar),+ unaryOpAllowExistential = True,+ unaryOpContextNames = Nothing+ }++-- | Derive 'UnifiedSymEq' instance for a data type.+deriveUnifiedSymEq :: DeriveConfig -> Name -> Q [Dec]+deriveUnifiedSymEq deriveConfig =+ genUnaryOpClass deriveConfig unifiedSymEqConfig 0++-- | Derive 'UnifiedSymEq1' instance for a data type.+deriveUnifiedSymEq1 :: DeriveConfig -> Name -> Q [Dec]+deriveUnifiedSymEq1 deriveConfig =+ genUnaryOpClass deriveConfig unifiedSymEqConfig 1++-- | Derive 'UnifiedSymEq2' instance for a data type.+deriveUnifiedSymEq2 :: DeriveConfig -> Name -> Q [Dec]+deriveUnifiedSymEq2 deriveConfig =+ genUnaryOpClass deriveConfig unifiedSymEqConfig 2
+ src/Grisette/Internal/TH/Derivation/DeriveUnifiedSymOrd.hs view
@@ -0,0 +1,104 @@+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}++{-# HLINT ignore "Unused LANGUAGE pragma" #-}++-- |+-- Module : Grisette.Internal.TH.Derivation.DeriveUnifiedSymOrd+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.TH.Derivation.DeriveUnifiedSymOrd+ ( deriveUnifiedSymOrd,+ deriveUnifiedSymOrd1,+ deriveUnifiedSymOrd2,+ )+where++import Grisette.Internal.Internal.Decl.Unified.Class.UnifiedSymOrd+ ( UnifiedSymOrd (withBaseSymOrd),+ UnifiedSymOrd1 (withBaseSymOrd1),+ UnifiedSymOrd2 (withBaseSymOrd2),+ )+import Grisette.Internal.TH.Derivation.Common (DeriveConfig (evalModeConfig))+import Grisette.Internal.TH.Derivation.UnaryOpCommon+ ( UnaryOpClassConfig+ ( UnaryOpClassConfig,+ unaryOpAllowExistential,+ unaryOpConfigs,+ unaryOpContextNames,+ unaryOpExtraVars,+ unaryOpInstanceNames,+ unaryOpInstanceTypeFromConfig+ ),+ UnaryOpConfig (UnaryOpConfig),+ genUnaryOpClass,+ )+import Grisette.Internal.TH.Derivation.UnifiedOpCommon+ ( UnaryOpUnifiedConfig (UnaryOpUnifiedConfig, unifiedFun),+ defaultUnaryOpUnifiedFun,+ )+import Grisette.Internal.Unified.EvalModeTag (EvalModeTag)+import Language.Haskell.TH+ ( Dec,+ Name,+ Q,+ Type (ConT, VarT),+ appT,+ conT,+ newName,+ )++unifiedSymOrdConfig :: UnaryOpClassConfig+unifiedSymOrdConfig =+ UnaryOpClassConfig+ { unaryOpConfigs =+ [ UnaryOpConfig+ UnaryOpUnifiedConfig+ { unifiedFun =+ defaultUnaryOpUnifiedFun+ ['withBaseSymOrd, 'withBaseSymOrd1, 'withBaseSymOrd2]+ }+ ['withBaseSymOrd, 'withBaseSymOrd1, 'withBaseSymOrd2]+ ],+ unaryOpInstanceNames = [''UnifiedSymOrd, ''UnifiedSymOrd1, ''UnifiedSymOrd2],+ unaryOpExtraVars = \config -> do+ let modeConfigs = evalModeConfig config+ case modeConfigs of+ [] -> do+ nm <- newName "mode"+ return [(VarT nm, ConT ''EvalModeTag)]+ [_] -> return []+ _ -> fail "UnifiedSymOrd does not support multiple evaluation modes",+ unaryOpInstanceTypeFromConfig =+ \config newModeVars keptNewVars con -> do+ let modeConfigs = evalModeConfig config+ modeVar <- case modeConfigs of+ [] -> return $ head newModeVars+ [(i, _)] -> do+ if i >= length keptNewVars+ then fail "UnifiedSymOrd reference to a non-existent mode variable"+ else return $ keptNewVars !! i+ _ -> fail "UnifiedSymOrd does not support multiple evaluation modes"+ appT (conT con) (return $ fst modeVar),+ unaryOpAllowExistential = True,+ unaryOpContextNames = Nothing+ }++-- | Derive 'UnifiedSymOrd' instance for a data type.+deriveUnifiedSymOrd :: DeriveConfig -> Name -> Q [Dec]+deriveUnifiedSymOrd deriveConfig =+ genUnaryOpClass deriveConfig unifiedSymOrdConfig 0++-- | Derive 'UnifiedSymOrd1' instance for a data type.+deriveUnifiedSymOrd1 :: DeriveConfig -> Name -> Q [Dec]+deriveUnifiedSymOrd1 deriveConfig =+ genUnaryOpClass deriveConfig unifiedSymOrdConfig 1++-- | Derive 'UnifiedSymOrd2' instance for a data type.+deriveUnifiedSymOrd2 :: DeriveConfig -> Name -> Q [Dec]+deriveUnifiedSymOrd2 deriveConfig =+ genUnaryOpClass deriveConfig unifiedSymOrdConfig 2
+ src/Grisette/Internal/TH/Derivation/SerializeCommon.hs view
@@ -0,0 +1,243 @@+{-# LANGUAGE MultiWayIf #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TupleSections #-}+{-# LANGUAGE TypeApplications #-}++-- |+-- Module : Grisette.Internal.TH.Derivation.SerializeCommon+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.TH.Derivation.SerializeCommon+ ( serializeConfig,+ serializeWithSerialConfig,+ )+where++import Control.Monad (zipWithM)+import Data.Bytes.Serial (Serial (deserialize, serialize), Serial1, Serial2)+import qualified Data.Map as M+import Data.Maybe (mapMaybe)+import qualified Data.Set as S+import GHC.Word (Word16, Word32, Word64, Word8)+import Grisette.Internal.TH.Derivation.UnaryOpCommon+ ( UnaryOpClassConfig+ ( UnaryOpClassConfig,+ unaryOpAllowExistential,+ unaryOpConfigs,+ unaryOpContextNames,+ unaryOpExtraVars,+ unaryOpInstanceNames,+ unaryOpInstanceTypeFromConfig+ ),+ UnaryOpConfig (UnaryOpConfig),+ UnaryOpFieldConfig+ ( UnaryOpFieldConfig,+ extraLiftedPatNames,+ extraPatNames,+ fieldCombineFun,+ fieldFunExp,+ fieldResFun+ ),+ UnaryOpFunConfig (genUnaryOpFun),+ defaultFieldFunExp,+ defaultUnaryOpInstanceTypeFromConfig,+ )+import Grisette.Internal.TH.Util (integerE)+import Language.Haskell.TH+ ( Body (NormalB),+ Clause (Clause),+ Dec (FunD),+ Lit (IntegerL),+ Match (Match),+ Name,+ Pat (LitP, VarP, WildP),+ Type (VarT),+ bindS,+ caseE,+ clause,+ conE,+ conT,+ doE,+ funD,+ match,+ mkName,+ newName,+ noBindS,+ normalB,+ sigP,+ varE,+ varP,+ wildP,+ )+import Language.Haskell.TH.Datatype+ ( ConstructorInfo (constructorFields, constructorName),+ TypeSubstitution (freeVariables),+ resolveTypeSynonyms,+ )++data UnaryOpSerializeWithSerialConfig = UnaryOpSerializeWithSerialConfig++instance UnaryOpFunConfig UnaryOpSerializeWithSerialConfig where+ genUnaryOpFun _ UnaryOpSerializeWithSerialConfig funNames n _ _ _ _ _ =+ funD (funNames !! n) [clause [] (normalB [|serialize|]) []]++data UnaryOpDeserializeWithSerialConfig = UnaryOpDeserializeWithSerialConfig++instance UnaryOpFunConfig UnaryOpDeserializeWithSerialConfig where+ genUnaryOpFun _ UnaryOpDeserializeWithSerialConfig funNames n _ _ _ _ _ =+ funD (funNames !! n) [clause [] (normalB [|deserialize|]) []]++-- | Configuration for deserialization function, generate the function from+-- scratch.+data UnaryOpDeserializeConfig = UnaryOpDeserializeConfig++getSerializedType :: Int -> Name+getSerializedType numConstructors =+ if+ | numConstructors <= fromIntegral (maxBound @Word8) + 1 -> ''Word8+ | numConstructors <= fromIntegral (maxBound @Word16) + 1 -> ''Word16+ | numConstructors <= fromIntegral (maxBound @Word32) + 1 -> ''Word32+ | numConstructors <= fromIntegral (maxBound @Word64) + 1 -> ''Word64+ | otherwise -> ''Integer++instance UnaryOpFunConfig UnaryOpDeserializeConfig where+ genUnaryOpFun _ UnaryOpDeserializeConfig funNames n _ _ _ _ [] = do+ let instanceFunName = funNames !! n+ funD+ instanceFunName+ [ clause+ []+ (normalB [|error "deserializing a type without constructors"|])+ []+ ]+ genUnaryOpFun+ _+ UnaryOpDeserializeConfig+ funNames+ n+ _+ _+ argTypes+ _+ constructors = do+ allFields <-+ mapM resolveTypeSynonyms $+ concatMap constructorFields constructors+ let usedArgs = S.fromList $ freeVariables allFields+ args <-+ traverse+ ( \(ty, _) -> do+ case ty of+ VarT nm ->+ if S.member nm usedArgs+ then do+ pname <- newName "p"+ return (nm, Just pname)+ else return ('undefined, Nothing)+ _ -> return ('undefined, Nothing)+ )+ argTypes+ let argToFunPat =+ M.fromList $ mapMaybe (\(nm, mpat) -> fmap (nm,) mpat) args+ let funPats = fmap (maybe WildP VarP . snd) args+ let genAuxFunMatch conIdx conInfo = do+ fields <- mapM resolveTypeSynonyms $ constructorFields conInfo+ defaultFieldFunExps <-+ traverse+ ( defaultFieldFunExp+ funNames+ argToFunPat+ M.empty+ )+ fields+ let conName = constructorName conInfo+ exp <-+ foldl+ (\exp fieldFun -> [|$exp <*> $(return fieldFun)|])+ [|return $(conE conName)|]+ defaultFieldFunExps+ return $ Match (LitP (IntegerL conIdx)) (NormalB exp) []+ auxMatches <- zipWithM genAuxFunMatch [0 ..] constructors+ auxFallbackMatch <- match wildP (normalB [|undefined|]) []+ let instanceFunName = funNames !! n+ -- let auxFunName = mkName "go"+ let selName = mkName "sel"+ exp <-+ doE+ [ bindS+ ( sigP+ (varP selName)+ (conT (getSerializedType $ length constructors))+ )+ (varE (head funNames)),+ noBindS $+ caseE (varE selName) $+ return <$> auxMatches ++ [auxFallbackMatch]+ ]+ return $+ FunD+ instanceFunName+ [ Clause+ funPats+ (NormalB exp)+ []+ ]++-- | Configuration for serialization function, generate the function from+-- scratch.+serializeConfig :: [Name] -> [Name] -> [Name] -> UnaryOpClassConfig+serializeConfig instanceNames serializeFunNames deserializeFunNames =+ UnaryOpClassConfig+ { unaryOpConfigs =+ [ UnaryOpConfig+ UnaryOpFieldConfig+ { extraPatNames = [],+ extraLiftedPatNames = const [],+ fieldCombineFun = \totalConNumber conIdx _ _ [] exp -> do+ let ty = getSerializedType totalConNumber+ r <-+ foldl+ (\r exp -> [|$r >> $(return exp)|])+ ( [|+ $(varE $ head serializeFunNames)+ ($(integerE conIdx) :: $(conT ty))+ |]+ )+ exp+ return (r, [True]),+ fieldResFun = \_ _ _ _ fieldPat fieldFun -> do+ r <- [|$(return fieldFun) $(return fieldPat)|]+ return (r, [True]),+ fieldFunExp = defaultFieldFunExp serializeFunNames+ }+ serializeFunNames,+ UnaryOpConfig+ UnaryOpDeserializeConfig+ deserializeFunNames+ ],+ unaryOpInstanceNames = instanceNames,+ unaryOpExtraVars = const $ return [],+ unaryOpInstanceTypeFromConfig = defaultUnaryOpInstanceTypeFromConfig,+ unaryOpAllowExistential = False,+ unaryOpContextNames = Nothing+ }++-- | Configuration for serialization function, reuse the 'Serial' instance.+serializeWithSerialConfig :: [Name] -> [Name] -> [Name] -> UnaryOpClassConfig+serializeWithSerialConfig instanceNames serializeFunNames deserializeFunNames =+ UnaryOpClassConfig+ { unaryOpConfigs =+ [ UnaryOpConfig UnaryOpSerializeWithSerialConfig serializeFunNames,+ UnaryOpConfig UnaryOpDeserializeWithSerialConfig deserializeFunNames+ ],+ unaryOpInstanceNames = instanceNames,+ unaryOpExtraVars = const $ return [],+ unaryOpInstanceTypeFromConfig = defaultUnaryOpInstanceTypeFromConfig,+ unaryOpAllowExistential = False,+ unaryOpContextNames =+ Just $ take (length instanceNames) [''Serial, ''Serial1, ''Serial2]+ }
+ src/Grisette/Internal/TH/Derivation/ShowPPrintCommon.hs view
@@ -0,0 +1,57 @@+{-# LANGUAGE TemplateHaskell #-}++-- |+-- Module : Grisette.Internal.TH.Derivation.ShowPPrintCommon+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.TH.Derivation.ShowPPrintCommon (showPrintFieldFunExp) where++import qualified Data.Map as M+import qualified Data.Set as S+import Grisette.Internal.TH.Derivation.UnaryOpCommon (FieldFunExp)+import Language.Haskell.TH (Name, Type (AppT, VarT), varE)+import Language.Haskell.TH.Datatype (TypeSubstitution (freeVariables))++-- | Common 'FieldFunExp' for 'Show' and 'Grisette.Core.PPrint' on a GADT.+showPrintFieldFunExp :: [Name] -> [Name] -> FieldFunExp+showPrintFieldFunExp precNames listNames argToFunPat liftedExps = go+ where+ allArgNames = M.keysSet argToFunPat+ typeHasNoArg ty =+ S.fromList (freeVariables [ty])+ `S.intersection` allArgNames+ == S.empty+ goLst ty = do+ let fun0 = varE (head listNames)+ fun1 b = [|$(varE $ listNames !! 1) $(go b) $(goLst b)|]+ fun2 b c =+ [|$(varE $ listNames !! 2) $(go b) $(goLst b) $(go c) $(goLst c)|]+ case ty of+ AppT (AppT (VarT _) b) c -> fun2 b c+ AppT (VarT _) b -> fun1 b+ _ | typeHasNoArg ty -> fun0+ AppT a b | typeHasNoArg a -> fun1 b+ AppT (AppT a b) c | typeHasNoArg a -> fun2 b c+ VarT nm -> case M.lookup nm liftedExps of+ Just [p] -> varE p+ _ -> fail $ "defaultFieldFunExp: unsupported type: " <> show ty+ _ -> fail $ "defaultFieldFunExp: unsupported type: " <> show ty+ go ty = do+ let fun0 = varE (head precNames)+ fun1 b = [|$(varE $ precNames !! 1) $(go b) $(goLst b)|]+ fun2 b c =+ [|$(varE $ precNames !! 2) $(go b) $(goLst b) $(go c) $(goLst c)|]+ case ty of+ AppT (AppT (VarT _) b) c -> fun2 b c+ AppT (VarT _) b -> fun1 b+ _ | typeHasNoArg ty -> fun0+ AppT a b | typeHasNoArg a -> fun1 b+ AppT (AppT a b) c | typeHasNoArg a -> fun2 b c+ VarT nm -> case M.lookup nm argToFunPat of+ Just pname -> varE pname+ _ -> fail $ "defaultFieldFunExp: unsupported type: " <> show ty+ _ -> fail $ "defaultFieldFunExp: unsupported type: " <> show ty
+ src/Grisette/Internal/TH/Derivation/UnaryOpCommon.hs view
@@ -0,0 +1,400 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TupleSections #-}+{-# LANGUAGE TypeApplications #-}++-- |+-- Module : Grisette.Internal.TH.Derivation.UnaryOpCommon+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.TH.Derivation.UnaryOpCommon+ ( UnaryOpClassConfig (..),+ UnaryOpFieldConfig (..),+ UnaryOpConfig (..),+ UnaryOpFunConfig (..),+ FieldFunExp,+ defaultFieldResFun,+ defaultFieldFunExp,+ genUnaryOpClass,+ defaultUnaryOpInstanceTypeFromConfig,+ )+where++import Control.Monad (replicateM, zipWithM)+import qualified Data.List as List+import qualified Data.Map as M+import Data.Maybe (catMaybes, fromMaybe, mapMaybe)+import qualified Data.Set as S+import Grisette.Internal.TH.Derivation.Common+ ( CheckArgsResult+ ( CheckArgsResult,+ argVars,+ constructors,+ keptVars+ ),+ DeriveConfig (unconstrainedPositions),+ checkArgs,+ ctxForVar,+ evalModeSpecializeList,+ extraConstraint,+ freshenCheckArgsResult,+ isVarUsedInFields,+ specializeResult,+ )+import Grisette.Internal.TH.Util (allUsedNames)+import Language.Haskell.TH+ ( Body (NormalB),+ Clause (Clause),+ Dec (FunD, InstanceD),+ Exp (VarE),+ Kind,+ Name,+ Pat (VarP, WildP),+ Q,+ Type (AppT, ConT, VarT),+ appE,+ clause,+ conP,+ conT,+ funD,+ nameBase,+ newName,+ normalB,+ varE,+ varP,+ )+import Language.Haskell.TH.Datatype+ ( ConstructorInfo (constructorFields, constructorName, constructorVariant),+ ConstructorVariant,+ TypeSubstitution (freeVariables),+ resolveTypeSynonyms,+ )++-- | Type of field function expression generator.+type FieldFunExp = M.Map Name Name -> M.Map Name [Name] -> Type -> Q Exp++-- | Default field function expression generator.+defaultFieldFunExp :: [Name] -> FieldFunExp+defaultFieldFunExp unaryOpFunNames argToFunPat _ = go+ where+ go ty = do+ let allArgNames = M.keysSet argToFunPat+ let typeHasNoArg ty =+ S.fromList (freeVariables [ty])+ `S.intersection` allArgNames+ == S.empty+ let fun0 = varE $ head unaryOpFunNames+ fun1 b = [|$(varE $ unaryOpFunNames !! 1) $(go b)|]+ fun2 b c = [|$(varE $ unaryOpFunNames !! 2) $(go b) $(go c)|]+ fun3 b c d =+ [|$(varE $ unaryOpFunNames !! 3) $(go b) $(go c) $(go d)|]+ case ty of+ AppT (AppT (AppT (VarT _) b) c) d -> fun3 b c d+ AppT (AppT (VarT _) b) c -> fun2 b c+ AppT (VarT _) b -> fun1 b+ _ | typeHasNoArg ty -> fun0+ AppT a b | typeHasNoArg a -> fun1 b+ AppT (AppT a b) c | typeHasNoArg a -> fun2 b c+ AppT (AppT (AppT a b) c) d | typeHasNoArg a -> fun3 b c d+ VarT nm -> case M.lookup nm argToFunPat of+ Just pname -> varE pname+ _ -> fail $ "defaultFieldFunExp: unsupported type: " <> show ty+ _ -> fail $ "defaultFieldFunExp: unsupported type: " <> show ty++-- | Configuration for a unary function field expression generation on a GADT.+data UnaryOpConfig where+ UnaryOpConfig ::+ (UnaryOpFunConfig config) => config -> [Name] -> UnaryOpConfig++-- | Default field result function.+defaultFieldResFun ::+ ConstructorVariant -> Name -> [Exp] -> Int -> Exp -> Exp -> Q (Exp, [Bool])+defaultFieldResFun _ _ extraPatExps _ fieldPatExp defaultFieldFunExp = do+ res <-+ appE+ ( foldl+ (\exp name -> appE exp (return name))+ (return defaultFieldFunExp)+ extraPatExps+ )+ (return fieldPatExp)+ return (res, (True <$ extraPatExps))++funPatAndExps ::+ FieldFunExp ->+ (Int -> [String]) ->+ [(Type, Kind)] ->+ [Type] ->+ Q ([Pat], [[Pat]], [Exp])+funPatAndExps fieldFunExpGen extraLiftedPatNames argTypes fields = do+ let usedArgs = S.fromList $ freeVariables fields+ let liftedNames = extraLiftedPatNames (length argTypes)+ args <-+ traverse+ ( \(ty, _) -> do+ case ty of+ VarT nm ->+ if S.member nm usedArgs+ then do+ pname <- newName "p"+ epname <- traverse newName liftedNames+ return (nm, Just (pname, epname))+ else return ('undefined, Nothing)+ _ -> return ('undefined, Nothing)+ )+ argTypes+ let argToFunPat =+ M.fromList $ mapMaybe (\(nm, mpat) -> fmap ((nm,) . fst) mpat) args+ let argToLiftedPat =+ M.fromList $ mapMaybe (\(nm, mpat) -> fmap ((nm,) . snd) mpat) args+ let funPats = fmap (maybe WildP (VarP . fst) . snd) args+ let extraLiftedPats =+ fmap+ ( maybe+ (replicate (length liftedNames) WildP)+ (fmap VarP . snd)+ . snd+ )+ args+ defaultFieldFunExps <-+ traverse+ (fieldFunExpGen argToFunPat argToLiftedPat)+ fields+ return (funPats, extraLiftedPats, defaultFieldFunExps)++-- | Generate a clause for a unary function on a GADT.+genUnaryOpFieldClause ::+ UnaryOpFieldConfig ->+ [(Type, Kind)] ->+ Int ->+ Int ->+ ConstructorInfo ->+ Q Clause+genUnaryOpFieldClause+ (UnaryOpFieldConfig {..})+ argTypes+ totalConNumber+ conIdx+ conInfo = do+ fields <- mapM resolveTypeSynonyms $ constructorFields conInfo+ (funPats, funLiftedPats, defaultFieldFunExps) <-+ funPatAndExps fieldFunExp extraLiftedPatNames argTypes fields+ extraPatNames <- traverse newName extraPatNames+ let extraPatExps = fmap VarE extraPatNames+ fieldsPatNames <- replicateM (length fields) $ newName "field"+ let extraPats = fmap VarP extraPatNames+ fieldPats <- conP (constructorName conInfo) (fmap varP fieldsPatNames)+ let fieldPatExps = fmap VarE fieldsPatNames++ fieldResExpsAndArgsUsed <-+ sequence $+ zipWith3+ ( fieldResFun+ (constructorVariant conInfo)+ (constructorName conInfo)+ extraPatExps+ )+ [0 ..]+ fieldPatExps+ defaultFieldFunExps+ let fieldResExps = fst <$> fieldResExpsAndArgsUsed+ let extraArgsUsedByFields = snd <$> fieldResExpsAndArgsUsed++ (resExp, extraArgsUsedByResult) <-+ fieldCombineFun+ totalConNumber+ conIdx+ (constructorVariant conInfo)+ (constructorName conInfo)+ extraPatExps+ fieldResExps+ let resUsedNames = allUsedNames resExp+ let extraArgsUsed =+ fmap or $+ List.transpose $+ extraArgsUsedByResult : extraArgsUsedByFields+ let extraArgsPats =+ zipWith+ (\pat used -> if used then pat else WildP)+ extraPats+ extraArgsUsed+ let transformPat (VarP nm) =+ if S.member nm resUsedNames then VarP nm else WildP+ transformPat p = p+ return $+ Clause+ ( fmap transformPat $+ concat (zipWith (:) funPats funLiftedPats)+ ++ extraArgsPats+ ++ [fieldPats]+ )+ (NormalB resExp)+ []++-- | Configuration for a unary operation type class generation on a GADT.+data UnaryOpClassConfig = UnaryOpClassConfig+ { unaryOpConfigs :: [UnaryOpConfig],+ unaryOpInstanceNames :: [Name],+ unaryOpContextNames :: Maybe [Name],+ unaryOpExtraVars :: DeriveConfig -> Q [(Type, Kind)],+ unaryOpInstanceTypeFromConfig ::+ DeriveConfig ->+ [(Type, Kind)] ->+ [(Type, Kind)] ->+ Name ->+ Q Type,+ unaryOpAllowExistential :: Bool+ }++-- | Default unary operation instance type generator.+defaultUnaryOpInstanceTypeFromConfig ::+ DeriveConfig -> [(Type, Kind)] -> [(Type, Kind)] -> Name -> Q Type+defaultUnaryOpInstanceTypeFromConfig _ _ _ = conT++-- | Configuration for the derivation rules for a unary operation that can be+-- derived by transforming each field and then combining the results.+data UnaryOpFieldConfig = UnaryOpFieldConfig+ { extraPatNames :: [String],+ extraLiftedPatNames :: Int -> [String],+ fieldResFun ::+ ConstructorVariant ->+ Name ->+ [Exp] ->+ Int ->+ Exp ->+ Exp ->+ Q (Exp, [Bool]),+ fieldCombineFun ::+ -- \| Total number of constructors+ Int ->+ -- \| Constructor index+ Int ->+ -- \| Constructor variant+ ConstructorVariant ->+ -- \| Constructor name+ Name ->+ -- \| Extra pattern expressions+ [Exp] ->+ -- \| Field result expressions+ [Exp] ->+ Q (Exp, [Bool]),+ fieldFunExp :: FieldFunExp+ }++-- | Configuration for the derivation rules for a unary operation.+class UnaryOpFunConfig config where+ genUnaryOpFun ::+ -- | Derive configuration+ DeriveConfig ->+ -- | Configuration+ config ->+ -- | Function names+ [Name] ->+ -- | Number of functor arguments to the class+ Int ->+ -- | Extra variables+ [(Type, Kind)] ->+ -- | Kept variables+ [(Type, Kind)] ->+ -- | Argument variables+ [(Type, Kind)] ->+ -- | Whether the variable is used in fields+ (Name -> Bool) ->+ -- | Constructor infos+ [ConstructorInfo] ->+ Q Dec++instance UnaryOpFunConfig UnaryOpFieldConfig where+ genUnaryOpFun _ _ funNames n _ _ _ _ [] =+ funD (funNames !! n) [clause [] (normalB [|error "impossible"|]) []]+ genUnaryOpFun _ config funNames n _ _ argTypes _ constructors = do+ clauses <-+ zipWithM+ ( genUnaryOpFieldClause+ config+ argTypes+ (length constructors)+ )+ [0 ..]+ constructors+ let instanceFunName = funNames !! n+ return $ FunD instanceFunName clauses++-- | Generate a unary operation type class instance for a data type.+genUnaryOpClass ::+ DeriveConfig ->+ UnaryOpClassConfig ->+ Int ->+ Name ->+ Q [Dec]+genUnaryOpClass deriveConfig (UnaryOpClassConfig {..}) n typName = do+ result@CheckArgsResult {..} <-+ specializeResult (evalModeSpecializeList deriveConfig)+ =<< freshenCheckArgsResult True+ =<< checkArgs+ (nameBase $ head unaryOpInstanceNames)+ (length unaryOpInstanceNames - 1)+ typName+ unaryOpAllowExistential+ n+ extraVars <- unaryOpExtraVars deriveConfig++ let isTypeUsedInFields (VarT nm) = isVarUsedInFields result nm+ isTypeUsedInFields _ = False+ contextInstanceTypes <-+ traverse+ (unaryOpInstanceTypeFromConfig deriveConfig extraVars keptVars)+ (fromMaybe unaryOpInstanceNames unaryOpContextNames)+ ctxs <-+ traverse (uncurry $ ctxForVar contextInstanceTypes) $+ filter (isTypeUsedInFields . fst) $+ fmap snd $+ filter (not . (`elem` unconstrainedPositions deriveConfig) . fst) $+ zip [0 ..] keptVars+ let keptType = foldl AppT (ConT typName) $ fmap fst keptVars+ instanceFuns <-+ traverse+ ( \(UnaryOpConfig config funNames) ->+ genUnaryOpFun+ deriveConfig+ config+ funNames+ n+ extraVars+ keptVars+ argVars+ (isVarUsedInFields result)+ constructors+ )+ unaryOpConfigs+ let instanceName = unaryOpInstanceNames !! n+ instanceTypes <-+ traverse+ (unaryOpInstanceTypeFromConfig deriveConfig extraVars keptVars)+ unaryOpInstanceNames+ let instanceType = AppT (instanceTypes !! n) keptType+ extraPreds <-+ extraConstraint+ deriveConfig+ typName+ instanceName+ extraVars+ keptVars+ constructors+ return+ [ InstanceD+ Nothing+ ( extraPreds+ ++ if null constructors+ then []+ else catMaybes ctxs+ )+ instanceType+ instanceFuns+ ]
+ src/Grisette/Internal/TH/Derivation/UnifiedOpCommon.hs view
@@ -0,0 +1,107 @@+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeApplications #-}++-- |+-- Module : Grisette.Internal.TH.Derivation.UnifiedOpCommon+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.TH.Derivation.UnifiedOpCommon+ ( UnaryOpUnifiedConfig (..),+ defaultUnaryOpUnifiedFun,+ )+where++import Grisette.Internal.TH.Derivation.Common (DeriveConfig (evalModeConfig))+import Grisette.Internal.TH.Derivation.UnaryOpCommon+ ( UnaryOpFunConfig (genUnaryOpFun),+ )+import Grisette.Internal.Unified.Util (withMode)+import Language.Haskell.TH+ ( Exp (VarE),+ Kind,+ Name,+ Q,+ Type (AppT, ArrowT, StarT, VarT),+ appE,+ clause,+ funD,+ newName,+ normalB,+ varE,+ varP,+ )++-- | Default implementation for the derivation rules for a unified operation.+defaultUnaryOpUnifiedFun :: [Name] -> Type -> (Type, Kind) -> Q (Maybe Exp)+defaultUnaryOpUnifiedFun funNames modeTy (ty, kind) =+ case kind of+ StarT ->+ Just+ <$> [|+ $(varE $ head funNames) @($(return modeTy))+ @($(return ty))+ |]+ AppT (AppT ArrowT StarT) StarT ->+ Just+ <$> [|+ $(varE $ funNames !! 1) @($(return modeTy))+ @($(return ty))+ |]+ AppT (AppT (AppT ArrowT StarT) StarT) StarT ->+ Just+ <$> [|+ $(varE $ funNames !! 2) @($(return modeTy))+ @($(return ty))+ |]+ _ -> return Nothing++-- | Configuration for the derivation rules for a unified operation.+newtype UnaryOpUnifiedConfig = UnaryOpUnifiedConfig+ {unifiedFun :: Type -> (Type, Kind) -> Q (Maybe Exp)}++instance UnaryOpFunConfig UnaryOpUnifiedConfig where+ genUnaryOpFun+ deriveConfig+ (UnaryOpUnifiedConfig {..})+ funNames+ n+ extraVars+ keptTypes+ _+ isVarUsedInFields+ _ = do+ modeTy <- case evalModeConfig deriveConfig of+ [] -> return $ fst $ head extraVars+ [(i, _)] -> return $ fst $ keptTypes !! i+ _ -> fail "Unified classes does not support multiple evaluation modes"+ let isTypeUsedInFields (VarT nm) = isVarUsedInFields nm+ isTypeUsedInFields _ = False+ exprs <-+ traverse (unifiedFun modeTy) $+ filter (isTypeUsedInFields . fst) keptTypes+ rVar <- newName "r"+ let rf =+ foldl+ ( \exp nextFun -> case nextFun of+ Nothing -> exp+ Just fun -> appE (return fun) exp+ )+ (return $ VarE rVar)+ exprs+ let instanceFunName = funNames !! n+ funD+ instanceFunName+ [ clause+ [varP rVar]+ ( normalB+ [|+ withMode @($(return modeTy)) $(rf) $(rf)+ |]+ )+ []+ ]
− src/Grisette/Internal/TH/GADT/BinaryOpCommon.hs
@@ -1,377 +0,0 @@-{-# LANGUAGE ExplicitNamespaces #-}-{-# LANGUAGE LambdaCase #-}-{-# LANGUAGE RecordWildCards #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TupleSections #-}---- |--- Module : Grisette.Internal.TH.GADT.BinaryOpCommon--- Copyright : (c) Sirui Lu 2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.TH.GADT.BinaryOpCommon- ( BinaryOpClassConfig (..),- BinaryOpFieldConfig (..),- FieldFunExp,- defaultFieldFunExp,- genBinaryOpClause,- genBinaryOpClass,- )-where--import Control.Monad (replicateM, unless, when, zipWithM)-import Control.Monad.Identity (IdentityT)-import qualified Data.List as List-import qualified Data.Map as M-import Data.Maybe (catMaybes, mapMaybe)-import Data.Proxy (Proxy (Proxy))-import qualified Data.Set as S-import Grisette.Internal.TH.GADT.Common- ( CheckArgsResult- ( argVars,- constructors,- keptVars- ),- DeriveConfig,- checkArgs,- ctxForVar,- evalModeSpecializeList,- extraConstraint,- freshenCheckArgsResult,- isVarUsedInFields,- specializeResult,- )-import Language.Haskell.TH- ( Clause,- Dec (FunD, InstanceD),- Exp (VarE),- Kind,- Name,- Pat (VarP, WildP),- Q,- Type (AppT, ConT, VarT),- clause,- conP,- nameBase,- newName,- normalB,- recP,- sigP,- varE,- varP,- varT,- wildP,- )-import Language.Haskell.TH.Datatype- ( ConstructorInfo (constructorFields, constructorName, constructorVars),- TypeSubstitution (freeVariables),- resolveTypeSynonyms,- tvName,- )-import Type.Reflection- ( TypeRep,- eqTypeRep,- someTypeRep,- typeRep,- type (:~~:) (HRefl),- )---- | Type of field function expression generator.-type FieldFunExp = M.Map Name Name -> Type -> Q Exp---- | Default field function expression generator.-defaultFieldFunExp :: [Name] -> FieldFunExp-defaultFieldFunExp binaryOpFunNames argToFunPat = go- where- go ty = do- let allArgNames = M.keysSet argToFunPat- let typeHasNoArg ty =- S.fromList (freeVariables [ty])- `S.intersection` allArgNames- == S.empty- let fun0 = varE $ head binaryOpFunNames- fun1 b = [|$(varE $ binaryOpFunNames !! 1) $(go b)|]- fun2 b c = [|$(varE $ binaryOpFunNames !! 2) $(go b) $(go c)|]- fun3 b c d =- [|$(varE $ binaryOpFunNames !! 3) $(go b) $(go c) $(go d)|]- case ty of- AppT (AppT (AppT (VarT _) b) c) d -> fun3 b c d- AppT (AppT (VarT _) b) c -> fun2 b c- AppT (VarT _) b -> fun1 b- _ | typeHasNoArg ty -> fun0- AppT a b | typeHasNoArg a -> fun1 b- AppT (AppT a b) c | typeHasNoArg a -> fun2 b c- AppT (AppT (AppT a b) c) d | typeHasNoArg a -> fun3 b c d- VarT nm -> case M.lookup nm argToFunPat of- Just pname -> varE pname- _ -> fail $ "defaultFieldFunExp: unsupported type: " <> show ty- _ -> fail $ "defaultFieldFunExp: unsupported type: " <> show ty--funPatAndExps ::- FieldFunExp ->- [(Type, Kind)] ->- [Type] ->- Q ([Pat], [Exp])-funPatAndExps fieldFunExpGen argTypes fields = do- let usedArgs = S.fromList $ freeVariables fields- args <-- traverse- ( \(ty, _) ->- case ty of- VarT nm ->- if S.member nm usedArgs- then do- pname <- newName "p"- return (nm, Just pname)- else return ('undefined, Nothing)- _ -> return ('undefined, Nothing)- )- argTypes- let argToFunPat =- M.fromList $ mapMaybe (\(ty, mpat) -> fmap (ty,) mpat) args- let funPats = fmap (maybe WildP VarP . snd) args- defaultFieldFunExps <- traverse (fieldFunExpGen argToFunPat) fields- return (funPats, defaultFieldFunExps)---- | Configuration for a binary operation field generation on a GADT.-data BinaryOpFieldConfig = BinaryOpFieldConfig- { extraPatNames :: [String],- fieldResFun :: [Exp] -> (Exp, Exp) -> Exp -> Q (Exp, [Bool]),- fieldCombineFun :: Name -> [Exp] -> Q (Exp, [Bool]),- fieldDifferentExistentialFun :: Exp -> Q Exp,- fieldLMatchResult :: Q Exp,- fieldRMatchResult :: Q Exp,- fieldFunExp :: FieldFunExp,- fieldFunNames :: [Name]- }---- | Generate a clause for a binary operation on a GADT.-genBinaryOpClause ::- BinaryOpFieldConfig ->- [(Type, Kind)] ->- [(Type, Kind)] ->- Bool ->- ConstructorInfo ->- ConstructorInfo ->- Q [Clause]-genBinaryOpClause- (BinaryOpFieldConfig {..})- lhsArgNewVars- _rhsArgNewVars- isLast- lhsConstructors- rhsConstructors =- do- lhsFields <- mapM resolveTypeSynonyms $ constructorFields lhsConstructors- rhsFields <- mapM resolveTypeSynonyms $ constructorFields rhsConstructors- (funPats, defaultFieldFunExps) <-- funPatAndExps fieldFunExp lhsArgNewVars lhsFields- unless (null extraPatNames) $- unless isLast $- fail "Should not happen"- extraPatNames <- traverse newName extraPatNames- let extraPats = fmap VarP extraPatNames- let extraPatExps = fmap VarE extraPatNames- lhsFieldsPatNames <- replicateM (length lhsFields) $ newName "lhsField"- rhsFieldsPatNames <- replicateM (length rhsFields) $ newName "rhsField"- let lhsFieldPats =- conP- (constructorName lhsConstructors)- ( zipWith- (\nm field -> sigP (varP nm) (return field))- lhsFieldsPatNames- lhsFields- )- let rhsFieldPats =- conP- (constructorName rhsConstructors)- ( zipWith- (\nm field -> sigP (varP nm) (return field))- rhsFieldsPatNames- rhsFields- )- let singleMatchPat =- if null lhsFields- then conP (constructorName lhsConstructors) []- else recP (constructorName rhsConstructors) []- let lhsFieldPatExps = fmap VarE lhsFieldsPatNames- let rhsFieldPatExps = fmap VarE rhsFieldsPatNames-- fieldResExpsAndArgsUsed <-- zipWithM- (fieldResFun extraPatExps)- (zip lhsFieldPatExps rhsFieldPatExps)- defaultFieldFunExps- let fieldResExps = fst <$> fieldResExpsAndArgsUsed- let extraArgsUsedByFields = snd <$> fieldResExpsAndArgsUsed- (resExp, extraArgsUsedByResult) <-- fieldCombineFun- (constructorName lhsConstructors)- fieldResExps-- let eqt l r =- [|- eqTypeRep- (typeRep :: TypeRep $(varT $ tvName l))- (typeRep :: TypeRep $(varT $ tvName r))- |]- let eqx trueCont l r = do- cmp <-- [|- compare- (someTypeRep (Proxy :: Proxy $(varT $ tvName l)))- (someTypeRep (Proxy :: Proxy $(varT $ tvName r)))- |]- [|- case $(eqt l r) of- Just HRefl -> $(trueCont)- _ ->- $(fieldDifferentExistentialFun cmp)- |]- let construct [] = return resExp- construct ((l, r) : xs) = [|$(eqx (construct xs) l r)|]-- let extraArgsUsed =- fmap or $- List.transpose $- extraArgsUsedByResult : extraArgsUsedByFields- let extraArgsPats =- zipWith- (\pat used -> if used then pat else WildP)- extraPats- extraArgsUsed- bothMatched <-- clause- ((return <$> funPats ++ extraArgsPats) ++ [lhsFieldPats, rhsFieldPats])- ( normalB- [|- $( construct $- zip- (constructorVars lhsConstructors)- (constructorVars rhsConstructors)- )- |]- )- []- lhsMatched <-- clause- ((wildP <$ funPats) ++ [singleMatchPat, wildP])- (normalB [|$(fieldLMatchResult)|])- []- rhsMatched <-- clause- ((wildP <$ funPats) ++ [wildP, singleMatchPat])- (normalB [|$(fieldRMatchResult)|])- []- if isLast- then return [bothMatched]- else return [bothMatched, lhsMatched, rhsMatched]---- | Configuration for a binary operation type class generation on a GADT.-data BinaryOpClassConfig = BinaryOpClassConfig- { binaryOpFieldConfigs :: [BinaryOpFieldConfig],- binaryOpInstanceNames :: [Name],- binaryOpAllowSumType :: Bool,- binaryOpAllowExistential :: Bool- }---- | Generate a function for a binary operation on a GADT.-genBinaryOpFun ::- BinaryOpFieldConfig ->- Int ->- [(Type, Kind)] ->- [(Type, Kind)] ->- [ConstructorInfo] ->- [ConstructorInfo] ->- Q Dec-genBinaryOpFun- config- n- lhsArgNewVars- rhsArgNewVars- lhsConstructors- rhsConstructors = do- clauses <-- zipWithM- (genBinaryOpClause config lhsArgNewVars rhsArgNewVars False)- (init lhsConstructors)- (init rhsConstructors)- lastClause <-- genBinaryOpClause- config- lhsArgNewVars- rhsArgNewVars- True- (last lhsConstructors)- (last rhsConstructors)- let instanceFunName = (fieldFunNames config) !! n- return $ FunD instanceFunName (concat clauses ++ lastClause)---- | Generate a type class instance for a binary operation on a GADT.-genBinaryOpClass ::- DeriveConfig -> BinaryOpClassConfig -> Int -> Name -> Q [Dec]-genBinaryOpClass deriveConfig (BinaryOpClassConfig {..}) n typName = do- lhsResult <-- specializeResult (evalModeSpecializeList deriveConfig)- =<< freshenCheckArgsResult True- =<< checkArgs- (nameBase $ head binaryOpInstanceNames)- (length binaryOpInstanceNames - 1)- typName- (n == 0 && binaryOpAllowExistential)- n- when (not binaryOpAllowSumType && length (constructors lhsResult) > 1) $- fail $- "Cannot derive "- <> nameBase (binaryOpInstanceNames !! n)- <> " for sum type"- rhsResult <-- specializeResult (evalModeSpecializeList deriveConfig)- =<< checkArgs- (nameBase $ head binaryOpInstanceNames)- (length binaryOpInstanceNames - 1)- typName- (n == 0)- n- let keptVars' = keptVars lhsResult- when (typName == ''IdentityT) $- fail $- show keptVars'- let isTypeUsedInFields' (VarT nm) = isVarUsedInFields lhsResult nm- isTypeUsedInFields' _ = False- ctxs <-- traverse (uncurry $ ctxForVar (fmap ConT binaryOpInstanceNames)) $- filter (isTypeUsedInFields' . fst) keptVars'- let keptType = foldl AppT (ConT typName) $ fmap fst keptVars'- instanceFuns <-- traverse- ( \config ->- genBinaryOpFun- config- n- (argVars lhsResult)- (argVars rhsResult)- (constructors lhsResult)- (constructors rhsResult)- )- binaryOpFieldConfigs- let instanceName = binaryOpInstanceNames !! n- let instanceType = AppT (ConT instanceName) keptType- extraPreds <-- extraConstraint- deriveConfig- typName- instanceName- []- keptVars'- (constructors lhsResult)- return- [ InstanceD- Nothing- (extraPreds ++ catMaybes ctxs)- instanceType- instanceFuns- ]
− src/Grisette/Internal/TH/GADT/Common.hs
@@ -1,452 +0,0 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE LambdaCase #-}-{-# LANGUAGE RecordWildCards #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeOperators #-}---- |--- Module : Grisette.Internal.TH.GADT.Common--- Copyright : (c) Sirui Lu 2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.TH.GADT.Common- ( CheckArgsResult (..),- checkArgs,- ctxForVar,- EvalModeConfig (..),- DeriveConfig (..),- extraEvalModeConstraint,- extraBitSizeConstraint,- extraFpBitSizeConstraint,- extraExtraMergeableConstraint,- extraConstraint,- specializeResult,- evalModeSpecializeList,- isVarUsedInFields,- freshenCheckArgsResult,- )-where--import Control.Monad (foldM, unless, when)-import Data.Bifunctor (first)-import qualified Data.Map as M-import Data.Maybe (catMaybes, mapMaybe)-import qualified Data.Set as S-import GHC.TypeLits (KnownNat, Nat, type (<=))-import Grisette.Internal.Internal.Decl.Core.Data.Class.Mergeable- ( Mergeable,- Mergeable1,- Mergeable2,- )-import Grisette.Internal.SymPrim.FP (ValidFP)-import Grisette.Internal.Unified.EvalModeTag (EvalModeTag (C, S))-import Grisette.Internal.Unified.Util (DecideEvalMode)-import Language.Haskell.TH- ( Kind,- Name,- Pred,- Q,- Type (AppT, ArrowT, ConT, PromotedT, StarT, VarT),- conT,- nameBase,- newName,- )-import Language.Haskell.TH.Datatype- ( ConstructorInfo (constructorFields, constructorName, constructorVars),- DatatypeInfo (datatypeCons, datatypeVars),- TypeSubstitution (applySubstitution, freeVariables),- reifyDatatype,- tvName,- )-import Language.Haskell.TH.Datatype.TyVarBndr (mapTVName, tvKind)---- | Result of 'checkArgs' for a GADT.-data CheckArgsResult = CheckArgsResult- { constructors :: [ConstructorInfo],- keptVars :: [(Type, Kind)],- argVars :: [(Type, Kind)]- }---- | Specialize the evaluation mode tags for the t'CheckArgsResult'.-specializeResult :: [(Int, EvalModeTag)] -> CheckArgsResult -> Q CheckArgsResult-specializeResult evalModeConfigs result = do- let modeToName C = 'C- modeToName S = 'S- map <-- foldM- ( \lst (n, tag) -> do- let (_, knd) = lst !! n- return $- take n lst- ++ [(PromotedT $ modeToName tag, knd)]- ++ drop (n + 1) lst- )- (keptVars result)- evalModeConfigs- return $ result {keptVars = map}--freshenConstructorInfo :: ConstructorInfo -> Q ConstructorInfo-freshenConstructorInfo conInfo = do- let vars = constructorVars conInfo- newNames <- traverse (newName . nameBase . tvName) vars- let newVars = zipWith (mapTVName . const) newNames vars- let substMap = M.fromList $ zip (tvName <$> vars) $ VarT <$> newNames- return $ applySubstitution substMap conInfo {constructorVars = newVars}---- | Freshen the type variables in the t'CheckArgsResult'.-freshenCheckArgsResult :: Bool -> CheckArgsResult -> Q CheckArgsResult-freshenCheckArgsResult freshenNats result = do- let genNewName :: (Type, Kind) -> Q (Maybe Name)- genNewName (VarT _, knd) =- if not freshenNats && knd == ConT ''Nat- then return Nothing- else Just <$> newName "a"- genNewName _ = return Nothing- keptNewNames <- traverse genNewName (keptVars result)- argNewNames <- traverse genNewName (argVars result)-- let substMap =- M.fromList- $ mapMaybe- ( \(newName, oldVar) ->- case (newName, oldVar) of- (Just newName, (VarT oldName, _)) ->- Just (oldName, VarT newName)- _ -> Nothing- )- $ zip- (keptNewNames ++ argNewNames)- (keptVars result ++ argVars result)- constructors <-- mapM freshenConstructorInfo $- applySubstitution substMap $- constructors result- let newKeptVars = first (applySubstitution substMap) <$> (keptVars result)- let newArgVars = first (applySubstitution substMap) <$> (argVars result)- return $- result- { constructors = constructors,- keptVars = newKeptVars,- argVars = newArgVars- }---- | Check if the number of type parameters is valid for a GADT, and return--- new names for the type variables, split into kept and arg parts.-checkArgs ::- String ->- Int ->- Name ->- Bool ->- Int ->- Q CheckArgsResult-checkArgs clsName maxArgNum typName allowExistential n = do- when (n < 0) $- fail $- unlines- [ "Cannot derive "- ++ clsName- ++ " instance with negative type parameters",- "\tRequested: " ++ show n,- "\tHint: Use a non-negative number of type parameters"- ]- when (n > maxArgNum) $- fail $- unlines- [ "Cannot derive "- <> clsName- <> " instance with more than "- <> show maxArgNum- <> " type parameters",- "\tRequested: " <> show n- ]- d <- reifyDatatype typName- let dvars = datatypeVars d- when (length dvars < n) $- fail $- unlines- [ "Cannot derive "- <> clsName- <> show n- <> " instance for the type "- <> show typName,- "\tReason: The type "- <> show typName- <> " has only "- <> show (length dvars)- <> " type variables."- ]- let keptVars =- (\bndr -> (VarT $ tvName bndr, tvKind bndr))- <$> take (length dvars - n) dvars- let argVars =- (\bndr -> (VarT $ tvName bndr, tvKind bndr))- <$> drop (length dvars - n) dvars- let constructors = datatypeCons d- unless allowExistential $- mapM_- ( \c ->- when (constructorVars c /= []) $- fail $- unlines- [ "Cannot derive "- <> clsName- <> show n- <> " instance for the type "- <> show typName,- "\tReason: The constructor "- <> nameBase (constructorName c)- <> " has existential variables"- ]- )- constructors- mapM_- ( \c -> do- let fields = constructorFields c- let existentialVars = tvName <$> constructorVars c- let fieldReferencedVars = freeVariables fields- let notReferencedVars =- S.fromList existentialVars S.\\ S.fromList fieldReferencedVars- unless (null notReferencedVars) $- fail $- unlines- [ "Cannot derive "- <> clsName- <> show n- <> " instance for the type "- <> show typName,- "Reason: Ambiguous existential variable in the constructor: "- <> nameBase (constructorName c)- <> ", this is not supported. Please consider binding the "- <> "existential variable to a field. You can use Proxy type to "- <> "do this."- ]- )- constructors- return $ CheckArgsResult {..}--isVarUsedInConstructorFields :: [ConstructorInfo] -> Name -> Bool-isVarUsedInConstructorFields constructors var =- let allFields = concatMap constructorFields constructors- allFieldsFreeVars = S.fromList $ freeVariables allFields- in S.member var allFieldsFreeVars---- | Check if a variable is used in the fields of a constructor.-isVarUsedInFields :: CheckArgsResult -> Name -> Bool-isVarUsedInFields CheckArgsResult {..} =- isVarUsedInConstructorFields constructors---- | Generate a context for a variable in a GADT.-ctxForVar :: [Type] -> Type -> Kind -> Q (Maybe Pred)-ctxForVar instanceExps ty knd = case knd of- StarT ->- Just- <$> [t|$(return $ head instanceExps) $(return ty)|]- AppT (AppT ArrowT StarT) StarT ->- Just- <$> [t|$(return $ instanceExps !! 1) $(return ty)|]- AppT (AppT (AppT ArrowT StarT) StarT) StarT ->- Just- <$> [t|$(return $ instanceExps !! 2) $(return ty)|]- AppT (AppT (AppT (AppT ArrowT StarT) StarT) StarT) StarT ->- Just- <$> [t|$(return $ instanceExps !! 3) $(return ty)|]- AppT (AppT (AppT (AppT ArrowT StarT) StarT) StarT) _ ->- fail $ "Unsupported kind: " <> show knd- _ -> return Nothing---- | Configuration for constraints for evaluation modes tag.------ * 'EvalModeConstraints' specifies a list of constraints for the tag, for--- example, we may use 'Grisette.Unified.EvalModeBase' and--- 'Grisette.Unified.EvalModeBV' to specify that the evaluation mode must--- support both base (boolean and data types) and bit vectors. This should be--- used when the data type uses bit vectors.------ * 'EvalModeSpecified' specifies a that an evaluation mode tag should be--- specialized to a specific tag for all the instances.-data EvalModeConfig- = EvalModeConstraints [Name]- | EvalModeSpecified EvalModeTag---- | Configuration for deriving instances for a GADT.-data DeriveConfig = DeriveConfig- { evalModeConfig :: [(Int, EvalModeConfig)],- bitSizePositions :: [Int],- fpBitSizePositions :: [(Int, Int)],- needExtraMergeableUnderEvalMode :: Bool,- needExtraMergeableWithConcretizedEvalMode :: Bool- }---- | Get all the evaluation modes to specialize in the t'DeriveConfig'.-evalModeSpecializeList :: DeriveConfig -> [(Int, EvalModeTag)]-evalModeSpecializeList DeriveConfig {..} =- mapMaybe- ( \(n, cfg) ->- case cfg of- EvalModeConstraints _ -> Nothing- EvalModeSpecified tag -> Just (n, tag)- )- evalModeConfig--instance Semigroup DeriveConfig where- (<>) = (<>)--instance Monoid DeriveConfig where- mempty = DeriveConfig [] [] [] False False- mappend = (<>)---- | Generate extra constraints for evaluation modes.-extraEvalModeConstraint ::- Name -> Name -> [(Type, Kind)] -> (Int, EvalModeConfig) -> Q [Pred]-extraEvalModeConstraint- tyName- instanceName- args- (n, EvalModeConstraints names)- | n >= length args = return []- | otherwise = do- let (arg, argKind) = args !! n- when (argKind /= ConT ''EvalModeTag) $- fail $- "Cannot introduce EvalMode constraint for the "- <> show n- <> "th argument of "- <> show tyName- <> " when deriving the "- <> show instanceName- <> " instance because it is not an EvalModeTag."- traverse (\nm -> [t|$(conT nm) $(return arg)|]) names-extraEvalModeConstraint _ _ _ (_, EvalModeSpecified _) = return []---- | Generate extra constraints for bit vectors.-extraBitSizeConstraint :: Name -> Name -> [(Type, Kind)] -> Int -> Q [Pred]-extraBitSizeConstraint tyName instanceName args n- | n >= length args = return []- | otherwise = do- let (arg, argKind) = args !! n- when (argKind /= ConT ''Nat) $- fail $- "Cannot introduce BitSize constraint for the "- <> show n- <> "th argument of "- <> show tyName- <> " when deriving the "- <> show instanceName- <> " instance because it is not a Nat."- predKnown <- [t|KnownNat $(return arg)|]- predPositive <- [t|1 <= $(return arg)|]- return [predKnown, predPositive]---- | Generate extra constraints for floating point exponents and significands.-extraFpBitSizeConstraint ::- Name -> Name -> [(Type, Kind)] -> (Int, Int) -> Q [Pred]-extraFpBitSizeConstraint tyName instanceName args (eb, sb)- | eb >= length args || sb >= length args = return []- | otherwise = do- let (argEb, argEbKind) = args !! eb- let (argSb, argSbKind) = args !! sb- when (argEbKind /= ConT ''Nat || argSbKind /= ConT ''Nat) $- fail $- "Cannot introduce ValidFP constraint for the "- <> show eb- <> "th and "- <> show sb- <> "th arguments of "- <> show tyName- <> " when deriving the "- <> show instanceName- <> " instance because they are not Nats."- pred <- [t|ValidFP $(return argEb) $(return argSb)|]- return [pred]---- | Generate extra constraints for 'Mergeable' instances.-extraExtraMergeableConstraint :: [ConstructorInfo] -> [(Type, Kind)] -> Q [Pred]-extraExtraMergeableConstraint constructors args = do- let isTypeUsedInFields' (VarT nm) =- isVarUsedInConstructorFields constructors nm- isTypeUsedInFields' _ = False- catMaybes- <$> traverse- ( \(arg, knd) ->- if isTypeUsedInFields' arg- then- ctxForVar- [ ConT ''Mergeable,- ConT ''Mergeable1,- ConT ''Mergeable2- ]- arg- knd- else return Nothing- )- args---- | Generate extra constraints for a GADT.-extraConstraint ::- DeriveConfig ->- Name ->- Name ->- [(Type, Kind)] ->- [(Type, Kind)] ->- [ConstructorInfo] ->- Q [Pred]-extraConstraint- DeriveConfig {..}- tyName- instanceName- extraArgs- keptArgs- constructors = do- -- checkAllValidExtraConstraintPosition- -- deriveConfig- -- tyName- -- instanceName- -- keptArgs- evalModePreds <-- traverse- (extraEvalModeConstraint tyName instanceName keptArgs)- evalModeConfig- extraArgEvalModePreds <-- if null evalModeConfig- then- traverse- ( \(arg, kind) ->- if kind == ConT ''EvalModeTag- then (: []) <$> [t|DecideEvalMode $(return arg)|]- else return []- )- extraArgs- else return []- bitSizePreds <-- traverse- (extraBitSizeConstraint tyName instanceName keptArgs)- bitSizePositions- fpBitSizePreds <-- traverse- (extraFpBitSizeConstraint tyName instanceName keptArgs)- fpBitSizePositions- extraMergeablePreds <-- if needExtraMergeableUnderEvalMode- && ( any- ( \case- (_, EvalModeConstraints _) -> True- (_, EvalModeSpecified _) -> False- )- evalModeConfig- || needExtraMergeableWithConcretizedEvalMode- )- then extraExtraMergeableConstraint constructors keptArgs- else return []- return $- extraMergeablePreds- ++ concat- ( extraArgEvalModePreds- ++ evalModePreds- ++ bitSizePreds- ++ fpBitSizePreds- )
− src/Grisette/Internal/TH/GADT/ConvertOpCommon.hs
@@ -1,469 +0,0 @@-{-# LANGUAGE LambdaCase #-}-{-# LANGUAGE RecordWildCards #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TupleSections #-}-{-# LANGUAGE TypeApplications #-}---- |--- Module : Grisette.Internal.TH.GADT.ConvertOpCommon--- Copyright : (c) Sirui Lu 2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.TH.GADT.ConvertOpCommon- ( genConvertOpClass,- ConvertOpClassConfig (..),- defaultFieldFunExp,- )-where--import Control.Monad (foldM, replicateM, zipWithM)-import qualified Data.Map as M-import Data.Maybe (catMaybes, mapMaybe)-import qualified Data.Set as S-import Grisette.Internal.Core.Data.Class.PlainUnion (unionToCon)-import Grisette.Internal.Internal.Decl.Core.Control.Monad.Union (Union)-import Grisette.Internal.Internal.Decl.Core.Data.Class.TryMerge (toUnionSym)-import Grisette.Internal.TH.GADT.Common- ( CheckArgsResult (argVars, constructors, keptVars),- DeriveConfig- ( DeriveConfig,- bitSizePositions,- evalModeConfig,- fpBitSizePositions,- needExtraMergeableUnderEvalMode,- needExtraMergeableWithConcretizedEvalMode- ),- EvalModeConfig (EvalModeConstraints, EvalModeSpecified),- checkArgs,- extraBitSizeConstraint,- extraEvalModeConstraint,- extraExtraMergeableConstraint,- extraFpBitSizeConstraint,- freshenCheckArgsResult,- isVarUsedInFields,- )-import Grisette.Internal.TH.Util (allUsedNames)-import Grisette.Internal.Unified.EvalModeTag (EvalModeTag (C, S))-import Grisette.Internal.Unified.Util- ( EvalModeConvertible (withModeConvertible'),- )-import Language.Haskell.TH- ( Body (NormalB),- Clause (Clause),- Dec (FunD, InstanceD),- Exp (VarE),- Kind,- Name,- Overlap (Incoherent),- Pat (VarP, WildP),- Pred,- Q,- Type (AppT, ArrowT, ConT, StarT, VarT),- clause,- conP,- funD,- nameBase,- newName,- normalB,- varE,- varP,- )-import Language.Haskell.TH.Datatype- ( ConstructorInfo (constructorFields, constructorName),- TypeSubstitution (freeVariables),- resolveTypeSynonyms,- )--type FieldFunExp = M.Map Name Name -> Type -> Q Exp---- | Default field transformation function.-defaultFieldFunExp :: [Name] -> FieldFunExp-defaultFieldFunExp binaryOpFunNames argToFunPat = go- where- go ty = do- let allArgNames = M.keysSet argToFunPat- let typeHasNoArg ty =- S.fromList (freeVariables [ty])- `S.intersection` allArgNames- == S.empty- let fun0 = varE $ head binaryOpFunNames- fun1 b = [|$(varE $ binaryOpFunNames !! 1) $(go b)|]- fun2 b c = [|$(varE $ binaryOpFunNames !! 2) $(go b) $(go c)|]- fun3 b c d =- [|$(varE $ binaryOpFunNames !! 3) $(go b) $(go c) $(go d)|]- case ty of- AppT (AppT (AppT (VarT _) b) c) d -> fun3 b c d- AppT (AppT (VarT _) b) c -> fun2 b c- AppT (VarT _) b -> fun1 b- _ | typeHasNoArg ty -> fun0- AppT a b | typeHasNoArg a -> fun1 b- AppT (AppT a b) c | typeHasNoArg a -> fun2 b c- AppT (AppT (AppT a b) c) d | typeHasNoArg a -> fun3 b c d- VarT nm -> case M.lookup nm argToFunPat of- Just pname -> varE pname- _ -> fail $ "defaultFieldFunExp: unsupported type: " <> show ty- _ -> fail $ "defaultFieldFunExp: unsupported type: " <> show ty--funPatAndExps ::- FieldFunExp ->- [(Type, Kind)] ->- [Type] ->- Q ([Pat], [Exp])-funPatAndExps fieldFunExpGen argTypes fields = do- let usedArgs = S.fromList $ freeVariables fields- args <-- traverse- ( \(ty, _) ->- case ty of- VarT nm ->- if S.member nm usedArgs- then do- pname <- newName "p"- return (nm, Just pname)- else return ('undefined, Nothing)- _ -> return ('undefined, Nothing)- )- argTypes- let argToFunPat =- M.fromList $ mapMaybe (\(ty, mpat) -> fmap (ty,) mpat) args- let funPats = fmap (maybe WildP VarP . snd) args- defaultFieldFunExps <- traverse (fieldFunExpGen argToFunPat) fields- return (funPats, defaultFieldFunExps)--tagPair ::- DeriveConfig ->- EvalModeTag ->- [(Type, Kind)] ->- [(Type, Kind)] ->- [(Type, Type)]-tagPair deriveConfig convertOpTarget lhsKeptVars rhsKeptVars =- let conKeptVars =- if convertOpTarget == S then lhsKeptVars else rhsKeptVars- symKeptVars =- if convertOpTarget == S then rhsKeptVars else lhsKeptVars- in mapMaybe- ( \case- (n, EvalModeConstraints _)- | n < length conKeptVars && n >= 0 ->- Just (fst $ conKeptVars !! n, fst $ symKeptVars !! n)- _ -> Nothing- )- (evalModeConfig deriveConfig)--caseSplitTagPairs ::- DeriveConfig ->- EvalModeTag ->- [(Type, Kind)] ->- [(Type, Kind)] ->- Exp ->- Q Exp-caseSplitTagPairs deriveConfig convertOpTarget lhsKeptVars rhsKeptVars exp = do- let tags = tagPair deriveConfig convertOpTarget lhsKeptVars rhsKeptVars- foldM- ( \exp (lty, rty) ->- [|- withModeConvertible'- @($(return lty))- @($(return rty))- $(return exp)- $(return exp)- $(return exp)- |]- )- exp- tags--genConvertOpFieldClause ::- DeriveConfig ->- ConvertOpClassConfig ->- [(Type, Kind)] ->- [(Type, Kind)] ->- [(Type, Kind)] ->- [(Type, Kind)] ->- ConstructorInfo ->- Q Clause-genConvertOpFieldClause- deriveConfig@DeriveConfig {..}- ConvertOpClassConfig {..}- lhsKeptTypes- rhsKeptTypes- lhsArgTypes- _rhsArgTypes- lhsConInfo = do- fields <- mapM resolveTypeSynonyms $ constructorFields lhsConInfo- (funPats, defaultFieldFunExps) <- funPatAndExps convertFieldFunExp lhsArgTypes fields- fieldsPatNames <- replicateM (length fields) $ newName "field"- fieldPats <- conP (constructorName lhsConInfo) (fmap varP fieldsPatNames)- let fieldPatExps = fmap VarE fieldsPatNames- fieldResExps <- zipWithM convertFieldResFun fieldPatExps defaultFieldFunExps- resExp <- convertFieldCombineFun (constructorName lhsConInfo) fieldResExps- let resUsedNames = allUsedNames resExp- let transformPat (VarP nm) =- if S.member nm resUsedNames then VarP nm else WildP- transformPat p = p- resExpWithTags <-- caseSplitTagPairs- deriveConfig- convertOpTarget- lhsKeptTypes- rhsKeptTypes- resExp- -- let conKeptVars =- -- if convertOpTarget == S then lhsKeptTypes else rhsKeptTypes- -- let symKeptVars =- -- if convertOpTarget == S then rhsKeptTypes else lhsKeptTypes- -- let tags =- -- mapMaybe- -- ( \case- -- (n, EvalModeConstraints _)- -- | n < length conKeptVars && n >= 0 ->- -- Just (fst $ conKeptVars !! n, fst $ symKeptVars !! n)- -- _ -> Nothing- -- )- -- evalModeConfig- -- resExpWithTags <-- -- foldM- -- ( \exp (lty, rty) ->- -- [|- -- withModeConvertible'- -- @($(return lty))- -- @($(return rty))- -- $(return exp)- -- $(return exp)- -- $(return exp)- -- |]- -- )- -- resExp- -- tags- return $- Clause- (fmap transformPat $ funPats ++ [fieldPats])- (NormalB resExpWithTags)- []--genConvertOpFun ::- DeriveConfig ->- ConvertOpClassConfig ->- Int ->- [(Type, Kind)] ->- [(Type, Kind)] ->- [(Type, Kind)] ->- [(Type, Kind)] ->- [ConstructorInfo] ->- Q Dec-genConvertOpFun- deriveConfig- convertOpClassConfig- n- lhsKeptTypes- rhsKeptTypes- lhsArgTypes- rhsArgTypes- lhsConstructors = do- clauses <-- traverse- ( genConvertOpFieldClause- deriveConfig- convertOpClassConfig- lhsKeptTypes- rhsKeptTypes- lhsArgTypes- rhsArgTypes- )- lhsConstructors- let instanceFunName = (convertOpFunNames convertOpClassConfig) !! n- return $ FunD instanceFunName clauses---- | Configuration for a convert operation class.-data ConvertOpClassConfig = ConvertOpClassConfig- { convertOpTarget :: EvalModeTag,- convertOpInstanceNames :: [Name],- convertOpFunNames :: [Name],- convertFieldResFun :: Exp -> Exp -> Q Exp,- convertFieldCombineFun :: Name -> [Exp] -> Q Exp,- convertFieldFunExp :: FieldFunExp- }--convertCtxForVar :: [Type] -> Type -> Type -> Kind -> Q (Maybe Pred)-convertCtxForVar instanceExps lty rty knd = case knd of- StarT ->- Just- <$> [t|$(return $ head instanceExps) $(return lty) $(return rty)|]- AppT (AppT ArrowT StarT) StarT ->- Just- <$> [t|$(return $ instanceExps !! 1) $(return lty) $(return rty)|]- AppT (AppT (AppT ArrowT StarT) StarT) StarT ->- Just- <$> [t|$(return $ instanceExps !! 2) $(return lty) $(return rty)|]- AppT (AppT (AppT StarT StarT) StarT) _ ->- fail $ "Unsupported kind: " <> show knd- _ -> return Nothing---- | Generate extra constraints for a GADT.-extraConstraintConvert ::- DeriveConfig ->- EvalModeTag ->- Name ->- Name ->- [(Type, Kind)] ->- [(Type, Kind)] ->- [ConstructorInfo] ->- Q [Pred]-extraConstraintConvert- DeriveConfig {..}- convertOpTarget- tyName- instanceName- lhsKeptArgs- rhsKeptArgs- rhsConstructors = do- let conKeptVars = if convertOpTarget == S then lhsKeptArgs else rhsKeptArgs- let symKeptVars = if convertOpTarget == S then rhsKeptArgs else lhsKeptArgs-- rhsEvalModePreds <-- if convertOpTarget == S && needExtraMergeableWithConcretizedEvalMode- then- traverse- (extraEvalModeConstraint tyName instanceName rhsKeptArgs)- evalModeConfig- else return []- extraArgEvalModePreds <-- traverse- ( \case- (n, EvalModeConstraints _)- | n < length lhsKeptArgs && n >= 0 ->- (: [])- <$> [t|- EvalModeConvertible- $(return $ fst $ conKeptVars !! n)- $(return $ fst $ symKeptVars !! n)- |]- _ -> return []- )- evalModeConfig- bitSizePreds <-- traverse- (extraBitSizeConstraint tyName instanceName lhsKeptArgs)- bitSizePositions- fpBitSizePreds <-- traverse- (extraFpBitSizeConstraint tyName instanceName lhsKeptArgs)- fpBitSizePositions- extraMergeablePreds <-- if convertOpTarget == S- && ( any- ( \case- (_, EvalModeConstraints _) -> True- (_, EvalModeSpecified _) -> False- )- evalModeConfig- || needExtraMergeableWithConcretizedEvalMode- )- then extraExtraMergeableConstraint rhsConstructors rhsKeptArgs- else return []- return $- concat- ( rhsEvalModePreds- ++ extraArgEvalModePreds- ++ bitSizePreds- ++ fpBitSizePreds- ++ [extraMergeablePreds]- )---- | Generate a convert operation class instance.-genConvertOpClass ::- DeriveConfig -> ConvertOpClassConfig -> Int -> Name -> Q [Dec]-genConvertOpClass deriveConfig (ConvertOpClassConfig {..}) n typName = do- oldLhsResult <-- freshenCheckArgsResult True- =<< checkArgs- (nameBase $ head convertOpInstanceNames)- (length convertOpInstanceNames - 1)- typName- False- n- oldRhsResult <- freshenCheckArgsResult False oldLhsResult- let lResult = oldLhsResult- let rResult = oldRhsResult- let instanceName = convertOpInstanceNames !! n- let lKeptVars = keptVars lResult- let rKeptVars = keptVars rResult- let lConstructors = constructors lResult- let rConstructors = constructors rResult- let lKeptType = foldl AppT (ConT typName) $ fmap fst lKeptVars- let rKeptType = foldl AppT (ConT typName) $ fmap fst rKeptVars- extraPreds <-- extraConstraintConvert- deriveConfig- convertOpTarget- typName- instanceName- lKeptVars- rKeptVars- rConstructors- unionExtraPreds <-- extraConstraintConvert- deriveConfig {needExtraMergeableWithConcretizedEvalMode = True}- convertOpTarget- typName- instanceName- lKeptVars- rKeptVars- rConstructors-- let instanceType = AppT (AppT (ConT instanceName) lKeptType) rKeptType- let isTypeUsedInFields (VarT nm) = isVarUsedInFields lResult nm- isTypeUsedInFields _ = False- ctxs <-- traverse- ( \((lty, knd), (rty, _)) ->- convertCtxForVar (ConT <$> convertOpInstanceNames) lty rty knd- )- $ filter (isTypeUsedInFields . fst . fst)- $ zip lKeptVars rKeptVars-- instanceFun <-- genConvertOpFun- deriveConfig- (ConvertOpClassConfig {..})- n- (keptVars lResult)- (keptVars rResult)- (argVars lResult)- (argVars rResult)- lConstructors-- let instanceUnionType =- case convertOpTarget of- S ->- AppT- (AppT (ConT instanceName) lKeptType)- (AppT (ConT ''Union) rKeptType)- C ->- AppT- (AppT (ConT instanceName) (AppT (ConT ''Union) lKeptType))- rKeptType- instanceUnionFun <- do- resExp <-- if convertOpTarget == S- then varE 'toUnionSym- else varE 'unionToCon- funD (head convertOpFunNames) [clause [] (normalB $ return resExp) []]-- return $- InstanceD- (Just Incoherent)- (extraPreds ++ catMaybes ctxs)- instanceType- [instanceFun]- : ( [ InstanceD- (Just Incoherent)- (unionExtraPreds ++ catMaybes ctxs)- instanceUnionType- [instanceUnionFun]- | n == 0- ]- )
− src/Grisette/Internal/TH/GADT/DeriveAllSyms.hs
@@ -1,88 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}-{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}--{-# HLINT ignore "Unused LANGUAGE pragma" #-}---- |--- Module : Grisette.Internal.TH.GADT.DeriveAllSyms--- Copyright : (c) Sirui Lu 2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.TH.GADT.DeriveAllSyms- ( deriveGADTAllSyms,- deriveGADTAllSyms1,- deriveGADTAllSyms2,- )-where--import Grisette.Internal.Internal.Decl.SymPrim.AllSyms- ( AllSyms (allSymsS),- AllSyms1 (liftAllSymsS),- AllSyms2 (liftAllSymsS2),- )-import Grisette.Internal.TH.GADT.Common (DeriveConfig)-import Grisette.Internal.TH.GADT.UnaryOpCommon- ( UnaryOpClassConfig- ( UnaryOpClassConfig,- unaryOpAllowExistential,- unaryOpConfigs,- unaryOpExtraVars,- unaryOpInstanceNames,- unaryOpInstanceTypeFromConfig- ),- UnaryOpConfig (UnaryOpConfig),- UnaryOpFieldConfig- ( UnaryOpFieldConfig,- extraLiftedPatNames,- extraPatNames,- fieldCombineFun,- fieldFunExp,- fieldResFun- ),- defaultFieldFunExp,- defaultFieldResFun,- defaultUnaryOpInstanceTypeFromConfig,- genUnaryOpClass,- )-import Language.Haskell.TH (Dec, Exp (AppE, ListE, VarE), Name, Q)--allSymsConfig :: UnaryOpClassConfig-allSymsConfig =- UnaryOpClassConfig- { unaryOpConfigs =- [ UnaryOpConfig- UnaryOpFieldConfig- { extraPatNames = [],- extraLiftedPatNames = const [],- fieldResFun = defaultFieldResFun,- fieldCombineFun = \_ _ _ _ exp ->- return (AppE (VarE 'mconcat) $ ListE exp, False <$ exp),- fieldFunExp =- defaultFieldFunExp- [ 'allSymsS,- 'liftAllSymsS,- 'liftAllSymsS2- ]- }- ['allSymsS, 'liftAllSymsS, 'liftAllSymsS2]- ],- unaryOpInstanceNames = [''AllSyms, ''AllSyms1, ''AllSyms2],- unaryOpExtraVars = const $ return [],- unaryOpInstanceTypeFromConfig = defaultUnaryOpInstanceTypeFromConfig,- unaryOpAllowExistential = True- }---- | Derive 'AllSyms' instance for a GADT.-deriveGADTAllSyms :: DeriveConfig -> Name -> Q [Dec]-deriveGADTAllSyms deriveConfig = genUnaryOpClass deriveConfig allSymsConfig 0---- | Derive 'AllSyms1' instance for a GADT.-deriveGADTAllSyms1 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTAllSyms1 deriveConfig = genUnaryOpClass deriveConfig allSymsConfig 1---- | Derive 'AllSyms2' instance for a GADT.-deriveGADTAllSyms2 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTAllSyms2 deriveConfig = genUnaryOpClass deriveConfig allSymsConfig 2
− src/Grisette/Internal/TH/GADT/DeriveEq.hs
@@ -1,79 +0,0 @@-{-# LANGUAGE LambdaCase #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TupleSections #-}---- |--- Module : Grisette.Internal.TH.GADT.DeriveEq--- Copyright : (c) Sirui Lu 2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.TH.GADT.DeriveEq- ( deriveGADTEq,- deriveGADTEq1,- deriveGADTEq2,- )-where--import Data.Functor.Classes (Eq1 (liftEq), Eq2 (liftEq2))-import Grisette.Internal.TH.GADT.BinaryOpCommon- ( BinaryOpClassConfig- ( BinaryOpClassConfig,- binaryOpAllowSumType,- binaryOpFieldConfigs,- binaryOpInstanceNames- ),- BinaryOpFieldConfig- ( BinaryOpFieldConfig,- extraPatNames,- fieldCombineFun,- fieldDifferentExistentialFun,- fieldFunExp,- fieldFunNames,- fieldLMatchResult,- fieldRMatchResult,- fieldResFun- ),- binaryOpAllowExistential,- defaultFieldFunExp,- genBinaryOpClass,- )-import Grisette.Internal.TH.GADT.Common (DeriveConfig)-import Language.Haskell.TH (Dec, Exp (ListE), Q)-import Language.Haskell.TH.Syntax (Name)--eqConfig :: BinaryOpClassConfig-eqConfig =- BinaryOpClassConfig- { binaryOpFieldConfigs =- [ BinaryOpFieldConfig- { extraPatNames = [],- fieldResFun = \_ (lhs, rhs) f ->- (,[]) <$> [|$(return f) $(return lhs) $(return rhs)|],- fieldCombineFun = \_ lst ->- (,[]) <$> [|and $(return $ ListE lst)|],- fieldDifferentExistentialFun = const [|False|],- fieldFunExp = defaultFieldFunExp ['(==), 'liftEq, 'liftEq2],- fieldFunNames = ['(==), 'liftEq, 'liftEq2],- fieldLMatchResult = [|False|],- fieldRMatchResult = [|False|]- }- ],- binaryOpInstanceNames = [''Eq, ''Eq1, ''Eq2],- binaryOpAllowSumType = True,- binaryOpAllowExistential = True- }---- | Derive 'Eq' instance for a GADT.-deriveGADTEq :: DeriveConfig -> Name -> Q [Dec]-deriveGADTEq deriveConfig = genBinaryOpClass deriveConfig eqConfig 0---- | Derive 'Eq1' instance for a GADT.-deriveGADTEq1 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTEq1 deriveConfig = genBinaryOpClass deriveConfig eqConfig 1---- | Derive 'Eq2' instance for a GADT.-deriveGADTEq2 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTEq2 deriveConfig = genBinaryOpClass deriveConfig eqConfig 2
− src/Grisette/Internal/TH/GADT/DeriveEvalSym.hs
@@ -1,94 +0,0 @@-{-# LANGUAGE LambdaCase #-}-{-# LANGUAGE NamedFieldPuns #-}-{-# LANGUAGE RecordWildCards #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TupleSections #-}-{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}--{-# HLINT ignore "Unused LANGUAGE pragma" #-}---- |--- Module : Grisette.Internal.TH.GADT.DeriveEvalSym--- Copyright : (c) Sirui Lu 2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.TH.GADT.DeriveEvalSym- ( deriveGADTEvalSym,- deriveGADTEvalSym1,- deriveGADTEvalSym2,- )-where--import Grisette.Internal.Internal.Decl.Core.Data.Class.EvalSym- ( EvalSym (evalSym),- EvalSym1 (liftEvalSym),- EvalSym2 (liftEvalSym2),- )-import Grisette.Internal.TH.GADT.Common (DeriveConfig)-import Grisette.Internal.TH.GADT.UnaryOpCommon- ( UnaryOpClassConfig- ( UnaryOpClassConfig,- unaryOpAllowExistential,- unaryOpConfigs,- unaryOpExtraVars,- unaryOpInstanceNames,- unaryOpInstanceTypeFromConfig- ),- UnaryOpConfig (UnaryOpConfig),- UnaryOpFieldConfig- ( UnaryOpFieldConfig,- extraLiftedPatNames,- extraPatNames,- fieldCombineFun,- fieldFunExp,- fieldResFun- ),- defaultFieldFunExp,- defaultFieldResFun,- defaultUnaryOpInstanceTypeFromConfig,- genUnaryOpClass,- )-import Language.Haskell.TH- ( Dec,- Exp (AppE, ConE),- Name,- Q,- )--evalSymConfig :: UnaryOpClassConfig-evalSymConfig =- UnaryOpClassConfig- { unaryOpConfigs =- [ UnaryOpConfig- UnaryOpFieldConfig- { extraPatNames = ["fillDefault", "model"],- extraLiftedPatNames = const [],- fieldResFun = defaultFieldResFun,- fieldCombineFun = \_ _ con extraPat exp -> do- return (foldl AppE (ConE con) exp, False <$ extraPat),- fieldFunExp =- defaultFieldFunExp ['evalSym, 'liftEvalSym, 'liftEvalSym2]- }- ['evalSym, 'liftEvalSym, 'liftEvalSym2]- ],- unaryOpInstanceNames =- [''EvalSym, ''EvalSym1, ''EvalSym2],- unaryOpExtraVars = const $ return [],- unaryOpInstanceTypeFromConfig = defaultUnaryOpInstanceTypeFromConfig,- unaryOpAllowExistential = True- }---- | Derive 'EvalSym' instance for a GADT.-deriveGADTEvalSym :: DeriveConfig -> Name -> Q [Dec]-deriveGADTEvalSym deriveConfig = genUnaryOpClass deriveConfig evalSymConfig 0---- | Derive 'EvalSym1' instance for a GADT.-deriveGADTEvalSym1 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTEvalSym1 deriveConfig = genUnaryOpClass deriveConfig evalSymConfig 1---- | Derive 'EvalSym2' instance for a GADT.-deriveGADTEvalSym2 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTEvalSym2 deriveConfig = genUnaryOpClass deriveConfig evalSymConfig 2
− src/Grisette/Internal/TH/GADT/DeriveExtractSym.hs
@@ -1,99 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}-{-# HLINT ignore "Unused LANGUAGE pragma" #-}-{-# LANGUAGE TupleSections #-}-{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}---- |--- Module : Grisette.Internal.TH.GADT.DeriveExtractSym--- Copyright : (c) Sirui Lu 2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.TH.GADT.DeriveExtractSym- ( deriveGADTExtractSym,- deriveGADTExtractSym1,- deriveGADTExtractSym2,- )-where--import Grisette.Internal.Internal.Decl.Core.Data.Class.ExtractSym- ( ExtractSym (extractSymMaybe),- ExtractSym1 (liftExtractSymMaybe),- ExtractSym2 (liftExtractSymMaybe2),- )-import Grisette.Internal.TH.GADT.Common (DeriveConfig)-import Grisette.Internal.TH.GADT.UnaryOpCommon- ( UnaryOpClassConfig- ( UnaryOpClassConfig,- unaryOpAllowExistential,- unaryOpConfigs,- unaryOpExtraVars,- unaryOpInstanceNames,- unaryOpInstanceTypeFromConfig- ),- UnaryOpConfig (UnaryOpConfig),- UnaryOpFieldConfig- ( UnaryOpFieldConfig,- extraLiftedPatNames,- extraPatNames,- fieldCombineFun,- fieldFunExp,- fieldResFun- ),- defaultFieldFunExp,- defaultFieldResFun,- defaultUnaryOpInstanceTypeFromConfig,- genUnaryOpClass,- )-import Language.Haskell.TH- ( Dec,- Exp (AppE, ListE, VarE),- Name,- Q,- )--extractSymConfig :: UnaryOpClassConfig-extractSymConfig =- UnaryOpClassConfig- { unaryOpConfigs =- [ UnaryOpConfig- UnaryOpFieldConfig- { extraPatNames = [],- extraLiftedPatNames = const [],- fieldResFun = defaultFieldResFun,- fieldCombineFun = \_ _ _ _ exp ->- if null exp- then (,[]) <$> [|return mempty|]- else return (AppE (VarE 'mconcat) $ ListE exp, False <$ exp),- fieldFunExp =- defaultFieldFunExp- [ 'extractSymMaybe,- 'liftExtractSymMaybe,- 'liftExtractSymMaybe2- ]- }- [ 'extractSymMaybe,- 'liftExtractSymMaybe,- 'liftExtractSymMaybe2- ]- ],- unaryOpInstanceNames =- [''ExtractSym, ''ExtractSym1, ''ExtractSym2],- unaryOpExtraVars = const $ return [],- unaryOpInstanceTypeFromConfig = defaultUnaryOpInstanceTypeFromConfig,- unaryOpAllowExistential = True- }---- | Derive 'ExtractSym' instance for a GADT.-deriveGADTExtractSym :: DeriveConfig -> Name -> Q [Dec]-deriveGADTExtractSym deriveConfig = genUnaryOpClass deriveConfig extractSymConfig 0---- | Derive 'ExtractSym1' instance for a GADT.-deriveGADTExtractSym1 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTExtractSym1 deriveConfig = genUnaryOpClass deriveConfig extractSymConfig 1---- | Derive 'ExtractSym2' instance for a GADT.-deriveGADTExtractSym2 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTExtractSym2 deriveConfig = genUnaryOpClass deriveConfig extractSymConfig 2
− src/Grisette/Internal/TH/GADT/DeriveGADT.hs
@@ -1,735 +0,0 @@-{-# LANGUAGE LambdaCase #-}-{-# HLINT ignore "Unused LANGUAGE pragma" #-}-{-# LANGUAGE MultiWayIf #-}-{-# LANGUAGE TemplateHaskell #-}-{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}---- |--- Module : Grisette.Internal.TH.GADT.DeriveGADT--- Copyright : (c) Sirui Lu 2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.TH.GADT.DeriveGADT- ( deriveGADT,- deriveGADTWith,- allClasses0,- allClasses01,- allClasses012,- basicClasses0,- noExistentialClasses0,- ordClasses0,- basicClasses1,- noExistentialClasses1,- ordClasses1,- basicClasses2,- noExistentialClasses2,- ordClasses2,- )-where--import Control.Arrow (Arrow (second))-import Control.DeepSeq (NFData, NFData1, NFData2)-import Data.Bytes.Serial (Serial, Serial1, Serial2)-import Data.Functor.Classes (Eq1, Eq2, Ord1, Ord2, Show1, Show2)-import Data.Hashable (Hashable)-import Data.Hashable.Lifted (Hashable1, Hashable2)-import qualified Data.Map as M-import qualified Data.Set as S-import Grisette.Internal.Internal.Decl.Core.Data.Class.EvalSym- ( EvalSym,- EvalSym1,- EvalSym2,- )-import Grisette.Internal.Internal.Decl.Core.Data.Class.ExtractSym- ( ExtractSym,- ExtractSym1,- ExtractSym2,- )-import Grisette.Internal.Internal.Decl.Core.Data.Class.Mergeable- ( Mergeable,- Mergeable1,- Mergeable2,- Mergeable3,- )-import Grisette.Internal.Internal.Decl.Core.Data.Class.PPrint- ( PPrint,- PPrint1,- PPrint2,- )-import Grisette.Internal.Internal.Decl.Core.Data.Class.SimpleMergeable- ( SimpleMergeable,- SimpleMergeable1,- SimpleMergeable2,- )-import Grisette.Internal.Internal.Decl.Core.Data.Class.SubstSym- ( SubstSym,- SubstSym1,- SubstSym2,- )-import Grisette.Internal.Internal.Decl.Core.Data.Class.SymEq- ( SymEq,- SymEq1,- SymEq2,- )-import Grisette.Internal.Internal.Decl.Core.Data.Class.SymOrd- ( SymOrd,- SymOrd1,- SymOrd2,- )-import Grisette.Internal.Internal.Decl.Core.Data.Class.ToCon- ( ToCon,- ToCon1,- ToCon2,- )-import Grisette.Internal.Internal.Decl.Core.Data.Class.ToSym- ( ToSym,- ToSym1,- ToSym2,- )-import Grisette.Internal.Internal.Decl.SymPrim.AllSyms- ( AllSyms,- AllSyms1,- AllSyms2,- )-import Grisette.Internal.Internal.Decl.Unified.Class.UnifiedSimpleMergeable- ( UnifiedSimpleMergeable,- UnifiedSimpleMergeable1,- UnifiedSimpleMergeable2,- )-import Grisette.Internal.Internal.Decl.Unified.Class.UnifiedSymEq- ( UnifiedSymEq,- UnifiedSymEq1,- UnifiedSymEq2,- )-import Grisette.Internal.Internal.Decl.Unified.Class.UnifiedSymOrd- ( UnifiedSymOrd,- UnifiedSymOrd1,- UnifiedSymOrd2,- )-import Grisette.Internal.TH.GADT.Common- ( DeriveConfig- ( evalModeConfig,- needExtraMergeableUnderEvalMode,- needExtraMergeableWithConcretizedEvalMode- ),- EvalModeConfig (EvalModeConstraints, EvalModeSpecified),- )-import Grisette.Internal.TH.GADT.DeriveAllSyms- ( deriveGADTAllSyms,- deriveGADTAllSyms1,- deriveGADTAllSyms2,- )-import Grisette.Internal.TH.GADT.DeriveEq- ( deriveGADTEq,- deriveGADTEq1,- deriveGADTEq2,- )-import Grisette.Internal.TH.GADT.DeriveEvalSym- ( deriveGADTEvalSym,- deriveGADTEvalSym1,- deriveGADTEvalSym2,- )-import Grisette.Internal.TH.GADT.DeriveExtractSym- ( deriveGADTExtractSym,- deriveGADTExtractSym1,- deriveGADTExtractSym2,- )-import Grisette.Internal.TH.GADT.DeriveHashable- ( deriveGADTHashable,- deriveGADTHashable1,- deriveGADTHashable2,- )-import Grisette.Internal.TH.GADT.DeriveMergeable- ( genMergeable,- genMergeable',- genMergeableAndGetMergingInfoResult,- genMergeableNoExistential,- )-import Grisette.Internal.TH.GADT.DeriveNFData- ( deriveGADTNFData,- deriveGADTNFData1,- deriveGADTNFData2,- )-import Grisette.Internal.TH.GADT.DeriveOrd- ( deriveGADTOrd,- deriveGADTOrd1,- deriveGADTOrd2,- )-import Grisette.Internal.TH.GADT.DerivePPrint- ( deriveGADTPPrint,- deriveGADTPPrint1,- deriveGADTPPrint2,- )-import Grisette.Internal.TH.GADT.DeriveSerial- ( deriveGADTSerial,- deriveGADTSerial1,- deriveGADTSerial2,- )-import Grisette.Internal.TH.GADT.DeriveShow- ( deriveGADTShow,- deriveGADTShow1,- deriveGADTShow2,- )-import Grisette.Internal.TH.GADT.DeriveSimpleMergeable- ( deriveGADTSimpleMergeable,- deriveGADTSimpleMergeable1,- deriveGADTSimpleMergeable2,- )-import Grisette.Internal.TH.GADT.DeriveSubstSym- ( deriveGADTSubstSym,- deriveGADTSubstSym1,- deriveGADTSubstSym2,- )-import Grisette.Internal.TH.GADT.DeriveSymEq- ( deriveGADTSymEq,- deriveGADTSymEq1,- deriveGADTSymEq2,- )-import Grisette.Internal.TH.GADT.DeriveSymOrd- ( deriveGADTSymOrd,- deriveGADTSymOrd1,- deriveGADTSymOrd2,- )-import Grisette.Internal.TH.GADT.DeriveToCon- ( deriveGADTToCon,- deriveGADTToCon1,- deriveGADTToCon2,- )-import Grisette.Internal.TH.GADT.DeriveToSym- ( deriveGADTToSym,- deriveGADTToSym1,- deriveGADTToSym2,- )-import Grisette.Internal.TH.GADT.DeriveUnifiedSimpleMergeable- ( deriveGADTUnifiedSimpleMergeable,- deriveGADTUnifiedSimpleMergeable1,- deriveGADTUnifiedSimpleMergeable2,- )-import Grisette.Internal.TH.GADT.DeriveUnifiedSymEq- ( deriveGADTUnifiedSymEq,- deriveGADTUnifiedSymEq1,- deriveGADTUnifiedSymEq2,- )-import Grisette.Internal.TH.GADT.DeriveUnifiedSymOrd- ( deriveGADTUnifiedSymOrd,- deriveGADTUnifiedSymOrd1,- deriveGADTUnifiedSymOrd2,- )-import Grisette.Internal.TH.Util (dataTypeHasExistential)-import Grisette.Internal.Unified.EvalModeTag (EvalModeTag (C, S))-import Language.Haskell.TH (Dec, Name, Q)--deriveProcedureMap :: M.Map Name (DeriveConfig -> Name -> Q [Dec])-deriveProcedureMap =- M.fromList- [ (''EvalSym, deriveGADTEvalSym),- (''EvalSym1, deriveGADTEvalSym1),- (''EvalSym2, deriveGADTEvalSym2),- (''ExtractSym, deriveGADTExtractSym),- (''ExtractSym1, deriveGADTExtractSym1),- (''ExtractSym2, deriveGADTExtractSym2),- (''SubstSym, deriveGADTSubstSym),- (''SubstSym1, deriveGADTSubstSym1),- (''SubstSym2, deriveGADTSubstSym2),- (''NFData, deriveGADTNFData),- (''NFData1, deriveGADTNFData1),- (''NFData2, deriveGADTNFData2),- (''Hashable, deriveGADTHashable),- (''Hashable1, deriveGADTHashable1),- (''Hashable2, deriveGADTHashable2),- (''Show, deriveGADTShow),- (''Show1, deriveGADTShow1),- (''Show2, deriveGADTShow2),- (''PPrint, deriveGADTPPrint),- (''PPrint1, deriveGADTPPrint1),- (''PPrint2, deriveGADTPPrint2),- (''AllSyms, deriveGADTAllSyms),- (''AllSyms1, deriveGADTAllSyms1),- (''AllSyms2, deriveGADTAllSyms2),- (''Eq, deriveGADTEq),- (''Eq1, deriveGADTEq1),- (''Eq2, deriveGADTEq2),- (''Ord, deriveGADTOrd),- (''Ord1, deriveGADTOrd1),- (''Ord2, deriveGADTOrd2),- (''SymOrd, deriveGADTSymOrd),- (''SymOrd1, deriveGADTSymOrd1),- (''SymOrd2, deriveGADTSymOrd2),- (''SymEq, deriveGADTSymEq),- (''SymEq1, deriveGADTSymEq1),- (''SymEq2, deriveGADTSymEq2),- (''UnifiedSymEq, deriveGADTUnifiedSymEq),- (''UnifiedSymEq1, deriveGADTUnifiedSymEq1),- (''UnifiedSymEq2, deriveGADTUnifiedSymEq2),- (''UnifiedSymOrd, deriveGADTUnifiedSymOrd),- (''UnifiedSymOrd1, deriveGADTUnifiedSymOrd1),- (''UnifiedSymOrd2, deriveGADTUnifiedSymOrd2),- (''ToSym, deriveGADTToSym),- (''ToSym1, deriveGADTToSym1),- (''ToSym2, deriveGADTToSym2),- (''ToCon, deriveGADTToCon),- (''ToCon1, deriveGADTToCon1),- (''ToCon2, deriveGADTToCon2),- (''Serial, deriveGADTSerial),- (''Serial1, deriveGADTSerial1),- (''Serial2, deriveGADTSerial2),- (''SimpleMergeable, deriveGADTSimpleMergeable),- (''SimpleMergeable1, deriveGADTSimpleMergeable1),- (''SimpleMergeable2, deriveGADTSimpleMergeable2),- (''UnifiedSimpleMergeable, deriveGADTUnifiedSimpleMergeable),- (''UnifiedSimpleMergeable1, deriveGADTUnifiedSimpleMergeable1),- (''UnifiedSimpleMergeable2, deriveGADTUnifiedSimpleMergeable2)- ]--deriveSingleGADT :: DeriveConfig -> Name -> Name -> Q [Dec]-deriveSingleGADT deriveConfig typName className = do- let newExtra- | className- `elem` [ ''Eq,- ''Eq1,- ''Eq2,- ''SymEq,- ''SymEq1,- ''SymEq2,- ''SymOrd,- ''SymOrd1,- ''SymOrd2,- ''UnifiedSymEq,- ''UnifiedSymEq1,- ''UnifiedSymEq2,- ''UnifiedSymOrd,- ''UnifiedSymOrd1,- ''UnifiedSymOrd2,- ''UnifiedSimpleMergeable,- ''UnifiedSimpleMergeable1,- ''UnifiedSimpleMergeable2- ] =- deriveConfig- { needExtraMergeableUnderEvalMode = False,- needExtraMergeableWithConcretizedEvalMode = False- }- | className- `elem` [''SimpleMergeable, ''SimpleMergeable1, ''SimpleMergeable2] =- deriveConfig- { evalModeConfig =- second- ( \case- EvalModeConstraints _ -> EvalModeSpecified S- EvalModeSpecified tag -> EvalModeSpecified tag- )- <$> evalModeConfig deriveConfig,- needExtraMergeableUnderEvalMode = False,- needExtraMergeableWithConcretizedEvalMode = False- }- | className `elem` [''Ord, ''Ord1, ''Ord2] =- deriveConfig- { evalModeConfig =- second- ( \case- EvalModeConstraints _ -> EvalModeSpecified C- EvalModeSpecified tag -> EvalModeSpecified tag- )- <$> evalModeConfig deriveConfig,- needExtraMergeableUnderEvalMode = False,- needExtraMergeableWithConcretizedEvalMode = False- }- | otherwise = deriveConfig- case M.lookup className deriveProcedureMap of- Just procedure -> procedure newExtra typName- Nothing ->- fail $ "No derivation available for class " ++ show className--deriveGADTWith' :: DeriveConfig -> Name -> [Name] -> Q [Dec]-deriveGADTWith' deriveConfig typName classNameList = do- let classNames = S.fromList classNameList- let (ns, ms) = splitMergeable $ S.toList classNames- decs <- mapM (deriveSingleGADT deriveConfig typName) ns- decMergeables <- deriveMergeables ms- return $ concat decs ++ decMergeables- where- configWithOutExtraMergeable :: DeriveConfig- configWithOutExtraMergeable =- deriveConfig {needExtraMergeableUnderEvalMode = False}- deriveMergeables :: [Int] -> Q [Dec]- deriveMergeables [] = return []- deriveMergeables [n] = genMergeable configWithOutExtraMergeable typName n- deriveMergeables (n : ns) = do- hasExistential <- dataTypeHasExistential typName- if hasExistential- then do- (info, dn) <-- genMergeableAndGetMergingInfoResult- configWithOutExtraMergeable- typName- n- dns <-- traverse (genMergeable' configWithOutExtraMergeable info typName) ns- return $ dn ++ concatMap snd dns- else do- dns <-- traverse- (genMergeableNoExistential configWithOutExtraMergeable typName)- (n : ns)- return $ concat dns- splitMergeable :: [Name] -> ([Name], [Int])- splitMergeable [] = ([], [])- splitMergeable (x : xs) =- let (ns, is) = splitMergeable xs- in if- | x == ''Mergeable -> (ns, 0 : is)- | x == ''Mergeable1 -> (ns, 1 : is)- | x == ''Mergeable2 -> (ns, 2 : is)- | x == ''Mergeable3 -> (ns, 3 : is)- | otherwise -> (x : ns, is)---- | Derive the specified classes for a GADT with the given name.------ Support the following classes.------ * 'Mergeable'--- * 'Mergeable1'--- * 'Mergeable2'--- * 'Mergeable3'--- * 'EvalSym'--- * 'EvalSym1'--- * 'EvalSym2'--- * 'ExtractSym'--- * 'ExtractSym1'--- * 'ExtractSym2'--- * 'SubstSym'--- * 'SubstSym1'--- * 'SubstSym2'--- * 'NFData'--- * 'NFData1'--- * 'NFData2'--- * 'Hashable'--- * 'Hashable1'--- * 'Hashable2'--- * 'Show'--- * 'Show1'--- * 'Show2'--- * 'PPrint'--- * 'PPrint1'--- * 'PPrint2'--- * 'AllSyms'--- * 'AllSyms1'--- * 'AllSyms2'--- * 'Eq'--- * 'Eq1'--- * 'Eq2'--- * 'Ord'--- * 'Ord1'--- * 'Ord2'--- * 'SymOrd'--- * 'SymOrd1'--- * 'SymOrd2'--- * 'SymEq'--- * 'SymEq1'--- * 'SymEq2'--- * 'UnifiedSymEq'--- * 'UnifiedSymEq1'--- * 'UnifiedSymEq2'--- * 'UnifiedSymOrd'--- * 'UnifiedSymOrd1'--- * 'UnifiedSymOrd2'--- * 'ToSym'--- * 'ToSym1'--- * 'ToSym2'--- * 'ToCon'--- * 'ToCon1'--- * 'ToCon2'--- * 'Serial'--- * 'Serial1'--- * 'Serial2'--- * 'SimpleMergeable'--- * 'SimpleMergeable1'--- * 'SimpleMergeable2'------ Note that the following type classes cannot be derived for GADTs with--- existential type variables.------ * 'Eq1'--- * 'Eq2'--- * 'SymEq1'--- * 'SymEq2'--- * 'Ord1'--- * 'Ord2'--- * 'SymOrd1'--- * 'SymOrd2'-deriveGADTWith :: DeriveConfig -> [Name] -> [Name] -> Q [Dec]-deriveGADTWith deriveConfig typeNameList classNameList = do- let typeNames = S.toList $ S.fromList typeNameList- concat- <$> traverse- (\typeName -> deriveGADTWith' deriveConfig typeName classNameList)- typeNames---- | Derive the specified classes for a GADT with the given name.------ See 'deriveGADTWith' for more details.-deriveGADT :: [Name] -> [Name] -> Q [Dec]-deriveGADT = deriveGADTWith mempty---- | All the classes that can be derived for GADTs.------ This includes:------ * 'Mergeable'--- * 'EvalSym'--- * 'ExtractSym'--- * 'SubstSym'--- * 'NFData'--- * 'Hashable'--- * 'Show'--- * 'PPrint'--- * 'AllSyms'--- * 'Eq'--- * 'SymEq'--- * 'SymOrd'--- * 'UnifiedSymEq'--- * 'Ord'--- * 'UnifiedSymOrd'--- * 'Serial'--- * 'ToCon'--- * 'ToSym'-allClasses0 :: [Name]-allClasses0 = basicClasses0 ++ ordClasses0 ++ noExistentialClasses0---- | All the @*1@ classes that can be derived for GADT functors.------ This includes:------ * 'Mergeable1'--- * 'EvalSym1'--- * 'ExtractSym1'--- * 'SubstSym1'--- * 'NFData1'--- * 'Hashable1'--- * 'Show1'--- * 'PPrint1'--- * 'AllSyms1'--- * 'Eq1'--- * 'SymEq1'--- * 'SymOrd1'--- * 'UnifiedSymEq1'--- * 'Ord1'--- * 'UnifiedSymOrd1'--- * 'Serial1'--- * 'ToCon1'--- * 'ToSym1'-allClasses1 :: [Name]-allClasses1 = basicClasses1 ++ ordClasses1 ++ noExistentialClasses1---- | All the classes that can be derived for GADT functors.------ This includes all the classes in 'allClasses0' and 'allClasses1'.-allClasses01 :: [Name]-allClasses01 = allClasses0 ++ allClasses1---- | All the @*2@ classes that can be derived for GADT functors.------ This includes:------ * 'Mergeable2'--- * 'EvalSym2'--- * 'ExtractSym2'--- * 'SubstSym2'--- * 'NFData2'--- * 'Hashable2'--- * 'Show2'--- * 'PPrint2'--- * 'AllSyms2'--- * 'Eq2'--- * 'SymEq2'--- * 'SymOrd2'--- * 'UnifiedSymEq2'--- * 'Ord2'--- * 'UnifiedSymOrd2'--- * 'Serial2'--- * 'ToCon2'--- * 'ToSym2'-allClasses2 :: [Name]-allClasses2 = basicClasses2 ++ ordClasses2 ++ noExistentialClasses2---- | All the classes that can be derived for GADTfunctors.------ This includes all the classes in 'allClasses0', 'allClasses1',--- and 'allClasses2'.-allClasses012 :: [Name]-allClasses012 = allClasses0 ++ allClasses1 ++ allClasses2---- | Basic classes for GADTs.------ This includes:------ * 'Mergeable'--- * 'EvalSym'--- * 'ExtractSym'--- * 'SubstSym'--- * 'NFData'--- * 'Hashable'--- * 'Show'--- * 'PPrint'--- * 'AllSyms'--- * 'Eq'--- * 'SymEq'--- * 'SymOrd'--- * 'UnifiedSymEq'------ These classes can be derived for most GADTs.-basicClasses0 :: [Name]-basicClasses0 =- [ ''Mergeable,- ''EvalSym,- ''ExtractSym,- ''SubstSym,- ''NFData,- ''Hashable,- ''Show,- ''PPrint,- ''AllSyms,- ''Eq,- ''SymEq,- ''SymOrd,- ''UnifiedSymEq- ]---- | Classes that can only be derived for GADTs without existential type--- variables.------ This includes:------ * 'Serial'--- * 'ToCon'--- * 'ToSym'-noExistentialClasses0 :: [Name]-noExistentialClasses0 = [''Serial, ''ToCon, ''ToSym]---- | Concrete ordered classes that can be derived for GADTs that------ * uses unified evaluation mode, or--- * does not contain any symbolic variables.------ This includes:------ * 'Ord'--- * 'UnifiedSymOrd'-ordClasses0 :: [Name]-ordClasses0 = [''Ord, ''UnifiedSymOrd]---- | Basic classes for GADT functors.------ This includes:------ * 'Mergeable1'--- * 'EvalSym1'--- * 'ExtractSym1'--- * 'SubstSym1'--- * 'NFData1'--- * 'Hashable1'--- * 'Show1'--- * 'PPrint1'--- * 'AllSyms1'--- * 'Eq1'--- * 'SymEq1'--- * 'SymOrd1'--- * 'UnifiedSymEq1'-basicClasses1 :: [Name]-basicClasses1 =- [ ''Mergeable1,- ''EvalSym1,- ''ExtractSym1,- ''SubstSym1,- ''NFData1,- ''Hashable1,- ''Show1,- ''PPrint1,- ''AllSyms1,- ''Eq1,- ''SymEq1,- ''SymOrd1,- ''UnifiedSymEq1- ]---- | @*1@ classes that can only be derived for GADT functors without existential--- type variables.------ This includes:------ * 'Serial1'--- * 'ToCon1'--- * 'ToSym1'-noExistentialClasses1 :: [Name]-noExistentialClasses1 = [''Serial1, ''ToCon1, ''ToSym1]---- | @*1@ concrete ordered classes that can be derived for GADT functors that------ * uses unified evaluation mode, or--- * does not contain any symbolic variables.------ This includes:------ * 'Ord1'--- * 'UnifiedSymOrd1'-ordClasses1 :: [Name]-ordClasses1 = [''Ord1, ''UnifiedSymOrd1]---- | Basic classes for GADT functors.------ This includes:------ * 'Mergeable2'--- * 'EvalSym2'--- * 'ExtractSym2'--- * 'SubstSym2'--- * 'NFData2'--- * 'Hashable2'--- * 'Show2'--- * 'PPrint2'--- * 'AllSyms2'--- * 'Eq2'--- * 'SymEq2'--- * 'SymOrd2'--- * 'UnifiedSymEq2'-basicClasses2 :: [Name]-basicClasses2 =- [ ''Mergeable2,- ''EvalSym2,- ''ExtractSym2,- ''SubstSym2,- ''NFData2,- ''Hashable2,- ''Show2,- ''PPrint2,- ''AllSyms2,- ''Eq2,- ''SymEq2,- ''SymOrd2,- ''UnifiedSymEq2- ]---- | @*2@ classes that can only be derived for GADT functors without existential--- type variables.------ This includes:------ * 'Serial2'--- * 'ToCon2'--- * 'ToSym2'-noExistentialClasses2 :: [Name]-noExistentialClasses2 = [''Serial2, ''ToCon2, ''ToSym2]---- | @*2@ concrete ordered classes that can be derived for GADT functors that------ * uses unified evaluation mode, or--- * does not contain any symbolic variables.------ This includes:------ * 'Ord2'--- * 'UnifiedSymOrd2'-ordClasses2 :: [Name]-ordClasses2 = [''Ord2, ''UnifiedSymOrd2]
− src/Grisette/Internal/TH/GADT/DeriveHashable.hs
@@ -1,90 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}---- |--- Module : Grisette.Internal.TH.GADT.DeriveHashable--- Copyright : (c) Sirui Lu 2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.TH.GADT.DeriveHashable- ( deriveGADTHashable,- deriveGADTHashable1,- deriveGADTHashable2,- )-where--import Data.Hashable (Hashable (hashWithSalt))-import Data.Hashable.Lifted- ( Hashable1 (liftHashWithSalt),- Hashable2 (liftHashWithSalt2),- )-import Grisette.Internal.TH.GADT.Common (DeriveConfig)-import Grisette.Internal.TH.GADT.UnaryOpCommon- ( UnaryOpClassConfig- ( UnaryOpClassConfig,- unaryOpAllowExistential,- unaryOpConfigs,- unaryOpExtraVars,- unaryOpInstanceNames,- unaryOpInstanceTypeFromConfig- ),- UnaryOpConfig (UnaryOpConfig),- UnaryOpFieldConfig- ( UnaryOpFieldConfig,- extraLiftedPatNames,- extraPatNames,- fieldCombineFun,- fieldFunExp,- fieldResFun- ),- defaultFieldFunExp,- defaultUnaryOpInstanceTypeFromConfig,- genUnaryOpClass,- )-import Language.Haskell.TH (Dec, Name, Q)--hashableConfig :: UnaryOpClassConfig-hashableConfig =- UnaryOpClassConfig- { unaryOpConfigs =- [ UnaryOpConfig- UnaryOpFieldConfig- { extraPatNames = ["salt"],- extraLiftedPatNames = const [],- fieldCombineFun =- \_ _ _ [salt] exp -> do- r <-- foldl- (\salt exp -> [|$(return exp) $salt|])- (return salt)- exp- return (r, [True]),- fieldResFun = \_ _ _ _ fieldPat fieldFun -> do- r <- [|\salt -> $(return fieldFun) salt $(return fieldPat)|]- return (r, [False]),- fieldFunExp =- defaultFieldFunExp- ['hashWithSalt, 'liftHashWithSalt, 'liftHashWithSalt2]- }- ['hashWithSalt, 'liftHashWithSalt, 'liftHashWithSalt2]- ],- unaryOpInstanceNames =- [''Hashable, ''Hashable1, ''Hashable2],- unaryOpExtraVars = const $ return [],- unaryOpInstanceTypeFromConfig = defaultUnaryOpInstanceTypeFromConfig,- unaryOpAllowExistential = True- }---- | Derive 'Hashable' instance for a GADT.-deriveGADTHashable :: DeriveConfig -> Name -> Q [Dec]-deriveGADTHashable deriveConfig = genUnaryOpClass deriveConfig hashableConfig 0---- | Derive 'Hashable1' instance for a GADT.-deriveGADTHashable1 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTHashable1 deriveConfig = genUnaryOpClass deriveConfig hashableConfig 1---- | Derive 'Hashable2' instance for a GADT.-deriveGADTHashable2 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTHashable2 deriveConfig = genUnaryOpClass deriveConfig hashableConfig 2
− src/Grisette/Internal/TH/GADT/DeriveMergeable.hs
@@ -1,792 +0,0 @@-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE MultiWayIf #-}-{-# LANGUAGE RecordWildCards #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TupleSections #-}-{-# LANGUAGE TypeApplications #-}---- |--- Module : Grisette.Internal.TH.GADT.DeriveMergeable--- Copyright : (c) Sirui Lu 2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.TH.GADT.DeriveMergeable- ( deriveGADTMergeable,- deriveGADTMergeable1,- deriveGADTMergeable2,- deriveGADTMergeable3,- genMergeableAndGetMergingInfoResult,- genMergeable,- genMergeable',- genMergeableNoExistential,- )-where--import Control.Monad (foldM, replicateM, zipWithM)-import qualified Data.Map as M-import Data.Maybe (catMaybes, isJust, mapMaybe)-import qualified Data.Set as S-import Data.Word (Word16, Word32, Word64, Word8)-import Grisette.Internal.Internal.Decl.Core.Data.Class.Mergeable- ( Mergeable (rootStrategy),- Mergeable1 (liftRootStrategy),- Mergeable2 (liftRootStrategy2),- Mergeable3 (liftRootStrategy3),- MergingStrategy (SimpleStrategy, SortedStrategy),- product2Strategy,- wrapStrategy,- )-import Grisette.Internal.TH.GADT.Common- ( CheckArgsResult- ( CheckArgsResult,- argVars,- constructors,- keptVars- ),- DeriveConfig,- checkArgs,- evalModeSpecializeList,- extraConstraint,- isVarUsedInFields,- specializeResult,- )-import Grisette.Internal.TH.GADT.UnaryOpCommon (FieldFunExp, UnaryOpClassConfig (UnaryOpClassConfig, unaryOpAllowExistential, unaryOpConfigs, unaryOpExtraVars, unaryOpInstanceNames, unaryOpInstanceTypeFromConfig), UnaryOpConfig (UnaryOpConfig), UnaryOpFunConfig (genUnaryOpFun), defaultUnaryOpInstanceTypeFromConfig, genUnaryOpClass)-import Grisette.Internal.TH.Util (dataTypeHasExistential, integerE, mangleName)-import Language.Haskell.TH- ( Bang (Bang),- Body (NormalB),- Clause (Clause),- Con (ForallC, GadtC),- Dec (DataD, FunD, InstanceD, PragmaD, SigD),- Exp (AppE, ConE, VarE),- Inline (Inline),- Kind,- Name,- Pat (SigP, VarP, WildP),- Phases (AllPhases),- Pragma (InlineP),- Pred,- Q,- RuleMatch (FunLike),- SourceStrictness (NoSourceStrictness),- SourceUnpackedness (NoSourceUnpackedness),- Type (AppT, ArrowT, ConT, ForallT, StarT, VarT),- appE,- caseE,- conE,- conT,- integerL,- lamE,- litP,- lookupTypeName,- mkName,- nameBase,- newName,- normalB,- recP,- sigP,- tupP,- varE,- varP,- varT,- wildP,- )-import Language.Haskell.TH.Datatype- ( ConstructorInfo- ( constructorContext,- constructorFields,- constructorName,- constructorVars- ),- DatatypeInfo (datatypeCons, datatypeName, datatypeVars),- TypeSubstitution (applySubstitution, freeVariables),- reifyDatatype,- resolveTypeSynonyms,- tvName,- )-import Language.Haskell.TH.Datatype.TyVarBndr- ( TyVarBndrUnit,- kindedTVSpecified,- plainTVFlag,- specifiedSpec,- )-import Language.Haskell.TH.Lib (clause, conP, litE, match, stringL)-import Type.Reflection (SomeTypeRep (SomeTypeRep), TypeRep, typeRep)-import Unsafe.Coerce (unsafeCoerce)--genMergingInfoCon ::- [TyVarBndrUnit] ->- Name ->- Bool ->- ConstructorInfo ->- Q (Con, Name, [Clause], [Clause], [Clause])-genMergingInfoCon dataTypeVars tyName isLast con = do- let conName = mangleName $ constructorName con- let newConName = mkName $ conName <> "MergingInfo"- let oriVars = dataTypeVars ++ constructorVars con- newDataTypeVars <- traverse (newName . nameBase . tvName) dataTypeVars- newConstructorVars <-- traverse (newName . nameBase . tvName) $ constructorVars con- let newNames = newDataTypeVars ++ newConstructorVars- -- newNames <- traverse (newName . nameBase . tvName) oriVars- let newVars = fmap VarT newNames- let substMap = M.fromList $ zip (tvName <$> oriVars) newVars- let fields =- zip [0 ..] $- applySubstitution substMap $- constructorFields con- let tyFields =- AppT (ConT ''TypeRep)- <$> applySubstitution- substMap- ((VarT . tvName) <$> constructorVars con)- let strategyFields = fmap (AppT (ConT ''MergingStrategy) . snd) fields- tyFieldNamesL <- traverse (const $ newName "p") tyFields- tyFieldNamesR <- traverse (const $ newName "p") tyFields- let tyFieldPatsL = fmap varP tyFieldNamesL- let tyFieldPatsR = fmap varP tyFieldNamesR- let tyFieldVarsL = fmap varE tyFieldNamesL- let tyFieldVarsR = fmap varE tyFieldNamesR- let strategyFieldPats = replicate (length strategyFields) wildP- let patsL = tyFieldPatsL ++ strategyFieldPats- let patsR = tyFieldPatsR ++ strategyFieldPats- let allWildcards = fmap (const wildP) $ tyFieldPatsL ++ strategyFieldPats- let eqCont l r cont =- [|- SomeTypeRep $l == SomeTypeRep $r- && $cont- |]- let eqExp =- foldl (\cont (l, r) -> eqCont l r cont) (conE 'True) $- zip tyFieldVarsL tyFieldVarsR- eqClause <-- clause- [conP newConName patsL, conP newConName patsR]- (normalB eqExp)- []- let cmpCont l r cont =- [|- case SomeTypeRep $l `compare` SomeTypeRep $r of- EQ -> $cont- x -> x- |]- let cmpExp =- foldl (\cont (l, r) -> cmpCont l r cont) (conE 'EQ) $- zip tyFieldVarsL tyFieldVarsR- cmpClause0 <-- clause- [conP newConName patsL, conP newConName patsR]- (normalB cmpExp)- []- cmpClause1 <-- clause- [conP newConName allWildcards, wildP]- (normalB $ conE 'LT)- []- cmpClause2 <-- clause- [wildP, conP newConName allWildcards]- (normalB $ conE 'GT)- []- let cmpClauses =- if isLast- then [cmpClause0]- else [cmpClause0, cmpClause1, cmpClause2]- let showCont t cont =- [|$cont <> " " <> show $t|]- let showExp = foldl (flip showCont) (litE $ stringL conName) tyFieldVarsL- showClause <-- clause- [conP newConName patsL]- (normalB showExp)- []- let ctx = applySubstitution substMap $ constructorContext con- let ctxAndGadtUsedVars =- S.fromList (freeVariables ctx)- <> S.fromList (freeVariables tyFields)- <> S.fromList (freeVariables strategyFields)- let isCtxAndGadtUsedVar nm = S.member nm ctxAndGadtUsedVars- return- ( ForallC- ( (`plainTVFlag` specifiedSpec)- <$> filter isCtxAndGadtUsedVar newDataTypeVars ++ newConstructorVars- )- ctx- $ GadtC- [newConName]- ( (Bang NoSourceUnpackedness NoSourceStrictness,)- <$> tyFields ++ strategyFields- )- (ConT tyName),- newConName,- [eqClause],- cmpClauses,- [showClause]- )--data MergingInfoResult = MergingInfoResult- { _infoName :: Name,- _conInfoNames :: [Name]- }--genMergingInfo :: Name -> Q (MergingInfoResult, [Dec])-genMergingInfo typName = do- d <- reifyDatatype typName- let originalName = mangleName $ datatypeName d- let newName = originalName <> "MergingInfo"- found <- lookupTypeName newName- let constructors = datatypeCons d- let name = mkName newName- r <-- if null constructors- then return []- else do- cons0 <-- traverse (genMergingInfoCon (datatypeVars d) name False) $- init constructors- consLast <-- genMergingInfoCon (datatypeVars d) name True $- last constructors- return $ cons0 ++ [consLast]- let cons = fmap (\(a, _, _, _, _) -> a) r- let eqClauses =- concatMap (\(_, _, a, _, _) -> a) r- ++ [ Clause [WildP, WildP] (NormalB $ ConE 'False) []- | length constructors > 1- ]- let cmpClauses = concatMap (\(_, _, _, a, _) -> a) r- let showClauses = concatMap (\(_, _, _, _, a) -> a) r- return- ( MergingInfoResult- name- (fmap (\(_, a, _, _, _) -> a) r),- if isJust found- then []- else- [ DataD [] name [] Nothing cons [],- InstanceD- Nothing- []- (ConT ''Eq `AppT` ConT name)- [FunD '(==) eqClauses],- InstanceD- Nothing- []- (ConT ''Ord `AppT` ConT name)- [FunD 'compare cmpClauses],- InstanceD- Nothing- []- (ConT ''Show `AppT` ConT name)- [FunD 'show showClauses]- ]- )---- | Generate 'Mergeable' instance and merging information for a GADT.-genMergeableAndGetMergingInfoResult ::- DeriveConfig -> Name -> Int -> Q (MergingInfoResult, [Dec])-genMergeableAndGetMergingInfoResult deriveConfig typName n = do- (infoResult, infoDec) <- genMergingInfo typName- (_, decs) <- genMergeable' deriveConfig infoResult typName n- return (infoResult, infoDec ++ decs)--constructMergingStrategyExp :: ConstructorInfo -> [Exp] -> Q Exp-constructMergingStrategyExp _ [] = [|SimpleStrategy $ \_ t _ -> t|]-constructMergingStrategyExp conInfo [x] = do- upname <- newName "a"- let unwrapPat = conP (constructorName conInfo) [varP upname]- let unwrapFun = lamE [unwrapPat] $ appE (varE 'unsafeCoerce) (varE upname)- [|- wrapStrategy- $(return x)- (unsafeCoerce . $(conE $ constructorName conInfo))- $unwrapFun- |]-constructMergingStrategyExp conInfo (x : xs) = do- upnames <- replicateM (length xs + 1) $ newName "a"- let wrapPat1 [] = error "Should not happen"- wrapPat1 [x] = varP x- wrapPat1 (x : xs) = tupP [varP x, wrapPat1 xs]- let wrapped = foldl AppE (ConE $ constructorName conInfo) $ fmap VarE upnames- let wrapFun =- lamE- [varP $ head upnames, wrapPat1 $ tail upnames]- [|unsafeCoerce ($(return wrapped))|]- let unwrapPat = conP (constructorName conInfo) $ fmap varP upnames- let unwrapExp1 [] = error "Should not happen"- unwrapExp1 [_] = error "Should not happen"- unwrapExp1 [x, y] =- [|(unsafeCoerce $(varE x), unsafeCoerce $(varE y))|]- unwrapExp1 (x : xs) = [|(unsafeCoerce $(varE x), $(unwrapExp1 xs))|]- let unwrapFun = lamE [unwrapPat] (unwrapExp1 upnames)- let strategy1 [] = error "Should not happen"- strategy1 [x] = return x- strategy1 (x : xs) =- [|- product2Strategy- ((,))- (\(x, y) -> (x, y))- $(return x)- $(strategy1 xs)- |]- [|- product2Strategy- $wrapFun- $unwrapFun- $(return x)- $(strategy1 xs)- |]--genMergeFunClause' :: Name -> ConstructorInfo -> Q Clause-genMergeFunClause' conInfoName con = do- let numExistential = length $ constructorVars con- let numFields = length $ constructorFields con- let argWildCards = replicate numExistential wildP :: [Q Pat]-- pnames <- replicateM numFields $ newName "s"- clause- ([conP conInfoName $ argWildCards ++ fmap varP pnames])- (normalB (constructMergingStrategyExp con (map VarE pnames)))- []--constructVarPats :: ConstructorInfo -> Q Pat-constructVarPats conInfo = do- let fields = constructorFields conInfo- capture n = return $ SigP WildP $ fields !! n- conP (constructorName conInfo) $ capture <$> [0 .. length fields - 1]--genMergingInfoFunClause' ::- [(Type, Kind)] -> Name -> ConstructorInfo -> Q Clause-genMergingInfoFunClause' argTypes conInfoName con = do- let conVars = constructorVars con- capturedVarTyReps <-- traverse (\bndr -> [|typeRep @($(varT $ tvName bndr))|]) conVars- varPat <- constructVarPats con- let infoExpWithTypeReps = foldl AppE (ConE conInfoName) capturedVarTyReps-- let fields = constructorFields con- let usedArgs = S.fromList $ freeVariables fields-- strategyNames <-- traverse- ( \(ty, _) ->- case ty of- VarT nm ->- if S.member nm usedArgs- then do- pname <- newName "p"- return (nm, Just pname)- else return ('undefined, Nothing)- _ -> return ('undefined, Nothing)- )- argTypes- let argToStrategyPat =- mapMaybe (\(nm, mpat) -> fmap (nm,) mpat) strategyNames- let strategyPats = fmap (maybe WildP VarP . snd) strategyNames-- let argNameSet =- S.fromList $- mapMaybe- ( \(ty, _) -> case ty of- VarT nm -> Just nm- _ -> Nothing- )- argTypes- let containsArg :: Type -> Bool- containsArg ty =- S.intersection argNameSet (S.fromList (freeVariables [ty])) /= S.empty- let typeHasNoArg = not . containsArg-- let fieldStrategyExp ty =- if not (containsArg ty)- then [|rootStrategy :: MergingStrategy $(return ty)|]- else case ty of- _- | typeHasNoArg ty ->- [|rootStrategy :: MergingStrategy $(return ty)|]- AppT a b- | typeHasNoArg a ->- [|- liftRootStrategy- $(fieldStrategyExp b) ::- MergingStrategy $(return ty)- |]- AppT (AppT a b) c- | typeHasNoArg a ->- [|- liftRootStrategy2- $(fieldStrategyExp b)- $(fieldStrategyExp c) ::- MergingStrategy $(return ty)- |]- AppT (AppT (AppT a b) c) d- | typeHasNoArg a ->- [|- liftRootStrategy3- $(fieldStrategyExp b)- $(fieldStrategyExp c)- $(fieldStrategyExp d) ::- MergingStrategy $(return ty)- |]- VarT nm -> do- case lookup nm argToStrategyPat of- Just pname -> varE pname- _ -> fail "BUG: fieldStrategyExp"- _ -> fail $ "fieldStrategyExp: unsupported type: " <> show ty- fieldStrategyExps <- traverse fieldStrategyExp fields- let infoExp = foldl AppE infoExpWithTypeReps fieldStrategyExps- -- fail $ show infoExp- return $ Clause (strategyPats ++ [varPat]) (NormalB infoExp) []--mergeableFieldFunExp :: [Name] -> FieldFunExp-mergeableFieldFunExp unaryOpFunNames argToFunPat _ = go- where- go ty = do- let allArgNames = M.keysSet argToFunPat- let typeHasNoArg ty =- S.fromList (freeVariables [ty])- `S.intersection` allArgNames- == S.empty- let fun0a a = [|$(varE $ head unaryOpFunNames) @($(return a))|]- fun1a a b = [|$(varE $ unaryOpFunNames !! 1) @($(return a)) $(go b)|]- fun2a a b c =- [|- $(varE $ unaryOpFunNames !! 2)- @($(return a))- $(go b)- $(go c)- |]- fun3a a b c d =- [|- $(varE $ unaryOpFunNames !! 3)- @($(return a))- $(go b)- $(go c)- $(go d)- |]-- case ty of- AppT (AppT (AppT a@(VarT _) b) c) d -> fun3a a b c d- AppT (AppT a@(VarT _) b) c -> fun2a a b c- AppT a@(VarT _) b -> fun1a a b- _ | typeHasNoArg ty -> fun0a ty- AppT a b | typeHasNoArg a -> fun1a a b- AppT (AppT a b) c | typeHasNoArg a -> fun2a a b c- AppT (AppT (AppT a b) c) d | typeHasNoArg a -> fun3a a b c d- VarT nm -> case M.lookup nm argToFunPat of- Just pname -> varE pname- _ -> fail $ "defaultFieldFunExp: unsupported type: " <> show ty- _ -> fail $ "defaultFieldFunExp: unsupported type: " <> show ty--mergeableNoExistentialConfig :: UnaryOpClassConfig-mergeableNoExistentialConfig =- UnaryOpClassConfig- { unaryOpConfigs =- [ UnaryOpConfig- MergeableNoExistentialConfig- { mergeableNoExistentialFun =- mergeableFieldFunExp- [ 'rootStrategy,- 'liftRootStrategy,- 'liftRootStrategy2,- 'liftRootStrategy3- ]- }- [ 'rootStrategy,- 'liftRootStrategy,- 'liftRootStrategy2,- 'liftRootStrategy3- ]- ],- unaryOpInstanceNames =- [''Mergeable, ''Mergeable1, ''Mergeable2, ''Mergeable3],- unaryOpExtraVars = const $ return [],- unaryOpInstanceTypeFromConfig = defaultUnaryOpInstanceTypeFromConfig,- unaryOpAllowExistential = False- }--newtype MergeableNoExistentialConfig = MergeableNoExistentialConfig- { mergeableNoExistentialFun :: FieldFunExp- }--instance UnaryOpFunConfig MergeableNoExistentialConfig where- genUnaryOpFun- _- MergeableNoExistentialConfig {..}- funNames- n- _- _- argTypes- _- constructors = do- allFields <-- mapM resolveTypeSynonyms $- concatMap constructorFields constructors- let usedArgs = S.fromList $ freeVariables allFields- args <-- traverse- ( \(ty, _) -> do- case ty of- VarT nm ->- if S.member nm usedArgs- then do- pname <- newName "p"- return (nm, Just pname)- else return ('undefined, Nothing)- _ -> return ('undefined, Nothing)- )- argTypes- let argToFunPat =- M.fromList $ mapMaybe (\(nm, mpat) -> fmap (nm,) mpat) args- let funPats = fmap (maybe WildP VarP . snd) args- let genAuxFunExp conInfo = do- fields <- mapM resolveTypeSynonyms $ constructorFields conInfo- defaultFieldFunExps <-- traverse- (mergeableNoExistentialFun argToFunPat M.empty)- fields- constructMergingStrategyExp conInfo defaultFieldFunExps- auxExps <- mapM genAuxFunExp constructors- funExp <- case auxExps of- [] -> [|NoStrategy|]- [singleExp] -> return singleExp- _ -> do- p <- newName "p"- let numConstructors = length constructors- let getIdx i =- if numConstructors <= 2- then if i == 0 then [|False|] else [|True|]- else integerE i- let getIdxPat i =- if numConstructors <= 2- then conP (if i == 0 then 'False else 'True) []- else do- let w8Bound = fromIntegral (maxBound @Word8)- let w16Bound = fromIntegral (maxBound @Word16)- let w32Bound = fromIntegral (maxBound @Word32)- let w64Bound = fromIntegral (maxBound @Word64)- sigP- (litP (integerL i))- ( conT $- if- | numConstructors <= w8Bound + 1 -> ''Word8- | numConstructors <= w16Bound + 1 -> ''Word16- | numConstructors <= w32Bound + 1 -> ''Word32- | numConstructors <= w64Bound + 1 -> ''Word64- | otherwise -> ''Integer- )- let idxFun =- lamE [varP p] $- caseE- (varE p)- ( zipWith- ( \conIdx conInfo -> do- match- (recP (constructorName conInfo) [])- (normalB (getIdx conIdx))- []- )- [0 ..]- constructors- )- let auxFun =- lamE [varP p] $- caseE- (varE p)- ( zipWith- ( \conIdx exp -> do- match- (getIdxPat conIdx)- (normalB (return exp))- []- )- [0 ..]- auxExps- ++ [match wildP (normalB [|undefined|]) []]- )- [|- SortedStrategy $idxFun $auxFun- |]- let instanceFunName = funNames !! n- return $- FunD- instanceFunName- [ Clause- funPats- (NormalB funExp)- []- ]---- | Generate 'Mergeable' instance for a GADT, using a given merging info--- result.-genMergeable' ::- DeriveConfig -> MergingInfoResult -> Name -> Int -> Q (Name, [Dec])-genMergeable' deriveConfig (MergingInfoResult infoName conInfoNames) typName n = do- result@CheckArgsResult {..} <-- specializeResult (evalModeSpecializeList deriveConfig)- =<< checkArgs "Mergeable" 3 typName True n-- d <- reifyDatatype typName- let ctxForVar :: (Type, Kind) -> Q (Maybe Pred)- ctxForVar (ty, kind) = case kind of- StarT -> Just <$> [t|Mergeable $(return ty)|]- AppT (AppT ArrowT StarT) StarT ->- Just <$> [t|Mergeable1 $(return ty)|]- AppT (AppT (AppT ArrowT StarT) StarT) StarT ->- Just <$> [t|Mergeable2 $(return ty)|]- AppT (AppT (AppT (AppT ArrowT StarT) StarT) StarT) StarT ->- Just <$> [t|Mergeable3 $(return ty)|]- AppT (AppT (AppT (AppT ArrowT StarT) StarT) StarT) _ ->- fail $ "Unsupported kind: " <> show kind- _ -> return Nothing- let isTypeUsedInFields (VarT nm) = isVarUsedInFields result nm- isTypeUsedInFields _ = False- mergeableContexts <-- traverse ctxForVar $ filter (isTypeUsedInFields . fst) keptVars-- let instanceName =- case n of- 0 -> ''Mergeable- 1 -> ''Mergeable1- 2 -> ''Mergeable2- 3 -> ''Mergeable3- _ -> error "Unsupported n"-- let instanceHead = ConT instanceName- extraPreds <-- extraConstraint- deriveConfig- typName- instanceName- []- keptVars- constructors-- let targetType =- foldl- (\ty (var, _) -> AppT ty var)- (ConT typName)- (keptVars ++ argVars)- let infoType = ConT infoName- let mergingInfoFunFinalType = AppT (AppT ArrowT targetType) infoType-- let mergingInfoFunTypeWithoutCtx =- foldr- (((AppT . AppT ArrowT) . AppT (ConT ''MergingStrategy)) . fst)- mergingInfoFunFinalType- argVars-- let mergingInfoFunType =- ForallT- ( mapMaybe- ( \(ty, knd) -> case ty of- VarT nm -> Just $ kindedTVSpecified nm knd- _ -> Nothing- )- $ keptVars ++ argVars- )- (extraPreds ++ catMaybes mergeableContexts)- mergingInfoFunTypeWithoutCtx- let mangledName = mangleName (datatypeName d)- let mergingInfoFunName =- mkName $- "mergingInfo"- <> (if n /= 0 then show n else "")- <> mangledName- let mergingInfoFunSigD = SigD mergingInfoFunName mergingInfoFunType- clauses <-- traverse (uncurry (genMergingInfoFunClause' argVars)) $- zip conInfoNames constructors- let mergingInfoFunDec = FunD mergingInfoFunName clauses-- let mergeFunType =- AppT (AppT ArrowT infoType) (AppT (ConT ''MergingStrategy) targetType)- let mergeFunName =- mkName $- "merge"- <> (if n /= 0 then show n else "")- <> mangledName- let mergeFunSigD = SigD mergeFunName mergeFunType- mergeFunClauses <- zipWithM genMergeFunClause' conInfoNames constructors- let mergeFunDec = FunD mergeFunName mergeFunClauses-- let instanceType =- AppT- instanceHead- (foldl AppT (ConT typName) $ fmap fst keptVars)-- let mergeInstanceFunName = case n of- 0 -> 'rootStrategy- 1 -> 'liftRootStrategy- 2 -> 'liftRootStrategy2- 3 -> 'liftRootStrategy3- _ -> error "Unsupported n"- mergeInstanceFunPatNames <- replicateM n $ newName "rootStrategy"- let mergeInstanceFunPats = VarP <$> mergeInstanceFunPatNames-- mergeInstanceFunBody <-- [|- SortedStrategy- $( foldM- (\exp name -> appE (return exp) $ varE name)- (VarE mergingInfoFunName)- mergeInstanceFunPatNames- )- $(varE mergeFunName)- |]-- let mergeInstanceFunClause =- Clause mergeInstanceFunPats (NormalB mergeInstanceFunBody) []-- return- ( mergingInfoFunName,- [ PragmaD (InlineP mergingInfoFunName Inline FunLike AllPhases),- mergingInfoFunSigD,- mergingInfoFunDec,- PragmaD (InlineP mergeFunName Inline FunLike AllPhases),- mergeFunSigD,- mergeFunDec,- InstanceD- Nothing- (extraPreds ++ catMaybes mergeableContexts)- instanceType- [FunD mergeInstanceFunName [mergeInstanceFunClause]]- ]- )---- | Generate 'Mergeable' instance for a GADT without existential variables.-genMergeableNoExistential :: DeriveConfig -> Name -> Int -> Q [Dec]-genMergeableNoExistential deriveConfig typName n = do- genUnaryOpClass deriveConfig mergeableNoExistentialConfig n typName---- | Generate 'Mergeable' instance for a GADT.-genMergeable :: DeriveConfig -> Name -> Int -> Q [Dec]-genMergeable deriveConfig typName n = do- hasExistential <- dataTypeHasExistential typName- if hasExistential- then do- (infoResult, infoDec) <- genMergingInfo typName- (_, decs) <- genMergeable' deriveConfig infoResult typName n- return $ infoDec ++ decs- else genMergeableNoExistential deriveConfig typName n---- | Derive 'Mergeable' instance for GADT.-deriveGADTMergeable :: DeriveConfig -> Name -> Q [Dec]-deriveGADTMergeable deriveConfig nm = genMergeable deriveConfig nm 0---- | Derive 'Mergeable1' instance for GADT.-deriveGADTMergeable1 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTMergeable1 deriveConfig nm = genMergeable deriveConfig nm 1---- | Derive 'Mergeable2' instance for GADT.-deriveGADTMergeable2 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTMergeable2 deriveConfig nm = genMergeable deriveConfig nm 2---- | Derive 'Mergeable3' instance for GADT.-deriveGADTMergeable3 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTMergeable3 deriveConfig nm = genMergeable deriveConfig nm 3
− src/Grisette/Internal/TH/GADT/DeriveNFData.hs
@@ -1,82 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}---- |--- Module : Grisette.Internal.TH.GADT.DeriveNFData--- Copyright : (c) Sirui Lu 2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.TH.GADT.DeriveNFData- ( deriveGADTNFData,- deriveGADTNFData1,- deriveGADTNFData2,- )-where--import Control.DeepSeq (NFData (rnf), NFData1 (liftRnf), NFData2 (liftRnf2))-import Grisette.Internal.TH.GADT.Common (DeriveConfig)-import Grisette.Internal.TH.GADT.UnaryOpCommon- ( UnaryOpClassConfig- ( UnaryOpClassConfig,- unaryOpAllowExistential,- unaryOpConfigs,- unaryOpExtraVars,- unaryOpInstanceNames,- unaryOpInstanceTypeFromConfig- ),- UnaryOpConfig (UnaryOpConfig),- UnaryOpFieldConfig- ( UnaryOpFieldConfig,- extraLiftedPatNames,- extraPatNames,- fieldCombineFun,- fieldFunExp,- fieldResFun- ),- defaultFieldFunExp,- defaultFieldResFun,- defaultUnaryOpInstanceTypeFromConfig,- genUnaryOpClass,- )-import Language.Haskell.TH (Dec, Name)-import Language.Haskell.TH.Syntax (Q)--nfdataConfig :: UnaryOpClassConfig-nfdataConfig =- UnaryOpClassConfig- { unaryOpConfigs =- [ UnaryOpConfig- UnaryOpFieldConfig- { extraPatNames = [],- extraLiftedPatNames = const [],- fieldCombineFun = \_ _ _ _ exps -> do- r <-- foldl- (\acc exp -> [|$acc `seq` $(return exp)|])- ([|()|])- exps- return (r, []),- fieldResFun = defaultFieldResFun,- fieldFunExp = defaultFieldFunExp ['rnf, 'liftRnf, 'liftRnf2]- }- ['rnf, 'liftRnf, 'liftRnf2]- ],- unaryOpInstanceNames = [''NFData, ''NFData1, ''NFData2],- unaryOpExtraVars = const $ return [],- unaryOpInstanceTypeFromConfig = defaultUnaryOpInstanceTypeFromConfig,- unaryOpAllowExistential = True- }---- | Derive 'NFData' instance for a GADT.-deriveGADTNFData :: DeriveConfig -> Name -> Q [Dec]-deriveGADTNFData deriveConfig = genUnaryOpClass deriveConfig nfdataConfig 0---- | Derive 'NFData1' instance for a GADT.-deriveGADTNFData1 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTNFData1 deriveConfig = genUnaryOpClass deriveConfig nfdataConfig 1---- | Derive 'NFData2' instance for a GADT.-deriveGADTNFData2 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTNFData2 deriveConfig = genUnaryOpClass deriveConfig nfdataConfig 2
− src/Grisette/Internal/TH/GADT/DeriveOrd.hs
@@ -1,78 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TupleSections #-}---- |--- Module : Grisette.Internal.TH.GADT.DeriveOrd--- Copyright : (c) Sirui Lu 2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.TH.GADT.DeriveOrd- ( deriveGADTOrd,- deriveGADTOrd1,- deriveGADTOrd2,- )-where--import Data.Functor.Classes (Ord1 (liftCompare), Ord2 (liftCompare2))-import Grisette.Internal.TH.GADT.BinaryOpCommon- ( BinaryOpClassConfig- ( BinaryOpClassConfig,- binaryOpAllowSumType,- binaryOpFieldConfigs,- binaryOpInstanceNames- ),- BinaryOpFieldConfig- ( BinaryOpFieldConfig,- extraPatNames,- fieldCombineFun,- fieldDifferentExistentialFun,- fieldFunExp,- fieldFunNames,- fieldLMatchResult,- fieldRMatchResult,- fieldResFun- ),- binaryOpAllowExistential,- defaultFieldFunExp,- genBinaryOpClass,- )-import Grisette.Internal.TH.GADT.Common (DeriveConfig)-import Language.Haskell.TH (Dec, Exp (ListE), Name, Q)--ordConfig :: BinaryOpClassConfig-ordConfig =- BinaryOpClassConfig- { binaryOpFieldConfigs =- [ BinaryOpFieldConfig- { extraPatNames = [],- fieldResFun = \_ (lhs, rhs) f ->- (,[]) <$> [|$(return f) $(return lhs) $(return rhs)|],- fieldCombineFun = \_ lst ->- (,[]) <$> [|mconcat $(return $ ListE lst)|],- fieldDifferentExistentialFun = return,- fieldFunExp =- defaultFieldFunExp ['compare, 'liftCompare, 'liftCompare2],- fieldFunNames = ['compare, 'liftCompare, 'liftCompare2],- fieldLMatchResult = [|LT|],- fieldRMatchResult = [|GT|]- }- ],- binaryOpInstanceNames = [''Ord, ''Ord1, ''Ord2],- binaryOpAllowSumType = True,- binaryOpAllowExistential = True- }---- | Derive 'Ord' instance for a GADT.-deriveGADTOrd :: DeriveConfig -> Name -> Q [Dec]-deriveGADTOrd deriveConfig = genBinaryOpClass deriveConfig ordConfig 0---- | Derive 'Ord1' instance for a GADT.-deriveGADTOrd1 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTOrd1 deriveConfig = genBinaryOpClass deriveConfig ordConfig 1---- | Derive 'Ord2' instance for a GADT.-deriveGADTOrd2 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTOrd2 deriveConfig = genBinaryOpClass deriveConfig ordConfig 2
− src/Grisette/Internal/TH/GADT/DerivePPrint.hs
@@ -1,195 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TupleSections #-}---- |--- Module : Grisette.Internal.TH.GADT.DerivePPrint--- Copyright : (c) Sirui Lu 2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.TH.GADT.DerivePPrint- ( deriveGADTPPrint,- deriveGADTPPrint1,- deriveGADTPPrint2,- )-where--import Data.Maybe (fromMaybe)-import Data.String (IsString (fromString))-import GHC.Show (appPrec1)-import Grisette.Internal.Internal.Decl.Core.Data.Class.PPrint- ( PPrint (pformatList, pformatPrec),- PPrint1 (liftPFormatList, liftPFormatPrec),- PPrint2 (liftPFormatList2, liftPFormatPrec2),- align,- condEnclose,- flatAlt,- group,- groupedEnclose,- nest,- pformatWithConstructorNoAlign,- vcat,- vsep,- (<+>),- )-import Grisette.Internal.TH.GADT.Common (DeriveConfig)-import Grisette.Internal.TH.GADT.ShowPPrintCommon (showPrintFieldFunExp)-import Grisette.Internal.TH.GADT.UnaryOpCommon- ( UnaryOpClassConfig- ( UnaryOpClassConfig,- unaryOpAllowExistential,- unaryOpConfigs,- unaryOpExtraVars,- unaryOpInstanceNames,- unaryOpInstanceTypeFromConfig- ),- UnaryOpConfig (UnaryOpConfig),- UnaryOpFieldConfig- ( UnaryOpFieldConfig,- extraLiftedPatNames,- extraPatNames,- fieldCombineFun,- fieldFunExp,- fieldResFun- ),- defaultUnaryOpInstanceTypeFromConfig,- genUnaryOpClass,- )-import Grisette.Internal.TH.Util (integerE, isNonUnitTuple)-import Language.Haskell.TH- ( Dec,- Exp (ListE),- Fixity (Fixity),- Name,- defaultFixity,- listE,- nameBase,- stringE,- )-import Language.Haskell.TH.Datatype- ( ConstructorVariant (InfixConstructor, NormalConstructor, RecordConstructor),- reifyFixityCompat,- )-import Language.Haskell.TH.Syntax (Q)--pprintConfig :: UnaryOpClassConfig-pprintConfig =- UnaryOpClassConfig- { unaryOpConfigs =- [ UnaryOpConfig- UnaryOpFieldConfig- { extraPatNames = ["prec"],- extraLiftedPatNames = \i -> (["pl" | i /= 0]),- fieldCombineFun = \_ variant conName [prec] exps -> do- let initExps =- (\e -> [|$(return e) <> "," <> flatAlt "" " "|])- <$> init exps- lastExp = [|$(return $ last exps)|]- commaSeped = initExps ++ [lastExp]- case (variant, exps) of- (NormalConstructor, []) -> do- r <- [|fromString $(stringE $ nameBase conName)|]- return (r, [False])- (NormalConstructor, [exp]) -> do- r <-- [|- pformatWithConstructorNoAlign- $(return prec)- $(stringE $ nameBase conName)- [$(return exp)]- |]- return (r, [True])- (NormalConstructor, _) | isNonUnitTuple conName -> do- r <- [|groupedEnclose "(" ")" $ vcat $ $(listE commaSeped)|]- return (r, [False])- (NormalConstructor, _) -> do- r <-- [|- pformatWithConstructorNoAlign- $(return prec)- $(stringE $ nameBase conName)- [vsep $(return $ ListE exps)]- |]- return (r, [True])- (RecordConstructor _, _) -> do- r <-- [|- pformatWithConstructorNoAlign- $(return prec)- $(stringE $ nameBase conName)- [groupedEnclose "{" "}" $ vcat $ $(listE commaSeped)]- |]- return (r, [True])- (InfixConstructor, [l, r]) -> do- fi <-- fromMaybe defaultFixity `fmap` reifyFixityCompat conName- let conPrec = case fi of Fixity prec _ -> prec- r <-- [|- group- $ condEnclose- ($(return prec) > $(integerE conPrec))- "("- ")"- $ nest 2- $ vsep- [ align $ $(return l),- fromString $(stringE $ nameBase conName)- <+> $(return r)- ]- |]- return (r, [True])- _ ->- fail "deriveGADTPPrint: unexpected constructor variant",- fieldResFun = \variant conName _ pos fieldPat fieldFun -> do- let makePPrintField p =- [|- $(return fieldFun)- $(integerE p)- $(return fieldPat)- |]- let attachUsedInfo = ((,[False]) <$>)- case variant of- NormalConstructor- | isNonUnitTuple conName ->- attachUsedInfo $ makePPrintField 0- NormalConstructor ->- attachUsedInfo $ makePPrintField appPrec1- RecordConstructor names ->- attachUsedInfo- [|- fromString $(stringE $ nameBase (names !! pos) ++ " = ")- <> $(makePPrintField 0)- |]- InfixConstructor -> do- fi <-- fromMaybe defaultFixity `fmap` reifyFixityCompat conName- let conPrec = case fi of Fixity prec _ -> prec- attachUsedInfo $ makePPrintField (conPrec + 1),- fieldFunExp =- showPrintFieldFunExp- ['pformatPrec, 'liftPFormatPrec, 'liftPFormatPrec2]- ['pformatList, 'liftPFormatList, 'liftPFormatList2]- }- ['pformatPrec, 'liftPFormatPrec, 'liftPFormatPrec2]- ],- unaryOpExtraVars = const $ return [],- unaryOpInstanceNames = [''PPrint, ''PPrint1, ''PPrint2],- unaryOpInstanceTypeFromConfig = defaultUnaryOpInstanceTypeFromConfig,- unaryOpAllowExistential = True- }---- | Derive 'PPrint' instance for a GADT.-deriveGADTPPrint :: DeriveConfig -> Name -> Q [Dec]-deriveGADTPPrint deriveConfig = genUnaryOpClass deriveConfig pprintConfig 0---- | Derive 'PPrint1' instance for a GADT.-deriveGADTPPrint1 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTPPrint1 deriveConfig = genUnaryOpClass deriveConfig pprintConfig 1---- | Derive 'PPrint2' instance for a GADT.-deriveGADTPPrint2 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTPPrint2 deriveConfig = genUnaryOpClass deriveConfig pprintConfig 2
− src/Grisette/Internal/TH/GADT/DeriveSerial.hs
@@ -1,203 +0,0 @@-{-# LANGUAGE RecordWildCards #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TupleSections #-}---- |--- Module : Grisette.Internal.TH.GADT.DeriveSerial--- Copyright : (c) Sirui Lu 2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.TH.GADT.DeriveSerial- ( deriveGADTSerial,- deriveGADTSerial1,- deriveGADTSerial2,- )-where--import Control.Monad (zipWithM)-import Data.Bytes.Serial- ( Serial (deserialize, serialize),- Serial1 (deserializeWith, serializeWith),- Serial2 (deserializeWith2, serializeWith2),- )-import qualified Data.Map as M-import Data.Maybe (mapMaybe)-import qualified Data.Set as S-import Grisette.Internal.TH.GADT.Common (DeriveConfig)-import Grisette.Internal.TH.GADT.UnaryOpCommon- ( FieldFunExp,- UnaryOpClassConfig- ( UnaryOpClassConfig,- unaryOpAllowExistential,- unaryOpConfigs,- unaryOpExtraVars,- unaryOpInstanceNames,- unaryOpInstanceTypeFromConfig- ),- UnaryOpConfig (UnaryOpConfig),- UnaryOpFieldConfig- ( UnaryOpFieldConfig,- extraLiftedPatNames,- extraPatNames,- fieldCombineFun,- fieldFunExp,- fieldResFun- ),- UnaryOpFunConfig (genUnaryOpFun),- defaultFieldFunExp,- defaultUnaryOpInstanceTypeFromConfig,- genUnaryOpClass,- )-import Grisette.Internal.TH.Util (integerE)-import Language.Haskell.TH- ( Body (NormalB),- Clause (Clause),- Dec (FunD),- Lit (IntegerL),- Match (Match),- Name,- Pat (LitP, VarP, WildP),- Q,- Type (VarT),- bindS,- caseE,- conE,- conT,- doE,- match,- mkName,- newName,- noBindS,- normalB,- sigP,- varE,- varP,- wildP,- )-import Language.Haskell.TH.Datatype- ( ConstructorInfo (constructorFields, constructorName),- TypeSubstitution (freeVariables),- resolveTypeSynonyms,- )--newtype UnaryOpDeserializeConfig = UnaryOpDeserializeConfig- {fieldDeserializeFun :: FieldFunExp}--instance UnaryOpFunConfig UnaryOpDeserializeConfig where- genUnaryOpFun- _- UnaryOpDeserializeConfig {..}- funNames- n- _- _- argTypes- _- constructors = do- allFields <-- mapM resolveTypeSynonyms $- concatMap constructorFields constructors- let usedArgs = S.fromList $ freeVariables allFields- args <-- traverse- ( \(ty, _) -> do- case ty of- VarT nm ->- if S.member nm usedArgs- then do- pname <- newName "p"- return (nm, Just pname)- else return ('undefined, Nothing)- _ -> return ('undefined, Nothing)- )- argTypes- let argToFunPat =- M.fromList $ mapMaybe (\(nm, mpat) -> fmap (nm,) mpat) args- let funPats = fmap (maybe WildP VarP . snd) args- let genAuxFunMatch conIdx conInfo = do- fields <- mapM resolveTypeSynonyms $ constructorFields conInfo- defaultFieldFunExps <-- traverse- (fieldDeserializeFun argToFunPat M.empty)- fields- let conName = constructorName conInfo- exp <-- foldl- (\exp fieldFun -> [|$exp <*> $(return fieldFun)|])- [|return $(conE conName)|]- defaultFieldFunExps- return $ Match (LitP (IntegerL conIdx)) (NormalB exp) []- auxMatches <- zipWithM genAuxFunMatch [0 ..] constructors- auxFallbackMatch <- match wildP (normalB [|undefined|]) []- let instanceFunName = funNames !! n- -- let auxFunName = mkName "go"- let selName = mkName "sel"- exp <-- doE- [ bindS- (sigP (varP selName) (conT ''Int))- [|deserialize|],- noBindS $- caseE (varE selName) $- return <$> auxMatches ++ [auxFallbackMatch]- ]- return $- FunD- instanceFunName- [ Clause- funPats- (NormalB exp)- []- ]--serialConfig :: UnaryOpClassConfig-serialConfig =- UnaryOpClassConfig- { unaryOpConfigs =- [ UnaryOpConfig- UnaryOpFieldConfig- { extraPatNames = [],- extraLiftedPatNames = const [],- fieldCombineFun = \conIdx _ _ [] exp -> do- r <-- foldl- (\r exp -> [|$r >> $(return exp)|])- ([|serialize ($(integerE conIdx) :: Int)|])- exp- return (r, [True]),- fieldResFun = \_ _ _ _ fieldPat fieldFun -> do- r <- [|$(return fieldFun) $(return fieldPat)|]- return (r, [True]),- fieldFunExp =- defaultFieldFunExp- ['serialize, 'serializeWith, 'serializeWith2]- }- ['serialize, 'serializeWith, 'serializeWith2],- UnaryOpConfig- UnaryOpDeserializeConfig- { fieldDeserializeFun =- defaultFieldFunExp- ['deserialize, 'deserializeWith, 'deserializeWith2]- }- ['deserialize, 'deserializeWith, 'deserializeWith2]- ],- unaryOpInstanceNames = [''Serial, ''Serial1, ''Serial2],- unaryOpExtraVars = const $ return [],- unaryOpInstanceTypeFromConfig = defaultUnaryOpInstanceTypeFromConfig,- unaryOpAllowExistential = False- }---- | Derive 'Serial' instance for a GADT.-deriveGADTSerial :: DeriveConfig -> Name -> Q [Dec]-deriveGADTSerial deriveConfig = genUnaryOpClass deriveConfig serialConfig 0---- | Derive 'Serial1' instance for a GADT.-deriveGADTSerial1 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTSerial1 deriveConfig = genUnaryOpClass deriveConfig serialConfig 1---- | Derive 'Serial2' instance for a GADT.-deriveGADTSerial2 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTSerial2 deriveConfig = genUnaryOpClass deriveConfig serialConfig 2
− src/Grisette/Internal/TH/GADT/DeriveShow.hs
@@ -1,195 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TupleSections #-}---- |--- Module : Grisette.Internal.TH.GADT.DeriveShow--- Copyright : (c) Sirui Lu 2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.TH.GADT.DeriveShow- ( deriveGADTShow,- deriveGADTShow1,- deriveGADTShow2,- )-where--import Data.Functor.Classes- ( Show1 (liftShowList, liftShowsPrec),- Show2 (liftShowList2, liftShowsPrec2),- )-import qualified Data.List as List-import Data.Maybe (fromMaybe)-import GHC.Show (appPrec, appPrec1)-import Grisette.Internal.TH.GADT.Common (DeriveConfig)-import Grisette.Internal.TH.GADT.ShowPPrintCommon (showPrintFieldFunExp)-import Grisette.Internal.TH.GADT.UnaryOpCommon- ( UnaryOpClassConfig- ( UnaryOpClassConfig,- unaryOpAllowExistential,- unaryOpConfigs,- unaryOpExtraVars,- unaryOpInstanceNames,- unaryOpInstanceTypeFromConfig- ),- UnaryOpConfig (UnaryOpConfig),- UnaryOpFieldConfig- ( UnaryOpFieldConfig,- extraLiftedPatNames,- extraPatNames,- fieldCombineFun,- fieldFunExp,- fieldResFun- ),- defaultUnaryOpInstanceTypeFromConfig,- genUnaryOpClass,- )-import Grisette.Internal.TH.Util (integerE, isNonUnitTuple)-import Language.Haskell.TH- ( Dec,- Fixity (Fixity),- Name,- Q,- defaultFixity,- integerL,- listE,- litE,- nameBase,- stringE,- )-import Language.Haskell.TH.Datatype- ( ConstructorVariant (InfixConstructor, NormalConstructor, RecordConstructor),- reifyFixityCompat,- )--showConfig :: UnaryOpClassConfig-showConfig =- UnaryOpClassConfig- { unaryOpConfigs =- [ UnaryOpConfig- UnaryOpFieldConfig- { extraPatNames = ["prec"],- extraLiftedPatNames = \i -> (["sl" | i /= 0]),- fieldCombineFun =- \_ variant conName [prec] exps -> do- case (variant, exps) of- (NormalConstructor, []) -> do- r <- [|showString $(stringE $ nameBase conName)|]- return (r, [False])- (NormalConstructor, [exp]) -> do- r <-- [|- showParen- ($(return prec) > $(integerE appPrec))- ( showString $(stringE $ nameBase conName)- . showChar ' '- . $(return exp)- )- |]- return (r, [True])- (NormalConstructor, _) | isNonUnitTuple conName -> do- let commaSeped =- List.intersperse [|showChar ','|] $- return <$> exps- r <-- [|- showChar '('- . foldr1 (.) $(listE commaSeped)- . showChar ')'- |]- return (r, [False])- (NormalConstructor, _) -> do- let spaceSeped =- List.intersperse [|showChar ' '|] $- return <$> exps- r <-- [|- showParen- ($(return prec) > $(integerE appPrec))- ( showString $(stringE $ nameBase conName)- . showChar ' '- . (foldr1 (.) $(listE spaceSeped))- )- |]- return (r, [True])- (RecordConstructor _, _) -> do- let commaSpaceSeped =- List.intersperse [|showString ", "|] $- return <$> exps- r <-- [|- showString $(stringE $ nameBase conName)- . showString " {"- . foldr1 (.) $(listE commaSpaceSeped)- . showString "}"- |]- return (r, [False])- (InfixConstructor, [l, r]) -> do- fi <-- fromMaybe defaultFixity `fmap` reifyFixityCompat conName- let conPrec = case fi of Fixity prec _ -> prec- r <-- [|- showParen- ($(return prec) > $(integerE conPrec))- ( $(return l)- . showChar ' '- . showString $(stringE $ nameBase conName)- . showChar ' '- . $(return r)- )- |]- return (r, [True])- _ ->- fail "deriveGADTShow: unexpected constructor variant",- fieldResFun = \variant conName _ pos fieldPat fieldFun -> do- let makeShowField p =- [|- $(return fieldFun)- $(litE $ integerL $ fromIntegral p)- $(return fieldPat)- |]- let attachUsedInfo = ((,[False]) <$>)- case variant of- NormalConstructor- | isNonUnitTuple conName ->- attachUsedInfo $ makeShowField 0- NormalConstructor ->- attachUsedInfo $ makeShowField appPrec1- RecordConstructor names ->- attachUsedInfo- [|- showString $(stringE $ nameBase (names !! pos) ++ " = ")- . $(makeShowField 0)- |]- InfixConstructor -> do- fi <-- fromMaybe defaultFixity `fmap` reifyFixityCompat conName- let conPrec = case fi of Fixity prec _ -> prec- attachUsedInfo $ makeShowField (conPrec + 1),- fieldFunExp =- showPrintFieldFunExp- ['showsPrec, 'liftShowsPrec, 'liftShowsPrec2]- ['showList, 'liftShowList, 'liftShowList2]- }- ['showsPrec, 'liftShowsPrec, 'liftShowsPrec2]- ],- unaryOpInstanceNames = [''Show, ''Show1, ''Show2],- unaryOpExtraVars = const $ return [],- unaryOpInstanceTypeFromConfig = defaultUnaryOpInstanceTypeFromConfig,- unaryOpAllowExistential = True- }---- | Derive 'Show' instance for a GADT.-deriveGADTShow :: DeriveConfig -> Name -> Q [Dec]-deriveGADTShow deriveConfig = genUnaryOpClass deriveConfig showConfig 0---- | Derive 'Show1' instance for a GADT.-deriveGADTShow1 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTShow1 deriveConfig = genUnaryOpClass deriveConfig showConfig 1---- | Derive 'Show2' instance for a GADT.-deriveGADTShow2 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTShow2 deriveConfig = genUnaryOpClass deriveConfig showConfig 2
− src/Grisette/Internal/TH/GADT/DeriveSimpleMergeable.hs
@@ -1,87 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TupleSections #-}---- |--- Module : Grisette.Internal.TH.GADT.DeriveSimpleMergeable--- Copyright : (c) Sirui Lu 2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.TH.GADT.DeriveSimpleMergeable- ( deriveGADTSimpleMergeable,- deriveGADTSimpleMergeable1,- deriveGADTSimpleMergeable2,- )-where--import Grisette.Internal.Internal.Decl.Core.Data.Class.SimpleMergeable- ( SimpleMergeable (mrgIte),- SimpleMergeable1 (liftMrgIte),- SimpleMergeable2 (liftMrgIte2),- )-import Grisette.Internal.TH.GADT.BinaryOpCommon- ( BinaryOpClassConfig- ( BinaryOpClassConfig,- binaryOpAllowSumType,- binaryOpFieldConfigs,- binaryOpInstanceNames- ),- BinaryOpFieldConfig- ( BinaryOpFieldConfig,- extraPatNames,- fieldCombineFun,- fieldDifferentExistentialFun,- fieldFunExp,- fieldFunNames,- fieldLMatchResult,- fieldRMatchResult,- fieldResFun- ),- binaryOpAllowExistential,- defaultFieldFunExp,- genBinaryOpClass,- )-import Grisette.Internal.TH.GADT.Common (DeriveConfig)-import Language.Haskell.TH (Dec, Exp (AppE, ConE), Name, Q)--simpleMergeableConfig :: BinaryOpClassConfig-simpleMergeableConfig =- BinaryOpClassConfig- { binaryOpFieldConfigs =- [ BinaryOpFieldConfig- { extraPatNames = ["c"],- fieldResFun = \[c] (lhs, rhs) f ->- (,[True])- <$> [|$(return f) $(return c) $(return lhs) $(return rhs)|],- fieldCombineFun =- \con lst -> return (foldl AppE (ConE con) lst, [False]),- fieldDifferentExistentialFun = const [|undefined|],- fieldFunExp =- defaultFieldFunExp ['mrgIte, 'liftMrgIte, 'liftMrgIte2],- fieldFunNames = ['mrgIte, 'liftMrgIte, 'liftMrgIte2],- fieldLMatchResult = [|undefined|],- fieldRMatchResult = [|undefined|]- }- ],- binaryOpInstanceNames =- [''SimpleMergeable, ''SimpleMergeable1, ''SimpleMergeable2],- binaryOpAllowSumType = False,- binaryOpAllowExistential = True- }---- | Derive 'SimpleMergeable' instance for a GADT.-deriveGADTSimpleMergeable :: DeriveConfig -> Name -> Q [Dec]-deriveGADTSimpleMergeable deriveConfig =- genBinaryOpClass deriveConfig simpleMergeableConfig 0---- | Derive 'SimpleMergeable1' instance for a GADT.-deriveGADTSimpleMergeable1 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTSimpleMergeable1 deriveConfig =- genBinaryOpClass deriveConfig simpleMergeableConfig 1---- | Derive 'SimpleMergeable2' instance for a GADT.-deriveGADTSimpleMergeable2 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTSimpleMergeable2 deriveConfig =- genBinaryOpClass deriveConfig simpleMergeableConfig 2
− src/Grisette/Internal/TH/GADT/DeriveSubstSym.hs
@@ -1,87 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}-{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}--{-# HLINT ignore "Unused LANGUAGE pragma" #-}---- |--- Module : Grisette.Internal.TH.GADT.DeriveSubstSym--- Copyright : (c) Sirui Lu 2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.TH.GADT.DeriveSubstSym- ( deriveGADTSubstSym,- deriveGADTSubstSym1,- deriveGADTSubstSym2,- )-where--import Grisette.Internal.Internal.Decl.Core.Data.Class.SubstSym- ( SubstSym (substSym),- SubstSym1 (liftSubstSym),- SubstSym2 (liftSubstSym2),- )-import Grisette.Internal.TH.GADT.Common (DeriveConfig)-import Grisette.Internal.TH.GADT.UnaryOpCommon- ( UnaryOpClassConfig- ( UnaryOpClassConfig,- unaryOpAllowExistential,- unaryOpConfigs,- unaryOpExtraVars,- unaryOpInstanceNames,- unaryOpInstanceTypeFromConfig- ),- UnaryOpConfig (UnaryOpConfig),- UnaryOpFieldConfig- ( UnaryOpFieldConfig,- extraLiftedPatNames,- extraPatNames,- fieldCombineFun,- fieldFunExp,- fieldResFun- ),- defaultFieldFunExp,- defaultFieldResFun,- defaultUnaryOpInstanceTypeFromConfig,- genUnaryOpClass,- )-import Language.Haskell.TH (Dec, Exp (AppE, ConE), Name)-import Language.Haskell.TH.Syntax (Q)--substSymConfig :: UnaryOpClassConfig-substSymConfig =- UnaryOpClassConfig- { unaryOpConfigs =- [ UnaryOpConfig- UnaryOpFieldConfig- { extraPatNames = ["symbol", "newVal"],- extraLiftedPatNames = const [],- fieldResFun = defaultFieldResFun,- fieldCombineFun = \_ _ con extraPat exp ->- return (foldl AppE (ConE con) exp, False <$ extraPat),- fieldFunExp =- defaultFieldFunExp- ['substSym, 'liftSubstSym, 'liftSubstSym2]- }- ['substSym, 'liftSubstSym, 'liftSubstSym2]- ],- unaryOpInstanceNames =- [''SubstSym, ''SubstSym1, ''SubstSym2],- unaryOpExtraVars = const $ return [],- unaryOpInstanceTypeFromConfig = defaultUnaryOpInstanceTypeFromConfig,- unaryOpAllowExistential = True- }---- | Derive 'SubstSym' instance for a GADT.-deriveGADTSubstSym :: DeriveConfig -> Name -> Q [Dec]-deriveGADTSubstSym deriveConfig = genUnaryOpClass deriveConfig substSymConfig 0---- | Derive 'SubstSym1' instance for a GADT.-deriveGADTSubstSym1 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTSubstSym1 deriveConfig = genUnaryOpClass deriveConfig substSymConfig 1---- | Derive 'SubstSym2' instance for a GADT.-deriveGADTSubstSym2 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTSubstSym2 deriveConfig = genUnaryOpClass deriveConfig substSymConfig 2
− src/Grisette/Internal/TH/GADT/DeriveSymEq.hs
@@ -1,85 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TupleSections #-}---- |--- Module : Grisette.Internal.TH.GADT.DeriveSymEq--- Copyright : (c) Sirui Lu 2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.TH.GADT.DeriveSymEq- ( deriveGADTSymEq,- deriveGADTSymEq1,- deriveGADTSymEq2,- )-where--import Grisette.Internal.Core.Data.Class.LogicalOp- ( LogicalOp (false, true, (.&&)),- )-import Grisette.Internal.Internal.Decl.Core.Data.Class.SymEq- ( SymEq ((.==)),- SymEq1 (liftSymEq),- SymEq2 (liftSymEq2),- )-import Grisette.Internal.TH.GADT.BinaryOpCommon- ( BinaryOpClassConfig- ( BinaryOpClassConfig,- binaryOpAllowSumType,- binaryOpFieldConfigs,- binaryOpInstanceNames- ),- BinaryOpFieldConfig- ( BinaryOpFieldConfig,- extraPatNames,- fieldCombineFun,- fieldDifferentExistentialFun,- fieldFunExp,- fieldFunNames,- fieldLMatchResult,- fieldRMatchResult,- fieldResFun- ),- binaryOpAllowExistential,- defaultFieldFunExp,- genBinaryOpClass,- )-import Grisette.Internal.TH.GADT.Common (DeriveConfig)-import Language.Haskell.TH (Dec, Exp (ListE), Name, Q)--symEqConfig :: BinaryOpClassConfig-symEqConfig =- BinaryOpClassConfig- { binaryOpFieldConfigs =- [ BinaryOpFieldConfig- { extraPatNames = [],- fieldResFun = \_ (lhs, rhs) f ->- (,[]) <$> [|$(return f) $(return lhs) $(return rhs)|],- fieldCombineFun =- \_ lst -> (,[]) <$> [|foldl (.&&) true $(return $ ListE lst)|],- fieldDifferentExistentialFun = const [|false|],- fieldFunExp =- defaultFieldFunExp ['(.==), 'liftSymEq, 'liftSymEq2],- fieldFunNames = ['(.==), 'liftSymEq, 'liftSymEq2],- fieldLMatchResult = [|false|],- fieldRMatchResult = [|false|]- }- ],- binaryOpInstanceNames = [''SymEq, ''SymEq1, ''SymEq2],- binaryOpAllowSumType = True,- binaryOpAllowExistential = True- }---- | Derive 'SymEq' instance for a GADT.-deriveGADTSymEq :: DeriveConfig -> Name -> Q [Dec]-deriveGADTSymEq deriveConfig = genBinaryOpClass deriveConfig symEqConfig 0---- | Derive 'SymEq1' instance for a GADT.-deriveGADTSymEq1 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTSymEq1 deriveConfig = genBinaryOpClass deriveConfig symEqConfig 1---- | Derive 'SymEq2' instance for a GADT.-deriveGADTSymEq2 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTSymEq2 deriveConfig = genBinaryOpClass deriveConfig symEqConfig 2
− src/Grisette/Internal/TH/GADT/DeriveSymOrd.hs
@@ -1,99 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TupleSections #-}---- |--- Module : Grisette.Internal.TH.GADT.DeriveSymOrd--- Copyright : (c) Sirui Lu 2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.TH.GADT.DeriveSymOrd- ( deriveGADTSymOrd,- deriveGADTSymOrd1,- deriveGADTSymOrd2,- )-where--import Grisette.Internal.Internal.Decl.Core.Data.Class.SymOrd- ( SymOrd (symCompare),- SymOrd1 (liftSymCompare),- SymOrd2 (liftSymCompare2),- )-import Grisette.Internal.Internal.Decl.Core.Data.Class.TryMerge- ( mrgSingle,- )-import Grisette.Internal.TH.GADT.BinaryOpCommon- ( BinaryOpClassConfig- ( BinaryOpClassConfig,- binaryOpAllowSumType,- binaryOpFieldConfigs,- binaryOpInstanceNames- ),- BinaryOpFieldConfig- ( BinaryOpFieldConfig,- extraPatNames,- fieldCombineFun,- fieldDifferentExistentialFun,- fieldFunExp,- fieldFunNames,- fieldLMatchResult,- fieldRMatchResult,- fieldResFun- ),- binaryOpAllowExistential,- defaultFieldFunExp,- genBinaryOpClass,- )-import Grisette.Internal.TH.GADT.Common (DeriveConfig)-import Language.Haskell.TH (Dec, Name, Q)--symOrdConfig :: BinaryOpClassConfig-symOrdConfig =- BinaryOpClassConfig- { binaryOpFieldConfigs =- [ BinaryOpFieldConfig- { extraPatNames = [],- fieldResFun =- \_ (lhs, rhs) f ->- (,[]) <$> [|$(return f) $(return lhs) $(return rhs)|],- fieldCombineFun =- \_ lst -> do- let go [] = [|mrgSingle EQ|]- go [x] = [|$(return x)|]- go (x : xs) =- [|- do- a <- $(return x)- case a of- EQ -> $(go xs)- _ -> mrgSingle a- |]- (,[]) <$> go lst,- fieldDifferentExistentialFun =- \exp -> [|mrgSingle $(return exp)|],- fieldFunExp =- defaultFieldFunExp- ['symCompare, 'liftSymCompare, 'liftSymCompare2],- fieldFunNames = ['symCompare, 'liftSymCompare, 'liftSymCompare2],- fieldLMatchResult = [|mrgSingle LT|],- fieldRMatchResult = [|mrgSingle GT|]- }- ],- binaryOpInstanceNames = [''SymOrd, ''SymOrd1, ''SymOrd2],- binaryOpAllowSumType = True,- binaryOpAllowExistential = True- }---- | Derive 'SymOrd' instance for a GADT.-deriveGADTSymOrd :: DeriveConfig -> Name -> Q [Dec]-deriveGADTSymOrd deriveConfig = genBinaryOpClass deriveConfig symOrdConfig 0---- | Derive 'SymOrd1' instance for a GADT.-deriveGADTSymOrd1 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTSymOrd1 deriveConfig = genBinaryOpClass deriveConfig symOrdConfig 1---- | Derive 'SymOrd2' instance for a GADT.-deriveGADTSymOrd2 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTSymOrd2 deriveConfig = genBinaryOpClass deriveConfig symOrdConfig 2
− src/Grisette/Internal/TH/GADT/DeriveToCon.hs
@@ -1,67 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}---- |--- Module : Grisette.Internal.TH.GADT.DeriveToCon--- Copyright : (c) Sirui Lu 2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.TH.GADT.DeriveToCon- ( deriveGADTToCon,- deriveGADTToCon1,- deriveGADTToCon2,- )-where--import Grisette.Internal.Internal.Decl.Core.Data.Class.ToCon- ( ToCon (toCon),- ToCon1 (liftToCon),- ToCon2 (liftToCon2),- )-import Grisette.Internal.TH.GADT.Common (DeriveConfig)-import Grisette.Internal.TH.GADT.ConvertOpCommon- ( ConvertOpClassConfig- ( ConvertOpClassConfig,- convertFieldCombineFun,- convertFieldFunExp,- convertFieldResFun,- convertOpFunNames,- convertOpInstanceNames,- convertOpTarget- ),- defaultFieldFunExp,- genConvertOpClass,- )-import Grisette.Internal.Unified.EvalModeTag (EvalModeTag (C))-import Language.Haskell.TH (Dec, Name, Q, conE)--toConClassConfig :: ConvertOpClassConfig-toConClassConfig =- ConvertOpClassConfig- { convertFieldResFun = \v f -> [|$(return f) $(return v)|],- convertFieldCombineFun = \f args ->- foldl- (\acc arg -> [|$(acc) <*> $arg|])- [|return $(conE f)|]- $ fmap return args,- convertFieldFunExp = defaultFieldFunExp ['toCon, 'liftToCon, 'liftToCon2],- convertOpTarget = C,- convertOpInstanceNames = [''ToCon, ''ToCon1, ''ToCon2],- convertOpFunNames = ['toCon, 'liftToCon, 'liftToCon2]- }---- | Derive 'ToCon' instance for a GADT.-deriveGADTToCon :: DeriveConfig -> Name -> Q [Dec]-deriveGADTToCon deriveConfig = genConvertOpClass deriveConfig toConClassConfig 0---- | Derive 'ToCon1' instance for a GADT.-deriveGADTToCon1 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTToCon1 deriveConfig =- genConvertOpClass deriveConfig toConClassConfig 1---- | Derive 'ToCon2' instance for a GADT.-deriveGADTToCon2 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTToCon2 deriveConfig =- genConvertOpClass deriveConfig toConClassConfig 2
− src/Grisette/Internal/TH/GADT/DeriveToSym.hs
@@ -1,67 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}-{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}--{-# HLINT ignore "Unused LANGUAGE pragma" #-}---- |--- Module : Grisette.Internal.TH.GADT.DeriveToSym--- Copyright : (c) Sirui Lu 2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.TH.GADT.DeriveToSym- ( deriveGADTToSym,- deriveGADTToSym1,- deriveGADTToSym2,- )-where--import Grisette.Internal.Internal.Decl.Core.Data.Class.ToSym- ( ToSym (toSym),- ToSym1 (liftToSym),- ToSym2 (liftToSym2),- )-import Grisette.Internal.TH.GADT.Common (DeriveConfig)-import Grisette.Internal.TH.GADT.ConvertOpCommon- ( ConvertOpClassConfig- ( ConvertOpClassConfig,- convertFieldCombineFun,- convertFieldFunExp,- convertFieldResFun,- convertOpInstanceNames,- convertOpTarget- ),- convertOpFunNames,- defaultFieldFunExp,- genConvertOpClass,- )-import Grisette.Internal.Unified.EvalModeTag (EvalModeTag (S))-import Language.Haskell.TH (Dec, Name, Q, appE, conE)--toSymClassConfig :: ConvertOpClassConfig-toSymClassConfig =- ConvertOpClassConfig- { convertFieldResFun = \v f -> [|$(return f) $(return v)|],- convertFieldCombineFun =- \f args -> foldl appE (conE f) $ fmap return args,- convertFieldFunExp = defaultFieldFunExp ['toSym, 'liftToSym, 'liftToSym2],- convertOpTarget = S,- convertOpInstanceNames = [''ToSym, ''ToSym1, ''ToSym2],- convertOpFunNames = ['toSym, 'liftToSym, 'liftToSym2]- }---- | Derive 'ToSym' instance for a GADT.-deriveGADTToSym :: DeriveConfig -> Name -> Q [Dec]-deriveGADTToSym deriveConfig = genConvertOpClass deriveConfig toSymClassConfig 0---- | Derive 'ToSym1' instance for a GADT.-deriveGADTToSym1 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTToSym1 deriveConfig =- genConvertOpClass deriveConfig toSymClassConfig 1---- | Derive 'ToSym2' instance for a GADT.-deriveGADTToSym2 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTToSym2 deriveConfig =- genConvertOpClass deriveConfig toSymClassConfig 2
− src/Grisette/Internal/TH/GADT/DeriveUnifiedSimpleMergeable.hs
@@ -1,112 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}-{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}--{-# HLINT ignore "Unused LANGUAGE pragma" #-}---- |--- Module : Grisette.Internal.TH.GADT.DeriveUnifiedSimpleMergeable--- Copyright : (c) Sirui Lu 2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.TH.GADT.DeriveUnifiedSimpleMergeable- ( deriveGADTUnifiedSimpleMergeable,- deriveGADTUnifiedSimpleMergeable1,- deriveGADTUnifiedSimpleMergeable2,- )-where--import Grisette.Internal.Internal.Decl.Unified.Class.UnifiedSimpleMergeable- ( UnifiedSimpleMergeable (withBaseSimpleMergeable),- UnifiedSimpleMergeable1 (withBaseSimpleMergeable1),- UnifiedSimpleMergeable2 (withBaseSimpleMergeable2),- )-import Grisette.Internal.TH.GADT.Common (DeriveConfig (evalModeConfig))-import Grisette.Internal.TH.GADT.UnaryOpCommon- ( UnaryOpClassConfig- ( UnaryOpClassConfig,- unaryOpAllowExistential,- unaryOpConfigs,- unaryOpExtraVars,- unaryOpInstanceNames,- unaryOpInstanceTypeFromConfig- ),- UnaryOpConfig (UnaryOpConfig),- genUnaryOpClass,- )-import Grisette.Internal.TH.GADT.UnifiedOpCommon- ( UnaryOpUnifiedConfig (UnaryOpUnifiedConfig, unifiedFun),- defaultUnaryOpUnifiedFun,- )-import Grisette.Internal.Unified.EvalModeTag (EvalModeTag)-import Language.Haskell.TH- ( Dec,- Name,- Q,- Type (ConT, VarT),- appT,- conT,- newName,- )--unifiedSimpleMergeableConfig :: UnaryOpClassConfig-unifiedSimpleMergeableConfig =- UnaryOpClassConfig- { unaryOpConfigs =- [ UnaryOpConfig- UnaryOpUnifiedConfig- { unifiedFun =- defaultUnaryOpUnifiedFun- [ 'withBaseSimpleMergeable,- 'withBaseSimpleMergeable1,- 'withBaseSimpleMergeable2- ]- }- [ 'withBaseSimpleMergeable,- 'withBaseSimpleMergeable1,- 'withBaseSimpleMergeable2- ]- ],- unaryOpInstanceNames =- [ ''UnifiedSimpleMergeable,- ''UnifiedSimpleMergeable1,- ''UnifiedSimpleMergeable2- ],- unaryOpExtraVars = \config -> do- let modeConfigs = evalModeConfig config- case modeConfigs of- [] -> do- nm <- newName "mode"- return [(VarT nm, ConT ''EvalModeTag)]- [_] -> return []- _ -> fail "UnifiedSimpleMergeable does not support multiple evaluation modes",- unaryOpInstanceTypeFromConfig =- \config newModeVars keptNewVars con -> do- let modeConfigs = evalModeConfig config- modeVar <- case modeConfigs of- [] -> return $ head newModeVars- [(i, _)] -> do- if i >= length keptNewVars- then fail "UnifiedSimpleMergeable reference to a non-existent mode variable"- else return $ keptNewVars !! i- _ -> fail "UnifiedSimpleMergeable does not support multiple evaluation modes"- appT (conT con) (return $ fst modeVar),- unaryOpAllowExistential = True- }---- | Derive 'UnifiedSimpleMergeable' instance for a GADT.-deriveGADTUnifiedSimpleMergeable :: DeriveConfig -> Name -> Q [Dec]-deriveGADTUnifiedSimpleMergeable deriveConfig =- genUnaryOpClass deriveConfig unifiedSimpleMergeableConfig 0---- | Derive 'UnifiedSimpleMergeable1' instance for a GADT.-deriveGADTUnifiedSimpleMergeable1 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTUnifiedSimpleMergeable1 deriveConfig =- genUnaryOpClass deriveConfig unifiedSimpleMergeableConfig 1---- | Derive 'UnifiedSimpleMergeable2' instance for a GADT.-deriveGADTUnifiedSimpleMergeable2 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTUnifiedSimpleMergeable2 deriveConfig =- genUnaryOpClass deriveConfig unifiedSimpleMergeableConfig 2
− src/Grisette/Internal/TH/GADT/DeriveUnifiedSymEq.hs
@@ -1,102 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}-{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}--{-# HLINT ignore "Unused LANGUAGE pragma" #-}---- |--- Module : Grisette.Internal.TH.GADT.DeriveUnifiedSymEq--- Copyright : (c) Sirui Lu 2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.TH.GADT.DeriveUnifiedSymEq- ( deriveGADTUnifiedSymEq,- deriveGADTUnifiedSymEq1,- deriveGADTUnifiedSymEq2,- )-where--import Grisette.Internal.Internal.Decl.Unified.Class.UnifiedSymEq- ( UnifiedSymEq (withBaseSymEq),- UnifiedSymEq1 (withBaseSymEq1),- UnifiedSymEq2 (withBaseSymEq2),- )-import Grisette.Internal.TH.GADT.Common (DeriveConfig (evalModeConfig))-import Grisette.Internal.TH.GADT.UnaryOpCommon- ( UnaryOpClassConfig- ( UnaryOpClassConfig,- unaryOpAllowExistential,- unaryOpConfigs,- unaryOpExtraVars,- unaryOpInstanceNames,- unaryOpInstanceTypeFromConfig- ),- UnaryOpConfig (UnaryOpConfig),- genUnaryOpClass,- )-import Grisette.Internal.TH.GADT.UnifiedOpCommon- ( UnaryOpUnifiedConfig (UnaryOpUnifiedConfig, unifiedFun),- defaultUnaryOpUnifiedFun,- )-import Grisette.Internal.Unified.EvalModeTag (EvalModeTag)-import Language.Haskell.TH- ( Dec,- Name,- Q,- Type (ConT, VarT),- appT,- conT,- newName,- )--unifiedSymEqConfig :: UnaryOpClassConfig-unifiedSymEqConfig =- UnaryOpClassConfig- { unaryOpConfigs =- [ UnaryOpConfig- UnaryOpUnifiedConfig- { unifiedFun =- defaultUnaryOpUnifiedFun- ['withBaseSymEq, 'withBaseSymEq1, 'withBaseSymEq2]- }- ['withBaseSymEq, 'withBaseSymEq1, 'withBaseSymEq2]- ],- unaryOpInstanceNames = [''UnifiedSymEq, ''UnifiedSymEq1, ''UnifiedSymEq2],- unaryOpExtraVars = \config -> do- let modeConfigs = evalModeConfig config- case modeConfigs of- [] -> do- nm <- newName "mode"- return [(VarT nm, ConT ''EvalModeTag)]- [_] -> return []- _ -> fail "UnifiedSymEq does not support multiple evaluation modes",- unaryOpInstanceTypeFromConfig =- \config newModeVars keptNewVars con -> do- let modeConfigs = evalModeConfig config- modeVar <- case modeConfigs of- [] -> return $ head newModeVars- [(i, _)] -> do- if i >= length keptNewVars- then fail "UnifiedSymEq reference to a non-existent mode variable"- else return $ keptNewVars !! i- _ -> fail "UnifiedSymEq does not support multiple evaluation modes"- appT (conT con) (return $ fst modeVar),- unaryOpAllowExistential = True- }---- | Derive 'UnifiedSymEq' instance for a GADT.-deriveGADTUnifiedSymEq :: DeriveConfig -> Name -> Q [Dec]-deriveGADTUnifiedSymEq deriveConfig =- genUnaryOpClass deriveConfig unifiedSymEqConfig 0---- | Derive 'UnifiedSymEq1' instance for a GADT.-deriveGADTUnifiedSymEq1 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTUnifiedSymEq1 deriveConfig =- genUnaryOpClass deriveConfig unifiedSymEqConfig 1---- | Derive 'UnifiedSymEq2' instance for a GADT.-deriveGADTUnifiedSymEq2 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTUnifiedSymEq2 deriveConfig =- genUnaryOpClass deriveConfig unifiedSymEqConfig 2
− src/Grisette/Internal/TH/GADT/DeriveUnifiedSymOrd.hs
@@ -1,102 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}-{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}--{-# HLINT ignore "Unused LANGUAGE pragma" #-}---- |--- Module : Grisette.Internal.TH.GADT.DeriveUnifiedSymOrd--- Copyright : (c) Sirui Lu 2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.TH.GADT.DeriveUnifiedSymOrd- ( deriveGADTUnifiedSymOrd,- deriveGADTUnifiedSymOrd1,- deriveGADTUnifiedSymOrd2,- )-where--import Grisette.Internal.Internal.Decl.Unified.Class.UnifiedSymOrd- ( UnifiedSymOrd (withBaseSymOrd),- UnifiedSymOrd1 (withBaseSymOrd1),- UnifiedSymOrd2 (withBaseSymOrd2),- )-import Grisette.Internal.TH.GADT.Common (DeriveConfig (evalModeConfig))-import Grisette.Internal.TH.GADT.UnaryOpCommon- ( UnaryOpClassConfig- ( UnaryOpClassConfig,- unaryOpAllowExistential,- unaryOpConfigs,- unaryOpExtraVars,- unaryOpInstanceNames,- unaryOpInstanceTypeFromConfig- ),- UnaryOpConfig (UnaryOpConfig),- genUnaryOpClass,- )-import Grisette.Internal.TH.GADT.UnifiedOpCommon- ( UnaryOpUnifiedConfig (UnaryOpUnifiedConfig, unifiedFun),- defaultUnaryOpUnifiedFun,- )-import Grisette.Internal.Unified.EvalModeTag (EvalModeTag)-import Language.Haskell.TH- ( Dec,- Name,- Q,- Type (ConT, VarT),- appT,- conT,- newName,- )--unifiedSymOrdConfig :: UnaryOpClassConfig-unifiedSymOrdConfig =- UnaryOpClassConfig- { unaryOpConfigs =- [ UnaryOpConfig- UnaryOpUnifiedConfig- { unifiedFun =- defaultUnaryOpUnifiedFun- ['withBaseSymOrd, 'withBaseSymOrd1, 'withBaseSymOrd2]- }- ['withBaseSymOrd, 'withBaseSymOrd1, 'withBaseSymOrd2]- ],- unaryOpInstanceNames = [''UnifiedSymOrd, ''UnifiedSymOrd1, ''UnifiedSymOrd2],- unaryOpExtraVars = \config -> do- let modeConfigs = evalModeConfig config- case modeConfigs of- [] -> do- nm <- newName "mode"- return [(VarT nm, ConT ''EvalModeTag)]- [_] -> return []- _ -> fail "UnifiedSymOrd does not support multiple evaluation modes",- unaryOpInstanceTypeFromConfig =- \config newModeVars keptNewVars con -> do- let modeConfigs = evalModeConfig config- modeVar <- case modeConfigs of- [] -> return $ head newModeVars- [(i, _)] -> do- if i >= length keptNewVars- then fail "UnifiedSymOrd reference to a non-existent mode variable"- else return $ keptNewVars !! i- _ -> fail "UnifiedSymOrd does not support multiple evaluation modes"- appT (conT con) (return $ fst modeVar),- unaryOpAllowExistential = True- }---- | Derive 'UnifiedSymOrd' instance for a GADT.-deriveGADTUnifiedSymOrd :: DeriveConfig -> Name -> Q [Dec]-deriveGADTUnifiedSymOrd deriveConfig =- genUnaryOpClass deriveConfig unifiedSymOrdConfig 0---- | Derive 'UnifiedSymOrd1' instance for a GADT.-deriveGADTUnifiedSymOrd1 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTUnifiedSymOrd1 deriveConfig =- genUnaryOpClass deriveConfig unifiedSymOrdConfig 1---- | Derive 'UnifiedSymOrd2' instance for a GADT.-deriveGADTUnifiedSymOrd2 :: DeriveConfig -> Name -> Q [Dec]-deriveGADTUnifiedSymOrd2 deriveConfig =- genUnaryOpClass deriveConfig unifiedSymOrdConfig 2
− src/Grisette/Internal/TH/GADT/ShowPPrintCommon.hs
@@ -1,57 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}---- |--- Module : Grisette.Internal.TH.GADT.ShowPPrintCommon--- Copyright : (c) Sirui Lu 2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.TH.GADT.ShowPPrintCommon (showPrintFieldFunExp) where--import qualified Data.Map as M-import qualified Data.Set as S-import Grisette.Internal.TH.GADT.UnaryOpCommon (FieldFunExp)-import Language.Haskell.TH (Name, Type (AppT, VarT), varE)-import Language.Haskell.TH.Datatype (TypeSubstitution (freeVariables))---- | Common 'FieldFunExp' for 'Show' and 'Grisette.Core.PPrint' on a GADT.-showPrintFieldFunExp :: [Name] -> [Name] -> FieldFunExp-showPrintFieldFunExp precNames listNames argToFunPat liftedExps = go- where- allArgNames = M.keysSet argToFunPat- typeHasNoArg ty =- S.fromList (freeVariables [ty])- `S.intersection` allArgNames- == S.empty- goLst ty = do- let fun0 = varE (head listNames)- fun1 b = [|$(varE $ listNames !! 1) $(go b) $(goLst b)|]- fun2 b c =- [|$(varE $ listNames !! 2) $(go b) $(goLst b) $(go c) $(goLst c)|]- case ty of- AppT (AppT (VarT _) b) c -> fun2 b c- AppT (VarT _) b -> fun1 b- _ | typeHasNoArg ty -> fun0- AppT a b | typeHasNoArg a -> fun1 b- AppT (AppT a b) c | typeHasNoArg a -> fun2 b c- VarT nm -> case M.lookup nm liftedExps of- Just [p] -> varE p- _ -> fail $ "defaultFieldFunExp: unsupported type: " <> show ty- _ -> fail $ "defaultFieldFunExp: unsupported type: " <> show ty- go ty = do- let fun0 = varE (head precNames)- fun1 b = [|$(varE $ precNames !! 1) $(go b) $(goLst b)|]- fun2 b c =- [|$(varE $ precNames !! 2) $(go b) $(goLst b) $(go c) $(goLst c)|]- case ty of- AppT (AppT (VarT _) b) c -> fun2 b c- AppT (VarT _) b -> fun1 b- _ | typeHasNoArg ty -> fun0- AppT a b | typeHasNoArg a -> fun1 b- AppT (AppT a b) c | typeHasNoArg a -> fun2 b c- VarT nm -> case M.lookup nm argToFunPat of- Just pname -> varE pname- _ -> fail $ "defaultFieldFunExp: unsupported type: " <> show ty- _ -> fail $ "defaultFieldFunExp: unsupported type: " <> show ty
− src/Grisette/Internal/TH/GADT/UnaryOpCommon.hs
@@ -1,371 +0,0 @@-{-# LANGUAGE GADTs #-}-{-# LANGUAGE LambdaCase #-}-{-# LANGUAGE RecordWildCards #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TupleSections #-}-{-# LANGUAGE TypeApplications #-}---- |--- Module : Grisette.Internal.TH.GADT.UnaryOpCommon--- Copyright : (c) Sirui Lu 2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.TH.GADT.UnaryOpCommon- ( UnaryOpClassConfig (..),- UnaryOpFieldConfig (..),- UnaryOpConfig (..),- UnaryOpFunConfig (..),- FieldFunExp,- defaultFieldResFun,- defaultFieldFunExp,- genUnaryOpClass,- defaultUnaryOpInstanceTypeFromConfig,- )-where--import Control.Monad (replicateM, zipWithM)-import qualified Data.List as List-import qualified Data.Map as M-import Data.Maybe (catMaybes, mapMaybe)-import qualified Data.Set as S-import Grisette.Internal.TH.GADT.Common- ( CheckArgsResult- ( CheckArgsResult,- argVars,- constructors,- keptVars- ),- DeriveConfig,- checkArgs,- ctxForVar,- evalModeSpecializeList,- extraConstraint,- freshenCheckArgsResult,- isVarUsedInFields,- specializeResult,- )-import Grisette.Internal.TH.Util (allUsedNames)-import Language.Haskell.TH- ( Body (NormalB),- Clause (Clause),- Dec (FunD, InstanceD),- Exp (VarE),- Kind,- Name,- Pat (VarP, WildP),- Q,- Type (AppT, ConT, VarT),- appE,- conP,- conT,- nameBase,- newName,- varE,- varP,- )-import Language.Haskell.TH.Datatype- ( ConstructorInfo (constructorFields, constructorName, constructorVariant),- ConstructorVariant,- TypeSubstitution (freeVariables),- resolveTypeSynonyms,- )---- | Type of field function expression generator.-type FieldFunExp = M.Map Name Name -> M.Map Name [Name] -> Type -> Q Exp---- | Default field function expression generator.-defaultFieldFunExp :: [Name] -> FieldFunExp-defaultFieldFunExp unaryOpFunNames argToFunPat _ = go- where- go ty = do- let allArgNames = M.keysSet argToFunPat- let typeHasNoArg ty =- S.fromList (freeVariables [ty])- `S.intersection` allArgNames- == S.empty- let fun0 = varE $ head unaryOpFunNames- fun1 b = [|$(varE $ unaryOpFunNames !! 1) $(go b)|]- fun2 b c = [|$(varE $ unaryOpFunNames !! 2) $(go b) $(go c)|]- fun3 b c d =- [|$(varE $ unaryOpFunNames !! 3) $(go b) $(go c) $(go d)|]- case ty of- AppT (AppT (AppT (VarT _) b) c) d -> fun3 b c d- AppT (AppT (VarT _) b) c -> fun2 b c- AppT (VarT _) b -> fun1 b- _ | typeHasNoArg ty -> fun0- AppT a b | typeHasNoArg a -> fun1 b- AppT (AppT a b) c | typeHasNoArg a -> fun2 b c- AppT (AppT (AppT a b) c) d | typeHasNoArg a -> fun3 b c d- VarT nm -> case M.lookup nm argToFunPat of- Just pname -> varE pname- _ -> fail $ "defaultFieldFunExp: unsupported type: " <> show ty- _ -> fail $ "defaultFieldFunExp: unsupported type: " <> show ty---- | Configuration for a unary function field expression generation on a GADT.-data UnaryOpConfig where- UnaryOpConfig ::- (UnaryOpFunConfig config) => config -> [Name] -> UnaryOpConfig---- | Default field result function.-defaultFieldResFun ::- ConstructorVariant -> Name -> [Exp] -> Int -> Exp -> Exp -> Q (Exp, [Bool])-defaultFieldResFun _ _ extraPatExps _ fieldPatExp defaultFieldFunExp = do- res <-- appE- ( foldl- (\exp name -> appE exp (return name))- (return defaultFieldFunExp)- extraPatExps- )- (return fieldPatExp)- return (res, (True <$ extraPatExps))--funPatAndExps ::- FieldFunExp ->- (Int -> [String]) ->- [(Type, Kind)] ->- [Type] ->- Q ([Pat], [[Pat]], [Exp])-funPatAndExps fieldFunExpGen extraLiftedPatNames argTypes fields = do- let usedArgs = S.fromList $ freeVariables fields- let liftedNames = extraLiftedPatNames (length argTypes)- args <-- traverse- ( \(ty, _) -> do- case ty of- VarT nm ->- if S.member nm usedArgs- then do- pname <- newName "p"- epname <- traverse newName liftedNames- return (nm, Just (pname, epname))- else return ('undefined, Nothing)- _ -> return ('undefined, Nothing)- )- argTypes- let argToFunPat =- M.fromList $ mapMaybe (\(nm, mpat) -> fmap ((nm,) . fst) mpat) args- let argToLiftedPat =- M.fromList $ mapMaybe (\(nm, mpat) -> fmap ((nm,) . snd) mpat) args- let funPats = fmap (maybe WildP (VarP . fst) . snd) args- let extraLiftedPats =- fmap- ( maybe- (replicate (length liftedNames) WildP)- (fmap VarP . snd)- . snd- )- args- defaultFieldFunExps <-- traverse- (fieldFunExpGen argToFunPat argToLiftedPat)- fields- return (funPats, extraLiftedPats, defaultFieldFunExps)---- | Generate a clause for a unary function on a GADT.-genUnaryOpFieldClause ::- UnaryOpFieldConfig ->- [(Type, Kind)] ->- Int ->- ConstructorInfo ->- Q Clause-genUnaryOpFieldClause- (UnaryOpFieldConfig {..})- argTypes- conIdx- conInfo = do- fields <- mapM resolveTypeSynonyms $ constructorFields conInfo- (funPats, funLiftedPats, defaultFieldFunExps) <-- funPatAndExps fieldFunExp extraLiftedPatNames argTypes fields- extraPatNames <- traverse newName extraPatNames- let extraPatExps = fmap VarE extraPatNames- fieldsPatNames <- replicateM (length fields) $ newName "field"- let extraPats = fmap VarP extraPatNames- fieldPats <- conP (constructorName conInfo) (fmap varP fieldsPatNames)- let fieldPatExps = fmap VarE fieldsPatNames-- fieldResExpsAndArgsUsed <-- sequence $- zipWith3- ( fieldResFun- (constructorVariant conInfo)- (constructorName conInfo)- extraPatExps- )- [0 ..]- fieldPatExps- defaultFieldFunExps- let fieldResExps = fst <$> fieldResExpsAndArgsUsed- let extraArgsUsedByFields = snd <$> fieldResExpsAndArgsUsed-- (resExp, extraArgsUsedByResult) <-- fieldCombineFun- conIdx- (constructorVariant conInfo)- (constructorName conInfo)- extraPatExps- fieldResExps- let resUsedNames = allUsedNames resExp- let extraArgsUsed =- fmap or $- List.transpose $- extraArgsUsedByResult : extraArgsUsedByFields- let extraArgsPats =- zipWith- (\pat used -> if used then pat else WildP)- extraPats- extraArgsUsed- let transformPat (VarP nm) =- if S.member nm resUsedNames then VarP nm else WildP- transformPat p = p- return $- Clause- ( fmap transformPat $- concat (zipWith (:) funPats funLiftedPats)- ++ extraArgsPats- ++ [fieldPats]- )- (NormalB resExp)- []---- | Configuration for a unary operation type class generation on a GADT.-data UnaryOpClassConfig = UnaryOpClassConfig- { unaryOpConfigs :: [UnaryOpConfig],- unaryOpInstanceNames :: [Name],- unaryOpExtraVars :: DeriveConfig -> Q [(Type, Kind)],- unaryOpInstanceTypeFromConfig ::- DeriveConfig ->- [(Type, Kind)] ->- [(Type, Kind)] ->- Name ->- Q Type,- unaryOpAllowExistential :: Bool- }---- | Default unary operation instance type generator.-defaultUnaryOpInstanceTypeFromConfig ::- DeriveConfig -> [(Type, Kind)] -> [(Type, Kind)] -> Name -> Q Type-defaultUnaryOpInstanceTypeFromConfig _ _ _ = conT---- | Configuration for the derivation rules for a unary operation that can be--- derived by transforming each field and then combining the results.-data UnaryOpFieldConfig = UnaryOpFieldConfig- { extraPatNames :: [String],- extraLiftedPatNames :: Int -> [String],- fieldResFun ::- ConstructorVariant ->- Name ->- [Exp] ->- Int ->- Exp ->- Exp ->- Q (Exp, [Bool]),- fieldCombineFun ::- Int ->- ConstructorVariant ->- Name ->- [Exp] ->- [Exp] ->- Q (Exp, [Bool]),- fieldFunExp :: FieldFunExp- }---- | Configuration for the derivation rules for a unary operation.-class UnaryOpFunConfig config where- genUnaryOpFun ::- -- | Derive configuration- DeriveConfig ->- -- | Configuration- config ->- -- | Function names- [Name] ->- -- | Number of functor arguments to the class- Int ->- -- | Extra variables- [(Type, Kind)] ->- -- | Kept variables- [(Type, Kind)] ->- -- | Argument variables- [(Type, Kind)] ->- -- | Whether the variable is used in fields- (Name -> Bool) ->- -- | Constructor infos- [ConstructorInfo] ->- Q Dec--instance UnaryOpFunConfig UnaryOpFieldConfig where- genUnaryOpFun _ config funNames n _ _ argTypes _ constructors = do- clauses <-- zipWithM- ( genUnaryOpFieldClause- config- argTypes- )- [0 ..]- constructors- let instanceFunName = funNames !! n- return $ FunD instanceFunName clauses---- | Generate a unary operation type class instance for a GADT.-genUnaryOpClass ::- DeriveConfig ->- UnaryOpClassConfig ->- Int ->- Name ->- Q [Dec]-genUnaryOpClass deriveConfig (UnaryOpClassConfig {..}) n typName = do- result@CheckArgsResult {..} <-- specializeResult (evalModeSpecializeList deriveConfig)- =<< freshenCheckArgsResult True- =<< checkArgs- (nameBase $ head unaryOpInstanceNames)- (length unaryOpInstanceNames - 1)- typName- unaryOpAllowExistential- n- extraVars <- unaryOpExtraVars deriveConfig- instanceTypes <-- traverse- (unaryOpInstanceTypeFromConfig deriveConfig extraVars keptVars)- unaryOpInstanceNames- let isTypeUsedInFields (VarT nm) = isVarUsedInFields result nm- isTypeUsedInFields _ = False- ctxs <-- traverse (uncurry $ ctxForVar instanceTypes) $- filter (isTypeUsedInFields . fst) keptVars- let keptType = foldl AppT (ConT typName) $ fmap fst keptVars- instanceFuns <-- traverse- ( \(UnaryOpConfig config funNames) ->- genUnaryOpFun- deriveConfig- config- funNames- n- extraVars- keptVars- argVars- (isVarUsedInFields result)- constructors- )- unaryOpConfigs- let instanceName = unaryOpInstanceNames !! n- let instanceType = AppT (instanceTypes !! n) keptType- extraPreds <-- extraConstraint- deriveConfig- typName- instanceName- extraVars- keptVars- constructors- return- [ InstanceD- Nothing- (extraPreds ++ catMaybes ctxs)- instanceType- instanceFuns- ]
− src/Grisette/Internal/TH/GADT/UnifiedOpCommon.hs
@@ -1,107 +0,0 @@-{-# LANGUAGE RecordWildCards #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeApplications #-}---- |--- Module : Grisette.Internal.TH.GADT.UnifiedOpCommon--- Copyright : (c) Sirui Lu 2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.TH.GADT.UnifiedOpCommon- ( UnaryOpUnifiedConfig (..),- defaultUnaryOpUnifiedFun,- )-where--import Grisette.Internal.TH.GADT.Common (DeriveConfig (evalModeConfig))-import Grisette.Internal.TH.GADT.UnaryOpCommon- ( UnaryOpFunConfig (genUnaryOpFun),- )-import Grisette.Internal.Unified.Util (withMode)-import Language.Haskell.TH- ( Exp (VarE),- Kind,- Name,- Q,- Type (AppT, ArrowT, StarT, VarT),- appE,- clause,- funD,- newName,- normalB,- varE,- varP,- )---- | Default implementation for the derivation rules for a unified operation.-defaultUnaryOpUnifiedFun :: [Name] -> Type -> (Type, Kind) -> Q (Maybe Exp)-defaultUnaryOpUnifiedFun funNames modeTy (ty, kind) =- case kind of- StarT ->- Just- <$> [|- $(varE $ head funNames) @($(return modeTy))- @($(return ty))- |]- AppT (AppT ArrowT StarT) StarT ->- Just- <$> [|- $(varE $ funNames !! 1) @($(return modeTy))- @($(return ty))- |]- AppT (AppT (AppT ArrowT StarT) StarT) StarT ->- Just- <$> [|- $(varE $ funNames !! 2) @($(return modeTy))- @($(return ty))- |]- _ -> return Nothing---- | Configuration for the derivation rules for a unified operation.-newtype UnaryOpUnifiedConfig = UnaryOpUnifiedConfig- {unifiedFun :: Type -> (Type, Kind) -> Q (Maybe Exp)}--instance UnaryOpFunConfig UnaryOpUnifiedConfig where- genUnaryOpFun- deriveConfig- (UnaryOpUnifiedConfig {..})- funNames- n- extraVars- keptTypes- _- isVarUsedInFields- _ = do- modeTy <- case evalModeConfig deriveConfig of- [] -> return $ fst $ head extraVars- [(i, _)] -> return $ fst $ keptTypes !! i- _ -> fail "Unified classes does not support multiple evaluation modes"- let isTypeUsedInFields (VarT nm) = isVarUsedInFields nm- isTypeUsedInFields _ = False- exprs <-- traverse (unifiedFun modeTy) $- filter (isTypeUsedInFields . fst) keptTypes- rVar <- newName "r"- let rf =- foldl- ( \exp nextFun -> case nextFun of- Nothing -> exp- Just fun -> appE (return fun) exp- )- (return $ VarE rVar)- exprs- let instanceFunName = funNames !! n- funD- instanceFunName- [ clause- [varP rVar]- ( normalB- [|- withMode @($(return modeTy)) $(rf) $(rf)- |]- )- []- ]
src/Grisette/Internal/Unified/Class/UnifiedFiniteBits.hs view
@@ -135,7 +135,7 @@ a symPopCount a = withMode @mode- (withBaseFiniteBits @mode @a (fromIntegral $ popCount a))+ (withBaseFiniteBits @mode @a (0 * a + fromIntegral (popCount a))) ( withBaseFiniteBits @mode @a $ withBaseITEOp @mode @a (SymFiniteBits.symPopCount a) )@@ -149,7 +149,7 @@ a symCountLeadingZeros a = withMode @mode- (withBaseFiniteBits @mode @a (fromIntegral $ countLeadingZeros a))+ (withBaseFiniteBits @mode @a (0 * a + fromIntegral (countLeadingZeros a))) ( withBaseFiniteBits @mode @a $ withBaseITEOp @mode @a (SymFiniteBits.symCountLeadingZeros a) )@@ -163,7 +163,7 @@ a symCountTrailingZeros a = withMode @mode- (withBaseFiniteBits @mode @a (fromIntegral $ countTrailingZeros a))+ (withBaseFiniteBits @mode @a (0 * a + fromIntegral (countTrailingZeros a))) ( withBaseFiniteBits @mode @a $ withBaseITEOp @mode @a (SymFiniteBits.symCountTrailingZeros a) )
src/Grisette/Internal/Unified/Util.hs view
@@ -83,6 +83,12 @@ ((c ~ 'S, s ~ 'S) => r) -> r +instance {-# INCOHERENT #-} (DecideEvalMode c) => EvalModeConvertible c c where+ withModeConvertible con sym = withMode @c con sym+ {-# INLINE withModeConvertible #-}+ withModeConvertible' con _ sym = withMode @c con sym+ {-# INLINE withModeConvertible' #-}+ instance {-# INCOHERENT #-} (DecideEvalMode s) => EvalModeConvertible 'C s where withModeConvertible con _ = con {-# INLINE withModeConvertible #-}
src/Grisette/SymPrim.hs view
@@ -172,7 +172,7 @@ SupportedPrim, SymRep (SymType), ConRep (ConType),- LinkedRep,+ LinkedRep (..), -- * Extract symbolic values SomeSym (..),@@ -208,6 +208,66 @@ Model, ModelValuePair (..), ModelSymPair (..),++ -- * Analysis on the terms+ Term,+ SomeTerm (..),+ termSize,+ someTermSize,+ termsSize,+ someTermsSize,+ pattern SupportedTerm,+ pattern SupportedTypedSymbol,+ pattern SupportedConstantTypedSymbol,+ pattern ConTerm,+ pattern SymTerm,+ pattern ForallTerm,+ pattern ExistsTerm,+ pattern NotTerm,+ pattern OrTerm,+ pattern AndTerm,+ pattern EqTerm,+ pattern DistinctTerm,+ pattern ITETerm,+ pattern AddNumTerm,+ pattern NegNumTerm,+ pattern MulNumTerm,+ pattern AbsNumTerm,+ pattern SignumNumTerm,+ pattern LtOrdTerm,+ pattern LeOrdTerm,+ pattern AndBitsTerm,+ pattern OrBitsTerm,+ pattern XorBitsTerm,+ pattern ComplementBitsTerm,+ pattern ShiftLeftTerm,+ pattern RotateLeftTerm,+ pattern ShiftRightTerm,+ pattern RotateRightTerm,+ pattern BitCastTerm,+ pattern BitCastOrTerm,+ pattern BVConcatTerm,+ pattern BVSelectTerm,+ pattern BVExtendTerm,+ pattern ApplyTerm,+ pattern DivIntegralTerm,+ pattern ModIntegralTerm,+ pattern QuotIntegralTerm,+ pattern RemIntegralTerm,+ pattern FPTraitTerm,+ pattern FdivTerm,+ pattern RecipTerm,+ pattern FloatingUnaryTerm,+ pattern PowerTerm,+ pattern FPUnaryTerm,+ pattern FPBinaryTerm,+ pattern FPRoundingUnaryTerm,+ pattern FPRoundingBinaryTerm,+ pattern FPFMATerm,+ pattern FromIntegralTerm,+ pattern FromFPOrTerm,+ pattern ToFPTerm,+ pattern SubTerms, ) where @@ -263,21 +323,83 @@ ModelValuePair (..), SymbolSet (..), )+import Grisette.Internal.SymPrim.Prim.Pattern (pattern SubTerms)+import Grisette.Internal.SymPrim.Prim.SomeTerm+ ( SomeTerm (..),+ ) import Grisette.Internal.SymPrim.Prim.Term ( ConRep (..), IsSymbolKind (..),- LinkedRep,+ LinkedRep (..), SomeTypedAnySymbol, SomeTypedConstantSymbol, SomeTypedSymbol (..), SupportedPrim, SymRep (..), SymbolKind (..),+ Term, TypedAnySymbol, TypedConstantSymbol, TypedSymbol (..), typedAnySymbol, typedConstantSymbol,+ pattern AbsNumTerm,+ pattern AddNumTerm,+ pattern AndBitsTerm,+ pattern AndTerm,+ pattern ApplyTerm,+ pattern BVConcatTerm,+ pattern BVExtendTerm,+ pattern BVSelectTerm,+ pattern BitCastOrTerm,+ pattern BitCastTerm,+ pattern ComplementBitsTerm,+ pattern ConTerm,+ pattern DistinctTerm,+ pattern DivIntegralTerm,+ pattern EqTerm,+ pattern ExistsTerm,+ pattern FPBinaryTerm,+ pattern FPFMATerm,+ pattern FPRoundingBinaryTerm,+ pattern FPRoundingUnaryTerm,+ pattern FPTraitTerm,+ pattern FPUnaryTerm,+ pattern FdivTerm,+ pattern FloatingUnaryTerm,+ pattern ForallTerm,+ pattern FromFPOrTerm,+ pattern FromIntegralTerm,+ pattern ITETerm,+ pattern LeOrdTerm,+ pattern LtOrdTerm,+ pattern ModIntegralTerm,+ pattern MulNumTerm,+ pattern NegNumTerm,+ pattern NotTerm,+ pattern OrBitsTerm,+ pattern OrTerm,+ pattern PowerTerm,+ pattern QuotIntegralTerm,+ pattern RecipTerm,+ pattern RemIntegralTerm,+ pattern RotateLeftTerm,+ pattern RotateRightTerm,+ pattern ShiftLeftTerm,+ pattern ShiftRightTerm,+ pattern SignumNumTerm,+ pattern SupportedConstantTypedSymbol,+ pattern SupportedTerm,+ pattern SupportedTypedSymbol,+ pattern SymTerm,+ pattern ToFPTerm,+ pattern XorBitsTerm,+ )+import Grisette.Internal.SymPrim.Prim.TermUtils+ ( someTermSize,+ someTermsSize,+ termSize,+ termsSize, ) import Grisette.Internal.SymPrim.Quantifier ( existsFresh,
src/Grisette/TH.hs view
@@ -12,20 +12,42 @@ ( -- * Convenient derivation of all instances relating to Grisette EvalModeConfig (..), DeriveConfig (..),- deriveGADT,- deriveGADTWith,+ derive,+ deriveWith, allClasses0, allClasses01, allClasses012, basicClasses0, noExistentialClasses0,- ordClasses0,+ concreteOrdClasses0, basicClasses1, noExistentialClasses1,- ordClasses1,+ concreteOrdClasses1, basicClasses2, noExistentialClasses2,- ordClasses2,+ concreteOrdClasses2,+ showClasses,+ pprintClasses,+ evalSymClasses,+ extractSymClasses,+ substSymClasses,+ allSymsClasses,+ eqClasses,+ ordClasses,+ symOrdClasses,+ symEqClasses,+ unifiedSymOrdClasses,+ unifiedSymEqClasses,+ mergeableClasses,+ nfDataClasses,+ hashableClasses,+ toSymClasses,+ toConClasses,+ serialClasses,+ simpleMergeableClasses,+ unifiedSimpleMergeableClasses,+ filterExactNumArgs,+ filterLeqNumArgs, -- * Smart constructors that merges in a monad makePrefixedSmartCtor,@@ -53,20 +75,45 @@ makeUnifiedCtor, makeUnifiedCtorWith, )-import Grisette.Internal.TH.GADT.Common (DeriveConfig (..), EvalModeConfig (..))-import Grisette.Internal.TH.GADT.DeriveGADT+import Grisette.Internal.TH.Derivation.Common+ ( DeriveConfig (..),+ EvalModeConfig (..),+ )+import Grisette.Internal.TH.Derivation.Derive ( allClasses0, allClasses01, allClasses012,+ allSymsClasses, basicClasses0, basicClasses1, basicClasses2,- deriveGADT,- deriveGADTWith,+ concreteOrdClasses0,+ concreteOrdClasses1,+ concreteOrdClasses2,+ derive,+ deriveWith,+ eqClasses,+ evalSymClasses,+ extractSymClasses,+ filterExactNumArgs,+ filterLeqNumArgs,+ hashableClasses,+ mergeableClasses,+ nfDataClasses, noExistentialClasses0, noExistentialClasses1, noExistentialClasses2,- ordClasses0,- ordClasses1,- ordClasses2,+ ordClasses,+ pprintClasses,+ serialClasses,+ showClasses,+ simpleMergeableClasses,+ substSymClasses,+ symEqClasses,+ symOrdClasses,+ toConClasses,+ toSymClasses,+ unifiedSimpleMergeableClasses,+ unifiedSymEqClasses,+ unifiedSymOrdClasses, )
test/Grisette/Backend/LoweringTests.hs view
@@ -889,7 +889,7 @@ ("isNormal", FPIsNormal, SBV.fpIsNormal), ("isSubnormal", FPIsSubnormal, SBV.fpIsSubnormal), ("isPoint", FPIsPoint, SBV.fpIsPoint)- ]+ ] return $ testCase name $ do testUnaryOpLowering @FP32 @Bool unboundedConfig@@ -1026,7 +1026,7 @@ ("sinh", sinh, FloatingSinh), ("cosh", cosh, FloatingCosh), ("tanh", tanh, FloatingTanh)- ]+ ] return $ testCase name $ testUnaryOpLowering @AlgReal @AlgReal
test/Grisette/Backend/TermRewritingGen.hs view
@@ -20,6 +20,7 @@ GeneralSpec (..), DifferentSizeBVSpec (..), FixedSizedBVWithBoolSpec (..),+ BoolWithFixedSizedBVSpec (..), BoolWithLIASpec (..), LIAWithBoolSpec (..), BoolWithNRASpec (..),@@ -49,7 +50,6 @@ shiftRightSpec, rotateLeftSpec, rotateRightSpec,- xorBitsSpec, fpTraitSpec, fdivSpec, recipSpec,@@ -64,6 +64,13 @@ bitCastOrSpec, fromFPOrSpec, toFPSpec,+ bvconcatSpec,+ bvselectSpec,+ bvextendSpec,+ andBitsSpec,+ orBitsSpec,+ xorBitsSpec,+ complementBitsSpec, IEEEFPSpec (..), IEEEFPBoolOpSpec (..), FPRoundingModeSpec (..),
test/Grisette/Backend/TermRewritingTests.hs view
@@ -3,6 +3,7 @@ {-# LANGUAGE DataKinds #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE QuantifiedConstraints #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeOperators #-}@@ -16,6 +17,7 @@ where import Data.Foldable (traverse_)+import Data.Proxy (Proxy (Proxy)) import GHC.TypeLits (KnownNat, type (<=)) import Grisette ( AlgReal,@@ -49,12 +51,13 @@ z3, ) import Grisette.Backend.TermRewritingGen- ( BoolOnlySpec,+ ( BoolOnlySpec (BoolOnlySpec),+ BoolWithFixedSizedBVSpec (BoolWithFixedSizedBVSpec), BoolWithLIASpec, DifferentSizeBVSpec, FPRoundingModeBoolOpSpec, FPRoundingModeSpec,- FixedSizedBVWithBoolSpec,+ FixedSizedBVWithBoolSpec (FixedSizedBVWithBoolSpec), GeneralSpec, IEEEFPBoolOpSpec (IEEEFPBoolOpSpec), IEEEFPSpec,@@ -71,9 +74,14 @@ ), absNumSpec, addNumSpec,+ andBitsSpec, andSpec, bitCastOrSpec, bitCastSpec,+ bvconcatSpec,+ bvextendSpec,+ bvselectSpec,+ complementBitsSpec, divIntegralSpec, eqvSpec, fpBinaryOpSpec,@@ -88,12 +96,15 @@ mulNumSpec, negNumSpec, notSpec,+ orBitsSpec, orSpec, quotIntegralSpec, remIntegralSpec,+ shiftLeftSpec, shiftRightSpec, signumNumSpec, toFPSpec,+ xorBitsSpec, ) import Grisette.Internal.Core.Data.Class.LogicalOp (LogicalOp ((.&&))) import Grisette.Internal.Core.Data.Class.SymEq (SymEq ((./=), (.==)))@@ -114,23 +125,35 @@ FPRoundingBinaryOp (FPAdd, FPDiv, FPMul, FPSub), FPRoundingUnaryOp (FPRoundToIntegral, FPSqrt), FPTrait (FPIsPositive),+ PEvalBVTerm, PEvalBitCastOrTerm, PEvalBitCastTerm,+ PEvalBitwiseTerm (pevalAndBitsTerm, pevalOrBitsTerm), PEvalIEEEFPConvertibleTerm,+ PEvalShiftTerm, SupportedNonFuncPrim, Term,+ andBitsTerm,+ andTerm,+ bvConcatTerm,+ bvExtendTerm,+ complementBitsTerm, conTerm,+ eqTerm, fpTraitTerm, iteTerm, notTerm,+ orBitsTerm,+ orTerm, pformatTerm, ssymTerm,+ xorBitsTerm, ) import Grisette.Internal.SymPrim.SymFP (SymFP32) import Test.Framework (Test, TestName, testGroup) import Test.Framework.Providers.HUnit (testCase) import Test.Framework.Providers.QuickCheck2 (testProperty)-import Test.HUnit (Assertion, assertFailure)+import Test.HUnit (Assertion, assertFailure, (@?=)) import Test.QuickCheck ( Arbitrary, elements,@@ -245,11 +268,432 @@ [-3 .. 3] ] +bvConcatTest ::+ forall bv.+ ( forall n. (KnownNat n, 1 <= n) => SupportedNonFuncPrim (bv n),+ forall n. (KnownNat n, 1 <= n) => PEvalShiftTerm (bv n),+ forall n. (KnownNat n, 1 <= n) => Arbitrary (bv n),+ Typeable bv,+ PEvalBVTerm bv+ ) =>+ Test+bvConcatTest =+ testGroup (show (typeRep @bv) <> "_concat") $+ ( do+ (opName, opSpec, termOp) <-+ [ ("and", andBitsSpec, andBitsTerm),+ ("or", orBitsSpec, orBitsTerm),+ ("xor", xorBitsSpec, xorBitsTerm)+ ]+ [ testCase (opName <> "(const,concat)") $ do+ let lhs = conSpec 0x39 :: FixedSizedBVWithBoolSpec bv 8+ let rhs =+ bvconcatSpec+ (symSpec "a" :: FixedSizedBVWithBoolSpec bv 4)+ (symSpec "b" :: FixedSizedBVWithBoolSpec bv 4)+ let spec = opSpec lhs rhs+ validateSpec @(FixedSizedBVWithBoolSpec bv 8) unboundedConfig spec,+ testCase (opName <> "(concat,concat)") $ do+ let lhs =+ bvconcatSpec+ (symSpec "a" :: FixedSizedBVWithBoolSpec bv 4)+ (symSpec "b" :: FixedSizedBVWithBoolSpec bv 4)+ let rhs =+ bvconcatSpec+ (symSpec "c" :: FixedSizedBVWithBoolSpec bv 4)+ (symSpec "d" :: FixedSizedBVWithBoolSpec bv 4)+ let spec@(FixedSizedBVWithBoolSpec _ r) = opSpec lhs rhs+ let expected =+ ( bvConcatTerm+ (termOp (ssymTerm "a" :: Term (bv 4)) (ssymTerm "c"))+ (termOp (ssymTerm "b" :: Term (bv 4)) (ssymTerm "d"))+ )+ r @?= expected+ validateSpec @(FixedSizedBVWithBoolSpec bv 8) unboundedConfig spec+ ]+ )+ ++ [ testCase "complement(concat)" $ do+ let lhs =+ bvconcatSpec+ (symSpec "a" :: FixedSizedBVWithBoolSpec bv 4)+ (symSpec "b" :: FixedSizedBVWithBoolSpec bv 4)+ let spec@(FixedSizedBVWithBoolSpec _ r) = complementBitsSpec lhs+ let expected =+ bvConcatTerm+ (complementBitsTerm (ssymTerm "a" :: Term (bv 4)))+ (complementBitsTerm (ssymTerm "b" :: Term (bv 4)))+ r @?= expected+ validateSpec @(FixedSizedBVWithBoolSpec bv 8) unboundedConfig spec,+ testCase "complement(sext)" $ do+ let spec@(FixedSizedBVWithBoolSpec _ r) =+ complementBitsSpec+ ( bvextendSpec+ True+ (Proxy :: Proxy 8)+ (symSpec "a" :: FixedSizedBVWithBoolSpec bv 4)+ ) ::+ FixedSizedBVWithBoolSpec bv 8+ let expected =+ bvExtendTerm+ True+ (Proxy :: Proxy 8)+ (complementBitsTerm (ssymTerm "a" :: Term (bv 4)))+ r @?= expected+ validateSpec @(FixedSizedBVWithBoolSpec bv 8) unboundedConfig spec,+ testCase "and(leading_zero_then_all_one, b)" $ do+ let spec =+ andBitsSpec+ (conSpec 0x1f)+ (symSpec "b" :: FixedSizedBVWithBoolSpec bv 4)+ validateSpec @(FixedSizedBVWithBoolSpec bv 4) unboundedConfig spec,+ testCase "and(leading_one_then_all_zero, b)" $ do+ let spec =+ andBitsSpec+ (conSpec 0xf8)+ (symSpec "b" :: FixedSizedBVWithBoolSpec bv 4)+ validateSpec @(FixedSizedBVWithBoolSpec bv 4) unboundedConfig spec,+ testCase "or(leading_zero_then_all_one, b)" $ do+ let spec =+ orBitsSpec+ (conSpec 0x1f)+ (symSpec "b" :: FixedSizedBVWithBoolSpec bv 4)+ validateSpec @(FixedSizedBVWithBoolSpec bv 4) unboundedConfig spec,+ testCase "or(leading_one_then_all_zero, b)" $ do+ let spec =+ orBitsSpec+ (conSpec 0xf8)+ (symSpec "b" :: FixedSizedBVWithBoolSpec bv 4)+ validateSpec @(FixedSizedBVWithBoolSpec bv 4) unboundedConfig spec,+ testCase "select(sext)with_part_base" $ do+ let spec =+ bvselectSpec+ (Proxy @2)+ (Proxy @4)+ ( bvextendSpec+ True+ (Proxy @8)+ (symSpec "b" :: FixedSizedBVWithBoolSpec bv 4) ::+ FixedSizedBVWithBoolSpec bv 8+ ) ::+ FixedSizedBVWithBoolSpec bv 4+ validateSpec @(FixedSizedBVWithBoolSpec bv 4) unboundedConfig spec,+ testCase "ite(cond,concat(a,b),concat(c,d))" $ do+ let spec@(FixedSizedBVWithBoolSpec _ r) =+ iteSpec+ (symSpec "cond" :: BoolWithFixedSizedBVSpec bv 4)+ ( bvconcatSpec+ (symSpec "a" :: FixedSizedBVWithBoolSpec bv 4)+ (symSpec "b" :: FixedSizedBVWithBoolSpec bv 4)+ )+ ( bvconcatSpec+ (symSpec "c" :: FixedSizedBVWithBoolSpec bv 4)+ (symSpec "d" :: FixedSizedBVWithBoolSpec bv 4)+ )+ let expected =+ bvConcatTerm+ ( iteTerm+ (ssymTerm "cond" :: Term Bool)+ (ssymTerm "a" :: Term (bv 4))+ (ssymTerm "c" :: Term (bv 4))+ )+ ( iteTerm+ (ssymTerm "cond" :: Term Bool)+ (ssymTerm "b" :: Term (bv 4))+ (ssymTerm "d" :: Term (bv 4))+ )+ r @?= expected+ validateSpec @(FixedSizedBVWithBoolSpec bv 8) unboundedConfig spec+ ]+ ++ ( do+ pos <- [True, False]+ cvalue <- [0 :: Int, -1]+ value <- [0 :: Int, -1]+ let con = conSpec (fromIntegral value) :: FixedSizedBVWithBoolSpec bv 4+ let sym = symSpec "b"+ let t = if pos then con else sym+ let f = if pos then sym else con+ let spec =+ iteSpec+ ( eqvSpec+ (symSpec "c" :: FixedSizedBVWithBoolSpec bv 1)+ (conSpec $ fromIntegral cvalue) ::+ BoolWithFixedSizedBVSpec bv 1+ )+ t+ f+ let ts = if pos then show value else "sym"+ let fs = if pos then "sym" else show value+ return+ $ testCase+ ( "ite(bv1="+ <> show cvalue+ <> ","+ <> ts+ <> ","+ <> fs+ <> ")"+ )+ $ validateSpec unboundedConfig spec+ )+ ++ ( do+ let cond = symSpec "cond" :: BoolWithFixedSizedBVSpec bv 1+ let condTerm = ssymTerm "cond" :: Term Bool+ (opName, op, opSpec) <-+ [ ("and", andBitsTerm, andBitsSpec),+ ("or", orBitsTerm, orBitsSpec),+ ("xor", xorBitsTerm, xorBitsSpec),+ ("ite", iteTerm condTerm, iteSpec cond)+ ]+ let name = opName <> "(sext,sext)"+ let spec@(FixedSizedBVWithBoolSpec _ r) =+ opSpec+ ( bvextendSpec+ True+ (Proxy :: Proxy 8)+ (symSpec "a" :: FixedSizedBVWithBoolSpec bv 4)+ )+ ( bvextendSpec+ True+ (Proxy :: Proxy 8)+ (symSpec "b" :: FixedSizedBVWithBoolSpec bv 4)+ )+ let expected =+ bvExtendTerm+ True+ (Proxy :: Proxy 8)+ ( op+ (ssymTerm "a" :: Term (bv 4))+ (ssymTerm "b" :: Term (bv 4))+ )+ return $ testCase name $ do+ r @?= expected+ validateSpec @(FixedSizedBVWithBoolSpec bv 8) unboundedConfig spec+ )+ ++ ( do+ let a = symSpec "a" :: FixedSizedBVWithBoolSpec bv 4+ let b = symSpec "b" :: FixedSizedBVWithBoolSpec bv 4+ let c = symSpec "c" :: FixedSizedBVWithBoolSpec bv 4+ let cond = symSpec "cond" :: BoolWithFixedSizedBVSpec bv 1+ (lhs, rhs, lhsName, rhsName) <-+ [ (andBitsSpec a b, a, "(& a b)", "a"),+ (andBitsSpec a b, b, "(& a b)", "b"),+ (a, andBitsSpec a b, "a", "(& a b)"),+ (b, andBitsSpec a b, "b", "(& a b)"),+ (orBitsSpec a b, a, "(| a b)", "a"),+ (orBitsSpec a b, b, "(| a b)", "b"),+ (a, orBitsSpec a b, "a", "(| a b)"),+ (b, orBitsSpec a b, "b", "(| a b)"),+ (andBitsSpec a b, andBitsSpec a c, "(& a b)", "(& a c)"),+ (andBitsSpec a b, andBitsSpec c a, "(& a b)", "(& c a)"),+ (andBitsSpec a b, andBitsSpec b c, "(& a b)", "(& b c)"),+ (andBitsSpec a b, andBitsSpec c b, "(& a b)", "(& c b)"),+ (orBitsSpec a b, orBitsSpec a c, "(| a b)", "(| a c)"),+ (orBitsSpec a b, orBitsSpec c a, "(| a b)", "(| c a)"),+ (orBitsSpec a b, orBitsSpec b c, "(| a b)", "(| b c)"),+ (orBitsSpec a b, orBitsSpec c b, "(| a b)", "(| c b)")+ ]+ let spec = iteSpec cond lhs rhs+ return $+ testCase ("ite(cond," <> lhsName <> "," <> rhsName <> ")") $+ validateSpec @(FixedSizedBVWithBoolSpec bv 4) unboundedConfig spec+ )+ ++ ( do+ trueBranch <- [True, False]+ (opName, spec) <-+ [("and", andBitsSpec), ("or", orBitsSpec)]+ let iteName = "ite(cond,const,const)"+ let name =+ opName+ <> "("+ <> (if trueBranch then iteName else "a")+ <> ","+ <> (if trueBranch then "b" else iteName)+ <> ")"+ return $ testProperty name $ \a b -> ioProperty $ do+ let ite =+ iteSpec+ (symSpec "cond" :: BoolWithFixedSizedBVSpec bv 4)+ (conSpec a :: FixedSizedBVWithBoolSpec bv 4)+ (conSpec b :: FixedSizedBVWithBoolSpec bv 4)+ let s = symSpec "a" :: FixedSizedBVWithBoolSpec bv 4+ let lhs = if trueBranch then ite else s+ let rhs = if trueBranch then s else ite+ let resSpec = spec lhs rhs+ validateSpec unboundedConfig resSpec+ )+ ++ ( do+ a <- [0, 1, 4, 7, 8, 9, 16]+ (opName, opSpec) <-+ [ ("shr", shiftRightSpec),+ ("shl", shiftLeftSpec)+ ]+ return $ testCase (opName <> "(bv8," <> show a <> ")") $ do+ let spec =+ opSpec+ (symSpec "a" :: FixedSizedBVWithBoolSpec bv 8)+ (conSpec a)+ validateSpec @(FixedSizedBVWithBoolSpec bv 8) unboundedConfig spec+ )+ ++ ( do+ trueBranch <- [True, False]+ innerTrueBranch <- [True, False]+ let l = symSpec "l" :: FixedSizedBVWithBoolSpec bv 8+ let r = symSpec "r" :: FixedSizedBVWithBoolSpec bv 8+ let cond = symSpec "cond" :: BoolWithFixedSizedBVSpec bv 8+ (absorbing, absorbingTerm, absorbingValueName, opName, opSpec, opTerm) <-+ [ ( conSpec 0 :: FixedSizedBVWithBoolSpec bv 8,+ conTerm 0 :: Term (bv 8),+ "0",+ "and",+ andBitsSpec,+ andBitsTerm+ ),+ ( conSpec $ -1 :: FixedSizedBVWithBoolSpec bv 8,+ conTerm $ -1 :: Term (bv 8),+ "-1",+ "or",+ orBitsSpec,+ orBitsTerm+ )+ ]+ let condTerm = ssymTerm "cond" :: Term Bool+ let lTerm = ssymTerm "l" :: Term (bv 8)+ let rTerm = ssymTerm "r" :: Term (bv 8)++ let (lhsName, lhs, lhsResultTerm)+ | trueBranch && innerTrueBranch = ("ite(cond," <> absorbingValueName <> ",l)", iteSpec cond absorbing l, absorbingTerm)+ | trueBranch && not innerTrueBranch = ("ite(cond,l," <> absorbingValueName <> ")", iteSpec cond l absorbing, opTerm lTerm rTerm)+ | otherwise = ("l", l, if innerTrueBranch then absorbingTerm else opTerm lTerm rTerm)+ let (rhsName, rhs, rhsResultTerm)+ | trueBranch = ("r", r, if innerTrueBranch then opTerm lTerm rTerm else absorbingTerm)+ | innerTrueBranch = ("ite(cond," <> absorbingValueName <> ",r)", iteSpec cond absorbing r, opTerm lTerm rTerm)+ | otherwise = ("ite(cond,r," <> absorbingValueName <> ")", iteSpec cond r absorbing, absorbingTerm)+ let spec@(FixedSizedBVWithBoolSpec _ rspec) = opSpec lhs rhs+ return $ testCase (opName <> "(" <> lhsName <> "," <> rhsName <> ")") $ do+ rspec @?= iteTerm condTerm lhsResultTerm rhsResultTerm+ validateSpec @(FixedSizedBVWithBoolSpec bv 8) unboundedConfig spec+ )+ ++ ( do+ innerTrueBranch <- [0 :: Int, -1]+ let innerFalseBranch = -1 - innerTrueBranch+ lhsIsExtend <- [True, False]+ let extendName =+ "sext(ite(cond,"+ <> show innerTrueBranch+ <> ","+ <> show innerFalseBranch+ <> "))"+ (opName, opSpec, opTerm) <-+ [ ("and", andBitsSpec, pevalAndBitsTerm),+ ("or", orBitsSpec, pevalOrBitsTerm)+ ]+ let name =+ opName+ <> if lhsIsExtend then "(" <> extendName <> ",c)" else "(c," <> extendName <> ")"+ return $+ testCase name $+ do+ let extend =+ bvextendSpec+ True+ (Proxy :: Proxy 8)+ ( iteSpec+ (symSpec "cond" :: BoolWithFixedSizedBVSpec bv 1)+ (conSpec $ fromIntegral innerTrueBranch :: FixedSizedBVWithBoolSpec bv 4)+ (conSpec $ fromIntegral innerFalseBranch :: FixedSizedBVWithBoolSpec bv 4)+ ) ::+ FixedSizedBVWithBoolSpec bv 8+ let single = symSpec "c" :: FixedSizedBVWithBoolSpec bv 8+ let spec@(FixedSizedBVWithBoolSpec _ r) =+ if lhsIsExtend+ then opSpec extend single+ else opSpec single extend+ let expected =+ iteTerm+ (ssymTerm "cond" :: Term Bool)+ (opTerm (conTerm $ fromIntegral innerTrueBranch) (ssymTerm "c"))+ (opTerm (conTerm $ fromIntegral innerFalseBranch) (ssymTerm "c"))+ r @?= expected+ validateSpec @(FixedSizedBVWithBoolSpec bv 8) unboundedConfig spec+ )++bv1Test ::+ forall bv.+ ( SupportedNonFuncPrim (bv 1),+ Num (bv 1),+ Typeable bv,+ PEvalBitwiseTerm (bv 1)+ ) =>+ Test+bv1Test =+ testGroup (show (typeRep @bv) <> " 1") $+ ( do+ (opName, op, v, bvop) <-+ [ ("||", orSpec, 0, andBitsTerm),+ ("||", orSpec, 1, orBitsTerm),+ ("&&", andSpec, 0, orBitsTerm),+ ("&&", andSpec, 1, andBitsTerm)+ ]+ let isV = "==" <> show v+ let name = "(a" <> isV <> ")" <> opName <> "(b" <> isV <> ")"+ let spec@(BoolWithFixedSizedBVSpec _ r) =+ op+ (eqvSpec (symSpec "a" :: FixedSizedBVWithBoolSpec bv 1) (conSpec v))+ (eqvSpec (symSpec "b" :: FixedSizedBVWithBoolSpec bv 1) (conSpec v))+ let expected =+ eqTerm+ ( bvop+ (ssymTerm "a" :: Term (bv 1))+ (ssymTerm "b")+ )+ (conTerm v)+ return $ testCase name $ do+ r @?= expected+ validateSpec @(BoolWithFixedSizedBVSpec bv 1) unboundedConfig spec+ )+ ++ ( do+ cond <- [0 :: bv 1, 1]+ t <- [0 :: bv 1, 1]+ let f = 1 - t+ let name = "ite(a==" <> show cond <> "," <> show t <> "," <> show f <> ")"+ let spec@(FixedSizedBVWithBoolSpec _ r) =+ iteSpec+ ( eqvSpec+ (symSpec "a" :: FixedSizedBVWithBoolSpec bv 1)+ (conSpec cond) ::+ BoolWithFixedSizedBVSpec bv 1+ )+ (conSpec t)+ (conSpec f)+ let aTerm = ssymTerm "a" :: Term (bv 1)+ let expected =+ if t == cond+ then aTerm+ else complementBitsTerm aTerm+ return $ testCase name $ do+ r @?= expected+ validateSpec @(FixedSizedBVWithBoolSpec bv 1) unboundedConfig spec+ )+ ++ [ testCase "(a==b)==(a==c)" $ do+ let spec@(BoolWithFixedSizedBVSpec _ r) =+ eqvSpec+ (eqvSpec (symSpec "a" :: FixedSizedBVWithBoolSpec bv 1) (symSpec "b") :: BoolWithFixedSizedBVSpec bv 1)+ (eqvSpec (symSpec "a" :: FixedSizedBVWithBoolSpec bv 1) (symSpec "c"))+ validateSpec @(BoolWithFixedSizedBVSpec bv 1)+ unboundedConfig+ spec+ r @?= eqTerm (ssymTerm "b" :: Term (bv 1)) (ssymTerm "c")+ ]+ termRewritingTests :: Test termRewritingTests = testGroup "TermRewriting"- [ testGroup+ [ bv1Test @WordN,+ bv1Test @IntN,+ bvConcatTest @WordN,+ bvConcatTest @IntN,+ testGroup "Bool only" [ testProperty "Bool only random test" $ mapSize (`min` 10) $@@ -279,7 +723,34 @@ ) ) (symSpec "xxx" :: BoolOnlySpec)- )+ ),+ testCase "And absortion" $ do+ let spec@(BoolOnlySpec _ r) =+ andSpec+ (orSpec (symSpec "c") (orSpec (symSpec "b") (symSpec "a")))+ (andSpec (symSpec "a") (andSpec (symSpec "d") (symSpec "e")))+ validateSpec @BoolOnlySpec+ unboundedConfig+ spec+ r @?= andTerm (ssymTerm "a") (andTerm (ssymTerm "d") (ssymTerm "e")),+ testCase "Or absorption" $ do+ let spec@(BoolOnlySpec _ r) =+ orSpec+ (andSpec (symSpec "c") (andSpec (symSpec "b") (symSpec "a")))+ (orSpec (symSpec "a") (orSpec (symSpec "d") (symSpec "e")))+ validateSpec @BoolOnlySpec+ unboundedConfig+ spec+ r @?= orTerm (ssymTerm "a") (orTerm (ssymTerm "d") (ssymTerm "e")),+ testCase "(a==b)==(a==c)" $ do+ let spec@(BoolOnlySpec _ r) =+ eqvSpec+ (eqvSpec (symSpec "a" :: BoolOnlySpec) (symSpec "b") :: BoolOnlySpec)+ (eqvSpec (symSpec "a" :: BoolOnlySpec) (symSpec "c"))+ validateSpec @BoolOnlySpec+ unboundedConfig+ spec+ r @?= eqTerm (ssymTerm "b" :: Term Bool) (ssymTerm "c") ], testGroup "LIA"@@ -567,8 +1038,8 @@ ] let ps = [ fpBinaryOpSpec op l r :: IEEEFPSpec 4 4- | l <- lst,- r <- lst+ | l <- lst,+ r <- lst ] traverse_ (validateSpec z3) ps, testGroup "RoundingOp" $ do@@ -636,10 +1107,7 @@ ( Arbitrary a, PEvalBitCastTerm a b, SupportedNonFuncPrim a,- SupportedNonFuncPrim b,- Show a,- Typeable a,- Typeable b+ SupportedNonFuncPrim b ) => Test bitCastCase = testProperty@@ -658,11 +1126,7 @@ PEvalBitCastOrTerm a b, RealFloat a, SupportedNonFuncPrim a,- SupportedNonFuncPrim b,- Show b,- Show a,- Typeable b,- Typeable a+ SupportedNonFuncPrim b ) => Test fromFPCase = testProperty@@ -681,10 +1145,7 @@ PEvalBitCastTerm a b, RealFloat b, SupportedNonFuncPrim a,- SupportedNonFuncPrim b,- Show a,- Typeable a,- Typeable b+ SupportedNonFuncPrim b ) => Test toFPCase = testProperty@@ -762,9 +1223,7 @@ ( ValidFP eb sb, Arbitrary b, PEvalIEEEFPConvertibleTerm b,- TermRewritingSpec spec b,- Show b,- Typeable b+ TermRewritingSpec spec b ) => Bool -> Test@@ -833,9 +1292,7 @@ SupportedNonFuncPrim b, LinkedRep b bs, Solvable b bs,- SymEq bs,- Show b,- Typeable b+ SymEq bs ) => Test toFPCase = testProperty
test/Grisette/Core/Data/Class/PPrintTests.hs view
@@ -616,40 +616,31 @@ (arbitrary :: Gen (Maybe (Maybe Int))), propertyPFormatRead "Maybe (,)"- ( arbitrary :: Gen (Maybe (Int, Int))- ),+ (arbitrary :: Gen (Maybe (Int, Int))), propertyPFormatRead "Maybe I5"- ( arbitrary :: Gen (Maybe (I5 Int))- ),+ (arbitrary :: Gen (Maybe (I5 Int))), propertyPFormatRead "Maybe []"- ( arbitrary :: Gen (Maybe [Int])- ),+ (arbitrary :: Gen (Maybe [Int])), propertyPFormatRead "Maybe Record"- ( arbitrary :: Gen (Maybe (Record Int Int))- ),+ (arbitrary :: Gen (Maybe (Record Int Int))), propertyPFormatRead "(Maybe,Either)"- ( arbitrary :: Gen (Maybe Int, Either Int Int)- ),+ (arbitrary :: Gen (Maybe Int, Either Int Int)), propertyPFormatRead "((,),(,))"- ( arbitrary :: Gen ((Int, Int), (Int, Int))- ),+ (arbitrary :: Gen ((Int, Int), (Int, Int))), propertyPFormatRead "(I5,I5)"- ( arbitrary :: Gen (I5 Int, I5 Int)- ),+ (arbitrary :: Gen (I5 Int, I5 Int)), propertyPFormatRead "([],[])"- ( arbitrary :: Gen ([Int], [Int])- ),+ (arbitrary :: Gen ([Int], [Int])), propertyPFormatRead "(Record,Record)"- ( arbitrary :: Gen (Record Int Int, Record Int Int)- ),+ (arbitrary :: Gen (Record Int Int, Record Int Int)), propertyPFormatRead "I5 (,)" (arbitrary :: Gen (I5 (Int, Int))), propertyPFormatRead "I5 I6" (arbitrary :: Gen (I5 (I6 Int))), propertyPFormatRead "I5 I5" (arbitrary :: Gen (I5 (I5 Int))),@@ -661,41 +652,32 @@ (arbitrary :: Gen (I5 (Record Int Int))), propertyPFormatRead "[Maybe]"- ( arbitrary :: Gen [Maybe Int]- ),+ (arbitrary :: Gen [Maybe Int]), propertyPFormatRead "[(,)]"- ( arbitrary :: Gen [(Int, Int)]- ),+ (arbitrary :: Gen [(Int, Int)]), propertyPFormatRead "[I5]" (arbitrary :: Gen [I5 Int]), propertyPFormatRead "[[]]"- ( arbitrary :: Gen [[Int]]- ),+ (arbitrary :: Gen [[Int]]), propertyPFormatRead "[Record]"- ( arbitrary :: Gen [Record Int Int]- ),+ (arbitrary :: Gen [Record Int Int]), propertyPFormatRead "Record Maybe Either"- ( arbitrary :: Gen (Record (Maybe Int) (Either Int Int))- ),+ (arbitrary :: Gen (Record (Maybe Int) (Either Int Int))), propertyPFormatRead "Record (,) (,)"- ( arbitrary :: Gen (Record (Int, Int) (Int, Int))- ),+ (arbitrary :: Gen (Record (Int, Int) (Int, Int))), propertyPFormatRead "Record I5 I6"- ( arbitrary :: Gen (Record (I5 Int) (I6 Int))- ),+ (arbitrary :: Gen (Record (I5 Int) (I6 Int))), propertyPFormatRead "Record []"- ( arbitrary :: Gen (Record [Int] [Int])- ),+ (arbitrary :: Gen (Record [Int] [Int])), propertyPFormatRead "Record Record"- ( arbitrary :: Gen (Record (Record Int Int) (Record Int Int))- ),+ (arbitrary :: Gen (Record (Record Int Int) (Record Int Int))), testPPrint1 "Identity" 0
test/Grisette/Core/Data/Class/TryMergeTests.hs view
@@ -158,7 +158,7 @@ (\x -> mrgSingle $ x + 1), testMerged = mrgSingle $ symIte "a" ("b" + 1) ("c" + 1) }- ]+ ] case test of TryMergeInstanceTest name unmerged merged -> [ testCase name $ do
test/Grisette/Core/TH/DerivationData.hs view
@@ -19,8 +19,7 @@ {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE UndecidableInstances #-}---- {-# OPTIONS_GHC -ddump-splices -ddump-to-file -ddump-file-prefix=derivation #-}+{-# OPTIONS_GHC -ddump-splices -ddump-to-file -ddump-file-prefix=derivation #-} module Grisette.Core.TH.DerivationData ( T (..),@@ -34,11 +33,14 @@ Ambiguous (..), replaceVVVShown, gggToVVV,+ Serializable (..), ) where import Control.DeepSeq (NFData, NFData1, NFData2) import Control.Monad.Identity (Identity (Identity))+import Data.Binary (Binary)+import Data.Bytes.Serial (Serial) import Data.Functor.Classes ( Eq1 (liftEq), Eq2,@@ -50,6 +52,7 @@ import Data.Hashable (Hashable) import Data.Hashable.Lifted (Hashable1, Hashable2) import Data.Maybe (fromJust)+import Data.Serialize (Serialize) import qualified Data.Text as T import Data.Typeable (Proxy, Typeable) import GHC.Generics (Generic)@@ -59,6 +62,7 @@ AllSyms2, BasicSymPrim, Default (Default),+ DeriveConfig (unconstrainedPositions), EvalSym, EvalSym1, EvalSym2,@@ -72,6 +76,7 @@ PPrint1, PPrint2, SimpleMergeable,+ Solvable (con), SubstSym, SubstSym1, SubstSym2,@@ -88,11 +93,13 @@ Union, allClasses0, allClasses012,- deriveGADT,- deriveGADTWith,+ derive,+ deriveWith,+ (.&&),+ (.||), ) import Grisette.Core.TH.PartialEvalMode (PartialEvalMode)-import Grisette.Internal.TH.GADT.Common+import Grisette.Internal.TH.Derivation.Common ( DeriveConfig ( bitSizePositions, evalModeConfig,@@ -111,15 +118,30 @@ GetWordN, UnifiedSimpleMergeable, )-import Test.QuickCheck (Arbitrary, oneof)+import Test.QuickCheck (Arbitrary, oneof, sized) import Test.QuickCheck.Arbitrary (Arbitrary (arbitrary)) +newtype Skipped a b c = Skipped b++deriveWith+ (mempty {unconstrainedPositions = [0, 2]})+ [''Skipped]+ allClasses012++data Empty a b c++derive [''Empty] allClasses012++data EmptyWithMode (mode :: EvalModeTag) a b c++derive [''EmptyWithMode] allClasses012+ data T mode n a = T (GetBool mode) [GetWordN mode n] [a] (GetData mode (T mode n a)) | TNil #if MIN_VERSION_base(4,16,0)-deriveGADTWith+deriveWith ( mempty { evalModeConfig = [(0, EvalModeConstraints [''EvalModeBV, ''EvalModeBase])],@@ -146,7 +168,7 @@ newtype X mode = X [GetBool mode] -deriveGADTWith+deriveWith ( mempty { evalModeConfig = [(0, EvalModeConstraints [''EvalModeBase])] }@@ -161,7 +183,7 @@ d :: Maybe Int } -deriveGADTWith+deriveWith ( mempty { needExtraMergeableUnderEvalMode = True }@@ -171,7 +193,7 @@ data Basic = Basic0 | Basic1 Int | Basic2 String [Int] -deriveGADT [''Basic] allClasses0+derive [''Basic] allClasses0 data Extra mode n eb sb a where Extra ::@@ -185,7 +207,7 @@ Extra mode n eb sb a #if MIN_VERSION_base(4,16,0)-deriveGADTWith+deriveWith ( mempty { evalModeConfig = [(0, EvalModeConstraints [''PartialEvalMode])], bitSizePositions = [1],@@ -238,7 +260,7 @@ f a -> Expr g b -deriveGADT+derive [''Expr] [ ''Mergeable, ''Mergeable1,@@ -264,11 +286,11 @@ instance (Eq1 f) => Eq1 (Expr f) where liftEq = undefined -deriveGADT [''Expr] [''Hashable, ''Hashable1]+derive [''Expr] [''Hashable, ''Hashable1] data P a b = P a | Q Int -deriveGADT+derive [''P] [ ''Mergeable, ''Mergeable1,@@ -321,7 +343,7 @@ infixr 5 :| -deriveGADT+derive [''GGG] [ ''Show, ''Show1,@@ -396,7 +418,7 @@ instance Eq (Ambiguous x) where (==) = undefined -deriveGADT+derive [''Ambiguous] [ ''AllSyms, ''Mergeable,@@ -415,7 +437,7 @@ (GetData mode (SimpleMergeableType mode n x)) #if MIN_VERSION_base(4,16,0)-deriveGADTWith+deriveWith ( mempty { evalModeConfig = [(0, EvalModeConstraints [''EvalModeBV, ''EvalModeBase])],@@ -426,3 +448,21 @@ [''SimpleMergeableType] ([''SimpleMergeable, ''UnifiedSimpleMergeable] ++ allClasses0) #endif++data Serializable a+ = Se1 a+ | Se2 SymBool+ deriving (Show, Eq)++instance (Arbitrary a) => Arbitrary (Serializable a) where+ arbitrary = oneof [Se1 <$> arbitrary, Se2 <$> sized bool]+ where+ bool n | n <= 0 = do+ b <- arbitrary+ oneof [return (con b), return "a", return "b"]+ bool n = do+ l <- bool (n `div` 2)+ r <- bool (n `div` 2)+ oneof [return (l .|| r), return (l .&& r), return l]++derive [''Serializable] [''Serial, ''Serialize, ''Binary]
test/Grisette/Core/TH/DerivationTest.hs view
@@ -13,6 +13,9 @@ module Grisette.Core.TH.DerivationTest (derivationTest) where +import Data.Bytes.Get (runGetS)+import Data.Bytes.Put (runPutS)+import Data.Bytes.Serial (Serial (deserialize, serialize)) import Data.Functor.Classes (showsPrec1, showsPrec2) import qualified Data.Text as T import GHC.TypeLits (KnownNat, type (<=))@@ -37,6 +40,7 @@ import Grisette.Core.TH.DerivationData ( Extra (Extra), GGG,+ Serializable, gggToVVV, replaceVVVShown, )@@ -155,6 +159,11 @@ symCompare1 g1 g2 === (g1 `symCompare` g2), testProperty "GADT SymOrd2 and SymOrd are consistent" $ \(g1 :: GGG (GGG Int String) [Int]) g2 ->- symCompare2 g1 g2 === (g1 `symCompare` g2)+ symCompare2 g1 g2 === (g1 `symCompare` g2),+ testProperty "Serialize" $ do+ \(s :: Serializable Int) ->+ let bs = runPutS (serialize s)+ s' = runGetS deserialize bs+ in Right s === s' ] ++ derivationExtraTest
test/Grisette/Lib/Control/Monad/Trans/State/Common.hs view
@@ -244,8 +244,7 @@ let actual = runStateT (mrgIfPropagatedStrategy (ssymBool "c") a b) (ssymBool "d") let expected = mrgSingle- ( mrgIte (ssymBool "c") ((), ssymBool "x") ((), ssymBool "y")- )+ (mrgIte (ssymBool "c") ((), ssymBool "x") ((), ssymBool "y")) unionSize actual @?= 1 actual @?=~ expected
test/Grisette/Lib/Data/FoldableTests.hs view
@@ -154,7 +154,7 @@ ("mrgMapM_", mrgMapM_, mrgMapM_), ("mrgFor_", flip mrgFor_, flip mrgFor_), ("mrgForM_", flip mrgForM_, flip mrgForM_)- ]+ ] [ testGroup name [ testCase "semantics" $ do@@ -187,7 +187,7 @@ (name, func0, func1) <- [ ("mrgSequence_", mrgSequence_, mrgSequence_), ("mrgSequenceA_", mrgSequenceA_, mrgSequenceA_)- ]+ ] [ testGroup name [ testCase "semantics" $ do
test/Grisette/Lib/Data/ListTests.hs view
@@ -638,8 +638,7 @@ Union [SymInteger] let expected = mrgIf- ( aint ./= bint .|| aint ./= cint .|| aint ./= dint- )+ (aint ./= bint .|| aint ./= cint .|| aint ./= dint) ( return [ symIte (aint ./= bint) cint bint, symIte (aint ./= bint .|| aint ./= cint) dint cint
test/Grisette/Lib/Data/TraversableTests.hs view
@@ -44,7 +44,7 @@ ("mrgMapM", mrgMapM, mrgMapM), ("mrgFor", flip mrgFor, flip mrgFor), ("mrgForM", flip mrgForM, flip mrgForM)- ]+ ] return $ testGroup name@@ -87,7 +87,7 @@ (name, func0, func1) <- [ ("mrgSequenceA", mrgSequenceA, mrgSequenceA), ("mrgSequence", mrgSequence, mrgSequence)- ]+ ] return $ testGroup name@@ -140,7 +140,7 @@ \f s t -> mrgForAccumM s t f, \f s t -> mrgForAccumM s t f )- ]+ ] return $ testGroup name
test/Grisette/SymPrim/FPTests.hs view
@@ -482,16 +482,16 @@ let operand = [fpNaN :: FP32, 1] let operands = [ (a, b, c)- | a <- operand,- b <- operand,- c <- operand,- fpIsNaN a || fpIsNaN b || fpIsNaN c+ | a <- operand,+ b <- operand,+ c <- operand,+ fpIsNaN a || fpIsNaN b || fpIsNaN c ] traverse_ (\(o, r, (a, b, c)) -> SameFPObj (o r a b c) @?= fpNaN) $ [ (o, r, (a, b, c))- | o <- op,- r <- roundingMode,- (a, b, c) <- operands+ | o <- op,+ r <- roundingMode,+ (a, b, c) <- operands ], testCase "fpAdd" $ do let v = 60 :: FP 4 4
test/Grisette/SymPrim/Prim/BVTests.hs view
@@ -149,7 +149,7 @@ (Proxy @4) (bitCastTerm @(WordN 2) @(IntN 2) (ssymTerm "a")) }- ]+ ] return $ testCase name $ do let actual = pevalBitCastTerm term actual @?= expected,@@ -193,7 +193,7 @@ (Proxy @4) (bitCastTerm @(IntN 2) @(WordN 2) (ssymTerm "a")) }- ]+ ] return $ testCase name $ do let actual = pevalBitCastTerm term actual @?= expected,@@ -411,7 +411,7 @@ (Proxy @1) (ssymTerm "a" :: Term (WordN 4)) }- ]+ ] return . testCase name $ pevalBVSelectTerm ix w term @?= expected, testGroup "pevalBVExtendTerm" $ do@@ -473,7 +473,7 @@ bvExtendExpected = bvExtendTerm True (Proxy @6) (ssymTerm "a" :: Term (WordN 2)) }- ]+ ] return . testCase name $ pevalBVExtendTerm signed pr term @?= expected, testGroup "pevalBVConcatTerm" $ do@@ -494,8 +494,7 @@ bvConcatTestExpected = bvConcatTerm (conTerm 29 :: Term (WordN 7))- ( ssymTerm "b" :: Term (WordN 3)- )+ (ssymTerm "b" :: Term (WordN 3)) }, BVConcatTest { bvConcatTestName = "[c1 (s c2)] -> (c1 (s c2))",@@ -549,8 +548,7 @@ (conTerm 3 :: Term (WordN 4)) ( bvConcatTerm (ssymTerm "a" :: Term (WordN 4))- ( conTerm 5 :: Term (WordN 3)- )+ (conTerm 5 :: Term (WordN 3)) ) }, BVConcatTest@@ -710,8 +708,7 @@ (ssymTerm "a" :: Term (WordN 4)) (conTerm 83 :: Term (WordN 8)) )- ( ssymTerm "b" :: Term (WordN 4)- )+ (ssymTerm "b" :: Term (WordN 4)) ) (conTerm 7 :: Term (WordN 4)) },@@ -769,8 +766,7 @@ (ssymTerm "a" :: Term (WordN 4)) ( bvConcatTerm (conTerm 87 :: Term (WordN 8))- ( ssymTerm "b" :: Term (WordN 4)- )+ (ssymTerm "b" :: Term (WordN 4)) ) ) },@@ -851,8 +847,7 @@ (ssymTerm "a" :: Term (WordN 4)) (conTerm 5 :: Term (WordN 4)) )- ( ssymTerm "b" :: Term (WordN 3)- )+ (ssymTerm "b" :: Term (WordN 3)) ) }, BVConcatTest@@ -924,7 +919,7 @@ (ssymTerm "a" :: Term (WordN 4)) (ssymTerm "b" :: Term (WordN 3)) }- ]+ ] return . testCase name $ pevalBVConcatTerm lhs rhs @?= expected ]
test/Grisette/SymPrim/Prim/BitsTests.hs view
@@ -7,6 +7,7 @@ module Grisette.SymPrim.Prim.BitsTests (bitsTests) where import Data.Bits (Bits (rotateL, rotateR), FiniteBits)+import Data.Data (Proxy (Proxy)) import Grisette (IntN, SupportedPrim, WordN) import Grisette.Internal.SymPrim.Prim.Term ( PEvalBitwiseTerm@@ -25,6 +26,9 @@ ), Term, andBitsTerm,+ bvConcatTerm,+ bvExtendTerm,+ bvSelectTerm, complementBitsTerm, conTerm, orBitsTerm,@@ -38,7 +42,7 @@ import Test.Framework (Test, testGroup) import Test.Framework.Providers.HUnit (testCase) import Test.Framework.Providers.QuickCheck2 (testProperty)-import Test.HUnit ((@=?))+import Test.HUnit ((@?=)) import Test.QuickCheck (Property, discard, ioProperty) bitsTests :: Test@@ -51,30 +55,30 @@ pevalAndBitsTerm (conTerm 3 :: Term (WordN 4)) (conTerm 5)- @=? conTerm 1,+ @?= conTerm 1, testCase "On zeroBits" $ do pevalAndBitsTerm (conTerm 0 :: Term (WordN 4)) (ssymTerm "a")- @=? conTerm 0+ @?= conTerm 0 pevalAndBitsTerm (ssymTerm "a") (conTerm 0 :: Term (WordN 4))- @=? conTerm 0,+ @?= conTerm 0, testCase "On all one bits" $ do pevalAndBitsTerm (conTerm 15 :: Term (WordN 4)) (ssymTerm "a")- @=? ssymTerm "a"+ @?= ssymTerm "a" pevalAndBitsTerm (ssymTerm "a") (conTerm 15 :: Term (WordN 4))- @=? ssymTerm "a",+ @?= ssymTerm "a", testCase "On symbolic" $ do pevalAndBitsTerm (ssymTerm "a" :: Term (WordN 4)) (ssymTerm "b")- @=? andBitsTerm+ @?= andBitsTerm (ssymTerm "a" :: Term (WordN 4)) (ssymTerm "b" :: Term (WordN 4)) ],@@ -84,30 +88,30 @@ pevalOrBitsTerm (conTerm 3 :: Term (WordN 4)) (conTerm 5)- @=? conTerm 7,+ @?= conTerm 7, testCase "On zeroBits" $ do pevalOrBitsTerm (conTerm 0 :: Term (WordN 4)) (ssymTerm "a")- @=? ssymTerm "a"+ @?= ssymTerm "a" pevalOrBitsTerm (ssymTerm "a") (conTerm 0 :: Term (WordN 4))- @=? ssymTerm "a",+ @?= ssymTerm "a", testCase "On all one bits" $ do pevalOrBitsTerm (conTerm 15 :: Term (WordN 4)) (ssymTerm "a")- @=? conTerm 15+ @?= conTerm 15 pevalOrBitsTerm (ssymTerm "a") (conTerm 15 :: Term (WordN 4))- @=? conTerm 15,+ @?= conTerm 15, testCase "On symbolic" $ do pevalOrBitsTerm (ssymTerm "a" :: Term (WordN 4)) (ssymTerm "b")- @=? orBitsTerm+ @?= orBitsTerm (ssymTerm "a" :: Term (WordN 4)) (ssymTerm "b" :: Term (WordN 4)) ],@@ -117,142 +121,171 @@ pevalXorBitsTerm (conTerm 3 :: Term (WordN 4)) (conTerm 5)- @=? conTerm 6,+ @?= conTerm 6, testCase "On zeroBits" $ do pevalXorBitsTerm (conTerm 0 :: Term (WordN 4)) (ssymTerm "a")- @=? ssymTerm "a"+ @?= ssymTerm "a" pevalXorBitsTerm (ssymTerm "a") (conTerm 0 :: Term (WordN 4))- @=? ssymTerm "a",+ @?= ssymTerm "a", testCase "On all one bits" $ do pevalXorBitsTerm (conTerm 15 :: Term (WordN 4)) (ssymTerm "a")- @=? pevalComplementBitsTerm (ssymTerm "a")+ @?= pevalComplementBitsTerm (ssymTerm "a") pevalXorBitsTerm (ssymTerm "a") (conTerm 15 :: Term (WordN 4))- @=? pevalComplementBitsTerm (ssymTerm "a"),+ @?= pevalComplementBitsTerm (ssymTerm "a"), testCase "On single complement" $ do pevalXorBitsTerm (pevalComplementBitsTerm $ ssymTerm "a" :: Term (WordN 4)) (ssymTerm "b")- @=? pevalComplementBitsTerm (pevalXorBitsTerm (ssymTerm "a") (ssymTerm "b"))+ @?= pevalComplementBitsTerm (pevalXorBitsTerm (ssymTerm "a") (ssymTerm "b")) pevalXorBitsTerm (ssymTerm "a" :: Term (WordN 4)) (pevalComplementBitsTerm $ ssymTerm "b")- @=? pevalComplementBitsTerm (pevalXorBitsTerm (ssymTerm "a") (ssymTerm "b")),+ @?= pevalComplementBitsTerm (pevalXorBitsTerm (ssymTerm "a") (ssymTerm "b")), testCase "On both complement" $ do pevalXorBitsTerm (pevalComplementBitsTerm $ ssymTerm "a" :: Term (WordN 4)) (pevalComplementBitsTerm $ ssymTerm "b")- @=? pevalXorBitsTerm (ssymTerm "a") (ssymTerm "b"),+ @?= pevalXorBitsTerm (ssymTerm "a") (ssymTerm "b"), testCase "On symbolic" $ do pevalXorBitsTerm (ssymTerm "a" :: Term (WordN 4)) (ssymTerm "b")- @=? xorBitsTerm+ @?= xorBitsTerm (ssymTerm "a" :: Term (WordN 4)) (ssymTerm "b" :: Term (WordN 4)) ], testGroup "ComplementBits" [ testCase "On concrete" $ do- pevalComplementBitsTerm (conTerm 5 :: Term (WordN 4)) @=? conTerm 10,+ pevalComplementBitsTerm (conTerm 5 :: Term (WordN 4)) @?= conTerm 10, testCase "On complement" $ do- pevalComplementBitsTerm (pevalComplementBitsTerm (ssymTerm "a") :: Term (WordN 4)) @=? ssymTerm "a",+ pevalComplementBitsTerm (pevalComplementBitsTerm (ssymTerm "a") :: Term (WordN 4)) @?= ssymTerm "a", testCase "On symbolic" $ do pevalComplementBitsTerm (ssymTerm "a" :: Term (WordN 4))- @=? complementBitsTerm (ssymTerm "a" :: Term (WordN 4))+ @?= complementBitsTerm (ssymTerm "a" :: Term (WordN 4)) ], testGroup "ShiftLeft" [ testCase "On concrete" $ do- pevalShiftLeftTerm (conTerm 15 :: Term (WordN 4)) (conTerm 2) @=? conTerm 12- pevalShiftLeftTerm (conTerm 15 :: Term (IntN 4)) (conTerm 2) @=? conTerm 12,+ pevalShiftLeftTerm (conTerm 15 :: Term (WordN 4)) (conTerm 2) @?= conTerm 12+ pevalShiftLeftTerm (conTerm 15 :: Term (IntN 4)) (conTerm 2) @?= conTerm 12, testCase "shift 0" $ do- pevalShiftLeftTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 0) @=? ssymTerm "a"- pevalShiftLeftTerm (ssymTerm "a" :: Term (IntN 4)) (conTerm 0) @=? ssymTerm "a",+ pevalShiftLeftTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 0) @?= ssymTerm "a"+ pevalShiftLeftTerm (ssymTerm "a" :: Term (IntN 4)) (conTerm 0) @?= ssymTerm "a", testCase "shift greater or equal to left bitsize" $ do- pevalShiftLeftTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 4) @=? conTerm 0- pevalShiftLeftTerm (ssymTerm "a" :: Term (IntN 4)) (conTerm 4) @=? conTerm 0- pevalShiftLeftTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 5) @=? conTerm 0- pevalShiftLeftTerm (ssymTerm "a" :: Term (IntN 4)) (conTerm 5) @=? conTerm 0,+ pevalShiftLeftTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 4) @?= conTerm 0+ pevalShiftLeftTerm (ssymTerm "a" :: Term (IntN 4)) (conTerm 4) @?= conTerm 0+ pevalShiftLeftTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 5) @?= conTerm 0+ pevalShiftLeftTerm (ssymTerm "a" :: Term (IntN 4)) (conTerm 5) @?= conTerm 0, testCase "shift negative amount is undefined on for IntN" $ do pevalShiftLeftTerm (conTerm 15 :: Term (IntN 4)) (conTerm $ -1)- @=? shiftLeftTerm (conTerm 15) (conTerm $ -1)+ @?= shiftLeftTerm (conTerm 15) (conTerm $ -1) pevalShiftLeftTerm (conTerm 15 :: Term (IntN 4)) (conTerm $ -8)- @=? shiftLeftTerm (conTerm 15) (conTerm $ -8),+ @?= shiftLeftTerm (conTerm 15) (conTerm $ -8), testCase "shift symbolic" $ do+ pevalShiftLeftTerm (ssymTerm "a" :: Term (WordN 4)) (ssymTerm "b")+ @?= shiftLeftTerm (ssymTerm "a" :: Term (WordN 4)) (ssymTerm "b"),+ testCase "shift symbolic by concrete" $ do pevalShiftLeftTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 2)- @=? shiftLeftTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 2),+ @?= bvConcatTerm+ (bvSelectTerm (Proxy @0) (Proxy @2) (ssymTerm "a" :: Term (WordN 4)))+ (conTerm 0 :: Term (WordN 2)), testCase "Regression: shift by very large number" $ do- pevalShiftLeftTerm (conTerm 15 :: Term (IntN 128)) (conTerm maxBound) @=? conTerm 0- pevalShiftLeftTerm (conTerm 15 :: Term (WordN 128)) (conTerm maxBound) @=? conTerm 0+ pevalShiftLeftTerm (conTerm 15 :: Term (IntN 128)) (conTerm maxBound) @?= conTerm 0+ pevalShiftLeftTerm (conTerm 15 :: Term (WordN 128)) (conTerm maxBound) @?= conTerm 0 ], testGroup "ShiftRight" [ testCase "On concrete, should perform arithmetic shifting on IntN" $ do- pevalShiftRightTerm (conTerm 7 :: Term (IntN 4)) (conTerm 2) @=? conTerm 1- pevalShiftRightTerm (conTerm 15 :: Term (IntN 4)) (conTerm 2) @=? conTerm 15,+ pevalShiftRightTerm (conTerm 7 :: Term (IntN 4)) (conTerm 2) @?= conTerm 1+ pevalShiftRightTerm (conTerm 15 :: Term (IntN 4)) (conTerm 2) @?= conTerm 15, testCase "On concrete, should perform logical shifting on WordN" $ do- pevalShiftRightTerm (conTerm 7 :: Term (WordN 4)) (conTerm 2) @=? conTerm 1- pevalShiftRightTerm (conTerm 15 :: Term (WordN 4)) (conTerm 2) @=? conTerm 3,+ pevalShiftRightTerm (conTerm 7 :: Term (WordN 4)) (conTerm 2) @?= conTerm 1+ pevalShiftRightTerm (conTerm 15 :: Term (WordN 4)) (conTerm 2) @?= conTerm 3, testCase "shift 0" $ do- pevalShiftRightTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 0) @=? ssymTerm "a"- pevalShiftRightTerm (ssymTerm "a" :: Term (IntN 4)) (conTerm 0) @=? ssymTerm "a",+ pevalShiftRightTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 0) @?= ssymTerm "a"+ pevalShiftRightTerm (ssymTerm "a" :: Term (IntN 4)) (conTerm 0) @?= ssymTerm "a", testCase "shift greater or equal to left bitsize on WordN" $ do- pevalShiftRightTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 4) @=? conTerm 0- pevalShiftRightTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 5) @=? conTerm 0,- testCase "shift greater or equal to left bitsize on IntN will not be reduced" $ do+ pevalShiftRightTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 4) @?= conTerm 0+ pevalShiftRightTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 5) @?= conTerm 0,+ testCase "shift greater or equal to left bitsize on IntN" $ do pevalShiftRightTerm (ssymTerm "a" :: Term (IntN 4)) (conTerm 5)- @=? shiftRightTerm (ssymTerm "a") (conTerm 5)+ @?= bvExtendTerm+ True+ (Proxy @4)+ ( bvSelectTerm+ (Proxy @3)+ (Proxy @1)+ (ssymTerm "a" :: Term (IntN 4))+ ) pevalShiftRightTerm (ssymTerm "a" :: Term (IntN 4)) (conTerm 4)- @=? shiftRightTerm (ssymTerm "a") (conTerm 4),+ @?= bvExtendTerm+ True+ (Proxy @4)+ ( bvSelectTerm+ (Proxy @3)+ (Proxy @1)+ (ssymTerm "a" :: Term (IntN 4))+ ), testCase "shift negative amount is undefined on for IntN" $ do pevalShiftRightTerm (conTerm 15 :: Term (IntN 4)) (conTerm $ -1)- @=? shiftRightTerm (conTerm 15) (conTerm $ -1)+ @?= shiftRightTerm (conTerm 15) (conTerm $ -1) pevalShiftRightTerm (conTerm 15 :: Term (IntN 4)) (conTerm $ -8)- @=? shiftRightTerm (conTerm 15) (conTerm $ -8),+ @?= shiftRightTerm (conTerm 15) (conTerm $ -8), testCase "shift symbolic" $ do+ pevalShiftRightTerm (ssymTerm "a" :: Term (WordN 4)) (ssymTerm "b")+ @?= shiftRightTerm (ssymTerm "a" :: Term (WordN 4)) (ssymTerm "b"),+ testCase "shift symbolic by concrete" $ do pevalShiftRightTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 2)- @=? shiftRightTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 2),+ @?= bvConcatTerm+ (conTerm 0 :: Term (WordN 2))+ (bvSelectTerm (Proxy @2) (Proxy @2) (ssymTerm "a" :: Term (WordN 4)))+ pevalShiftRightTerm (ssymTerm "a" :: Term (IntN 4)) (conTerm 2)+ @?= bvExtendTerm+ True+ (Proxy @4)+ (bvSelectTerm (Proxy @2) (Proxy @2) (ssymTerm "a" :: Term (IntN 4))), testCase "Regression: shift by very large number" $ do- pevalShiftRightTerm (conTerm 15 :: Term (IntN 128)) (conTerm maxBound) @=? conTerm 0- pevalShiftRightTerm (conTerm 15 :: Term (WordN 128)) (conTerm maxBound) @=? conTerm 0+ pevalShiftRightTerm (conTerm 15 :: Term (IntN 128)) (conTerm maxBound) @?= conTerm 0+ pevalShiftRightTerm (conTerm 15 :: Term (WordN 128)) (conTerm maxBound) @?= conTerm 0 ], testGroup "RotateLeft" [ testCase "On concrete" $ do- pevalRotateLeftTerm (conTerm 0b10100101 :: Term (WordN 8)) (conTerm 2) @=? conTerm 0b10010110- pevalRotateLeftTerm (conTerm 0b10100101 :: Term (IntN 8)) (conTerm 2) @=? conTerm 0b10010110,+ pevalRotateLeftTerm (conTerm 0b10100101 :: Term (WordN 8)) (conTerm 2) @?= conTerm 0b10010110+ pevalRotateLeftTerm (conTerm 0b10100101 :: Term (IntN 8)) (conTerm 2) @?= conTerm 0b10010110, testCase "rotate 0" $ do- pevalRotateLeftTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 0) @=? ssymTerm "a"- pevalRotateLeftTerm (ssymTerm "a" :: Term (IntN 4)) (conTerm 0) @=? ssymTerm "a",+ pevalRotateLeftTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 0) @?= ssymTerm "a"+ pevalRotateLeftTerm (ssymTerm "a" :: Term (IntN 4)) (conTerm 0) @?= ssymTerm "a", testCase "rotate bitsize" $ do pevalRotateLeftTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 4)- @=? ssymTerm "a"+ @?= ssymTerm "a" pevalRotateLeftTerm (ssymTerm "a" :: Term (IntN 4)) (conTerm 4)- @=? ssymTerm "a",+ @?= ssymTerm "a", testCase "rotate greater than left bitsize" $ do pevalRotateLeftTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 5)- @=? rotateLeftTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 1)+ @?= rotateLeftTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 1) pevalRotateLeftTerm (ssymTerm "a" :: Term (IntN 4)) (conTerm 5)- @=? rotateLeftTerm (ssymTerm "a" :: Term (IntN 4)) (conTerm 1),+ @?= rotateLeftTerm (ssymTerm "a" :: Term (IntN 4)) (conTerm 1), testCase "rotate negative amount is undefined on for IntN" $ do pevalRotateLeftTerm (conTerm 15 :: Term (IntN 4)) (conTerm $ -1)- @=? rotateLeftTerm (conTerm 15) (conTerm $ -1)+ @?= rotateLeftTerm (conTerm 15) (conTerm $ -1) pevalRotateLeftTerm (conTerm 15 :: Term (IntN 4)) (conTerm $ -8)- @=? rotateLeftTerm (conTerm 15) (conTerm $ -8),+ @?= rotateLeftTerm (conTerm 15) (conTerm $ -8), testCase "rotate symbolic" $ do pevalRotateLeftTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 2)- @=? rotateLeftTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 2),+ @?= rotateLeftTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 2), testCase "Regression: rotate by very large number" $ do- pevalRotateLeftTerm (conTerm 15 :: Term (IntN 128)) (conTerm maxBound) @=? conTerm (rotateR 15 1)- pevalRotateLeftTerm (conTerm 15 :: Term (WordN 128)) (conTerm maxBound) @=? conTerm (rotateR 15 1)+ pevalRotateLeftTerm (conTerm 15 :: Term (IntN 128)) (conTerm maxBound) @?= conTerm (rotateR 15 1)+ pevalRotateLeftTerm (conTerm 15 :: Term (WordN 128)) (conTerm maxBound) @?= conTerm (rotateR 15 1) ], testGroup "RotateRight"@@ -277,29 +310,29 @@ testProperty "On concrete IntN 8" $ concreteSmallRotateRightCorrect @(IntN 8), testCase "rotate 0" $ do- pevalRotateRightTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 0) @=? ssymTerm "a"- pevalRotateRightTerm (ssymTerm "a" :: Term (IntN 4)) (conTerm 0) @=? ssymTerm "a",+ pevalRotateRightTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 0) @?= ssymTerm "a"+ pevalRotateRightTerm (ssymTerm "a" :: Term (IntN 4)) (conTerm 0) @?= ssymTerm "a", testCase "rotate bitsize" $ do pevalRotateRightTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 4)- @=? ssymTerm "a"+ @?= ssymTerm "a" pevalRotateRightTerm (ssymTerm "a" :: Term (IntN 4)) (conTerm 4)- @=? ssymTerm "a",+ @?= ssymTerm "a", testCase "rotate greater than left bitsize" $ do pevalRotateRightTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 5)- @=? rotateRightTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 1)+ @?= rotateRightTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 1) pevalRotateRightTerm (ssymTerm "a" :: Term (IntN 4)) (conTerm 5)- @=? rotateRightTerm (ssymTerm "a" :: Term (IntN 4)) (conTerm 1),+ @?= rotateRightTerm (ssymTerm "a" :: Term (IntN 4)) (conTerm 1), testCase "rotate negative amount is undefined on for IntN" $ do pevalRotateRightTerm (conTerm 15 :: Term (IntN 4)) (conTerm $ -1)- @=? rotateRightTerm (conTerm 15) (conTerm $ -1)+ @?= rotateRightTerm (conTerm 15) (conTerm $ -1) pevalRotateRightTerm (conTerm 15 :: Term (IntN 4)) (conTerm $ -8)- @=? rotateRightTerm (conTerm 15) (conTerm $ -8),+ @?= rotateRightTerm (conTerm 15) (conTerm $ -8), testCase "rotate symbolic" $ do pevalRotateRightTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 2)- @=? rotateRightTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 2),+ @?= rotateRightTerm (ssymTerm "a" :: Term (WordN 4)) (conTerm 2), testCase "Regression: rotate by very large number" $ do- pevalRotateRightTerm (conTerm 15 :: Term (IntN 128)) (conTerm maxBound) @=? conTerm (rotateL 15 1)- pevalRotateRightTerm (conTerm 15 :: Term (WordN 128)) (conTerm maxBound) @=? conTerm (rotateL 15 1)+ pevalRotateRightTerm (conTerm 15 :: Term (IntN 128)) (conTerm maxBound) @?= conTerm (rotateL 15 1)+ pevalRotateRightTerm (conTerm 15 :: Term (WordN 128)) (conTerm maxBound) @?= conTerm (rotateL 15 1) ] ] @@ -311,4 +344,4 @@ concreteSmallRotateRightCorrect _ b | b < 0 = discard concreteSmallRotateRightCorrect a b = ioProperty $ do pevalRotateRightTerm (conTerm a) (conTerm b)- @=? conTerm (rotateR a (fromIntegral b))+ @?= conTerm (rotateR a (fromIntegral b))
test/Grisette/SymPrim/SomeBVTests.hs view
@@ -484,7 +484,7 @@ (UnionSingle $ bv 4 5) (UnionSingle $ bv 5 4) )- ]+ ] return $ testCase name $ do let actual = mrgIf "cond" (return l) (return r) :: Union SomeIntN@@ -515,7 +515,7 @@ (UnionSingle $ ssymBV 4 "a") (UnionSingle $ ssymBV 5 "b") )- ]+ ] return $ testCase name $ do let actual = mrgIf "cond" (return l) (return r) :: Union SomeSymIntN
+ test/Grisette/SymPrim/SymPrimConstraintTests.hs view
@@ -0,0 +1,97 @@+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE GADTs #-}++module Grisette.SymPrim.SymPrimConstraintTests+ ( symBool,+ symInteger,+ symWordN8,+ symIntN8,+ symFP32,+ symAlgReal,+ someSymWordN,+ someSymIntN,+ bool,+ integer,+ wordN8,+ intN8,+ fp32,+ algReal,+ someWordN,+ someIntN,+ )+where++import Grisette+ ( AlgReal,+ BasicSymPrim,+ FP32,+ IntN8,+ Prim,+ SomeSymWordN,+ SymAlgReal,+ SymBool,+ SymFP32,+ SymIntN8,+ SymInteger,+ SymPrim,+ SymWordN8,+ WordN8,+ )+import Grisette.Internal.SymPrim.SomeBV (SomeIntN, SomeSymIntN, SomeWordN)++data BasicSymPrimType a where+ BasicSymPrimType :: (BasicSymPrim a) => BasicSymPrimType a++symBool :: BasicSymPrimType SymBool+symBool = BasicSymPrimType++symInteger :: BasicSymPrimType SymInteger+symInteger = BasicSymPrimType++symWordN8 :: BasicSymPrimType SymWordN8+symWordN8 = BasicSymPrimType++symIntN8 :: BasicSymPrimType SymIntN8+symIntN8 = BasicSymPrimType++symFP32 :: BasicSymPrimType SymFP32+symFP32 = BasicSymPrimType++symAlgReal :: BasicSymPrimType SymAlgReal+symAlgReal = BasicSymPrimType++data SymPrimType a where+ SymPrimType :: (SymPrim a) => SymPrimType a++someSymWordN :: SymPrimType SomeSymWordN+someSymWordN = SymPrimType++someSymIntN :: SymPrimType SomeSymIntN+someSymIntN = SymPrimType++data PrimType a where+ PrimType :: (Prim a) => PrimType a++bool :: PrimType Bool+bool = PrimType++integer :: PrimType Integer+integer = PrimType++wordN8 :: PrimType WordN8+wordN8 = PrimType++intN8 :: PrimType IntN8+intN8 = PrimType++fp32 :: PrimType FP32+fp32 = PrimType++algReal :: PrimType AlgReal+algReal = PrimType++someWordN :: PrimType SomeWordN+someWordN = PrimType++someIntN :: PrimType SomeIntN+someIntN = PrimType
test/Grisette/Unified/UnifiedClassesTest.hs view
@@ -32,12 +32,12 @@ SymWordN, Union, WordN,- deriveGADTWith,+ deriveWith, mrgReturn, symAnd, ) import qualified Grisette-import Grisette.Internal.TH.GADT.Common+import Grisette.Internal.TH.Derivation.Common ( DeriveConfig ( bitSizePositions, evalModeConfig,@@ -97,7 +97,7 @@ | XNil #if MIN_VERSION_base(4,16,0)-deriveGADTWith+deriveWith ( mempty { evalModeConfig = [(0, EvalModeConstraints [''EvalModeBV, ''EvalModeBase])],
test/Grisette/Unified/UnifiedConstructorTest.hs view
@@ -42,11 +42,11 @@ Union, allClasses0, allClasses01,- deriveGADT,- deriveGADTWith,+ derive,+ deriveWith, mrgReturn, )-import Grisette.Internal.TH.GADT.Common+import Grisette.Internal.TH.Derivation.Common ( DeriveConfig (evalModeConfig, needExtraMergeableUnderEvalMode), EvalModeConfig (EvalModeConstraints), )@@ -60,7 +60,7 @@ | T1 #if MIN_VERSION_base(4,16,0)-deriveGADTWith+deriveWith ( mempty { evalModeConfig = [(0, EvalModeConstraints [''EvalModeBase])], needExtraMergeableUnderEvalMode = True@@ -86,12 +86,12 @@ data TNoMode a = TNoMode0 Bool a (TNoMode a) | TNoMode1 -deriveGADT [''TNoMode] allClasses01+derive [''TNoMode] allClasses01 makeNamedUnifiedCtor [] ["tNoMode0", "tNoMode1"] ''TNoMode data TNoArg = TNoArg -deriveGADT [''TNoArg] allClasses0+derive [''TNoArg] allClasses0 makePrefixedUnifiedCtor [] "mk" ''TNoArg #if MIN_VERSION_base(4,16,0)