488 lines
12 KiB
Prolog
488 lines
12 KiB
Prolog
/*************************************************************************
|
||
* *
|
||
* YAP Prolog *
|
||
* *
|
||
* Yap Prolog was developed at NCCUP - Universidade do Porto *
|
||
* *
|
||
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-2014 *
|
||
* *
|
||
**************************************************************************
|
||
* *
|
||
* File: boot.yap *
|
||
* Last rev: 8/2/88 *
|
||
* mods: *
|
||
* commen ts: boot file for Prolog *
|
||
* *
|
||
*************************************************************************/
|
||
|
||
/**
|
||
@file boot.yap
|
||
@brief YAP bootstrap
|
||
|
||
|
||
@addtogroup TopLevel Top-Level and Boot Predicates
|
||
|
||
@ingroup builtins
|
||
@{
|
||
|
||
|
||
*/
|
||
|
||
|
||
system_module(_Mod, _SysExps, _Decls).
|
||
% new_system_module(Mod).
|
||
|
||
use_system_module(_Module, _SysExps).
|
||
|
||
private(_).
|
||
|
||
%
|
||
% boootstrap predicates.
|
||
%
|
||
:- system_module( '$_boot', [
|
||
bootstrap/1,
|
||
call/1,
|
||
catch/3,
|
||
catch_ball/2,
|
||
expand_term/2,
|
||
import_system_module/2,
|
||
incore/1,
|
||
(not)/1,
|
||
repeat/0,
|
||
throw/1,
|
||
true/0], ['$$compile'/4,
|
||
'$call'/4,
|
||
'$catch'/3,
|
||
'$check_callable'/2,
|
||
'$check_head_and_body'/4,
|
||
'$check_if_reconsulted'/2,
|
||
'$clear_reconsulting'/0,
|
||
'$command'/4,
|
||
'$cut_by'/1,
|
||
'$disable_debugging'/0,
|
||
'$do_live'/0,
|
||
'$'/0,
|
||
'$find_goal_definition'/4,
|
||
'$head_and_body'/3,
|
||
'$inform_as_reconsulted'/2,
|
||
'$init_system'/0,
|
||
'$init_win_graphics'/0,
|
||
'$loop'/2,
|
||
'$meta_call'/2,
|
||
'$prompt_alternatives_on'/1,
|
||
'$run_at_thread_start'/0,
|
||
'$system_catch'/4,
|
||
'$undefp'/1,
|
||
'$version'/0]).
|
||
|
||
:- use_system_module( '$_absf', ['$system_library_directories'/2]).
|
||
|
||
:- use_system_module( '$_checker', ['$check_term'/5,
|
||
'$sv_warning'/2]).
|
||
|
||
:- use_system_module( '$_consult', ['$csult'/2]).
|
||
|
||
:- use_system_module( '$_control', ['$run_atom_goal'/1]).
|
||
|
||
:- use_system_module( '$_directives', ['$all_directives'/1,
|
||
'$exec_directives'/5]).
|
||
|
||
:- use_system_module( '$_errors', ['$do_error'/2]).
|
||
|
||
:- use_system_module( '$_grammar', ['$translate_rule'/2]).
|
||
|
||
:- use_system_module( '$_modules', ['$get_undefined_pred'/4,
|
||
'$meta_expansion'/6,
|
||
'$module_expansion'/6]).
|
||
|
||
:- use_system_module( '$_preddecls', ['$dynamic'/2]).
|
||
|
||
:- use_system_module( '$_preds', ['$assert_static'/5,
|
||
'$assertz_dynamic'/4,
|
||
'$init_preds'/0,
|
||
'$unknown_error'/1,
|
||
'$unknown_warning'/1]).
|
||
|
||
:- use_system_module( '$_qly', ['$init_state'/0]).
|
||
|
||
:- use_system_module( '$_strict_iso', ['$check_iso_strict_clause'/1,
|
||
'$iso_check_goal'/2]).
|
||
|
||
% be careful here not to generate an undefined exception..
|
||
|
||
print_message(L,E) :-
|
||
'$number_of_clauses'(print_message(L,E), prolog_complete, 1),
|
||
!,
|
||
(L = informational
|
||
->
|
||
true
|
||
;
|
||
format( user_error, '~w in bootstrap: got ~w~n',[L,E])
|
||
).
|
||
|
||
'$undefp0'([M|G], _Action) :-
|
||
stream_property( loop_stream, [file_name(F), line_number(L)]),
|
||
format(user_error,'~a:~d error undefined:',[F,L]),
|
||
fail
|
||
;
|
||
format(user_error,' call to ~w~n',[M:G]),
|
||
fail.
|
||
|
||
:- '$undefp_handler'('$undefp0'(_,_),prolog).
|
||
|
||
/**
|
||
* @pred $system_meta_predicates'( +L )
|
||
*
|
||
* @param L declare a set of system meta-predicates
|
||
*
|
||
* @return system predicates
|
||
*/
|
||
'$system_meta_predicates'([]).
|
||
'$system_meta_predicates'([P|L]) :-
|
||
functor(P,N,A),
|
||
'$new_meta_pred'(P, prolog),
|
||
G = ('$meta_predicate'(N,_M2,A,P) :- true),
|
||
'$compile'(G, assertz, G, prolog, _R),
|
||
'$system_meta_predicates'(L).
|
||
|
||
:- '$mk_dynamic'( '$meta_predicate'(_N,_M,_A,_P), prolog).
|
||
:- '$new_multifile'( '$meta_predicate'(_N,_M,_A,_P), prolog).
|
||
:- '$new_multifile'('$full_clause_optimisation'(_H, _M, _B0, _BF), prolog).
|
||
:- '$new_multifile'('$exec_directive'(_,_,_,_,_), prolog).
|
||
|
||
:- system_module( '$_init', [!/0,
|
||
':-'/1,
|
||
'?-'/1,
|
||
[]/0,
|
||
extensions_to_present_answer/1,
|
||
fail/0,
|
||
false/0,
|
||
goal_expansion/2,
|
||
goal_expansion/3,
|
||
otherwise/0,
|
||
term_expansion/2,
|
||
version/2,
|
||
'$do_log_upd_clause'/6,
|
||
'$do_log_upd_clause0'/6,
|
||
'$do_log_upd_clause_erase'/6,
|
||
'$do_static_clause'/5], [
|
||
'$system_module'/1]).
|
||
|
||
:- use_system_module( '$_boot', ['$cut_by'/1]).
|
||
|
||
|
||
%:- start_low_level_trace.
|
||
|
||
% This is the YAP init file
|
||
% should be consulted first step after booting
|
||
|
||
|
||
:- yap_flag(prolog:unknown, error).
|
||
|
||
:- c_compile('top.yap').
|
||
|
||
% These are pseudo declarations
|
||
% so that the user will get a redefining system predicate
|
||
|
||
% just create a choice-point
|
||
% the 6th argument marks the time-stamp.
|
||
'$do_log_upd_clause'(_,_,_,_,_,_).
|
||
'$do_log_upd_clause'(A,B,C,D,E,_) :-
|
||
'$continue_log_update_clause'(A,B,C,D,E).
|
||
'$do_log_upd_clause'(_,_,_,_,_,_).
|
||
|
||
|
||
'$do_log_upd_clause_erase'(_,_,_,_,_,_).
|
||
'$do_log_upd_clause_erase'(A,B,C,D,E,_) :-
|
||
'$continue_log_update_clause_erase'(A,B,C,D,E).
|
||
'$do_log_upd_clause_erase'(_,_,_,_,_,_).
|
||
|
||
'$do_log_upd_clause0'(_,_,_,_,_,_).
|
||
'$do_log_upd_clause0'(A,B,C,D,_,_) :-
|
||
'$continue_log_update_clause'(A,B,C,D).
|
||
'$do_log_upd_clause0'(_,_,_,_,_,_).
|
||
|
||
|
||
'$do_static_clause'(_,_,_,_,_).
|
||
'$do_static_clause'(A,B,C,D,E) :-
|
||
'$continue_static_clause'(A,B,C,D,E).
|
||
'$do_static_clause'(_,_,_,_,_).
|
||
|
||
|
||
:- c_compile('directives.yap').
|
||
:- c_compile('init.yap').
|
||
|
||
'$command'(C,VL,Pos,Con) :-
|
||
current_prolog_flag(strict_iso, true), !, /* strict_iso on */
|
||
'$yap_strip_module'(C, EM, EG),
|
||
'$execute_command'(EG,EM,VL,Pos,Con,_Source).
|
||
'$command'(C,VL,Pos,Con) :-
|
||
( (Con = top ; var(C) ; C = [_|_]) ->
|
||
'$yap_strip_module'(C, EM, EG),
|
||
'$execute_command'(EG,EM,VL,Pos,Con,C) ;
|
||
% do term expansion
|
||
'$expand_term'(C, Con, EC),
|
||
'$yap_strip_module'(EC, EM2, EG2),
|
||
% execute a list of commands
|
||
'$execute_commands'(EG2,EM2,VL,Pos,Con,_Source)
|
||
),
|
||
% succeed only if the *original* was at end of file.
|
||
C == end_of_file.
|
||
|
||
:- c_compile('arith.yap').
|
||
%:- stop_low_level_trace.
|
||
|
||
:- compile_expressions.
|
||
|
||
|
||
:- c_compile('imports.yap').
|
||
:- c_compile('bootutils.yap').
|
||
:- c_compile('bootlists.yap').
|
||
:- c_compile('consult.yap').
|
||
:- c_compile('preddecls.yap').
|
||
:- c_compile('meta.yap').
|
||
:- c_compile('metadecls.yap').
|
||
:- c_compile('preddyns.yap').
|
||
:- c_compile('builtins.yap').
|
||
:- c_compile('newmod.yap').
|
||
|
||
:- c_compile('atoms.yap').
|
||
:- c_compile('os.yap').
|
||
:- c_compile('errors.yap').
|
||
|
||
%%
|
||
% @pred initialize_prolog
|
||
%
|
||
% User-interface to Prolog bootstrap routine.
|
||
%
|
||
initialize_prolog :-
|
||
'$init_prolog'.
|
||
|
||
:- set_prolog_flag(verbose, silent).
|
||
%:- set_prolog_flag(verbose_file_search, true ).
|
||
%:- yap_flag(write_strings,on).
|
||
:- c_compile( 'preds.yap' ).
|
||
:- c_compile( 'modules.yap' ).
|
||
:- c_compile( 'grammar.yap' ).
|
||
:- c_compile( 'protect.yap' ).
|
||
|
||
:- ['absf.yap'].
|
||
|
||
:- use_module('error.yap').
|
||
|
||
:- [
|
||
'utils.yap',
|
||
'control.yap',
|
||
'flags.yap'
|
||
].
|
||
|
||
|
||
:- [
|
||
% lists is often used.
|
||
'../os/yio.yap',
|
||
'debug.yap',
|
||
'checker.yap',
|
||
'depth_bound.yap',
|
||
'ground.yap',
|
||
'listing.yap',
|
||
'arithpreds.yap',
|
||
% modules must be after preds, otherwise we will have trouble
|
||
% with meta-predicate expansion being invoked
|
||
% must follow grammar
|
||
'eval.yap',
|
||
'signals.yap',
|
||
'profile.yap',
|
||
'callcount.yap',
|
||
'load_foreign.yap',
|
||
% 'save.yap',
|
||
'setof.yap',
|
||
'sort.yap',
|
||
'statistics.yap',
|
||
'strict_iso.yap',
|
||
'tabling.yap',
|
||
'threads.yap',
|
||
'eam.yap',
|
||
'yapor.yap',
|
||
'qly.yap',
|
||
'spy.yap',
|
||
'udi.yap'].
|
||
|
||
%:- start_low_level_trace.
|
||
|
||
:- meta_predicate(log_event(+,:)).
|
||
|
||
:- dynamic prolog:'$user_defined_flag'/4.
|
||
|
||
:- multifile prolog:debug_action_hook/1.
|
||
|
||
:- multifile prolog:'$system_predicate'/2.
|
||
|
||
:- '$opdec'(1150,fx,(mode),prolog).
|
||
|
||
:- dynamic 'extensions_to_present_answer'/1.
|
||
|
||
:- ['arrays.yap'].
|
||
|
||
:- multifile user:portray_message/2.
|
||
|
||
:- dynamic user:portray_message/2.
|
||
|
||
/** @pred prolog:goal_expansion( :G,+ M,- NG)
|
||
@pred user:goalexpansion(+ G,+ M,- NG)
|
||
|
||
The goal_expansion/3 hook is an user-defined
|
||
procedure that is called after term expansion when compiling or
|
||
asserting goals for each sub-goal in a clause. The first argument is
|
||
bound to the goal and the second to the module under which the goal
|
||
_G_ will execute. If goal_expansion/3 succeeds the new
|
||
sub-goal _NG_ will replace _G_ and will be processed in the same
|
||
way. If goal_expansion/3 fails the system will use the default
|
||
expandion mechanism.
|
||
|
||
This hook is called:
|
||
- at compilation time;
|
||
- when running a query in the top-level
|
||
|
||
Older versions of YAP would call this procedure at every meta-call.
|
||
|
||
|
||
*/
|
||
:- multifile user:goal_expansion/3.
|
||
|
||
:- dynamic user:goal_expansion/3.
|
||
|
||
:- multifile user:goal_expansion/2.
|
||
|
||
:- dynamic user:goal_expansion/2.
|
||
|
||
:- multifile system:goal_expansion/2.
|
||
|
||
:- dynamic system:goal_expansion/2.
|
||
|
||
:- multifile goal_expansion/2.
|
||
|
||
:- dynamic goal_expansion/2.
|
||
|
||
:- use_module('messages.yap').
|
||
|
||
:- ['undefined.yap'].
|
||
|
||
:- use_module('hacks.yap').
|
||
|
||
|
||
:- use_module('attributes.yap').
|
||
:- use_module('corout.yap').
|
||
:- use_module('dialect.yap').
|
||
:- use_module('dbload.yap').
|
||
:- use_module('ypp.yap').
|
||
:- use_module('../os/chartypes.yap').
|
||
:- ensure_loaded('../os/edio.yap').
|
||
|
||
yap_hacks:cut_by(CP) :- '$$cut_by'(CP).
|
||
|
||
:- '$change_type_of_char'(36,7). % Make $ a symbol character
|
||
|
||
:- set_prolog_flag(generate_debug_info,true).
|
||
|
||
%
|
||
% cleanup ensure loaded and recover some data-base space.
|
||
%
|
||
%:- ( recorded('$lf_loaded',_,R), erase(R), fail ; true ).
|
||
%:- ( recorded('$module',_,R), erase(R), fail ; true ).
|
||
|
||
:- set_value('$user_module',user), '$protect'.
|
||
|
||
:- style_check([+discontiguous,+multiple,+single_var]).
|
||
|
||
%
|
||
% moved this to init_gc in sgc.c to separate the alpha
|
||
%
|
||
% :- yap_flag(gc,on).
|
||
%
|
||
% :- yap_flag(gc_trace,verbose`
|
||
|
||
:- multifile
|
||
prolog:comment_hook/3.
|
||
|
||
:- source.
|
||
|
||
:- module(user).
|
||
|
||
|
||
/** @pred term_expansion( _T_,- _X_)
|
||
user:term_expansion( _T_,- _X_)
|
||
|
||
|
||
This user-defined predicate is called by `expand_term/3` to
|
||
preprocess all terms read when consulting a file. If it succeeds:
|
||
|
||
+
|
||
If _X_ is of the form `:- G` or `?- G`, it is processed as
|
||
a directive.
|
||
+
|
||
If _X_ is of the form `$source_location`( _File_, _Line_): _Clause_` it is processed as if from `File` and line `Line`.
|
||
|
||
+
|
||
If _X_ is a list, all terms of the list are asserted or processed
|
||
as directives.
|
||
+ The term _X_ is asserted instead of _T_.
|
||
|
||
|
||
|
||
*/
|
||
:- multifile term_expansion/2.
|
||
|
||
:- dynamic term_expansion/2.
|
||
|
||
:- multifile system:term_expansion/2.
|
||
|
||
:- dynamic system:term_expansion/2.
|
||
|
||
:- multifile system:swi_predicate_table/4.
|
||
|
||
/** @pred user:message_hook(+ _Term_, + _Kind_, + _Lines_)
|
||
|
||
|
||
Hook predicate that may be define in the module `user` to intercept
|
||
messages from print_message/2. _Term_ and _Kind_ are the
|
||
same as passed to print_message/2. _Lines_ is a list of
|
||
format statements as described with print_message_lines/3.
|
||
|
||
This predicate should be defined dynamic and multifile to allow other
|
||
modules defining clauses for it too.
|
||
|
||
|
||
*/
|
||
:- multifile user:message_hook/3.
|
||
|
||
:- dynamic user:message_hook/3.
|
||
|
||
/** @pred exception(+ _Exception_, + _Context_, - _Action_)
|
||
|
||
|
||
Dynamic predicate, normally not defined. Called by the Prolog system on run-time exceptions that can be repaired `just-in-time`. The values for _Exception_ are described below. See also catch/3 and throw/1.
|
||
If this hook preodicate succeeds it must instantiate the _Action_ argument to the atom `fail` to make the operation fail silently, `retry` to tell Prolog to retry the operation or `error` to make the system generate an exception. The action `retry` only makes sense if this hook modified the environment such that the operation can now succeed without error.
|
||
|
||
+ `undefined_predicate`
|
||
_Context_ is instantiated to a predicate-indicator ( _Module:Name/Arity_). If the predicate fails Prolog will generate an existence_error exception. The hook is intended to implement alternatives to the SWI built-in autoloader, such as autoloading code from a database. Do not use this hook to suppress existence errors on predicates. See also `unknown`.
|
||
+ `undefined_global_variable`
|
||
_Context_ is instantiated to the name of the missing global variable. The hook must call nb_setval/2 or b_setval/2 before returning with the action retry.
|
||
|
||
*/
|
||
|
||
:- multifile user:exception/3.
|
||
|
||
:- dynamic user:exception/3.
|
||
|
||
:- ensure_loaded('../pl/pathconf.yap').
|
||
|
||
:- current_prolog_fkag(android,true), ensure_loaded('../pl/android.yap').
|
||
|
||
|
||
|
||
:- set_prolog_flag(unknown,error).
|
||
|
||
|
||
%% @}
|
||
|