An Effective Bottom-Up Semantics for First-Order Linear Logic Programs