exprToPred path (Dot e ident _) = do
    ep <- exprToPred (path.dot_exprL) e
    case classifyVar ident of
        Expression -> return pExpr'
        (BoundExpression name) -> do
            -- TODO: this doesn't seem right and might explain why
            -- the this test fails in TestRepace.hs:
            -- "x.y" "V1.E1" "E1.V1" "y.x"
            bindExpression name path
            return pExpr'
        Variable -> return $ pDot ep (const True)
        (BoundVariable name) -> do
            bindVariable name (path.dot_attributeL)
            return $ pDot ep (const True)
        Normal -> return $ pDot ep (pIdent ident)
exprToPred path (Dot e ident _) = do
    ep <- exprToPred (path.dot_exprL) e
    case classifyVar ident of
        Expression -> return pExpr'
        (BoundExpression name) -> do
            -- TODO: this doesn't seem right and might explain why
            -- the this test fails in TestRepace.hs:
            -- "x.y" "V1.E1" "E1.V1" "y.x"
            bindExpression name path
            return pExpr'
        Variable -> return $ pDot ep (const True)
        (BoundVariable name) -> do
            bindVariable name (path.dot_attributeL)
            return $ pDot ep (const True)
        Normal -> return $ pDot ep (pIdent ident)
exprToPred path (Dot e ident _) = do
    ep <- exprToPred (path.dot_exprL) e
    case classifyVar ident of
        Expression -> return pExpr'
        (BoundExpression name) -> do
            -- TODO: this doesn't seem right and might explain why
            -- the this test fails in TestRepace.hs:
            -- "x.y" "V1.E1" "E1.V1" "y.x"
            bindExpression name path
            return pExpr'
        Variable -> return $ pDot ep (const True)
        (BoundVariable name) -> do
            bindVariable name (path.dot_attributeL)
            return $ pDot ep (const True)
        Normal -> return $ pDot ep (pIdent ident)