27
28:- module(scasp_compile,
29 [ scasp_load/2, 30 scasp_compile/2, 31 scasp_compile_query/3, 32 scasp_query/1, 33 scasp_query/3 34 ]). 35:- use_module(library(error)). 36:- use_module(library(lists)). 37:- use_module(library(option)). 38:- use_module(library(prolog_code)). 39:- use_module(predicates). 40:- use_module(common).
53:- use_module(input). 54:- use_module(program). 55:- use_module(comp_duals). 56:- use_module(nmr_check). 57:- use_module(pr_rules). 58:- use_module(variables). 59
60:- meta_predicate
61 scasp_load(:, +),
62 scasp_compile(:, +),
63 scasp_query(:),
64 scasp_query(:, -, +),
65 scasp_compile_query(:, -, +).
80:- det(scasp_load/2). 81scasp_load(M:Spec, Options) :-
82 to_list(Spec, Sources),
83 call_cleanup(
84 scasp_load_guarded(M:Sources, Options),
85 destroy_program).
86
87to_list(List, List) :-
88 is_list(List),
89 !.
90to_list(One, [One]).
91
92scasp_load_guarded(M:Sources, Options) :-
93 clean_pr_program(M),
94 load_source_files(Sources),
95 comp_duals,
96 generate_nmr_check(M),
97 generate_pr_rules(M:Sources, Options).
103scasp_compile(M:Terms, Options) :-
104 call_cleanup(
105 scasp_compile_guarded(M:Terms, Options),
106 destroy_program).
107
108scasp_compile_guarded(M:Terms, Options) :-
109 clean_pr_program(M),
110 scasp_load_terms(Terms, Options),
111 comp_duals,
112 generate_nmr_check(M),
113 generate_pr_rules(M:_Sources, Options).
117scasp_compile_query(M:Goal, M:Query, Options) :-
118 conj_to_list(Goal, Q0),
119 maplist(intern_negation, Q0, Q1),
120 add_nmr(Q1, Query, Options),
121 maplist(check_existence(M), Query).
122
123conj_to_list(true, []) :-
124 !.
125conj_to_list(Conj, List) :-
126 comma_list(Conj, List).
127
128add_nmr(Q0, Q, Options) :-
129 option(nmr(false), Options),
130 Q = Q0.
131add_nmr(Q0, Q, _Options) :-
132 append(Q0, [o_nmr_check], Q).
133
134check_existence(M, G) :-
135 shown_predicate(M:G),
136 !.
137check_existence(_,G) :-
138 prolog_builtin(G),
139 !.
140check_existence(_,G) :-
141 clp_builtin(G),
142 !.
143check_existence(_,G) :-
144 clp_interval(G),
145 !.
146check_existence(_,_ is _) :-
147 !.
148check_existence(_, G) :-
149 scasp_pi(G, PI),
150 existence_error(scasp_predicate, PI).
151
152scasp_pi(not(G), PI) :-
153 !,
154 scasp_pi(G, PI).
155scasp_pi(G, PI) :-
156 pi_head(PI, G).
165scasp_query(M:_Query) :-
166 M:pr_query([not(o_false)]), !,
167 existence_error(scasp_query, M).
168scasp_query(M:Query) :-
169 M:pr_query(Query).
177scasp_query(M:Query, Bindings, Options) :-
178 scasp_query(M:Query0),
179 process_query(M:Query0, _, M:Query, Bindings, Options),
180 maplist(check_existence(M), Query).
181
182process_query(M:Q, M:Query, M:TotalQuery, VarNames, Options) :-
183 revar(Q, A, VarNames),
184 ( is_list(A)
185 -> Query = A
186 ; comma_list(A, Query)
187 ),
188 ( option(nmr(false), Options)
189 -> TotalQuery = Query
190 ; append(Query, [o_nmr_check], TotalQuery)
191 )
s(ASP)
Ungrounded Stable Models SolverRead in a normal logic program. Compute dual rules and the NMR check. Execute the modified program according to the stable model semantics and output the results.