:- dynamic detchecked/1. det(Functor/Arity) :- ignore(retract(detchecked(Functor/Arity))), assert(detchecked(Functor/Arity)), length(Args, Arity), Head =.. [Functor | Args], atom_concat('__detcheck$', Functor, MangledFunctor), MangledHead =.. [MangledFunctor | Args], ignore(retract(Head :- _)), assert(Head :- (MangledHead, ! ; deterror(Head))). deterror(Head) :- tell(user_error), nl, write('*** Predicate call should not have failed:'), nl, writeq(Head), nl, halt(1). term_expansion(Head :- Body, MangledHead :- Body) :- !, term_expansion(Head, MangledHead). term_expansion(Head, MangledHead) :- Head =.. [Functor | Args], length(Args, Arity), detchecked(Functor/Arity), !, atom_concat('__detcheck$', Functor, MangledFunctor), MangledHead =.. [MangledFunctor | Args].