View source with raw comments or as raw
    1:- module(scasp_load_compiled,
    2          [ read_compiled_source/1
    3          ]).    4:- use_module(pr_rules).

Load a precompiled program

To be done
- : Not compatible with module handling. */
   11:- op(700, fx, [not, #]).   12:- op(700, xfx, [(.\=.), (.=.)]).   13:- op(700, xfx, [#=, #<>, #<, #>, #=<, #>=]).   14
   15read_compiled_source(M:S) :-
   16    clean_pr_program(M),
   17    read_compiled_files(M:S), !.
   18
   19read_compiled_files([]).
   20read_compiled_files([F|Fs]) :-
   21    read_compiled_file(F),
   22    read_compiled_files(Fs).
   23
   24read_compiled_file(F) :-
   25    open(F, read, ID),  % open a stream
   26    repeat,             % try again forever
   27    read(ID, X),        % read from the stream
   28    assert_clause(X),
   29    X == end_of_file,   % fail (backtrack) if not end of file
   30    close(ID).          % close the file
   31
   32assert_clause(end_of_file) :- !.
   35assert_clause('#'(_)) :- !.
   36
   37assert_clause('?-'(Query)) :- !,
   38    conj_to_list(Query, LQuery),
   39    assert(pr_query(LQuery)).
   40
   41assert_clause(':-'(Head,Body)) :- !,
   42    conj_to_list(Body,LBody),
   43    capture_minus(LBody,MBody),
   44    capture_minus([Head],[MHead]),
   45    assert_rule(MHead,MBody).
   46assert_clause(Fact) :-
   47    capture_minus([Fact],[MFact]),
   48    assert_rule(MFact,[]).
   49
   50assert_rule(global_constraint,Body) :- !,
   51    assertz(pr_rule(o_nmr_check,Body)),
   52    assertz(pr_user_predicate(o_nmr_check/0)),
   53    assertz(pr_user_predicate(global_constraints/0)).
   54assert_rule(Head,Body) :-
   55    functor(Head, Name, La),
   56    (   pr_user_predicate(Name/La)
   57    ->  true
   58    ;   assertz(pr_user_predicate(Name/La))
   59    ),
   60    assertz(pr_rule(Head,Body)).
   61
   62capture_minus([],[]).
   63capture_minus([-Neg|Bs],[MNeg|MBs]) :- !,
   64    Neg =.. [Name|Args],
   65    atom_concat('-',Name,MName),
   66    MNeg =.. [MName|Args],
   67    capture_minus(Bs,MBs).
   68capture_minus([not(-Neg)|Bs],[not(MNeg)|MBs]) :- !,
   69    Neg =.. [Name|Args],
   70    atom_concat('-',Name,MName),
   71    MNeg =.. [MName|Args],
   72    capture_minus(Bs,MBs).
   73capture_minus([B|Bs],[B|MBs]) :-
   74    capture_minus(Bs,MBs).
   75
   76conj_to_list(true, []) :-
   77    !.
   78conj_to_list(Conj, List) :-
   79    comma_list(Conj, List)