subs (CondExpr old_if old_then old_else) old new = do
    new_if <- (subs old_if old new)
    new_then <- (subs old_then old new)
    new_else <- (subs old_else old new)
    return $ CondExpr new_if new_then new_else
{- OPT (subs old_if old new) >>= 
     (\new_if -> (subs old_then old new) >>= 
      (\new_then -> (subs old_else old new) >>=
       (\new_else -> return $ CondExpr new_if new_then new_else)
      )
      -}
subs (CondExpr old_if old_then old_else) old new = do
    new_if <- (subs old_if old new)
    new_then <- (subs old_then old new)
    new_else <- (subs old_else old new)
    return $ CondExpr new_if new_then new_else
{- OPT (subs old_if old new) >>= 
     (\new_if -> (subs old_then old new) >>= 
      (\new_then -> (subs old_else old new) >>=
       (\new_else -> return $ CondExpr new_if new_then new_else)
      )
      -}
subs (CondExpr old_if old_then old_else) old new = do
    new_if <- (subs old_if old new)
    new_then <- (subs old_then old new)
    new_else <- (subs old_else old new)
    return $ CondExpr new_if new_then new_else
{- OPT (subs old_if old new) >>= 
     (\new_if -> (subs old_then old new) >>= 
      (\new_then -> (subs old_else old new) >>=
       (\new_else -> return $ CondExpr new_if new_then new_else)
      )
      -}