#!/usr/local/bin/yap -L -- * #. :- style_check(all). :- yap_flag( write_strings, on). :- yap_flag( gc_trace, verbose ). :- use_module(library(readutil)). :- use_module(library(lineutils)). :- use_module(library(lists)). :- use_module(library(maplist)). :- use_module(library(system)). :- initialization(main). :- style_check(all). :- yap_flag( double_quotes, string ). %:- yap_flag( dollar_as_lower_case, on ). :- dynamic edge/1, public/2, private/2, module_on/3, exported/1, dir/2, consulted/2, op_export/3, library/1, undef/2, c_dep/2, do_comment/5, module_file/2. % @short node(?Module:module, ?Predicate:pred_indicator, ?File:file, ?Generator:atom) is nondet % inline( !/0 ). inline( (\+)/1 ). inline( (fail)/0 ). inline( (false)/0 ). inline( (repeat)/0 ). inline( (true)/0 ). inline( []/0 ). % @short edge(+SourceModule:module, +SourcePredicate:pred_indicator, +TargetPredicate:pred_indicator, +InFile:file) is nondet % main :- init, fail. main :- unix(argv([D])), working_directory(_, D), fail. main :- % from libraries outside the current directories assert( node( attributes, woken_att_do/4, 'library/atts.yap', prolog ) ), fail. main :- Dirs = ['C'-prolog, 'os'-prolog, 'pl'-prolog, 'OPTYap'-prolog, 'library'-user, 'swi/console'-prolog, 'swi/library'-user, 'packages'-user], dirs( Dirs ), %%% phase 1: find modules nb_setval( current_module, user ), nb_setval( private, false ), nb_setval( file_entry, user:user ), init_loop( Dirs ), maplist( pl_interfs, Dirs ), %%% phase 2: find C-code predicates maplist( c_preds, Dirs ), %%% phase 4: construct graph retractall( consulted(_,_) ), % maplist( pl_graphs, Dirs ), undefs, doubles, % pl_exported(pl). c_links, mkdocs. dirs( Roots ) :- member( Root-_, Roots ), absolute_file_name( Root, FRoot ), rdir( FRoot ), fail. dirs( _Roots ). rdir( FRoot ) :- directory_files( FRoot , Files), member( File, Files ), atom_concat( [FRoot,'/',File], New0 ), absolute_file_name( New0, New ), \+ doskip( New ), ( file_property( New, type(directory) ) -> File \= '.', File \= '..', File \= '.git', rdir( New ) ; assert_new( dir( FRoot, File )) ), fail. rdir(_). init :- retractall(dir(_)), retractall(edge(_)), retractall(private(_,_)), retractall(public(_,_)), retractall(undef(_,_)), retractall(consulted(_,_)), retractall(module_on(_,_,_)), retractall(op_export(_,_,_)), retractall(exported(_)), retractall(do_comment(_,_,_,_,_)). init :- user_c_dep(A,B), do_user_c_dep(A,B), fail. init :- user_skip(A), do_user_skip(A), fail. init :- user_expand(N,A), do_user_expand(N,A), fail. init :- catch( make_directory(tmp), _, fail), fail. init. init_loop( _Dirs ). c_preds(Dir - Mod) :- atom( Dir ), atom_concat([Dir,'/*'], Pattern), expand_file_name( Pattern, Files ), member( File0, Files ), absolute_file_name( File0, File ), ( ( sub_atom(File,_,_,0,'.c') ; sub_atom(File,_,_,0,'.i') ; sub_atom(File,_,_,0,'.C') ; sub_atom(File,_,_,0,'.cpp') ; sub_atom(File,_,_,0,'.icc') ; sub_atom(File,_,_,0,'.h') ) -> \+ doskip( File ), c_file( File , Mod ) ; exists_directory( File ), \+ atom_concat(_, '/.', File), \+ atom_concat(_, '/..', File), \+ doskip( File ), c_preds( File - Mod ) ), fail. c_preds(_). c_file(F, _Mod) :- consulted( F, _ ), !. c_file(F, Mod) :- % writeln(F), assert( consulted( F, Mod ) ), nb_setval( current_module, Mod ), open(F, read, S, [alias(c_file)]), repeat, read_line_to_string( S, String ), ( String == end_of_file -> !, close(S) ; sub_string(String, _, _, _, "PL_extension"), %writeln(Fields), c_ext(S, Mod, F), fail ; split_string(String, ",; ()\t\"\'", Fields), %' %writeln(Fields), line_count(S, Lines), c_line(Fields , Mod, F:Lines), fail ). c_line(["}"], Mod, _) :- !, nb_setval( current_module, Mod ). c_line(Line, _Mod, _) :- append( _, [ "CurrentModule", "=", M|_], Line), system_mod(M, _Mod, Mod, _), nb_setval( current_module, Mod ). c_line(Line, Mod, F: LineP) :- break_line( Line, N/A, Fu), assert( node( Mod, N/A, F-LineP, Fu ) ), handle_pred( Mod, N, A, F ). c_ext( S, Mod, F ) :- repeat, read_line_to_string( S, String ), ( sub_string( String, _, _, _, "NULL" ), ! ; split_string(String, ",; (){}\t\"\'", ["FRG", NS,AS,FS|_]), %' atom_string(N,NS), atom_string(Fu,FS), number_string(A, AS), stream_property( S, position( Pos ) ), stream_position_data( line_count, Pos, Line ), assert( node( Mod , N/A, F-Line, Fu ) ), handle_pred( Mod, N, A, F ) ; split_string(String, ",; (){}\t\"\'", [NS,AS,FS|_]), %' atom_string(N,NS), atom_string(Fu,FS), number_string(A, AS), stream_property( S, position( Pos ) ), stream_position_data( line_count, Pos, Line ), Line0 is Line-1, assert( node( Mod, N/A, F-Line0, Fu ) ), handle_pred( Mod, N, A, F ) ). break_line( Line, N/A, c(Fu)) :- take_line( Line, NS, AS, FS ), !, atom_string(N,NS), atom_string(Fu,FS), number_string(A, AS). break_line( Line, N/A, swi(Fu)) :- take_line( Line, NS, AS, FS ), !, atom_string(N,NS), number_string(A, AS), atomic_concat(["pl_",FS,"_",A,"_va"], Fu). break_line( Line, N/A, bp(Fu)) :- take_line( Line, NS, AS, FS ), !, atom_string(N,NS), number_string(A, AS), atomic_concat(["pc_",FS,"_",A], Fu). break_line( Line, N/A, c(FuE, FuB)) :- take_line( Line, NS, AS, FSE, FSB ), !, atom_string(N,NS), atom_string(FuE,FSE), atom_string(FuB,FSB), number_string(A, AS). take_line( Line, NS, AS, FS ) :- append( _, [ "Yap_InitCPred", NS, AS, FS|_], Line), !. take_line( Line, NS, AS, FS ) :- append( _, [ "Yap_InitAsmPred", NS, AS, _, FS|_], Line), !. take_line( Line, NS, AS, FS ) :- append( _, [ "Yap_InitCmpPred", NS, AS, FS|_], Line), !. take_line( Line, NS, AS, FS ) :- append( _, [ "Yap_InitCmpPred", NS, AS, FS|_], Line), !. take_line( Line, NS, AS, FS ) :- append( _, [ "YAP_UserCPredicate", NS, FS, AS|_], Line), !. take_line( Line, NS, AS, FS ) :- append( _, [ "PRED", NS0, AS, FS|_], Line), !, append( ["pl_", NS0, AS, "_va"], NS ). take_line( Line, NS, AS, FS ) :- append( _, [ "PRED_IMPL", NS0, AS, FS|_], Line), !, append( ["pl_", NS0, AS, "_va"], NS ). take_line( Line, NS, AS, FS ) :- append( _, [ "PL_register_foreign", NS, AS, FS|_], Line), !. take_line( Line, NS, AS, FS ) :- append( _, [ "PRED_DEF", NS0, AS, FS|_], Line), !, append( ["pl_", NS0, AS, "_va"], NS ). take_line( Line, NS, AS, FS ) :- append( _, [ "FRG", NS, AS, FS|_], Line), !. % from odbc take_line( Line, NS, AS, FS ) :- append( _, [ "NDET", NS, AS, FS|_], Line), !. take_line( Line, NS, AS, FS ) :- append( _, [ "DET", NS, AS, FS|_], Line), !. take_line( Line, AS, FS ) :- append( _, [ "REGISTER_CPRED", FS, AS], Line), !. take_line( Line, NS, AS, FSE, FSB ) :- append( _, [ "Yap_InitCPredBack", NS, AS, _, FSE, FSB|_], Line), !. system_mod("ATTRIBUTES_MODULE", _, attributes, user ). system_mod("HACKS_MODULE", _, '$hacks' , sys ). system_mod("USER_MODULE", _, user, user ). system_mod("DBLOAD_MODULE", _, '$db_load', sys ). system_mod("GLOBALS_MODULE", _, globals, sys ). system_mod("ARG_MODULE", _, arg, sys ). system_mod("PROLOG_MODULE", _ , prolog, sys ). system_mod("RANGE_MODULE", _, range, user ). system_mod("SWI_MODULE", _, swi, sys ). system_mod("OPERATING_SYSTEM_MODULE", _, operating_system_support , sys ). system_mod("TERMS_MODULE", _, terms , sys). system_mod("SYSTEM_MODULE", _, system, sys ). system_mod("IDB_MODULE", _, idb, user ). system_mod("CHARSIO_MODULE", _, charsio, sys ). system_mod("cm", M, M, user ). call_c_files( File, Mod, _Fun, [CFile] ) :- search_file( CFile, File, c, F ), c_file(F, Mod). call_c_files( File, Mod, _Fun, CFile ) :- CFile \= [_|_], search_file( CFile, File, c, F ), c_file(F, Mod). pl_interfs(Dir - Mod) :- \+ doskip( Dir ), format('% ************* ~a\n', [Dir]), nb_setval( current_module, Mod ), atom( Dir ), directory_files( Dir , Files), member( File, Files ), atom_concat([Dir,'/',File], Path), ( ( sub_atom(File,_,_,0,'.yap') ; sub_atom(File,_,_,0,'.pl') ; sub_atom(File,_,_,0,'.ypp') ) -> ops_restore, absolute_file_name( Path, APath ), pl_interf( APath , Mod ) ; exists_directory( Path ), \+ atom_concat(_, '/.', Path), \+ atom_concat(_, '/..', Path), \+ atom_concat(_, '/.git', Path), absolute_file_name( Path, APath ), \+ doskip( APath ), pl_interfs( APath - Mod ) ), fail. pl_interfs(_). %% % pl_interf( File, Mod) % adds a node to the file graph and marks which files are modules % % main side-effect facts like edge( F0-Mod:File ) % exported( ( FMNATarget :- FMNASource ) ) ou exported(F-M, Op ), % module_on ( M, File ) % pl_interf(F, _Mod) :- module_on( F , _M, _Is), !. pl_interf(F, Mod) :- consulted(F, Mod ), !. pl_interf(F, Mod) :- % ( sub_atom(F,_,_,_,'matrix.yap') -> spy get_interf ; true ), % ( sub_atom( F, _, _, 0, 'gecode.yap' ) -> spy user_deps; true ), assert_new(consulted(F, Mod ) ), nb_getval( private, Default ), nb_setval( private, false ), nb_getval( file_entry, OF:OMod ), nb_setval( file_entry, F:Mod ), preprocess_file( F, PF ), catch( open(PF, read, S, [scripting(true)]) , _, fail ), repeat, nb_getval( current_module, MR ), %( sub_atom(F,_,_,_,'e.yap') -> spy get_interf ; nospyall ), catch( read_term( S, T, [module( MR ),term_position(Pos)] ), Throw, (ypp(F,Throw), fail)), ( T == end_of_file -> !, close(S), ( c_dep( F, Fc), c_file( Fc, MR ), fail ; build_graph( F, MR ), fail % cleanup ; module_on( F , _M, _Is) -> % also, close ops defined in the module M, if M \= Mod nb_setval( current_module, Mod ), nb_setval( private, Default ), nb_setval( file_entry, OF:OMod ) ; true ) ; nb_getval( current_module, MC0 ), stream_position_data( line_count, Pos, Line ), nb_setval( line, Line ), ( Mod == prolog -> MC = prolog ; MC = MC0 ), get_interf( T, F, MC ), fail ). get_interf( T, _F, _M0 ) :- var(T), !. get_interf( T, _F, _M0 ) :- % ( T = (:- op(_,_,_)) -> trace ; true ), var(T), !. get_interf( M:T, F, _M0 ) :- !, get_interf( T, F, M ). get_interf( goal_expansion(G, M, _) , F, _M0 ) :- nonvar( G ), !, ( var( M ) -> M1 = prolog ; M = M1 ), functor( G, N, A ), handle_pred( M1, N, A, F ). get_interf( goal_expansion(G, _) , F, _M0 ) :- nonvar( G ), !, functor( G, N, A ), handle_pred( prolog, N, A, F ). get_interf( ( M:H :- _B), F, _M ) :- !, get_interf( H, F, M ). get_interf( ( goal_expansion(G, M, _) :- _) , F, _M0 ) :- nonvar( G ), !, ( var( M ) -> M1 = prolog ; M = M1 ), functor( G, N, A ), handle_pred( M1, N, A, F ). get_interf( ( goal_expansion(G, _) :- _) , F, _M0 ) :- nonvar( G ), !, functor( G, N, A ), handle_pred( prolog, N, A, F ). get_interf( ( M:H --> _B), F, _ ) :- !, get_interf( ( H --> _B), F, M ). get_interf( ( A, _ --> _B), F, M ) :- get_interf( ( A --> _B), F, M ). get_interf( (H --> _B), F, M ) :- !, functor( H, N, Ar), Ar2 is Ar+2, functor( H2, N, Ar2), get_interf( H2, F, M ). get_interf( (H :- _B), F, M ) :- !, get_interf( H, F, M ). %% switches to new file n get_interf( (:- V ), _F, _M ) :- var( V ), !. get_interf( (:- module( NM, Is ) ), F, _M ) :- !, assert(module_file( F, NM ) ), nb_setval( current_module, NM ), assert( module_on( F , NM, Is) ), maplist( public(F, NM), Is ), nb_setval( private, true ). get_interf( (:- reexport( Loc, Is ) ), F, M ) :- !, % find the file search_file( Loc, F, pl, NF ), include_files( F, M, Is, NF ), % extend the interface.rg retract( module_on( F , M, Is0) ), append( Is0, Is, NIs ), assert( module_on( F , M, NIs) ), maplist( public(F, M), NIs ). get_interf( (:- use_module( Loc, Is ) ), F, M ) :- !, !, include_files( F, M, Is, Loc ). get_interf( (:- use_module( Loc ) ), F, M ) :- !, !, include_files( F, M, Loc ). % nb_getval(current_module,MM), writeln(NM:MM:M). get_interf( (:- use_module( Loc, Is, _ ) ), F, M ) :- !, !, include_files( F, M, Is, Loc ). get_interf( (:- consult( Files ) ), F, M ) :- !, include_files( F, M, Files ). get_interf( (:- reconsult( Files ) ), F, M ) :- !, include_files( F, M, Files ). get_interf( (:- ensure_loaded( Files ) ), F, M ) :- !, include_files( F, M, Files ). get_interf( (:- include( Files ) ), F, M ) :- !, source_files( F, M, Files ). get_interf( (:- load_files( Files , [_|_] ) ), F, M ) :- !, include_files( F, M, Files ). get_interf( ( :- ( G -> _ ; _ ) ) , F, M) :- !, get_interf( (:- G ) , F, M). get_interf( (:- catch( G , _, _ ) ) , F, M) :- !, get_interf( (:- G ) , F, M). get_interf( (:- initialization( G , now ) ) , F, M) :- !, get_interf( (:- G ) , F, M). get_interf( (:- load_files( Files , [_|_] ) ), F, M ) :- !, include_files( F, M, Files ). get_interf( (:- [F1|Fs] ), F, M ) :- !, include_files( F, M, [F1|Fs] ). % don't actually use this one. get_interf( (:- load_foreign_files(Fs, _, Fun) ), F, M ) :- !, call_c_files( F, M, Fun, Fs ). get_interf( (:- load_foreign_library(F) ), F0, M ) :- !, always_strip_module(M:F, M1, F1), call_c_files( F0, M1, '', F1 ). get_interf( (:- load_foreign_library(F,Fun) ), F0, M ) :- !, always_strip_module(M:F, M1, F1), call_c_files( F0, M1, Fun, F1 ). get_interf( (:- use_foreign_library(F) ), F0, M ) :- !, always_strip_module(M:F, M1, F1), call_c_files( F0, M1, '', F1 ). get_interf( (:- system_module( _NM, _Publics, _Hiddens) ), _F, _M ) :- !. get_interf( (:- style_checker( _ ) ), _F, _M ) :- !. get_interf( (:- dynamic T), F, M ) :- !, declare_functors( T, F, M ). get_interf( (:- multifile T), F, M ) :- % public? !, declare_functors( T, F, M ). get_interf( (:- meta_predicate T), F, M ) :-!, declare_terms( T, F, M ), % public? !. get_interf( (:- '$install_meta_predicate'( H, M) ), F, __M ) :- !, declare_functors( H, F, M ). get_interf( (:- thread_local T), F, M ) :- !, declare_functors( T, F, M ). get_interf( (:- op( X, Y, Z) ), F, M ) :- !, always_strip_module(M:Z, M1, Z1), handle_op( F, M1, op( X, Y, Z1) ). get_interf( (:- record( Records ) ), F, M ) :- !, handle_record( Records, F, M). get_interf( (:- set_prolog_flag(dollar_as_lower_case,On) ), _F, _M ) :- !, set_prolog_flag(dollar_as_lower_case,On). get_interf( (:- _ ), _F, _M ) :- !. get_interf( (?- _ ), _F, _M ) :- !. get_interf( V , _F, _M ) :- var( V ), !, error( instantiation_error ). get_interf( G , F, M ) :- functor( G, N, A), handle_pred( M, N, A, F ), !. % support SWI package record handle_record( (Records1, Records2), F, M ) :- !, handle_record( Records1, F, M ), handle_record( Records2, F, M ). handle_record( Record, F, M ) :- Record =.. [Constructor|Fields], atom_concat(Constructor, '_data', Data), handle_pred( M, Data, 3, F), atom_concat(default_, Constructor, New), handle_pred( M, New, 1, F), atom_concat(is_, Constructor, Is), handle_pred( M, Is, 1, F), atom_concat(make_, Constructor, Make), handle_pred( M, Make, 2, F), handle_pred( M, Make, 3, F), atom_concat([set_, Constructor,'_fields'], Sets), handle_pred( M, Sets, 3, F), handle_pred( M, Sets, 4, F), atom_concat([set_, Constructor,'_field'], Set), handle_pred( M, Set, 3, F), maplist( handle_record_field( Constructor, F, M) , Fields ). handle_record_field( Constructor, F, M, Name:_=_ ) :- !, handle_record_field_name( Constructor, F, M, Name). handle_record_field( Constructor, F, M, Name:_ ) :- !, handle_record_field_name( Constructor, F, M, Name). handle_record_field( Constructor, F, M, Name=_ ) :- !, handle_record_field_name( Constructor, F, M, Name). handle_record_field( Constructor, F, M, Name ) :- handle_record_field_name( Constructor, F, M, Name). handle_record_field_name( Constructor, F, M, Name) :- atom_concat([ Constructor,'_', Name], Val), handle_pred( M, Val, 2, F), atom_concat([ set_, Name, '_of_', Constructor ], Set), handle_pred( M, Set, 3, F), handle_pred( M, Set, 2, F), atom_concat([ nb_set_, Name, '_of_', Constructor ], Set), handle_pred( M, Set, 3, F), handle_pred( M, Set, 2, F). handle_pred( M, N, A, F ) :- ( system_mod( _, _, M, sys ) -> ( atom_concat('$',_,N) -> private( F, M, N/A ) ; public( F, M, N/A ) ) ; ( nb_getval( private, false ) -> public( F, M, N/A ) ; private( F, M, N/A ) ) ). handle_op( F, M, Op ) :- ( nb_getval( private, false ) -> public( F, M, Op ) ; private( F, M, Op ) ), Op = op(X, Y, Z ), ( ( M == user ; M == prolog ) -> op( X, Y, prolog:Z ) ; op( X, Y, M:Z ) ). exported( NF, F, NM, M, op(X,Y,Z)) :- !, public( NF , NM:op(X,Y,Z) ), handle_op( F, M , op(X,Y,Z) ). exported( NF, F, NM, M, N/A) :- !, % sink no more retractall( exported(( _ :- F-M:N/A) ) ), assert_new( exported( (F-M:N/A :- NF-NM:N/A )) ). exported( NF, F, NM, M, N/A as NN) :- !, % sink no more retractall( exported(( _ :- F-M:N/A) ) ), assert_new( exported( ( F-M:NN/A :- NF-NM:N/A ) ) ). exported( NF, F, NM, M, N//A) :- !, A2 is A+2, % sink no more retractall( exported(( _ :- F-M:N/A2) ) ), assert_new( exported( (F-M:N/A2 :- NF-NM:N/A2) ) ). exported( NF, F, NM, M, N//A as NN) :- !, A2 is A+2, % sink no more retractall( exported(( _ :- F-M:N/A2) ) ), assert_new( exported( ( F-M:NN/A2 :- NF-NM:N/A2 )) ). import_publics( F, ProducerMod, ConsumerMod ) :- public(F, ProducerMod:op(X,Y,Z) ), handle_op( F, ConsumerMod, op(X,Y,Z) ), fail. import_publics( _F, _ProducerMod, _ConsumerMod ). all_imported( ProducerFile, ConsumerFile, ProducerMod, ConsumerMod ) :- public(ProducerFile, ProducerMod:op(X,Y,Z) ), handle_op( ConsumerFile, ConsumerMod, op(X,Y,Z) ), fail. all_imported( ProducerFile, ConsumerFile, ProducerMod, ConsumerMod ) :- public(ProducerFile, ProducerMod:N/A ), exported( ProducerFile, ConsumerFile, ProducerMod, ConsumerMod, N/A ), fail. all_imported( _ProducerFile, _ConsumerFile, _ProducerMod, _ConsumerMod ). include_files( F, M, Files ) :- include_files( F, M, _Is, Files ). include_files( F, M, Is, Files ) :- maplist( include_files( F, M, Is ), Files ), !. include_files( F, M, Is, -Files ) :- !, include_files( F, M, Is, Files). include_files( F, M, Is, Files ) :- !, always_strip_module(M:Files, M1, NFiles), include_file( F, M1, Is, NFiles ). include_files( F, M, Is, Loc ) :- include_file( F, M, Is, Loc ). include_file( F, M, Is, Loc ) :- is_list( Loc ), !, maplist( include_file( F, M, Is), Loc ). include_file( F, M, Is0, Loc ) :- nb_getval( private, Private ), % find the file once( search_file( Loc, F, pl, NF ) ), % depth visit pl_interf(NF, M), % should verify Is in _Is % link b ( module_on(NF, NM, Is) -> ( var(Is0) -> Is = Is0 ; true ), maplist( exported( NF, F, NM, M) , Is0 ) ; all_imported( NF, F, NM, M) ), nb_setval( private, Private ). source_files( F, M, Files ) :- maplist( source_files( F, M ), Files ), !. source_files( F, M, Loc ) :- source_file( F, M, Loc ). source_file( F, M, Loc ) :- once( search_file( Loc, F, pl, NF ) ), % depth visit pl_source(NF, F, M). % should verify Is in _Is pl_source(F, F0, Mod) :- % writeln( -F ), preprocess_file( F, PF ), catch( open(PF, read, S, []) , _, fail ), repeat, nb_getval( current_module, MR ), %( sub_atom(F,_,_,_,'examples/matrix.yap') -> spy get_interf ; nospyall ), catch( read_term( S, T, [module( MR ),term_position(Pos)] ), Throw, (writeln(F:MR:Throw), break, fail)), ( T == end_of_file -> !, close(S) ; nb_getval( current_module, MC0 ), stream_position_data( line_count, Pos, Line ), nb_setval( line, Line ), ( Mod == prolog -> MC = prolog ; MC = MC0 ), get_interf( T, F0, MC ), fail ). declare_functors( T, _F, _M1) :- var(T), !, error( unbound_variable ). declare_functors( M:T, F, _M1) :- !, declare_functors( T, F, M). declare_functors( (T1,T2), F, M1) :- !, declare_functors( T1, F, M1), declare_functors( T2, F, M1). declare_functors( Ts, F, M1) :- maplist( declare_functor( F, M1), Ts ), !. declare_functors( T, F, M1) :- declare_functor( F, M1, T). declare_functor(File, M, N/A) :- handle_pred( M, N, A, File ). declare_terms( T, _F, _M1) :- var(T), !, error( unbound_variable ). declare_terms( M:T, F, _M1) :- !, declare_functors( T, F, M). declare_terms( (N1,N2), F, M) :- number(N1), number(N2), !, declare_term( F, M, (N1,N2)). declare_terms( (T1,T2), F, M1) :- !, declare_terms( T1, F, M1), declare_terms( T2, F, M1). declare_terms( Ts, F, M1) :- maplist( declare_term( F, M1), Ts ), !. declare_terms( T, F, M1) :- declare_term( F, M1, T). declare_term(F, M, S) :- functor(S, N, A), handle_pred( M, N, A, F ). pl_graphs(Dir - Mod) :- format(' ************* GRAPH: ~a ***********************~n', [Dir]), atom( Dir ), atom_concat([Dir,'/*'], Pattern), expand_file_name( Pattern, Files ), member( File, Files ), ( ( sub_atom(File,_,_,0,'.yap') ; sub_atom(File,_,_,0,'.pl') ) -> build_graph( File , Mod ) ; exists_directory( File ), \+ atom_concat(_, '/.', File), \+ atom_concat(_, '/..', File), \+ atom_concat(_, '/.git', File), pl_graphs( File - Mod ) ), fail. pl_graphs(_). %% % pl_graph( File, Mod) % adds a node to the file graph and marks which files are modules % % main side-effect facts like edge( F0-Mod:File ) % exported( F-M , N/A ) ou exported(F- M. Op ), % module_on ( M, File ) % pred ( M :N/A ) % build_graph(F, Mod) :- % writeln(F), preprocess_file( F, PF ), catch( open(PF, read, S, [scripting(true)]), _, fail ), repeat, nb_getval( current_module, MR ), catch(read_term( S, T, [term_position(Pos),module(MR),comments(Cs)] ), Throw, (writeln(Throw))), ( T == end_of_file -> !, % also, clo ops defined in the module M, if M \= Mod % ( sub_atom(F,_,_,_,'/matrix.yap') -> start_low_level_trace ; nospyall ), close(S) ; stream_position_data( line_count, Pos, Line ), maplist( comment, Cs ), nb_setval( line, Line ), nb_getval( current_module, MC0 ), ( Mod == prolog -> MC = prolog ; MC = MC0 ), get_graph( T, F, Pos, MC ), fail ). get_graph( V , _F, _Pos, _M ) :- var( V ), !, error( instantiation_error ). get_graph( T, _F, _Pos, _M0 ) :- var(T), !. get_graph( M:T, F, _Pos, _M0 ) :- !, get_graph( T, F, _Pos, M ). get_graph( ( M:H :- B), F, _Pos, M0 ) :- !, get_graph( (H :- M0:B), F, _Pos, M ). get_graph( ( M:H --> B), F, _Pos, M0 ) :- !, get_graph( ( H --> M0:B), F, _Pos, M ). get_graph( ( A, _ --> B), F, _Pos, M ) :- get_graph( ( A --> B), F, _Pos, M ). get_graph( (H --> B), F, _Pos, M ) :- !, functor( H, N, Ar), Ar2 is Ar+2, add_deps( B, M, M:N/Ar2, F, _Pos, 2 ). get_graph( (H :- B), F, _Pos, M ) :- !, functor( H, N, Ar), add_deps( B, M, M:N/Ar, F, _Pos, 0 ). %% switches to new file n get_graph( (:-include( Fs ) ), F, _Pos, M ) :- !, source_graphs( M, F, Fs ). get_graph( (?- _ ), _F, _Pos, _M ) :- !. get_graph( (:- _ ), _F, _Pos, _M ) :- !. source_graphs( M, F, Fs ) :- maplist( source_graph( M, F ), Fs ), !. source_graphs( M, F, Fs ) :- search_file( Fs, F, pl, NF ), build_graph( NF , M ), !. add_deps(V, _M, _P, _F, _Pos, _) :- var(V), !. add_deps(M1:G, _M, _P, _F, _Pos,L) :- !, always_strip_module(M1:G, M2, G2), add_deps(G2, M2, _P, _F, _Pos, L). add_deps((A,B), M, P, F, _Pos, L) :- !, add_deps(A, M, P, F, _Pos, L), add_deps(B, M, P, F, _Pos, L). add_deps((A;B), M, P, F, _Pos, L) :- !, add_deps(A, M, P, F, _Pos, L), add_deps(B, M, P, F, _Pos, L). add_deps((A|B), M, P, F, _Pos, L) :- !, add_deps(A, M, P, F, _Pos, L), add_deps(B, M, P, F, _Pos, L). add_deps((A->B), M, P, F, _Pos, L) :- !, add_deps(A, M, P, F, _Pos, L), add_deps(B, M, P, F, _Pos, L). add_deps((A*->B), M, P, F, _Pos, L) :- !, add_deps(A, M, P, F, _Pos, L), add_deps(B, M, P, F, _Pos, L). add_deps(once(A), M, P, F, _Pos, L) :- !, add_deps(A, M, P, F, _Pos, L). add_deps({A}, M, P, F, _Pos, 2) :- !, add_deps(A, M, P, F, _Pos, 0). add_deps([_|_], M, P, F, Pos, 2) :- !, put_dep( (F-M:P :- prolog:'C'/3 ), Pos ). add_deps(String, _M, _P, _F, _Pos, _) :- string(String), !. add_deps([], _M, _P, _F, _Pos, 2) :- !. add_deps(!, _M, _P, _F, _Pos, _) :- !. add_deps(true, _M, _P, _F, _Pos, 0) :- !. add_deps(false, _M, _P, _F, _Pos, 0) :- !. add_deps(fail, _M, _P, _F, _Pos, 0) :- !. add_deps(repeat, _M, _P, _F, _Pos, 0) :- !. add_deps(A, M, P, F, Pos, L) :- % we're home, M:N/Ar -> P=M1:N1/A1 functor(A, N, Ar0), Ar is Ar0+L, put_dep( ( F-M:P :- F-M:N/Ar ), Pos ). put_dep( (Target :- F0-M:Goal ), Pos ) :- exported( ( F0-M:Goal :- F1-M1:N/Ar ) ), !, %follow ancestor chain ancestor( ( F1-M1:N/Ar :- FA-MA:NA/Ar ) ), put_dep( ( Target :- FA-MA:NA/Ar ), Pos ). % the base case, copying from the same module ( but maybe not same file 0. put_dep( ( Target :- _F-M:N/Ar ) , _ ) :- m_exists(M:N/Ar, F0), !, assert_new( edge( ( Target :- F0-M:N/Ar ) ) ). % prolog is visible ( but maybe not same file ). put_dep( ( Target :- _F-_prolog:N/Ar ), _ ) :- m_exists(prolog:N/Ar, F0), !, assert_new( edge( ( Target :- F0-prolog:N/Ar ) ) ). put_dep( ( _Target :- _F-Mod:_N/_Ar ), _Pos) :- var( Mod ), !. put_dep( ( Target :- F-Mod:N/Ar ), Pos) :- atom( Mod ), stream_position_data( line_count, Pos, Line ), assert_new( undef( (Target :- F-Mod:N/Ar ), Line) ). ancestor( ( Younger :- Older) ) :- exported( ( Mid :- Older ) ), !, ancestor( ( Younger :- Mid) ). ancestor( (Older :- Older) ). m_exists(P, F) :- private( F, P ), !. m_exists(P, F) :- public( F, P ). doubles :- node(M, P, F-_, _), node(M1, P, F1-_, _), M @< M1, is_public( P, M, F), is_public( P, M1, F1), format('~w vs ~w~n', [M:P,M1:P]), fail. doubles. undefs :- format('UNDEFINED procedure calls:~n',[]), setof(M, Target^F^Line^NA^undef( ( Target :- F-M:NA ), Line ), Ms ), member( Mod, Ms ), format(' module ~a:~n',[Mod]), setof(NA, Target^F^Line^undef( ( Target :- F-Mod:NA ), Line ), Ns ), member( NA, Ns ), \+ node( Mod , NA , _File1, _ ), \+ node( prolog , NA , _File2, _ ), format(' predicate ~w:~n',[NA]), ( setof(F-Line, Target^undef( ( Target :- F-Mod:NA ), Line ), FLs ), member(F-L, FLs ), format(' line ~w, file ~a~n',[L,F]), fail ; setof(F-M,Type^node( M, NA, F, Type ) , FMs ), format(' same name at:~n',[]), member((F-L)-M, FMs ), format(' module ~a, file ~a, line ~d~n',[M,F,L]), fail ). undefs. out_list([]) :- format('[]', []). out_list([El]) :- format('[~q]', [El]). out_list([E1,E2|Es]) :- format('[~q', [E1]), maplist(out_el, [E2|Es]), format(']', []). out_el( El ) :- format(',~n ~q',[El]). pub(M, P) :- node(M, P, _, _), P = N/_A, \+ sub_atom(N,0,1,_,'$'). has_edge(M1, P1, M, F) :- edge(M1:P1, _P, F:_), node(M1, P1, _, _), M1 \= prolog, M1 \= M, \+ is_public(P1, M1, _). mod_priv(M, P) :- node(M, P, _, _), node(M, P, _, _), \+ is_public(P, M, _), edge(M1:P, _P0, _), M1 \= M. priv(M, P) :- node(M, P, F:_, _), \+ is_public(P, M, _), edge(_:P, _P1, F1:_), F1 \= F. % utilities split_string( S , Cs, N) :- string_codes(S, S1), string_codes(Cs, NCs), split(S1, NCs, Ncs0), maplist(remove_escapes, Ncs0, Ncs), maplist(string_codes, N, Ncs). remove_escapes([0'\\ ,A|Cs], [A|NCs]) :- !, %' remove_escapes(Cs, NCs). remove_escapes([A|Cs], [A|NCs]) :- remove_escapes(Cs, NCs). remove_escapes( [], [] ). always_strip_module(V, M, V1) :- var(V), !, V = M:call(V1). always_strip_module(M0:A, M0, call(A)) :- var(A), !. always_strip_module(_:M0:A, M1, B) :- !, always_strip_module(M0:A, M1, B). always_strip_module(M0:A, M0, call(A)) :- var(A),!. always_strip_module(M0:A, M0, A). c_links :- open('tmp/foreigns.yap', write, S), clinks(S), fail. c_links :- open('tmp/foreigns.c', write, S), cclinks(S), fail. clinks(S) :- module_file( F, NM ), format( S, 'mod( ~q , ~q ).~n', [NM, F] ), fail. clinks(S) :- system_predicate(C), functor(C, N, A), format( S, 'sys ~q/~d.~n', [N, A] ), fail. clinks(S) :- exported( ( Fi0-M:F/A :- Fi1-M1:F1/A ) ), ( M \= M1 -> M \= prolog ; F \= F1 ), % functor(S0, F, A), % S0 =.. [F| Args], % S1 =.. [F1| Args], % numbervars(Args, 0, _), format( S, '% ~q <- ~q.~n~q:~q imports ~q:~q. ~n', [Fi0, Fi1, M,F/A, M1,F1/A] ), fail. clinks(S) :- close(S). cclinks(S) :- node( M, F/A, File-_Line, c(F)), % functor( S0, F, A), % S0 =.. [F| Args], % S1 =.. [foreign, F| Args], % numbervars(Args, 0, _), format( S, '/// @file ~a~n', [File] ), format( S, '/// @memberof ~a ~a:~a/~d~n', [F, M, F, A] ), fail. cclinks(S) :- close(S). warn_singletons(_Vars, _Pos). %% % comment( +Comment ) % % Handle documentation comments % comment( _Pos - Comment) :- skip_blanks(1, Comment, N), doc( Comment, N ), format( "%s\n", [Comment] ), !. comment( _Pos - _Comment). skip_blanks(I, Comment, N) :- get_string_code( I, Comment, Code ), code_type( Code, space ), I1 is I+1, skip_blanks(I1, Comment, N). skip_blanks(N, _Comment, N). doc( Comment , N ) :- N1 is N+1, sub_string( Comment, N1, 3, _, Header ), ( Header == "/**" -> true ; Header == "/*!" ), !, % */ N4 is N+4, get_string_code( N4, Comment, Code ), code_type( Code, space ). doc( Comment, N ) :- N1 is N+1, sub_string( Comment, N1, 2, _, Header ), ( Header == "%%" -> true ; Header == "%!" ), N3 is N+3, get_string_code( N3, Comment, Code ), code_type( Code, space ). %% % search_file( +Target, +Location, +FileType, -File ) % % % Directories into atoms search_file( Loc , F, Type, FN ) :- search_file0( Loc , F, Type, FN ), !. search_file( Loc , F, _FN ) :- format('~n~n~n###############~n~n FAILED TO FIND ~w when at ~a~n~n###############~n~n~n', [Loc, F ]), fail. % % handle some special cases. % search_file0( F, _, _Type, FN ) :- doexpand(F, FN), !. search_file0( A/B, F, Type, FN ) :- !, term_to_atom(A/B, AB), search_file0( AB, F, Type, FN ). % libraries can be anywhere in the source. search_file0( LibLoc, F, Type, FN ) :- LibLoc =.. [Dir,File], !, ( term_to_atom( Dir/File, Full ) ; Full = File ), search_file0( Full, F, Type, FN ). %try to use your base search_file0( Loc , F, c, FN ) :- atom_concat( D, '.yap', F), atom_concat( [ D, '/', Loc], F1), check_suffix( F1 , c, NLoc ), absolute_file_name( NLoc, FN), file_base_name( FN, LocNam), file_directory_name( FN, D), dir( D, LocNam ). search_file0( Loc , F, Type, FN ) :- file_directory_name( F, FD), check_suffix( Loc , Type, LocS ), atom_concat( [ FD, '/', LocS], NLoc), absolute_file_name( NLoc, FN), file_base_name( FN, LocNam), file_directory_name( FN, D), dir( D, LocNam). search_file0( Loc , _F, Type, FN ) :- file_base_name( Loc, Loc0), file_directory_name( Loc, LocD), check_suffix( Loc0 , Type, LocS ), dir( D, LocS), sub_dir( D, DD), atom_concat( [ DD, '/', LocD], NLoc), absolute_file_name( NLoc, D), atom_concat( [D,'/', LocS], FN). search_file0( Loc , _F, Type, FN ) :- file_base_name( Loc, Loc0), check_suffix( Loc0 , Type, LocS ), dir( D, LocS), atom_concat( [D,'/', LocS], FN). % you try using the parent sub_dir( D, D ). sub_dir( D, DD) :- D \= '/', atom_concat( D, '/..', DD0), absolute_file_name( DD0, DDA), sub_dir( DDA, DD). % files must be called .yap or .pl % if it is .yap... check_suffix( Loc , pl, Loc ) :- atom_concat( _, '.yap', Loc ), !. %, otherwise, .pl check_suffix( Loc , pl, Loc ) :- atom_concat( _, '.pl', Loc ), !. %, otherwise, .prolog check_suffix( Loc , pl, Loc ) :- atom_concat( _, '.prolog', Loc ), !. %, otherwise, .P % try adding suffix check_suffix( Loc0 , pl, Loc ) :- member( Suf , ['.yap', '.ypp', '.pl' , '.prolog']), atom_concat( Loc0, Suf, Loc ). check_suffix( Loc , c, Loc ) :- atom_concat( _, '.c', Loc ), !. %, otherwise, .pl check_suffix( Loc , c, Loc ) :- atom_concat( _, '.icc', Loc ), !. %, otherwise, .prolog check_suffix( Loc , c, Loc ) :- atom_concat( _, '.cpp', Loc ), !. %, otherwise, .P % try adding suffix check_suffix( Loc0 , c, Loc ) :- member( Suf , ['.c', '.icc' , '.cpp']), atom_concat( Loc0, Suf, Loc ). match_file( LocD, Loc0, Type, FN ) :- var(LocD), !, dir( LocD, Loc0 ), atom_concat( [LocD, '/', Loc0], F ), absolute_file_name( F, Type, FN ), exists( FN ). match_file( SufLocD, Loc0, Type, FN ) :- dir( LocD, Loc0 ), atom_concat(_, SufLocD, LocD ), atom_concat( [LocD, '/', Loc0], Type, FN ). new_op( F, M, op(X,Y,Z) ) :- nb_getval( private, true ), !, private( F, M, op(X,Y,Z) ), op( X, Y, Z). new_op( F, M, op( X, Y, Z) ) :- public( F, M, op( X, Y, Z) ). ypp(F, error(syntax_error(syntax_error),[syntax_error(read(_228515),between(K,L,M),_,_L,_)-_]) ) :- format('SYNTAX ERROR at file ~a, line ~d (~d - ~d).~n', [F,L,K,M] ), break. preprocess_file(F,NF) :- atom_concat(_, '.ypp', F ), !, atom_concat( [ 'cpp -CC -w -DMYDDAS_MYSQL -DMYDDAS_ODBC -DMYDDAS_STATS -DMYDDAS_TOP_LEVEL -P ',F], OF ), NF = pipe( OF ). preprocess_file(F,F). %%%%%%% %% declare a concept export1able public( F, M, op(X,Y,Z) ) :- retract( private( F, M:op(X,Y,Z) ) ), fail. public( F, M, op(X,Y,Z) ) :- !, assert( op_export(F, _M, op(X,Y,Z) ) ), assert_new( public( F, M:op(X,Y,Z) ) ), ( ( M == user ; M == prolog ) -> op( X, Y, prolog:Z ) ; op( X, Y, M:Z ) ). public( F, M, M:N/Ar ) :- retract( private( F, M:N/Ar ) ), fail. public( F, M, N/Ar ) :- assert_new( public( F, M:N/Ar ) ), \+ node( M, N/Ar, F-_, _ ), nb_getval( line, L ), assert( node( M, N/Ar, F-L, prolog ) ), !. public( _F, _M, _/_Ar ). public( F, M, M:N//Ar ) :- Ar2 is Ar+2, retract( private( F, M:N/Ar2 ) ), fail. public( F, M, N//Ar ) :- Ar2 is Ar+2, assert_new( public( F, M:N/Ar2 ) ), \+ node( M, N/Ar2, F-_, _ ), nb_getval( line, L ), assert( node( M, N/Ar2, F-L, prolog ) ), !. public( _F, _M, _//_Ar ). private( F, M, op(X,Y,Z) ) :- assert_new( private( F, M:op(X,Y,Z) ) ), ( ( M == user ; M == prolog ) -> op( X, Y, prolog:Z ) ; op( X, Y, M:Z ) ), !. private( _F, _M, op(_X,_Y,_Z) ). private( F, M, N/Ar ) :- assert_new( private( F, M:N/Ar ) ), \+ node( M, N/Ar, F-_, _ ), nb_getval( line, L ), assert( node( M, N/Ar, F-L, prolog ) ), !. private( _F, _M, _N/_Ar ). private( F, M, N//Ar ) :- Ar2 is Ar+2, assert_new( private( F, M:N/Ar2 ) ), \+ node( M, N/Ar2, F-_, _ ), nb_getval( line, L ), assert_new( node( M, N/Ar2, F-L, prolog ) ), !. private( _F, _M, _N//_Ar ). is_public( F, M, OP ) :- public( F, M:OP ). is_private( F, M, OP ) :- private( F, M :OP ). assert_new( G ) :- G, !. assert_new( G ) :- assert( G ). error( Error ) :- throw(Error ). %% mkdocs inserts a file with a sequence of comments into a sequence of Prolog/C files. % % mkdocs :- open( 'tmp/pages', write, S1), close( S1 ), open( 'tmp/bads', write, S2), close( S2 ), open( 'tmp/groups', write, S3), close( S3 ), open( 'docs/yapdocs.yap', read, S), repeat, ( blanks(S, Comment, Rest) -> get_comment(S, Rest), store_comment( Comment ), fail ; close(S), !, add_comments ). blanks( S , T, TF) :- read_line_to_codes(S, T1, T2), ( T1 == end_of_file -> fail; T2 == [] -> fail; T1 \== T2, foldl( check, [0'/,0'*,0'*],T1, _) -> TF = T2, T = T1 ; % ' blanks( S , T, TF) ). get_comment( S , T) :- read_line_to_codes(S, T, T0), ( T == end_of_file -> T = []; T0 == [] -> T=[]; diff_end( [0'*,0'/,10],T, T0 ) -> true ; get_comment( S , T0) ). check(C, [C0|L], L) :- C == C0. diff_end( L, T, [] ) :- append(_, L, T). store_comment(Comment) :- header( Pred, A, Comment, _ ), atom_codes( P, Pred), ( node( Mod, P/A, File-Line, Type) -> true ; format('Missing definition for ~q.~n', [P/A] ), node( Mod, P/Ar, File-Line, Type), format(' ~w exists.~n',[Mod:P/Ar]), fail ), ( node( M1, P/A, _, _), M1 \= Mod -> Dup = true ; Dup = false), !, string_codes( C, Comment ), assert( do_comment( File, Line, C, Type, Dup ) ). store_comment(Comment) :- page( Comment, _ ), !, open( 'tmp/pages', append, S), format(S, '*******************************~n~n~s~n~n', [Comment]), close(S). store_comment(Comment) :- defgroup( Comment, _ ), !, open( 'tmp/groups', append, S), format(S, '*******************************~n~n~s~n~n', [Comment]), close(S). store_comment(Comment) :- open( 'tmp/bads', append, S), format(S, '*******************************~n~n~s~n~n', [Comment]), close(S). defgroup --> "/**", % */ blanks, "@defgroup". page --> "/**", % */ blanks, "@page". header(Pred, Arity) --> "/**", % */ blanks, "@pred", blanks, atom(_), ":", !, atom(Pred), atom_pred(Arity). header(Pred, Arity) --> "/**", % */ blanks, "@pred", blanks, atom(Pred), atom_pred(Arity), !. header(Pred, 2, Comment, _) :- split(Comment, [[0'/,0'*,0'*],[0'@,0'p,0'r,0'e,0'd],_,Pred,_,[0'i,0's]|_]), !. atom_pred(Arity) --> "/", !, int( 0, Arity ). atom_pred(N) --> "(", !, decl(1,N). atom_pred(0) --> blanks, !. int(I0, I) --> [A], { A >= "0", A =< "9" }, !, { I1 is I0*10+(A-"0") }, int(I1, I). int( I, I ) --> []. decl(I, I) --> ")", !. decl(I0, I) --> ",", !, { I1 is I0+1 }, decl(I1, I). decl(I0, I) --> [_], decl( I0, I). blanks --> " ", !, blanks. blanks --> "\t", !, blanks. blanks --> []. atom([A|As]) --> [A], { A >= "a", A =< "z" }, atom2( As ). atom2([A|As]) --> [A], { A >= "a", A =< "z" -> true ; A >= "A", A =< "Z" -> true ; A >= "0", A =< "9" -> true ; A =:= "_" }, !, atom2( As ). atom2([]) --> []. add_comments :- open('tmp/comments.yap', write, S), findall(File, do_comment( File, Line, C, Type, Dup), Fs0 ), ( sort(Fs0, Fs), member( File, Fs ), setof(Line-C-Type-Dup, do_comment( File, Line, C, Type, Dup) , Lines0 ), reverse( Lines0, Lines), member(Line-Comment-Type-Dup, Lines), check_comment( Comment, CN, Line, File ), Line1 is Line-1, format(S, '#~a~ncat << "EOF" > tmp~n~sEOF~nsed -e "~dr tmp" ~a > x~n\ mv x ~a~n~n',[Dup,CN, Line1, File, File]) ; close(S) ), fail. add_comments :- listing( open_comment ). check_comment( Comment, CN, _Line, _qFile ) :- string_codes( Comment, [_,_,_|C]), check_groups(0,_C,[]), check_quotes(0,C,[]), ( append(C0,[0'@,0'},0' ,0'*,0'/,10], C) -> %' append(C0,[0'*,0'/,10], CN) ; CN = C ), !. check_comment( Comment, Comment, Line, File ) :- format(user_error,'*** bad comment ~a ~d~n~n~s~n~', [File,Line,Comment]). check_groups(0) --> []. check_quotes( 0 ) --> []. check_quotes( 0 ) --> "`", !, check_quotes( 1 ). check_quotes( 1 ) --> "`", !, check_quotes( 0 ). check_quotes( 1 ) --> "\"", !, { fail }. check_quotes( 1 ) --> "'", !, { fail }. %' check_quotes( N ) --> [_], check_quotes( N ). %%% % ops_default sets operators back to YAP default. % ops_default :- abolish( default_ops/1 ), A = (_,_), functor(A,Comma,2), findall(op(X,Y,prolog:Z), ( current_op(X,Y,prolog:Z), Z\= Comma ), L), assert_static( default_ops(L) ). :- initialization(ops_default, now). ops_restore :- A = (_,_), functor(A,Comma,2), current_op(_X,Y,prolog:Z), Z\= Comma, op(0,Y,prolog:Z), fail. ops_restore :- default_ops(L), maplist( call, L ). do_user_c_dep(F1, F2) :- absolute_file_name(F1, A1), absolute_file_name(F2, A2), assert(c_dep(A1, A2)). do_user_skip(F1) :- absolute_file_name(F1, A1), assert(doskip(A1)). do_user_expand(F, F1) :- absolute_file_name(F1, A1), assert(doexpand(F, A1)). user_deps( F, M ) :- c_dep(F, A2), c_file(A2 , M), fail. user_deps( _F, _M ). user_c_dep( 'packages/jpl/jpl.pl', 'packages/jpl/src/c/jpl.c' ). user_c_dep( 'packages/real/real.pl', 'packages/real/real.c' ). user_c_dep( 'packages/odbc/odbc.pl', 'packages/odbc/odbc.c' ). user_c_dep( 'packages/clib/unix.pl', 'packages/clib/unix.c' ). user_c_dep( 'packages/clib/cgi.pl', 'packages/clib/cgi.c' ). user_c_dep( 'packages/clib/crypt.pl', 'packages/clib/crypt.c' ). user_c_dep( 'packages/clib/filesex.pl', 'packages/clib/files.c' ). user_c_dep( 'packages/clib/mime.pl', 'packages/clib/mime.c' ). user_c_dep( 'packages/clib/socket.pl', 'packages/clib/socket.c' ). user_c_dep( 'packages/clib/socket.pl', 'packages/clib/winpipe.c' ). user_c_dep( 'packages/http/http_stream.pl', 'packages/http/cgi_stream.c' ). user_c_dep( 'packages/http/http_stream.pl', 'packages/http/stream_range.c' ). user_c_dep( 'packages/http/http_stream.pl', 'packages/http/http_chunked.c' ). user_c_dep( 'packages/http/http_stream.pl', 'packages/http/http_error.c' ). user_c_dep( 'packages/swi-minisat2/minisat.pl', 'packages/swi-minisat2/C/pl-minisat.C' ). user_c_dep( 'packages/gecode/gecode.yap', 'packages/gecode/gecode4_yap.cc' ). user_c_dep( 'packages/gecode/gecode.yap', 'packages/gecode/4.2.1/gecode_yap_cc_forward_auto_generated.icc' ). user_c_dep( 'packages/gecode/gecode.yap', 'packages/gecode/4.2.1/gecode_yap_cc_init_auto_generated.icc' ). user_c_dep( 'packages/gecode/gecode.yap', 'packages/gecode/4.2.1/gecode_yap_cc_impl_auto_generated.icc' ). user_c_dep( 'packages/semweb/rdf_db.pl', 'packages/semweb/atom_map.c' ). user_c_dep( 'packages/semweb/rdf_db.pl', 'packages/semweb/resource.c' ). user_c_dep( 'packages/sgml/sgml.pl', 'packages/sgml/quote.c' ). user_c_dep( 'swi/library/readutil.pl', 'packages/clib/readutil.c' ). user_c_dep( 'packages/myddas/pl/myddas.ypp', 'packages/myddas/myddas_shared.c' ). user_c_dep( 'packages/myddas/pl/myddas.ypp', 'packages/myddas/myddas_odbc.c' ). user_c_dep( 'packages/myddas/pl/myddas.ypp', 'packages/myddas/myddas_mysql.c' ). user_c_dep( 'packages/myddas/pl/myddas.ypp', 'packages/myddas/myddas_top_level.c' ). user_c_dep( 'packages/prism/src/prolog/prism.yap', 'packages/prism/src/c/core/bpx.c' ). user_c_dep( 'packages/prism/src/prolog/prism.yap', 'packages/prism/src/c/core/error.c' ). user_c_dep( 'packages/prism/src/prolog/prism.yap', 'packages/prism/src/c/core/fputil.c' ). user_c_dep( 'packages/prism/src/prolog/prism.yap', 'packages/prism/src/c/core/gamma.c' ). user_c_dep( 'packages/prism/src/prolog/prism.yap', 'packages/prism/src/c/core/glue.c' ). user_c_dep( 'packages/prism/src/prolog/prism.yap', 'packages/prism/src/c/core/idtable.c' ). user_c_dep( 'packages/prism/src/prolog/prism.yap', 'packages/prism/src/c/core/idtable_preds.c' ). user_c_dep( 'packages/prism/src/prolog/prism.yap', 'packages/prism/src/c/core/random.c' ). user_c_dep( 'packages/prism/src/prolog/prism.yap', 'packages/prism/src/c/core/termpool.c' ). user_c_dep( 'packages/prism/src/prolog/prism.yap', 'packages/prism/src/c/core/vector.c' ). user_c_dep( 'packages/prism/src/prolog/prism.yap', 'packages/prism/src/c/core/xmalloc.c' ). user_c_dep( 'packages/prism/src/prolog/prism.yap', 'packages/prism/src/c/up/em_aux.c' ). user_c_dep( 'packages/prism/src/prolog/prism.yap', 'packages/prism/src/c/up/em_aux_ml.c' ). user_c_dep( 'packages/prism/src/prolog/prism.yap', 'packages/prism/src/c/up/em_aux_vb.c' ). user_c_dep( 'packages/prism/src/prolog/prism.yap', 'packages/prism/src/c/up/em_ml.c' ). user_c_dep( 'packages/prism/src/prolog/prism.yap', 'packages/prism/src/c/up/em_preds.c' ). user_c_dep( 'packages/prism/src/prolog/prism.yap', 'packages/prism/src/c/up/flags.c' ). user_c_dep( 'packages/prism/src/prolog/prism.yap', 'packages/prism/src/c/up/graph.c' ). user_c_dep( 'packages/prism/src/prolog/prism.yap', 'packages/prism/src/c/up/graph_aux.c' ). user_c_dep( 'packages/prism/src/prolog/prism.yap', 'packages/prism/src/c/up/hindsight.c' ). user_c_dep( 'packages/prism/src/prolog/prism.yap', 'packages/prism/src/c/up/util.c' ). user_c_dep( 'packages/prism/src/prolog/prism.yap', 'packages/prism/src/c/up/viterbi.c' ). user_skip( 'packages/gecode/3.6.0'). user_skip( 'packages/gecode/3.7.0'). user_skip( 'packages/gecode/3.7.1'). user_skip( 'packages/gecode/3.7.2'). user_skip( 'packages/gecode/3.7.3'). user_skip( 'packages/gecode/4.0.0'). user_skip( 'packages/gecode/4.2.0'). user_skip( 'packages/gecode/4.2.1'). user_skip( 'packages/gecode/gecode3.yap' ). user_skip( 'packages/gecode/gecode3_yap.cc' ). user_skip( 'packages/gecode/gecode3_yap_hand_written.yap'). user_skip( 'packages/gecode/gecode3.yap-common.icc'). user_skip( 'packages/prism/src/prolog/core'). user_skip( 'packages/prism/src/prolog/up'). user_skip( 'packages/prism/src/prolog/mp'). user_skip( 'packages/prism/src/prolog/trans'). user_skip( 'packages/prism/src/prolog/bp'). user_skip( 'packages/prism/src/c'). user_expand( library(clpfd), 'library/clp/clpfd.pl' ).