\begin{verbatim} obj(a). obj(b). obj(c). obj(d). prec(X,Y) :- obj(X), obj(Y), not prec(Y,X), neq(X,Y). prec(X,Y) :- obj(X), obj(Y), obj(Z), prec(X,Z), prec(Z,Y). %It works even if the previous rule is removed. not_succ(X,Z) :- obj(X), obj(Z), prec(Z,X). not_succ(X,Z) :- obj(X), obj(Y), obj(Z), prec(X,Y), prec(Y,Z). not_succ(X,Y) :- obj(X), obj(Y), eq(X,Y). succ(X,Y) :- obj(X), obj(Y), not not_succ(X,Y). not_first(X) :- obj(X), obj(Y), prec(Y,X). first(X) :- obj(X), not not_first(X). not_last(X) :- obj(X), obj(Y), prec(X,Y). last(X) :- obj(X), not not_last(X). reachable(X) :- obj(X), first(X). reachable(Y) :- obj(X), obj(Y), reachable(X), succ(X,Y). linear :- obj(X), reachable(X), last(X). inconsistent :- not inconsistent, not linear. hide obj(X). hide prec(X,Y). hide not_succ(X,Y). hide not_first(X). hide not_last(X). hide reachable(X). hide linear. hide inconsistent. \end{verbatim}