%%% circular(X) %%% =========== %%% %%% Determines if X is a circular term. circular(X) :- circular(X, []). circular(X, Parents) :- id_member(X, Parents). circular(X, Parents) :- X =.. [_|Args], args_circular(Args, [X|Parents]). args_circular([Arg|Args], Parents) :- circular(Arg, Parents); args_circular(Args, Parents). id_member(X, [Y|Rest]) :- X == Y; id_member(X, Rest).