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