:- object(metaclass, % avoid infinite metaclass regression by instantiates(metaclass)). % making the class its own metaclass :- end_object. :- object(class, instantiates(metaclass)). :- public(p1/1). p1(class). :- end_object. :- object(instance, instantiates(class)). :- end_object.