2016-04-06 00:26:16 +01:00
|
|
|
/**
|
|
|
|
* @file log2md.yap
|
|
|
|
* @author Vitor Santos Costa
|
|
|
|
*
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
:- op(650,yfx, <-- ),
|
|
|
|
op(650,yfx, <-* ).
|
|
|
|
|
|
|
|
:- module( log2md,
|
|
|
|
[open_log/1,
|
|
|
|
log_title/1,
|
|
|
|
log_section/1,
|
|
|
|
log_subsection/1,
|
|
|
|
log_paragraph/1,
|
|
|
|
log_unit/2,
|
|
|
|
(<--)/2,
|
|
|
|
(<-*)/2,
|
|
|
|
log_goal/1,
|
|
|
|
log_goal/1 as log_clause,
|
|
|
|
out/1,
|
|
|
|
out/2,
|
|
|
|
outln/1,
|
|
|
|
outln/2] ).
|
|
|
|
|
|
|
|
:- use_module( library( maplist) ).
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* @defgroup Log2MD Log Output of Tests in Markdown format.
|
|
|
|
*
|
|
|
|
* @ingroup Regression System Tests
|
|
|
|
*
|
|
|
|
* These primitives support writing a user-specified log of execution to an
|
|
|
|
* output file. The output file can be used for testing or debugging.
|
|
|
|
*
|
|
|
|
* Primitives include the ability to write a title, a Prolog clause or
|
|
|
|
* goal, and hooks for tracing calls. The log_goal/2 can be used to
|
|
|
|
* start a goal. Arguments of the form `<--/2` and `*->/2` can be used to
|
|
|
|
* track calls.
|
|
|
|
*
|
|
|
|
* The output format is markdown.
|
|
|
|
*/
|
|
|
|
|
|
|
|
open_log(F) :-
|
|
|
|
open( F, write, _Out, [alias(log)]).
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @pred log_title( +String ) is det
|
|
|
|
*
|
|
|
|
* @param [in] S is a Prolog atom or string describing a title.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
log_title( S ) :-
|
|
|
|
out( '## Report on ~a~n~n', [S]).
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @pred log_section( +String ) is det
|
|
|
|
*
|
|
|
|
* @param [in] S is a Prolog atom or string describing a title.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
log_section( S ) :-
|
|
|
|
out( '### Report on ~a~n~n', [S]).
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @pred log_section( +String ) is det
|
|
|
|
*
|
|
|
|
* @param [in] S is a Prolog atom or string describing a title.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
log_subsection( S ) :-
|
|
|
|
out( '#### Report on ~a~n~n', [S]).
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @pred log_section( +String ) is det
|
|
|
|
*
|
|
|
|
* @param [in] S is a Prolog atom or string describing a title.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
log_paragraph( S ) :-
|
|
|
|
out( '##### Report on ~a~n~n', [S]).
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @pred log_unit( +String, + Level ) is det
|
|
|
|
*
|
|
|
|
* @param [in] _String_ is a Prolog atom or string describing a title
|
|
|
|
* @param [in] _Level_ is an integer number larager than 1 (do notice that )
|
|
|
|
*large numbers may be ignored ).
|
|
|
|
*
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
log_unit( S ) :-
|
|
|
|
out( '## Report on ~a~n~n', [S]).
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @pred clause( +Term ) is det
|
|
|
|
*
|
|
|
|
* @param [in] Term is a Prolog clause or goal that it is going to
|
|
|
|
* be printed out using portray_clause/2.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
log_goal( DecoratedClause ) :-
|
|
|
|
take_decorations(DecoratedClause, Clause),
|
|
|
|
out( '~~~~~~~~{.prolog}~n'),
|
|
|
|
portray_clause( user_error , Clause ),
|
|
|
|
portray_clause( log , Clause ),
|
|
|
|
out( '~~~~~~~~~n', []).
|
|
|
|
|
|
|
|
take_decorations( G, G ) :-
|
|
|
|
var(G),
|
|
|
|
!.
|
|
|
|
take_decorations(_ <-- G, NG ) :-
|
|
|
|
!,
|
|
|
|
take_decorations( G, NG ).
|
|
|
|
take_decorations(_ <-* G, NG ) :-
|
|
|
|
!,
|
|
|
|
take_decorations( G, NG ).
|
|
|
|
take_decorations(G, NG ) :-
|
|
|
|
G =.. [F|Args],
|
|
|
|
maplist( take_decorations, Args, NArgs ),
|
|
|
|
NG =.. [F|NArgs].
|
|
|
|
|
|
|
|
:- meta_predicate ( + <-- 0 ),
|
|
|
|
( + <-* 0 ).
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @pred log_goal( +Tag , :Goal )
|
|
|
|
*
|
|
|
|
* @param [in] evaluate goal _Goal_ with output before,
|
2016-11-24 04:35:39 +00:00
|
|
|
* during and after the goal has been evaluated.
|
2016-04-06 00:26:16 +01:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
A <-* Goal :-
|
|
|
|
(
|
|
|
|
outln(A),
|
|
|
|
log_goal( Goal ),
|
|
|
|
call( Goal )
|
|
|
|
*->
|
|
|
|
out('succeded as~n'), log_goal(Goal)
|
|
|
|
;
|
|
|
|
out( 'failed~n'),
|
|
|
|
fail
|
|
|
|
).
|
|
|
|
|
|
|
|
/**
|
2016-11-24 04:35:39 +00:00
|
|
|
* @pred `<--`( +Tag , :Goal )
|
2016-04-06 00:26:16 +01:00
|
|
|
*
|
2016-11-24 04:35:39 +00:00
|
|
|
* @param [in] output goal _Goal_ before and after being evaluated, but only
|
2016-04-06 00:26:16 +01:00
|
|
|
* taking the first solution. The _Tag_ must be an atom or a string.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
Tag <-- Goal :-
|
|
|
|
(
|
|
|
|
outln(Tag),
|
|
|
|
log_goal( Goal ),
|
|
|
|
call( Goal )
|
|
|
|
->
|
|
|
|
out('succeded as~n'),
|
|
|
|
log_goal(Goal),
|
|
|
|
fail
|
|
|
|
;
|
|
|
|
out(failed)
|
|
|
|
).
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @pred out(+Format, +Args)
|
|
|
|
*
|
|
|
|
* @param [in] format the string given Args . The output is sent to
|
|
|
|
* user_error and to a stream with alias `log`;
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
out(Format, Args) :-
|
|
|
|
format( log, Format, Args),
|
|
|
|
format( user_error, Format, Args).
|
|
|
|
|
|
|
|
out(Format) :-
|
|
|
|
format( log, Format, []),
|
|
|
|
format( user_error, Format, []).
|
|
|
|
|
|
|
|
outln(Format, Args) :-
|
|
|
|
out(Format, Args), out('~n').
|
|
|
|
outln(Format) :-
|
|
|
|
out(Format), out('~n').
|