2009/2/16 Kish Shen <kisshen_at_...5...>: > Wit Jakuczun wrote: > >> But I would love to have other features: >> - initial call of a propagator (could result in suspending). This would be >> especially useful for propagators based on demons. > > As propagators are normal ECLiPSe goals, you can simply write your > propagator such that it is executed once before suspension, something like: > > propagator(...) :- > do_propagation(....), > suspend(do_propagation(....)...). > The code looks like that: propagator(Vars, state(State0)) :- update_state(Vars, State0, State1), ( ground(Vars) -> check_solution(Vars) ; do_propagate(Vars, State1), suspend(propagator(Vars, state(State1), Susp), 3, Vars->inst, Susp)). propagator(Vars, State, Susp) :- State = state(State0), update_state(Vars, State0, State1), ( ground(Vars) -> kill_suspension(Susp), check_solution(Vars) ; do_propagate(Vars, State1), setarg(1, State, State1)). update_state/3 must be called as there can be more that one variable instantiated comparing to previous call of a propagator. This is due to priorities! Now, propagator/2 is called and if there is a need for suspension a propagator/3 (demon) is suspended. If there were guarantee that propagators are called for each variable change separately then I could do as you proposed. I hope I clarified the issue. Best regards -- [ Wit Jakuczun w.jakuczun_at_...116... ] [ WLOG Solutions http://wlogsolutions.com ]Received on Mon Feb 16 2009 - 14:40:40 CET
This archive was generated by hypermail 2.3.0 : Wed Sep 25 2024 - 15:13:20 CEST