View source with raw comments or as raw
    1:- module(scasp_source_reference,
    2          [ scasp_source_reference_file_line/3,   % +Ref, -File, -Line
    3            assert_scasp_source_reference/3,      % +File, +Pos, -Ref
    4            scasp_source_reference/3,             % +Ref, -File, -Pos
    5            scasp_dynamic_clause_position/2       % +Ref, -Pos
    6          ]).

s(CASP) source references

*/

   12scasp_source_reference_file_line(Ref, File, Line) :-
   13    blob(Ref, clause),
   14    !,
   15    (   clause_file_line(Ref, File, Line)
   16    ->  true
   17    ;   File = none, Line = 0
   18    ).
   19scasp_source_reference_file_line(Ref, File, Line) :-
   20    scasp_source_reference(Ref, File, Pos),
   21    !,
   22    stream_position_data(line_count, Pos, Line).
   23
   24clause_file_line(ClauseRef, dynamic, Line) :-
   25    scasp_dynamic_clause_position(ClauseRef, Pos),
   26    !,
   27    stream_position_data(line_count, Pos, Line).
   28clause_file_line(ClauseRef, File, Line) :-
   29    clause_property(ClauseRef, file(File)),
   30    clause_property(ClauseRef, line_count(Line)).
   31
   32:- dynamic scasp_source_reference/3.   33
   34assert_scasp_source_reference(File, Pos, Ref) :-
   35    scasp_source_reference(Ref, File, Pos), !.
   36assert_scasp_source_reference(File, Pos, Ref) :-
   37    (   scasp_source_reference(Ref0, _, _)
   38    ->  Ref is Ref0 + 1
   39    ;   Ref is 1
   40    ),
   41    asserta(scasp_source_reference(Ref, File, Pos)).
 scasp_dynamic_clause_position(+Ref, -Pos) is semidet
True when Pos is the stream position is which the source code for the dynamic clause referenced by Ref was read.
   49:- dynamic scasp_dynamic_clause_position/2.