This is an example of code using predicate_property/2 and import_module/2 to collect facts about modules then using library(persistency) saves them to a file when the top-level is halted.
:- module(module_tools,[
init/0,
list_uses/1,
list_imports/1,
compare/0
]).
:- use_module(library(persistency)).
:- persistent
uses(super:atom,module:atom),
imports(module:atom,import:atom).
:- initialization(db_attach('module.journal', [])).
add_uses(Super,Module) :-
(
uses(Super,Module), !
;
assert_uses(Super,Module)
).
init_uses :-
forall(
predicate_property(Super:_, imported_from(Module)),
add_uses(Super,Module)
).
list_uses(uses(Super,Module)) :-
uses(Super,Module).
add_imports(Module,Import) :-
(
imports(Module,Import), !
;
assert_imports(Module,Import)
).
init_imports :-
forall(
(
current_module(Module),
import_module(Module,Import)
),
add_imports(Module,Import)
).
list_imports(imports(Module,Import)) :-
imports(Module,Import).
init :-
init_uses,
init_imports.
compare :-
missing_imports,
missing_uses.
missing_imports :-
list_uses(uses(A,B)),
(
list_imports(imports(A,B))
->
true
;
format('Missing import: ~w, ~w~n',[A,B])
),
fail.
missing_imports.
missing_uses :-
list_imports(imports(A,B)),
(
list_uses(uses(A,B))
->
true
;
format('Missing uses: ~w, ~w~n',[A,B])
),
fail.
missing_uses.
Example usage.
Welcome to SWI-Prolog (threaded, 64 bits, version 8.3.5-8-ge14460a94)
?- working_directory(_,'C:/Users/Groot/Documents').
true.
?- ['module tools'].
true.
?- init.
true.
?- list_uses(Uses).
Uses = uses(prolog_source, system) ;
Uses = uses(prolog_source, prolog_operator) ;
Uses = uses(prolog_source, '$expand') ;
...
?- list_imports(Imports).
Imports = imports(prolog_source, system) ;
Imports = imports(swi_option, system) ;
Imports = imports(prolog_operator, system) ;
...
?- compare.
...
Missing import: prolog_metainference, lists
Missing import: prolog_metainference, apply
Missing uses: prolog, user
Missing uses: pce_expansion, user
...
For an example of using the data from the persistent file see: Convert facts to GraphViz dot file using DCGs
Windows notes (click triangle to expalnd
On Windows since this will create a file and the file might be scanned by antivirus software such as Windows Defender, consider disabling scans of the file or folder.
Here is an example during a large update with the Antivirus service also loading down the CPU.