68 lines
2.4 KiB
Prolog
68 lines
2.4 KiB
Prolog
:- module(log,
|
|
[ log/1,
|
|
debug/1,
|
|
log/2,
|
|
explain_error/2,
|
|
why_failed/2,
|
|
set_verbosity/1,
|
|
if_verbose/1
|
|
]).
|
|
|
|
:- dynamic verbose_level/1.
|
|
verbose_level(0). % Default verbosity: 0 (errors only), 1 (log), 2 (debug)
|
|
|
|
set_verbosity(Level) :-
|
|
retractall(verbose_level(_)),
|
|
assertz(verbose_level(Level)).
|
|
|
|
if_verbose(Goal) :-
|
|
verbose_level(Level),
|
|
Level > 0,
|
|
call(Goal).
|
|
|
|
log(Message) :-
|
|
verbose_level(Level),
|
|
Level >= 1,
|
|
format(user_error, '[LOG] ~w~n', [Message]).
|
|
|
|
debug(Message) :-
|
|
verbose_level(Level),
|
|
Level >= 2,
|
|
format(user_error, '[DEBUG] ~w~n', [Message]).
|
|
|
|
log(Phase, Term) :-
|
|
verbose_level(Level),
|
|
Level >= 1,
|
|
format(user_error, '[LOG][~w] ~w~n', [Phase, Term]).
|
|
|
|
explain_error(ErrorTerm, Explanation) :-
|
|
% Basic error explanation, to be expanded
|
|
( ErrorTerm = type_mismatch(Expected, Actual, Location) ->
|
|
format(string(Explanation), "Type mismatch at ~w: Expected ~w, but got ~w.", [Location, Expected, Actual])
|
|
; ErrorTerm = unification_failure(Term1, Term2, Context) ->
|
|
format(string(Explanation), "Unification failed between ~w and ~w in context: ~w.", [Term1, Term2, Context])
|
|
; ErrorTerm = unbound_variable(Var, Location) ->
|
|
format(string(Explanation), "Unbound variable ~w at ~w.", [Var, Location])
|
|
; ErrorTerm = unknown_predicate(Pred, Location) ->
|
|
format(string(Explanation), "Unknown predicate ~w at ~w.", [Pred, Location])
|
|
; format(string(Explanation), "An error occurred: ~w", [ErrorTerm])
|
|
),
|
|
log(error, Explanation).
|
|
|
|
why_failed(ErrorTerm, Details) :-
|
|
% Provide more context or steps leading to failure
|
|
( ErrorTerm = type_mismatch(Expected, Actual, _Location) ->
|
|
% Placeholder for more detailed logic, e.g., tracing type inference steps
|
|
format(string(Details), "Failure due to ~w not being compatible with ~w.", [Actual, Expected])
|
|
; format(string(Details), "Details for ~w not yet implemented.", [ErrorTerm])
|
|
),
|
|
log(error_details, Details).
|
|
|
|
% Example usage (can be removed or moved to tests.pl)
|
|
% :- set_verbosity(2).
|
|
% :- log('Logging system initialized.').
|
|
% :- debug('This is a debug message.').
|
|
% :- log(parser, 'Parsing phase started.').
|
|
% :- explain_error(type_mismatch(number, string, 'line 5'), Explanation), writeln(Explanation).
|
|
% :- why_failed(type_mismatch(number, string, 'line 5'), Details), writeln(Details).
|