34
35:- module(infer_alias,
36 [infer_alias/3,
37 fastest_alias/2,
38 library_alias/2,
39 smallest_alias/2,
40 current_alias/2,
41 pretty_path/2
42 ]). 43
44:- use_module(library(lists)). 45:- use_module(library(option)). 46:- use_module(library(term_size)). 47
48infer_alias(File, CAlias, Options) :-
49 select_option(sort(SortL), Options, _, []),
50 findall(SortTerm-Alias,
51 ( current_alias(File, Alias),
52 Alias =.. [AName, _],
53 maplist(sort_field(Alias, AName), SortL, SortTerm)
54 ), SA),
55 sort(SA, [_-CAlias|_]).
56
57sort_field(_, A, alias(L), N) :-
58 ( nth0(N, L, A)
59 ->true
60 ; length(L, N)
61 ).
62sort_field(_, A, sols, N) :-
63 findall(A, user:file_search_path(A, _), L),
64 length(L, N).
65sort_field(Alias, _, size, S) :-
66 term_size(Alias, S).
67sort_field(Alias, _, length, N) :-
68 term_to_atom(Alias, Atom),
69 atom_length(Atom, N).
70
71fastest_alias(File, Alias) :-
72 infer_alias(File, Alias, [sort([sols, size, length])]).
73
74library_alias(File, Alias) :-
75 infer_alias(File, Alias, [sort([alias([library]), sols, size, length])]).
76
77smallest_alias(File, Alias) :-
78 infer_alias(File, Alias, [sort([length, size, sols])]).
79
80current_alias(File, Alias) :-
81 user:file_search_path(A1, ADir),
82 A1 \= autoload,
83 absolute_file_name(ADir, Dir, [file_type(directory), solutions(all)]),
84 directory_file_path(Dir, Base, File),
85 file_name_extension(Name, _Ext, Base),
86 pretty_path(Name, Path),
87 Alias =.. [A1, Path].
88
89pretty_path(Name1, Path/F) :-
90 directory_file_path(Dir, F, Name1),
91 Dir \= '.',
92 !,
93 pretty_path(Dir, Path).
94pretty_path(Name, Name)