process s t con info = case (con,info) of
    (EGIntValue c, ([],[a],[])) -> case c of
      Const v -> addFD $ OHasValue (getDefIntSpec a) (fromInteger v)
      _ -> error "Overton solver does not support parametrized values"
    (EGPlus, ([],[a,b,c],[])) -> processBinary (b,c,a) OAdd
    (EGMinus, ([],[a,b,c],[])) -> processBinary (a,c,b) OAdd
    (EGMult, ([],[a,b,c],[])) -> processBinary (b,c,a) OMult
    (EGAbs, ([],[a,b],[])) -> processUnary (b,a) OAbs
    (EGDiff, ([FDSpecInfoBool {fdspBoolVal = Just (BoolConst True)}],[a,b],[])) -> addFD $ ODiff (getDefIntSpec a) (getDefIntSpec b)
    (EGLess True, ([FDSpecInfoBool {fdspBoolVal = Just (BoolConst True)}],[a,b],[])) -> addFD $ OLess (getDefIntSpec a) (getDefIntSpec b)
    (EGLess False, ([FDSpecInfoBool {fdspBoolVal = Just (BoolConst True)}],[a,b],[])) -> addFD $ OLessEq (getDefIntSpec a) (getDefIntSpec b)
    (EGEqual, ([FDSpecInfoBool {fdspBoolVal = Just (BoolConst True)}],[a,b],[])) -> addFD $ OSame (getDefIntSpec a) (getDefIntSpec b)
    _ -> s con info
process s t con info = case (con,info) of
    (EGIntValue c, ([],[a],[])) -> case c of
      Const v -> addFD $ OHasValue (getDefIntSpec a) (fromInteger v)
      _ -> error "Overton solver does not support parametrized values"
    (EGPlus, ([],[a,b,c],[])) -> processBinary (b,c,a) OAdd
    (EGMinus, ([],[a,b,c],[])) -> processBinary (a,c,b) OAdd
    (EGMult, ([],[a,b,c],[])) -> processBinary (b,c,a) OMult
    (EGAbs, ([],[a,b],[])) -> processUnary (b,a) OAbs
    (EGDiff, ([FDSpecInfoBool {fdspBoolVal = Just (BoolConst True)}],[a,b],[])) -> addFD $ ODiff (getDefIntSpec a) (getDefIntSpec b)
    (EGLess True, ([FDSpecInfoBool {fdspBoolVal = Just (BoolConst True)}],[a,b],[])) -> addFD $ OLess (getDefIntSpec a) (getDefIntSpec b)
    (EGLess False, ([FDSpecInfoBool {fdspBoolVal = Just (BoolConst True)}],[a,b],[])) -> addFD $ OLessEq (getDefIntSpec a) (getDefIntSpec b)
    (EGEqual, ([FDSpecInfoBool {fdspBoolVal = Just (BoolConst True)}],[a,b],[])) -> addFD $ OSame (getDefIntSpec a) (getDefIntSpec b)
    _ -> s con info
process s t con info = case (con,info) of
    (EGIntValue c, ([],[a],[])) -> case c of
      Const v -> addFD $ OHasValue (getDefIntSpec a) (fromInteger v)
      _ -> error "Overton solver does not support parametrized values"
    (EGPlus, ([],[a,b,c],[])) -> processBinary (b,c,a) OAdd
    (EGMinus, ([],[a,b,c],[])) -> processBinary (a,c,b) OAdd
    (EGMult, ([],[a,b,c],[])) -> processBinary (b,c,a) OMult
    (EGAbs, ([],[a,b],[])) -> processUnary (b,a) OAbs
    (EGDiff, ([FDSpecInfoBool {fdspBoolVal = Just (BoolConst True)}],[a,b],[])) -> addFD $ ODiff (getDefIntSpec a) (getDefIntSpec b)
    (EGLess True, ([FDSpecInfoBool {fdspBoolVal = Just (BoolConst True)}],[a,b],[])) -> addFD $ OLess (getDefIntSpec a) (getDefIntSpec b)
    (EGLess False, ([FDSpecInfoBool {fdspBoolVal = Just (BoolConst True)}],[a,b],[])) -> addFD $ OLessEq (getDefIntSpec a) (getDefIntSpec b)
    (EGEqual, ([FDSpecInfoBool {fdspBoolVal = Just (BoolConst True)}],[a,b],[])) -> addFD $ OSame (getDefIntSpec a) (getDefIntSpec b)
    _ -> s con info