From a90e006be03e89cad9ac5858df371ef39e66c273 Mon Sep 17 00:00:00 2001 From: Vitor Santos Costa Date: Wed, 3 Nov 2010 00:33:26 +0000 Subject: [PATCH] more meld updates. --- Makefile.in | 2 +- packages/meld/graph3.meld | 2 + packages/meld/maxtemp.meld | 4 ++ packages/meld/meld.yap | 10 ++++- packages/meld/meldc.yap | 22 ++++++++--- packages/meld/meldi.yap | 35 ++++++++++++------ packages/meld/meldtd.yap | 75 ++++++++++++++++++++++++++++++++++++++ 7 files changed, 130 insertions(+), 20 deletions(-) create mode 100644 packages/meld/meldtd.yap diff --git a/Makefile.in b/Makefile.in index ef638820d..519a8d289 100755 --- a/Makefile.in +++ b/Makefile.in @@ -637,7 +637,7 @@ install_data: $(INSTALL_DATA) $(srcdir)/LGPL/pillow/pillow.pl $(DESTDIR)$(SHAREDIR)/Yap/ @INSTALLCLP@(cd LGPL/clp ; $(MAKE) install) (cd packages/CLPBN ; $(MAKE) install) - (cd packages/meld; $(MAKE)) + (cd packages/meld; $(MAKE) install) (cd packages/ProbLog ; $(MAKE) install) @ENABLE_CHR@ (cd packages/chr ; $(MAKE) install) @ENABLE_CHR@ (cd packages/clpqr ; $(MAKE) install) diff --git a/packages/meld/graph3.meld b/packages/meld/graph3.meld index 1cc1c72d3..4c665d3e6 100644 --- a/packages/meld/graph3.meld +++ b/packages/meld/graph3.meld @@ -1,3 +1,5 @@ + + root(a). neighbor(a,b). diff --git a/packages/meld/maxtemp.meld b/packages/meld/maxtemp.meld index 51f3a63cc..261bb060f 100644 --- a/packages/meld/maxtemp.meld +++ b/packages/meld/maxtemp.meld @@ -1,6 +1,10 @@ %:- ensure_loaded(l +type extensional root(module). +type extensional neighbor(module, module). +type extensional temperature(module, float). + type logical_neighbor parent(module, first module). type maxTemp(module, max float). diff --git a/packages/meld/meld.yap b/packages/meld/meld.yap index cc8c4696a..87b6fb79d 100644 --- a/packages/meld/meld.yap +++ b/packages/meld/meld.yap @@ -1,7 +1,14 @@ + + +:- style_check(all). + +:- yap_flag(unknown,error). + :- module(meld_core, [simulate/1, op(1200, fy, (type)), op(1150, fy, (logical_neighbor)), + op(1150, fy, (extensional)), op( 500, fy, (first)), op( 500, fy, (max)), op( 950, fy, (forall)), @@ -14,9 +21,10 @@ :- reexport(meld/meldc). +:- reexport(meld/meldtd). + simulate(G) :- input_graph(G), live. - diff --git a/packages/meld/meldc.yap b/packages/meld/meldc.yap index 389eaef4a..8ec5867cd 100644 --- a/packages/meld/meldc.yap +++ b/packages/meld/meldc.yap @@ -1,7 +1,3 @@ -:- style_check(all). - -:- yap_flag(unknown,error). - :- module(meld_compiler, [ mcompile/1, @@ -17,7 +13,13 @@ max/3 ]). -:- use_module(meld). +:- use_module(library(meld)). + +:- use_module(meldtd, + [ + meld_top_down_compile/2, + meld_top_down_aggregate/3 + ]). :- use_module(library(terms), [ variable_in_term/2 @@ -47,6 +49,11 @@ mcompile(type(T), Program, Vars) :- mcompile((Head :- Body), _, _Vars) :- rule(Head, Body). +type_declaration(extensional(T), Program) :- !, + functor(T, Na, Arity), + functor(NT, Na, Arity), + assert(meld_topdown:extensional(NT, Na, Arity)), + type_declaration(T, Program). type_declaration(logical_neighbor(T), Program) :- !, type_declaration(T, Program). type_declaration(T, _) :- @@ -58,8 +65,10 @@ type_declaration(T, Program) :- check_aggregate(Args, 1, NewArgs, Aggregation, Arg), !, NT =.. [P|NewArgs], + meld_top_down_aggregate(T, Aggregation, Arg), assert_type(NT, Program, aggregation(Aggregation, Arg)). type_declaration(T, Program) :- + meld_top_down_aggregate(T, horn, _), assert_type(T, Program, horn). assert_type(NT, Program, Agg) :- @@ -79,7 +88,8 @@ ground_term(_, []). rule(Head, Body) :- bodytolist(Body, L, []), - compile_goals(L, [], Head). + compile_goals(L, [], Head), + meld_top_down_compile(Head, Body). compile_goals([], _, _). compile_goals([Goal|Goals], Gs, Head) :- diff --git a/packages/meld/meldi.yap b/packages/meld/meldi.yap index fae101f32..17b6b4885 100644 --- a/packages/meld/meldi.yap +++ b/packages/meld/meldi.yap @@ -6,7 +6,9 @@ push/1, first/2, min/3, - max/3 + max/3, + minval/3, + maxval/3 ]). @@ -51,7 +53,7 @@ done. delete(Fact) :- nb_getval(meld_queue, Queue), retract(meld_program:Fact), -nb_queue_enqueue(Queue, deleted(Fact)), + nb_queue_enqueue(Queue, deleted(Fact)), live. pop(Goal) :- @@ -61,12 +63,10 @@ pop(Goal) :- push(Goal) :- clause(meld_program:Goal,_,Ref), !, - writeln(Goal+ref), increase_reference_count(Ref), fail. push(Goal) :- -% format('+~w~n',[Goal]), - writeln(Goal+0), + format('+~w~n',[Goal]), nb_getval(meld_queue, Queue), !, assert(meld_program:Goal), nb_queue_enqueue(Queue, Goal). @@ -124,15 +124,22 @@ deleted(Goal) :- clause(meld_program:Goal,_,Ref), decrease_reference_count(Ref), !, - fail. + force_delete(Goal), + complete_delete(Goal). deleted(Goal) :- % format('-~w~n',[Goal]), + complete_delete(Goal). + +force_delete(Goal) :- + meld_topdown:Goal, !, abolish_all_tables, fail. +force_delete(Goal) :- + abolish_all_tables. + +complete_delete(Goal) :- nb_getval(meld_queue, Queue), !, retract(meld_program:Goal), nb_queue_enqueue(Queue, deleted(Goal)). - - % % first, cleanup cache % @@ -160,9 +167,11 @@ delete_from_first(VGoal,Goal) :- delete_from_max(VGoal,Arg,Goal) :- clause(meld_cache:Goal,_,Ref), + trace, ( - decrease_reference_count(Ref) - -> + decrease_reference_count(Ref), + \+ force_delete(Goal) + ; clause(meld_program:Goal,_,CRef), decrease_reference_count(CRef), fail @@ -175,14 +184,14 @@ new_max(VGoal,Arg,Goal) :- % format('-~w~n',[Goal]), retract(meld_program:Goal), push(deleted(Goal)), - writeln(delete_from_max(VGoal,Arg,Goal)), maxval(Arg, meld_cache:VGoal, VGoal), push(VGoal). delete_from_min(VGoal,Arg,Goal) :- clause(meld_cache:Goal,_,Ref), ( - decrease_reference_count(Ref) + decrease_reference_count(Ref), + \+ force_delete(Goal) -> clause(meld_program:Goal,_,CRef), decrease_reference_count(CRef), @@ -200,6 +209,8 @@ new_min(VGoal,Arg,Goal) :- minval(Arg, meld_cache:VGoal, VGoal), push(VGoal). +:- meta_predicate minval(+,:,-), maxval(+,:,-). + minval(_,_,_) :- nb_setval(min, +inf), nb_setval(min_arg, '$none'), diff --git a/packages/meld/meldtd.yap b/packages/meld/meldtd.yap new file mode 100644 index 000000000..1206d2446 --- /dev/null +++ b/packages/meld/meldtd.yap @@ -0,0 +1,75 @@ + +:- module(meld_topdown, + [ + meld_top_down_compile/2, + meld_top_down_aggregate/3 + ]). + +:- use_module(meldi, + [ + maxval/3, + minval/3 + ]). + +:- dynamic extensional/3, translate/2. + +meld_top_down_aggregate(S0, horn, _) :- + functor(S0,Na,Arg), + table(Na/Arg). +meld_top_down_aggregate(S0, max, Arg) :- + functor(S0, Na, Arg), + functor(S, Na, Arg), + table(Na/Arg), + meld_compiler:freshen(S, Arg, VHead), + VHead =.. [Na|Args], + atom_concat([Na,'__max'], NewName), + NVHead =.. [NewName|Args], + arg(Arg, NVHead, A), + arg(Arg, S, MAX), + assert_static((S :- maxval(A, NVHead, MAX))), + assert(translate(Na,NewName)). +meld_top_down_aggregate(S0, min, Arg) :- + functor(S0, Na, Arg), + functor(S, Na, Arg), + table(Na/Arg), + meld_compiler:freshen(S, Arg, VHead), + VHead =.. [Na|Args], + atom_concat([Na,'__max'], NewName), + NVHead =.. [NewName|Args], + arg(Arg, NVHead, A), + arg(Arg, S, MIN), + assert_static((S :- minval(A, NVHead, MIN))), + assert(translate(Na,NewName)). +meld_top_down_aggregate(S0, first, _) :- + functor(S0, Na, Arg), + functor(S, Na, Arg), + table(Na/Arg), + S =.. [Na|Args], + atom_concat([Na,'__max'], NewName), + NS =.. [NewName|Args], + assert_static((S :- once(NS))), + assert(translate(Na,NewName)). + +meld_top_down_compile(Head, Body) :- + compile_body(Body, NBody), + compile_aggregate(Head, NHead), + assert_static((NHead :- NBody)). + +compile_body((G1,G2), (NG1, NG2)) :- !, + compile_body(G1, NG1), + compile_body(G2, NG2). +compile_body((forall G then B), (forall NG then NB)) :- !, + compile_body(G, NG), + compile_body(B, NB). +compile_body(G, meld_program:G) :- + extensional(G,_,_), !. +compile_body(G, G). + + +compile_aggregate(Head, NewHead) :- + Head =.. [Na|Args], + translate(Na, NewNa), !, + NewHead =.. [NewNa|Args]. +compile_aggregate(Head, Head). + +