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].