1:- module(scasp_load_compiled,
2 [ read_compiled_source/1
3 ]). 4:- use_module(pr_rules).
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), 26 repeat, 27 read(ID, X), 28 assert_clause(X),
29 X == end_of_file, 30 close(ID). 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)
Load a precompiled program