Occurs check

From testwiki
Jump to navigation Jump to search

Template:Short description In computer science, the occurs check is a part of algorithms for syntactic unification. It causes unification of a variable V and a structure S to fail if S contains V.

Application in theorem proving

In theorem proving, unification without the occurs check can lead to unsound inference. For example, the Prolog goal X=f(X) will succeed, binding X to a cyclic structure which has no counterpart in the Herbrand universe. As another example,[1] without occurs-check, a resolution proof can be found for the non-theorem[2] (xy.p(x,y))(yx.p(x,y)): the negation of that formula has the conjunctive normal form p(X,f(X))¬p(g(Y),Y), with f and g denoting the Skolem function for the first and second existential quantifier, respectively. Without occurs check, the literals p(X,f(X)) and p(g(Y),Y) are unifiable, producing the refuting empty clause.

Cycle by omitted occurs check

Rational tree unification

Prolog implementations usually omit the occurs check for reasons of efficiency, which can lead to circular data structures and looping. By not performing the occurs check, the worst case complexity of unifying a term t1 with term t2 is reduced in many cases from O(size(t1)+size(t2)) to O(min(size(t1),size(t2))); in the particular, frequent case of variable-term unifications, runtime shrinks to O(1). Template:Refn

Modern implementations, based on Colmerauer's Prolog II, [3] [4] [5] [6] use rational tree unification to avoid looping. However it is difficult to keep the complexity time linear in the presence of cyclic terms. Examples where Colmerauers algorithm becomes quadratic [7] can be readily constructed, but refinement proposals exist.

See image for an example run of the unification algorithm given in Unification (computer science)#A unification algorithm, trying to solve the goal cons(x,y)=?cons(1,cons(x,cons(2,y))), however without the occurs check rule (named "check" there); applying rule "eliminate" instead leads to a cyclic graph (i.e. an infinite term) in the last step.

Sound unification

ISO Prolog implementations have the built-in predicate unify_with_occurs_check/2 for sound unification but are free to use unsound or even looping algorithms when unification is invoked otherwise, provided the algorithm works correctly for all cases that are "not subject to occurs-check" (NSTO).[8] The built-in acyclic_term/1 serves to check the finiteness of terms.

Implementations offering sound unification for all unifications are Qu-Prolog and Strawberry Prolog and (optionally, via a runtime flag): XSB, SWI-Prolog, CxProlog, Tau Prolog, Trealla Prolog and Scryer Prolog. A variety [9][10] of optimizations can render sound unification feasible for common cases.

See also

Template:Cite journal

Notes

Template:Reflist

References

Template:Reflist

  1. Template:Cite book; here: p.143
  2. Informally, and taking p(x,y) to mean e.g. "x loves y", the formula reads "If everybody loves somebody, then a single person must exist that is loved by everyone."
  3. Template:Cite book
  4. Template:Cite journal
  5. Template:Cite journal
  6. Template:Cite journal
  7. Template:Cite conference
  8. 7.3.4 Normal unification in Prolog of ISO/IEC 13211-1:1995.
  9. Template:Cite journal
  10. Template:Cite conference