The object of study in this thesis is a class of functional logic programs, where the functions are implemented in an external functional or imperative language. The contributions are twofold:
Firstly, an operational semantics is formally defined. The key idea is that non-ground function calls selected for unification are delayed and retained in form of constraints until their arguments become ground. With this strategy two problems arise: (1) Given a program P and an initial goal, will any delayed unifications remain unresolved after computation? (2) For every function call f(X) in P, find a safe evaluation point for f(X), i.e. a point in P where X always will be bound to a ground term, and thus f(X) can be evaluated.
Secondly, we present a static groundness analysis technique which enables us to solve problems (1) and (2) in a uniform way. The analysis method is dependency-based, exploiting analogies between logic programs and attribute grammars.