elipl/log.pl
Kacper Marzecki 4f13a98189 asd
2025-05-29 16:53:36 +02:00

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).