Predicates declared as autoloaded are always defined as global but note that the module directive in a file erases the module completely so that the autoloaded procedure (and its visibility) are removed completely before being recompiled. This means that the global declaration must be present in the file.
The predicate autoload_tool/2 is the same except that all the predicates are declared to be tools, using tool/1.
Success: [eclipse]: get_flag(library_path, Path), get_flag(cwd, Cwd), set_flag(library_path, [Cwd | Path]). Cwd = "/home/user/" Path = ["/usr/local/ECLIPSE/lib"] yes. [eclipse]: open("my_lib.pl", write, s), write(s, ":- module(my_lib).\n"), write(s, ":- global p/0.\n"), write(s, "p :- write(hello).\n"), close(s). yes. [eclipse]: autoload(my_lib, [p/0]). yes. [eclipse]: p. % when p/0 is called, the library is % compiled first, ie. autoloaded. loading the library /home/user/my_lib.pl hello yes. [eclipse]: p. % p/0 is not an autoloaded pred anymore hello yes. Error: autoload(Lib, [p/0]). (Error 4). autoload(a_lib, L). (Error 4). autoload(a_lib, [1]). (Error 5). autoload(a_lib, p/0). (Error 5). autoload("a_lib", [p/0]). (Error 5). autoload(no_file, [p/0]). (Error 173).