%%%  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).
