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(retract, G, M, F) :- database_retract_fact(G, M, F).
  112database_fact_ort(query,   G, M, F) :- database_query_fact(G, M, F).
  113
  114database_fact(M:G, F) :-
  115    predicate_property(M:G, implementation_module(IM)),
  116    database_fact_ort(_, G, IM, F).
  117
  118database_def_fact(M:H, F) :- database_def_fact(H, M, F).
  119
  120database_def_fact(bind_interface(Intf, Impl), interface, Intf:H) :-
  121    interface:'$interface'(Intf, DIL),
  122    interface:'$implementation'(Impl, Intf),
  123    member(F/A, DIL),
  124    functor(H, F, A).
  125
  126database_def_fact(asserta_with_names(A, _),  ifprolog,   F) :- clause_head(A, F).
  127database_def_fact(assertz_with_names(A, _),  ifprolog,   F) :- clause_head(A, F).
  128database_def_fact(lasserta(A),               pce_config, F) :- clause_head(A, F).
  129database_def_fact(assert_cyclic(A),          plunit,     F) :- clause_head(A, F).
  130database_def_fact(assert(A),                 system,     F) :- clause_head(A, F).
  131database_def_fact(assert(A, _),              system,     F) :- clause_head(A, F).
  132database_def_fact(asserta(A),                system,     F) :- clause_head(A, F).
  133database_def_fact(asserta(A, _),             system,     F) :- clause_head(A, F).
  134database_def_fact(assertz(A),                system,     F) :- clause_head(A, F).
  135database_def_fact(assertz(A, _),             system,     F) :- clause_head(A, F).
  136database_def_fact(update_fact_from(A, From), from_utils, F) :-
  137    nonvar(A),
  138    extend_args(A, [From], H),
  139    clause_head(H, F).
  140database_def_fact(PAssert, M, Fact) :-
  141    persistency:persistent(M, Fact, _),
  142    functor(Fact, Name, Arity),
  143    member(Prefix, [assert_, asserta_]),
  144    atom_concat(Prefix, Name, PName),
  145    functor(PAssert, PName, Arity).
  146
  147database_dec_fact(M:H, F) :- database_dec_fact(H, M, F).
  148
  149database_dec_fact(abolish(F, A),             system,     H) :- fa_to_head(F, A, H).
  150database_dec_fact(abolish(PI),               system,     H) :- pi_to_head(PI, H).
  151database_dec_fact(retractall(F),             system,     F).
  152database_dec_fact(retractall_near(F),        near_utils, F).
  153database_dec_fact(forall(A, B),              system,     F) :-
  154    subsumes_term(forall(retract(F), true), forall(A, B)),
  155    A=retract(F).
  156database_dec_fact(\+ A,  system,     F) :-
  157    subsumes_term((retract(F), \+ true), A),
  158    A = (retract(F), \+ true).
  159database_dec_fact(PRetractall, M, Fact) :-
  160    persistency:persistent(M, Fact, _),
  161    functor(Fact, Name, Arity),
  162    atom_concat(retractall_, Name, PName),
  163    functor(PRetractall, PName, Arity).
  164
  165database_retract_fact(retract(A),      system,     F) :- clause_head(A, F).
  166database_retract_fact(retract_near(A), near_utils, F) :- clause_head(A, F).
  167database_retract_fact(lretract(A),     pce_config, F) :- clause_head(A, F).
  168database_retract_fact(PRetract, M, Fact) :-
  169    persistency:persistent(M, Fact, _),
  170    functor(Fact, Name, Arity),
  171    atom_concat(retract_, Name, PName),
  172    functor(PRetract, PName, Arity).
  173
  174database_query_fact(clause(A, _),       system,     F) :- clause_head(A, F).
  175database_query_fact(clause(A, _, _),    system,     F) :- clause_head(A, F).
  176database_query_fact(unfold_goal(_,A,_), refactor,   F) :- clause_head(A, F).
  177database_query_fact(fact_near(A),       near_utils, F) :- clause_head(A, F).
  178database_query_fact(fact_near(A, _),    near_utils, F) :- clause_head(A, F).
  179
  180pi_to_head(PI, H) :- nonvar(PI) -> PI=F/A, fa_to_head(F, A, H) ; true.
  181
  182fa_to_head(M:F, A, M:H) :- atomic(M) -> fa_to_head_(F, A, H), !.
  183fa_to_head(F,   A, H) :- fa_to_head_(F, A, H).
  184
  185fa_to_head_(F, A, H) :- atomic(F), integer(A) -> functor(H, F, A) ; true