[m-dev.] Solvers, negation, existential quantification, and so forth
Ralph Becket
rafe at cs.mu.OZ.AU
Tue Jun 6 17:18:01 AEST 2006
Mark Brown, Tuesday, 6 June 2006:
> On 05-Jun-2006, Ralph Becket <rafe at cs.mu.OZ.AU> wrote:
> >
>
> Reviewing what has been said in the thread so far, it seems (correct me
> if I'm wrong) you are proposing that we can ensure all variables get
> labelled by:
>
> 1) Having each solver keep a reference to every variable it has
> ever created (possibly indexed by some kind of "solver id").
>
> 2) Having each solver provide an impure labelling procedure
> that doesn't take a list of variables, but instead labels _all_
> variables the solver has kept track of (or all variables
> associated with a particular solver id).
>
> 3) Requiring the user to promise that they have called this
> procedure, or labelled all the variables in some other way.
>
> Is this a fair summary?
Absolutely.
> promise_some [Y] (
> X < Y,
> Y < Z
> ).
>
> The promise here can be read literally: the user is promising that there
> exists a value for Y that is consistent with the constraint store. In this
> case, the fact that a promise is required is a Good Thing, since the
> reasoning required to prove completeness is non-trivial, and centers around
> this exact point in the code.
>
> Let me reiterate the point:
>
> - the problem with this example is that the existential
> quantification cannot be shown to be safe,
>
> - this is exactly the place where a promise is required, and
>
> - the promise itself has a direct literal meaning.
I follow what you are (and have been) saying. It's very attractive.
But...
> Consider now the following example (which comes from an already existing
> test case we have for the finite domain solver).
>
> impure Is = n_new_fdvars(3, 1, 3),
> impure Xs = n_new_fdvars(3, 1, 3),
> impure Vs = n_new_fdvars(3, 1, 3),
> Is = [I1, I2, I3],
> Vs = [V1, V2, V3],
> element_var(I1, Xs, V1),
> element_var(I2, Xs, V2),
> element_var(I3, Xs, V3),
> all_different(Xs),
> all_different(Vs),
> Ls = append(Is, Vs)
> impure labeling(Ls)
>
> The groundness information for the various calls is:
>
> As = n_new_fdvars(_, _, _) true
> element_var(I, Xs, V) (Xs /\ I -> V), (Xs /\ V -> I)
> all_different(As) true
> labeling(Ls) true -> Ls
> Ls = append(Is, Vs) Ls <-> Is /\ Vs
>
> (Here "true" means no information: none of the arguments are definitely
> ground.)
>
> Groundness analysis will determine that Is and Vs become ground, but can't
> show that Xs does. Xs does in fact become ground, but showing this requires
> non-trivial reasoning (and, in particular, requires knowledge of the
> semantics of element_var and all_different). Again, an explicit
> `promise_some [Xs]' will be required, and again it is a Good Thing, IMHO.
Agreed. Now consider the following situation:
some [Z] (
add_clause([..., Z]),
add_clause([..., Z]),
add_clause([..., Z])
)
For very good efficiency reasons I do not want to label Z at the end of
its scope. Labelling the ... variables will not cause Z to be labelled
either (i.e., there's no groundness propagation here). I can't use
promise_some [Z] here because there may be *no* solution for Z (i.e.,
adding these constraints may, in some circumstances, make the
constraint store unsatisfiable).
As far as I can see, the SAT solver will have to remember that Z was
introduced and check that it has a consistent labelling when the user
finally calls the impure sat_label_everything consistency checking
predicate.
-- Ralph
--------------------------------------------------------------------------
mercury-developers mailing list
Post messages to: mercury-developers at cs.mu.oz.au
Administrative Queries: owner-mercury-developers at cs.mu.oz.au
Subscriptions: mercury-developers-request at cs.mu.oz.au
--------------------------------------------------------------------------
More information about the developers
mailing list