How to prevent user_propagator propagated clauses from being ignored #5678
-
I'm currently trying to implement a version of SATPlan with the user propagator. In enforcing the frame axioms (basically, a state variable may only change values between steps if an action that changes the state variable is used at the same step), I propagate clauses corresponding to the related actions being chosen. However, these clauses seem to be ignored/not satisfied. I'm wondering if there's a way around this (or something that I'm doing incorrectly). To elaborate: Assume that I have some set of state variables I model this by creating Boolean constants propagate(1u, &si_at_j_id, z3::mk_or(si_at_prev_step, a1_at_j, a3_at_j)) However, I'll often see that, shortly after this propagation, all of Thank you! |
Beta Was this translation helpful? Give feedback.
Replies: 1 comment 4 replies
-
There could be two ways: You can change the propagator to deal directly with 3 cases:
You may need to re-propagate the clause multiple times in separate branches. It should not be the case that the clause is false in the same backtracking context. That is, you should observe a pop before you get anything that contracts the clause. If you do, I am not sure what is going on without digging into details. It might be possible to re-assert the propagated clause during a callback to pop as well. This interaction is not yet tested. |
Beta Was this translation helpful? Give feedback.
There could be two ways:
You can change the propagator to deal directly with 3 cases:
You may need to re-propagate the clause multiple times in separate branches. It should not be the case that the clause is false in the same backtracking context. That is, you should observe a pop before you get anything that contracts the clause. If you do, I am not sure what is going on without digging into details.
It might be possible to re-assert the propagated clause during a callback to pop as well. This interaction is not yet tested.