Now, by focusing on a particular problem domain, CLP languages make logic programs execute efficiently. Prolog is based on first-order predicate logic, and the objects that it manipulates are pure symbols with no intrinsic meaning. Execution of a Prolog program proceeds by a process called unification, which searches a database of such facts and finds those values that will satisfy a user's query.
Unification is based on syntactic identity.
Since Prolog tries to find the set of all solutions to a query, during this search, a program may encounter many dead-ends to explore and then abandon by backtracking to an earlier state and trying a different branch. For complex problems, this search process can become greedy in both space and time, which is the root of Prolog's inefficiency. Hence, there isn't a single CLP language but a whole family of them defined for different application domains. In such a CLP system, the simple unification algorithm that lies at the heart of Prolog must be augmented by a dedicated solver for the particular domain of application. The solver can decide at any moment whether the remaining constraints are solvable.