Ulrich Scholz wrote: > Dear all, > > for the following problem I only can come up with a solution that uses a > non-logical variable. I there a better way? > > Consider I want to find all solutions of a predicate p. At one point, there > is the choice between q and r, i.e. > > p :- q. > p :- r. > >>From studying the problem, I know that r can only have a solution if q had > (at least one) solution itself. In other words, if q fails without ever > succeeding then r will fail, too. > > The only way I see to prevent r from being tried is to set a non-logical > flag if q succeeds and let r fail in case the flag is unset. > > Of course, unsuccessfully trying r is so expensive that preventing it is > worth the effort. If I understand the problem correctly, then you could write p :- \+ \+ q, ( q ; r ). or, equivalently p :- ( \+ q -> false ; q ; r ). Of course, this would only make sense if detecting unsatisfiability of q is cheap. Your non-logical solution is probably best here. Make sure you use a handle-based feature (to ensure reentrancy), e.g. p :- shelf_create(sol(false), Shelf), ( p, shelf_set(Shelf, 1, true) % set solution flag ; shelf_get(Shelf, 1, true), % fail if p has no solution r ). -- JoachimReceived on Sun Sep 12 2010 - 07:52:20 CEST
This archive was generated by hypermail 2.3.0 : Wed Sep 25 2024 - 15:13:20 CEST