:- multifile user:file_search_path/2.
% :- dynamic user:file_search_path/2.

% :- ensure_loaded( library(lists) ).
% :- ensure_loaded( library(ordsets) ).
% :- ensure_loaded( library(ugraphs) ).

fsp_if( AbsDir ) :-
    % write( absdir(AbsDir) ), nl,
    ( user:file_search_path(interpreter,_Exists) ->
        % no need to redefine it
        true
        ;
        assert( user:file_search_path(interpreter,AbsDir)  )
    ).

fsp_pfd :-
    user:file_search_path( interpreter, Ipr ),
    ( user:file_search_path(pfd,_Exists) ->
        true
        ;
        atom_concat( Ipr, '/../pfds', RelPfd ),
        absolute_file_name( RelPfd, Pfd ),
        assert( user:file_search_path(pfd,Pfd) )
    ).

loads_pfd( swi(_Ver) ) :-
    % aberdeen settings.
    % ( current_prolog_flag( windows, true ) ->
        % Pfd = 'C:/My Documents/nicos/pfd'
        % ;
        % Pfd = '/windows/home/nicos/pfd'
    % ),
    LdOpts = [if(changed),silent(true)],
    load_files( [
                  interpreter('system/swi/std'),
                  interpreter('system/swi/sicstus_ugraphs'),
                  interpreter('system/swi/sicstus_ordsets'),
                  interpreter('system/swi/sicstus_lists'),
                  interpreter('system/clpfd_ops') ]
                  , LdOpts ),
    loads_pfd_common( LdOpts ).
    % ensure_loaded( interpreter('system/swi/maplist') ),   
        % /4 this is not heavily used see if can be deleted


loads_pfd( yap(_Ver) ) :-
    set_prolog_flag(unknown,error),
    set_prolog_flag(single_var_warnings,on),
    set_prolog_flag(redefine_warnings,on),
    set_prolog_flag(informational_messages,off),

    use_module( library(lists) ),
    use_module( library(ordsets) ),
    use_module( library(ugraphs) ),
    ensure_loaded( 'system/yap/ord_intersection_4' ),
    ensure_loaded( 'system/clpfd_ops' ),
    reconsult( [ operators,
        'system/sicstus/flatten.pl',
        'system/sicstus/maplist',
        'system/yap/std',
        % 'system/yap/nth1',
        'directives', 'active', 'auxil', 'identicals',
        'constraint_to_store', 'data',
        'demo', 'enforce_unconditional',
        'graph_operations', 'methods',
        'probe', 'multi_conditional_probe',
        'rationals', 'store_operations',
        'error', 'write_pfd', 'spy_message',
        % 'system/yap/reachable', 'system/yap/ord_intersection',
        probabilistic_method, preprocess
        ] ).

loads_pfd( sicstus(_Ver) ) :-
    ensure_loaded( interpreter('system/sicstus/portray_no_compile') ),
    ensure_loaded( library(lists) ),
    ensure_loaded( library(ordsets) ),
        % ..., ord_member/2, ord_add_elem/3.
    ensure_loaded( library(ugraphs) ),
    ensure_loaded( library(clpfd) ),
    % Pfd = '$HOME/pfd',
    % assert( file_search_path( interpreter, Pfd)  ),
    ensure_loaded( interpreter('system/sicstus/flatten') ),
    ensure_loaded( interpreter('system/sicstus/maplist') ),
    ensure_loaded( interpreter('system/sicstus/std') ),
    ensure_loaded( interpreter('system/sicstus/nth1') ),
    loads_pfd_common( [] ).

/*
loads_pfd_swi_files( Files, LdOpts ) :-         % This is temporary. Bug reported.
    user:file_search_path( interpreter, Alias ),
    maplist( loads_pfd_swi_file(Alias,LdOpts), Files ).

loads_pfd_swi_file( Alias, LdOpts, interpreter(File) ) :-
    directory_file_path( Alias, File, Path ),
    load_files( [Path], LdOpts ).
    */

% interpreter code.
loads_pfd_common( Opts ) :-
    fsp_pfd,
    load_files( [operators,identicals], Opts ),
   load_files( 
    % Files = 
        [
        interpreter(directives),
        interpreter(active),
        interpreter(auxil),
        interpreter(constraint_to_store),
        interpreter(data),
        interpreter(demo),
        interpreter(enforce_unconditional),
        interpreter(graph_operations),
        interpreter(methods),
        interpreter(probe),
        interpreter(multi_conditional_probe),
        interpreter(rationals),
        interpreter(store_operations),
        interpreter(error),
        % only for debugging systems
        interpreter(write_pfd),
        interpreter(spy_message),
        % special context, keep last.
        interpreter(probabilistic_method),
        interpreter(preprocess)
        ],
        Opts ).
    % loads_pfd_swi_files( Files, Opts ).
    % can we move this out ??? should be faster in that case
    %
    % % ensure_loaded( interpreter(valuations) ),
    % % ensure_loaded( interpreter(vertical) ),
    % % ensure_loaded( interpreter(vertical_array) ),
    % ensure_loaded( interpreter(vertical_tree) ),

% the following is true for swi, test on sicstus.
% :- initialization( bb_put(pfd_not_interactive,false) ).

:-
    ensure_loaded( pl ),
    ensure_loaded( dbg ),
    set_dbg( off ),
    % ensure_loaded( operators ),
    prolog_load_context( directory, AbsDir ),
    ( pl(yap(_Any)) -> 
        true
        ;
        fsp_if( AbsDir )
    ),
    pl( Prolog ),
    loads_pfd( Prolog ).

:- bb_put(pfd_not_interactive,false).