1/*****************************************************************************
    2 * This file is part of the Prolog Development Tool (PDT)
    3 * 
    4 * Author: G�nter Kniesel (among others)
    5 * WWW: http://sewiki.iai.uni-bonn.de/research/pdt/start
    6 * Mail: pdt@lists.iai.uni-bonn.de
    7 * Copyright (C): 2004-2012, CS Dept. III, University of Bonn
    8 * 
    9 * All rights reserved. This program is  made available under the terms
   10 * of the Eclipse Public License v1.0 which accompanies this distribution,
   11 * and is available at http://www.eclipse.org/legal/epl-v10.html
   12 * 
   13 ****************************************************************************/
   14
   15% Date: 06.10.2004
   16
   17% 21.2.2011: Added option 'unique'
   18
   19/*
   20 * This file contains predicates for caching results of goals
   21 * as facts in a specified module. By providing the option 
   22 * 'unique' in the optional Options list, one can enforce that the
   23 * generated facts are duplicate free.
   24 */
   25:- module( database_cache, 
   26   [ generate_all_in_module/3  % (+Module,+Template,+Call)
   27   , generate_all_in_module/4  % (+Module,+Template,+Call,+Options)
   28   , generate_in_module/3      % (+Module,+Template,+Call)
   29   , generate_in_module/4      % (+Module,+Template,+Call,Options)
   30   ]
   31).   32
   33:- use_module(general).       
   34:- use_module(utils4modules).   35/*
   36 * generate_all_in_module(+Module,+Template,+Call)
   37 * generate_all_in_module(+Module,+Template,+Call,Options)
   38 *
   39 * Compute ALL results of an arbitrary goal (Arg3) 
   40 * that shares variables with the template (Arg2)
   41 * and assert the resulting template instances in 
   42 * the specified output module (Arg1). 
   43 *
   44 * If the Options list contains the element 'unique'
   45 * the generated facts will contain NO DUPLICATES.
   46 * If no Options are provided duplicates will be created.
   47 *
   48 * All previous facts for Template are retracted  
   49 * from Module before generating the new facts. 
   50 */
   51 
   52 :- use_module(library(lists)).   53 
   54:- module_transparent generate_all_in_module/3,
   55                      generate_all_in_module/4.   56                      
   57generate_all_in_module(Module,Template,Call) :- 
   58   generate_all_in_module(Module,Template,Call,[]).
   59   
   60generate_all_in_module(Module,Template,Call,Options) :- 
   61   retractall_generated_in_module(Module,Template),
   62   all( generate_in_module(Module,Template,Call,Options) ).
   63
   64
   65:- module_transparent retractall_generated_in_module/2.   66 
   67retractall_generated_in_module(Module,Template) :- 
   68   ( is_list(Template)
   69     -> forall( member(T, Template), retractall_in_module(Module,T) )
   70      ; retractall_in_module(Module,Template)
   71   ) .
   72
   73
   74   
   75   
   76/*
   77 * generate_in_module(+Module,+Template,+Call)
   78 *
   79 * Compute a result of an arbitrary goal (Arg3) 
   80 * that shares variables with the template (Arg2)
   81 * and assert the resulting template instances in 
   82 * the specified output module (Arg1). 
   83 * If Template is a list, assert each element.
   84 */
   85:- module_transparent generate_in_module/3, 
   86                      generate_in_module/4.   87
   88generate_in_module(Module,Template,Call) :-
   89   generate_in_module(Module,Template,Call,[]).
   90                         
   91generate_in_module(Module,Template,Call,Options) :- 
   92   call(Call), 
   93   ( is_list(Template)
   94     -> forall( member(T, Template), assert_in_module(Module,T, Options) )
   95      ; assert_in_module(Module,Template,Options)
   96   ) .
   97
   98
   99%/* **********************************************************
  100% * Only for systems that do not support modules: 
  101% * Caching by prepending prefix to predicate name
  102% */
  103%
  104%   
  105%findall_and_generate_with_prefix(Prefix,Call) :- 
  106%   all( generate_with_prefix(Prefix,Call) ).
  107%
  108%generate_with_prefix(Prefix, Goal) :-
  109%    generatedName(Goal,Prefix,F/N,NewG),
  110%    dynamic(F/N),
  111%    call(Goal),
  112%    assert(NewG).
  113% 
  114%regenerate_with_prefix(Prefix, Goal) :-
  115%    generatedName(Goal,Prefix,_,NewG),
  116%    retractall(NewG),
  117%    call(Goal),
  118%    assert(NewG).
  119%        
  120%generatedName(G1,Prefix,F/N,G2) :-
  121%    functor(G1,FOld,N),
  122%    G1 =.. [FOld|Arg],
  123%    concat(Prefix,FOld,F),
  124%    G2 =.. [F|Arg].