core.logic

cannot use fresh/conde in the invoke of a constraint

Details

  • Type: Defect Defect
  • Status: Closed Closed
  • Priority: Major Major
  • Resolution: Completed
  • Affects Version/s: None
  • Fix Version/s: None
  • Component/s: None
  • Labels:
    None

Description

This means that we cannot really emulate modes with constraints. The problem is related to -inc.

An easy way to try it out is to have a dummy fresh goal in predc and see the failing tests.

@@ -2932,7 +2932,7 @@
        (invoke [this a]
          (let [x (walk a x)]
            (when (p x)
-             ((remcg this) a))))
+             (bind* a (fresh [y] (== x x)) (remcg this)))))
        IConstraintOp
        (rator [_] (if (seq? pform)
                     `(predc ~pform)

Activity

Nada Amin made changes -
Field Original Value New Value
Description This means that we cannot really emulate modes with constraints. The problem is related to -inc.

An easy way to try it out is to have a dummy fresh goal in predc and see the failing tests.

@@ -2932,7 +2932,7 @@
        (invoke [this a]
          (let [x (walk a x)]
            (when (p x)
- ((remcg this) a))))
+ (bind* a (fresh [y] (== x x)) (remcg this)))))
        IConstraintOp
        (rator [_] (if (seq? pform)
                     `(predc ~pform)
This means that we cannot really emulate modes with constraints. The problem is related to -inc.

An easy way to try it out is to have a dummy fresh goal in predc and see the failing tests.

{noformat}
@@ -2932,7 +2932,7 @@
        (invoke [this a]
          (let [x (walk a x)]
            (when (p x)
- ((remcg this) a))))
+ (bind* a (fresh [y] (== x x)) (remcg this)))))
        IConstraintOp
        (rator [_] (if (seq? pform)
                     `(predc ~pform)
{noformat}
Hide
David Nolen added a comment - - edited

Sorry I didn't mean to suggest this approach. In general you cannot put search related operators into a constraint. In fact I think we should replace any instances of bind* and bind in constraint logic as they really are a part of the search infrastructure and I'd like them to become implementation details of a particular search approach.

Instead I meant to suggest that the disjunction expressed by your example

(run 1 [re]
  (forall [s o]
    (conde
      [(== s '(foo bar bar bar))
       (== o regex-BLANK)]
      [(!= s '(foo bar bar bar))
       (== o regex-NULL)])
    (regex-matcho re s o)))

Is perhaps best described as an explicit constraint something more like:

(defn regexc [s o]
  (reify
    IFn
    (invoke [c a]
      (let [s (walk* a)[
        (if (= s '(foo bar bar bar))
          ((== o regex-BLANK) a)
          ((== o regex-NULL) a)))))
    ...
    IRunnable
    (runnable? [c a]
      (ground-terms? x))
    ...))

Of course someone might want to write constraint like this quite often, then I think it's question of what the best way to support that might be.

Show
David Nolen added a comment - - edited Sorry I didn't mean to suggest this approach. In general you cannot put search related operators into a constraint. In fact I think we should replace any instances of bind* and bind in constraint logic as they really are a part of the search infrastructure and I'd like them to become implementation details of a particular search approach. Instead I meant to suggest that the disjunction expressed by your example
(run 1 [re]
  (forall [s o]
    (conde
      [(== s '(foo bar bar bar))
       (== o regex-BLANK)]
      [(!= s '(foo bar bar bar))
       (== o regex-NULL)])
    (regex-matcho re s o)))
Is perhaps best described as an explicit constraint something more like:
(defn regexc [s o]
  (reify
    IFn
    (invoke [c a]
      (let [s (walk* a)[
        (if (= s '(foo bar bar bar))
          ((== o regex-BLANK) a)
          ((== o regex-NULL) a)))))
    ...
    IRunnable
    (runnable? [c a]
      (ground-terms? x))
    ...))
Of course someone might want to write constraint like this quite often, then I think it's question of what the best way to support that might be.
Hide
David Nolen added a comment -

No plans to add support for search operators in constraints in the near future.

Show
David Nolen added a comment - No plans to add support for search operators in constraints in the near future.
David Nolen made changes -
Resolution Completed [ 1 ]
Status Open [ 1 ] Resolved [ 5 ]
David Nolen made changes -
Status Resolved [ 5 ] Closed [ 6 ]

People

Vote (0)
Watch (0)

Dates

  • Created:
    Updated:
    Resolved: