@/2 differs from call/2 insofar as it only changes the calling context of the goal, but the goal predicate is still looked up in the module where @/2 is called. As opposed to that, call/2 changes both lookup and context module.
If Goal is not a tool-predicate, then Goal@ContextModule is completely equivalent to Goal.
[eclipse 1]: [user]. :- tool(where/0, where/1). where(Module) :- printf("where/0 was called from module %w\n", [Module]). ^D [eclipse 2]: where. where/0 was called from module eclipse yes. [eclipse 3]: where @ m. where/0 was called from module m yes. [eclipse 4]: call(where, m). calling an undefined procedure where in module m [eclipse 1]: [user]. :- tool(print_local_preds/0, print_local_preds/1). print_local_preds(Module) :- current_predicate(P) @ Module, get_flag(P, visibility, local) @ Module, writeln(P), fail. ^D [eclipse 2]: print_local_preds. print_local_preds / 0 print_local_preds / 1