34
35:- module(database_fact,
36 [database_fact/1,
37 database_fact/2,
38 database_fact/3,
39 database_fact_ort/4,
40 database_def_fact/2,
41 database_mod_fact/2,
42 database_use_fact/2,
43 clause_head/2,
44 fa_to_head/3
45 ]). 46
47:- use_module(library(lists)). 48:- use_module(library(assertions)). 49:- use_module(library(plprops)). 50:- use_module(library(extend_args)). 51:- use_module(library(static_strip_module)). 52:- use_module(library(persistency), []). 53:- use_module(library(interface)). 54:- init_expansors. 55
56:- create_prolog_flag(check_database_preds, false, [type(boolean)]). 57
60
61prolog:called_by(H, IM, CM, [F]) :-
62 current_prolog_flag(check_database_preds, true),
63 \+ is_meta(IM:H),
64 database_use_fact(IM:H, F),
65 static_strip_module(F, CM, C, M),
66 callable(C),
67 nonvar(M).
68
69is_meta(G) :-
70 predicate_property(G, meta_predicate(Meta)),
71 arg(_, Meta, S),
72 integer(S).
73
74:- multifile
75 database_def_fact/3,
76 database_dec_fact/3,
77 database_retract_fact/3,
78 database_query_fact/3. 79
80:- meta_predicate
81 database_fact(0),
82 database_fact(0, -). 83
84database_fact(MG) :-
85 database_fact(MG, _).
86database_fact(MG) :-
87 prop_asr(head, MG, _, Asr),
88 prop_asr(glob, database(_), _, Asr).
89
90database_mod_fact(M:G, F) :- database_def_fact( G, M, F).
91database_mod_fact(M:G, F) :- database_dec_fact( G, M, F).
92database_mod_fact(M:G, F) :- database_retract_fact(G, M, F).
93
94database_use_fact(M:G, F) :- database_query_fact( G, M, F).
95database_use_fact(M:G, F) :- database_retract_fact(G, M, F).
96
97clause_head(A, A) :- var(A), !.
98clause_head(M:A, M:A) :- var(A), !.
99clause_head((A :- _), A) :- !.
100clause_head(M:(A :- _), M:A) :- !.
101clause_head(A, A).
102
103database_fact(def, Goal, Fact) :- database_def_fact(Goal, Fact).
104database_fact(dec, Goal, Fact) :- database_dec_fact(Goal, Fact).
105database_fact(use, Goal, Fact) :- database_use_fact(Goal, Fact).
106database_fact(mod, Goal, Fact) :- database_mod_fact(Goal, Fact).
107
109database_fact_ort(def, G, M, F) :- database_def_fact(G, M, F).
110database_fact_ort(dec, G, M, F) :- database_dec_fact(G, M, F).
111database_fact_ort(declare, G, M, F) :- database_declare_fact(G, M, F).
112database_fact_ort(retract, G, M, F) :- database_retract_fact(G, M, F).
113database_fact_ort(query, G, M, F) :- database_query_fact(G, M, F).
114
115database_fact(M:G, F) :-
116 predicate_property(M:G, implementation_module(IM)),
117 database_fact_ort(_, G, IM, F).
118
119database_def_fact(M:H, F) :- database_def_fact(H, M, F).
120
121database_def_fact(bind_interface(Intf, Impl), interface, Intf:H) :-
122 interface:'$interface'(Intf, DIL),
123 interface:'$implementation'(Impl, Intf),
124 member(F/A, DIL),
125 functor(H, F, A).
126
127database_def_fact(asserta_with_names(A, _), ifprolog, F) :- clause_head(A, F).
128database_def_fact(assertz_with_names(A, _), ifprolog, F) :- clause_head(A, F).
129database_def_fact(lasserta(A), pce_config, F) :- clause_head(A, F).
130database_def_fact(assert_cyclic(A), plunit, F) :- clause_head(A, F).
131database_def_fact(ld_asserta(A), local_dynamic, F) :- clause_head(A, F).
132database_def_fact(ld_asserta(_, A), local_dynamic, F) :- clause_head(A, F).
133database_def_fact(ld_assertz(A), local_dynamic, F) :- clause_head(A, F).
134database_def_fact(ld_assertz(_, A), local_dynamic, F) :- clause_head(A, F).
135database_def_fact(assert(A), system, F) :- clause_head(A, F).
136database_def_fact(assert(A, _), system, F) :- clause_head(A, F).
137database_def_fact(asserta(A), system, F) :- clause_head(A, F).
138database_def_fact(asserta(A, _), system, F) :- clause_head(A, F).
139database_def_fact(assertz(A), system, F) :- clause_head(A, F).
140database_def_fact(assertz(A, _), system, F) :- clause_head(A, F).
141database_def_fact(update_fact_from(A, From), from_utils, F) :-
142 nonvar(A),
143 extend_args(A, [From], H),
144 clause_head(H, F).
145database_def_fact(PAssert, M, Fact) :-
146 persistency:persistent(M, Fact, _),
147 functor(Fact, Name, Arity),
148 member(Prefix, [assert_, asserta_]),
149 atom_concat(Prefix, Name, PName),
150 functor(PAssert, PName, Arity).
151
152database_dec_fact(M:H, F) :- database_dec_fact(H, M, F).
153
154database_dec_fact(abolish(F, A), system, H) :- fa_to_head(F, A, H).
155database_dec_fact(abolish(PI), system, H) :- pi_to_head(PI, H).
156database_dec_fact(retractall(F), system, F).
157database_dec_fact(retractall_near(F), near_utils, F).
158database_dec_fact(ld_retractall(F), local_dynamic, F).
159database_dec_fact(ld_retractall(_, F), local_dynamic, F).
160database_dec_fact(forall(A, B), system, F) :-
161 subsumes_term(forall(retract(F), true), forall(A, B)),
162 A=retract(F).
163database_dec_fact(\+ A, system, F) :-
164 subsumes_term((retract(F), \+ true), A),
165 A = (retract(F), \+ true).
166database_dec_fact(PRetractall, M, Fact) :-
167 persistency:persistent(M, Fact, _),
168 functor(Fact, Name, Arity),
169 atom_concat(retractall_, Name, PName),
170 functor(PRetractall, PName, Arity).
171
172ddf_wld(ML, MH) :-
173 nonvar(ML),
174 !,
175 dd_wld(ML, MH).
176dd_wld(M:L, M:H) :-
177 !,
178 dd_wld(L, H).
179dd_wld(L, H) :-
180 nonvar(L),
181 member(E, L),
182 pi_to_head(E, H).
183
184database_declare_fact(dynamic(A), system, F) :- clause_head(A, F).
185database_declare_fact(thread_local(A), system, F) :- clause_head(A, F).
186database_declare_fact(volatile(A), system, F) :- clause_head(A, F).
187database_declare_fact(with_local_dynamic(ML, _), local_dynamic, H) :- ddf_wld(ML, H).
188database_declare_fact(with_local_dynamic(ML, _, _), local_dynamic, H) :- ddf_wld(ML, H).
189
190database_retract_fact(retract(A), system, F) :- clause_head(A, F).
191database_retract_fact(retract_near(A), near_utils, F) :- clause_head(A, F).
192database_retract_fact(lretract(A), pce_config, F) :- clause_head(A, F).
193database_retract_fact(ld_retract(A), local_dynamic, F) :- clause_head(A, F).
194database_retract_fact(ld_retract(_, A), local_dynamic, F) :- clause_head(A, F).
195database_retract_fact(PRetract, M, Fact) :-
196 persistency:persistent(M, Fact, _),
197 functor(Fact, Name, Arity),
198 atom_concat(retract_, Name, PName),
199 functor(PRetract, PName, Arity).
200
201database_query_fact(clause(A, _), system, F) :- clause_head(A, F).
202database_query_fact(clause(A, _, _), system, F) :- clause_head(A, F).
203database_query_fact(unfold_goal(_,A,_), refactor, F) :- clause_head(A, F).
204database_query_fact(fact_near(A), near_utils, F) :- clause_head(A, F).
205database_query_fact(fact_near(A, _), near_utils, F) :- clause_head(A, F).
206database_query_fact(call_ref(A, _), call_ref, F) :- clause_head(A, F).
207database_query_fact(call_ref(A, _, _), call_ref, F) :- clause_head(A, F).
208database_query_fact(ld_call(A), local_dynamic, F) :- clause_head(A, F).
209database_query_fact(ld_call(_, A), local_dynamic, F) :- clause_head(A, F).
210
211pi_to_head(PI, H) :- nonvar(PI) -> PI=F/A, fa_to_head(F, A, H) ; true.
212
213fa_to_head(M:F, A, M:H) :- atomic(M) -> fa_to_head_(F, A, H), !.
214fa_to_head(F, A, H) :- fa_to_head_(F, A, H).
215
216fa_to_head_(F, A, H) :- atomic(F), integer(A) -> functor(H, F, A) ; true