Re: [eclipse-clp-users] Checking for existing clauses without dynamic definition?

From: Gesche Gierse <gierse_at_...358...>
Date: Wed, 11 Jun 2014 20:50:02 +0200
Thanks for the help, that solution works out fine.

However it raises another questions: I need to store those dynamic
predicates in different files (want to use some with different modules
and avoid copy&paste). Furthermore I want to load that definitions only
with a single import/use_module call.

When I load these predicates with

:- ['outsourced_predicates']

the solution below does not detect the predicates defined in
"outsourced_predicates" (they seem to be unfindable for "clause").

I hacked that by defining a module "outsourced_predicates", which has a
tool predicate "assert_preds", that asserts everything to the calling
module:

:- export assert_preds/0.
:- tool(assert_preds/0, assert_preds/1).

assert_preds(M) :- call(assert(..))_at_M.

That works, but I have to call the predicate "assert_preds" explicitly.
I would rather like to call it implicitly at import time. Therefore I tried

:- export initialization((outsourced_predicates : assert_preds))

However, then "clause" does not detect the asserted predicates.

Do you have any idea how I could use definitions from different files
such that "clause" can find all of them in one module and that only one
import command is needed?

Thanks, again!
Gesche

On 2014-05-29 13:20, Joachim Schimpf wrote:
> On 29/05/2014 11:48, Marco Gavanelli wrote:
>> Dear Gesche,
>>
>> Maybe you could use abolish/1 to remove the dynamic predicate and then 
>> use compile_term/1 to re-add the predicate in compiled form.
>>
>> Example:
>> ------------------------------------------------------------------
>> [eclipse 1]: assert(p:-q).
>>
>> Yes (0.00s cpu)
>> [eclipse 2]: compile_term(q).
>> source_processor.eco loaded in 0.00 seconds
>> ...
>> ecl_compiler.eco loaded in 0.05 seconds
>>
>> Yes (0.05s cpu)
>> [eclipse 3]: clause(p,X).
>>
>> X = q
>> Yes (0.00s cpu)
>> [eclipse 4]: abolish(p/0).
>>
>> Yes (0.00s cpu)
>> [eclipse 5]: p.
>> calling an undefined procedure p in module eclipse
>> Abort
>> [eclipse 6]: compile_term(p:-q).
>>
>> Yes (0.00s cpu)
>> [eclipse 7]: clause(p,X).
>> procedure not dynamic in clause(p, X) in module eclipse
>> Abort
>> [eclipse 8]: p.
>>
>> Yes (0.00s cpu)
>> ---------------------------------------------------------------------
> 
> 
> Correct.  Here is a little utility that does everything:
> 
> :- tool(dynamic_to_static/1, dynamic_to_static_/2).
> dynamic_to_static_(F/N, Module) :-
> 	functor(Head, F, N),
> 	findall(Head:-Body, clause(Head, Body), Clauses)_at_Module,
> 	abolish(F/N)_at_Module,
> 	compile_term(Clauses)_at_Module.
> 
> 
> ?- assert(p(111)), assert(p(222)).
> Yes (0.00s cpu)
> 
> ?- dynamic_to_static(p/1).
> Yes (0.00s cpu)
> 
> ?- is_dynamic(p/1).
> No (0.00s cpu)
> 
> ?- p(X).
> X = 111
> Yes (0.00s cpu, solution 1, maybe more)
> X = 222
> Yes (0.02s cpu, solution 2)
> 
> 
> -- Joachim
> 
> 
> ------------------------------------------------------------------------------
> Time is money. Stop wasting it! Get your web API in 5 minutes.
> www.restlet.com/download
> http://p.sf.net/sfu/restlet
> _______________________________________________
> ECLiPSe-CLP-Users mailing list
> ECLiPSe-CLP-Users_at_lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/eclipse-clp-users
> 
Received on Wed Jun 11 2014 - 18:50:22 CEST

This archive was generated by hypermail 2.3.0 : Wed Sep 25 2024 - 15:13:21 CEST