<!--
RSS generated by JIRA (4.4#649-r158309) at Wed Jun 19 05:17:45 CDT 2013

It is possible to restrict the fields that are returned in this document by specifying the 'field' parameter in your request.
For example, to request only the issue key and summary add field=key&field=summary to the URL of your request.
For example:
http://dev.clojure.org/jira/sr/jira.issueviews:searchrequest-xml/temp/SearchRequest.xml?jqlQuery=project+%3D+LOGIC+AND+resolution+%3D+Unresolved+AND+priority+%3D+Minor+ORDER+BY+key+DESC&tempMax=1000&field=key&field=summary
-->
<!-- If you wish to do custom client-side styling of RSS, uncomment this:
<?xml-stylesheet href="http://dev.clojure.org/jira/styles/jiraxml2html.xsl" type="text/xsl"?>
-->
<rss version="0.92">
    <channel>
        <title>Clojure JIRA</title>
        <link>http://dev.clojure.org/jira/secure/IssueNavigator.jspa?reset=true&amp;jqlQuery=project+%3D+LOGIC+AND+resolution+%3D+Unresolved+AND+priority+%3D+Minor+ORDER+BY+key+DESC</link>
        <description>An XML representation of a search request</description>
                <language>en-us</language>
                        <issue start="0" end="12" total="12"/>
                <build-info>
            <version>4.4</version>
            <build-number>649</build-number>
            <build-date>25-07-2011</build-date>
        </build-info>
<item>
            <title>[LOGIC-138] Allow tying multiple noms in one binder</title>
                <link>http://dev.clojure.org/jira/browse/LOGIC-138</link>
                <project id="10020" key="LOGIC">core.logic</project>
                        <description>&lt;p&gt;I think it may be useful to be able to tie multiple noms in one binder, with or without significant order.&lt;/p&gt;

&lt;p&gt;A couple use cases I&apos;ve thought of so far:&lt;/p&gt;

&lt;p&gt;Lambdas in a non-currying language. Here order matters.&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(== (list &apos;fn (ties [x y] (list &apos;+ x y)))
    (list &apos;fn (ties [z w] (list &apos;+ z w)))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;My original use case, free/quantified variables in logical formulas. Order doesn&apos;t matter (note the second body has its noms swapped).&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(== (list &apos;&#8704; (ties #{x y} (list &apos;= (list &apos;+ x y) (list &apos;+ y x))))
    (list &apos;&#8704; (ties #{z w} (list &apos;= (list &apos;+ w z) (list &apos;+ z w)))))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;


&lt;p&gt;I have a draft implementation here: &lt;a href=&quot;https://github.com/tomjack/core.logic/compare/ties&quot;&gt;https://github.com/tomjack/core.logic/compare/ties&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Possible issues with this implementation:&lt;/p&gt;
&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;Is it OK to reextend IWalkTerm to IPersistentSet?&lt;/li&gt;
	&lt;li&gt;Should Tie and Ties present a uniform interface? (e.g. (tie? (ties #{x} x)))&lt;/li&gt;
&lt;/ul&gt;
</description>
                <environment></environment>
            <key id="16224">LOGIC-138</key>
            <summary>Allow tying multiple noms in one binder</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="dnolen">David Nolen</assignee>
                                <reporter username="tomoj">Tom Jack</reporter>
                        <labels>
                        <label>nominal</label>
                    </labels>
                <created>Mon, 10 Jun 2013 15:29:53 -0500</created>
                <updated>Mon, 10 Jun 2013 16:07:23 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="31243" author="dnolen" created="Mon, 10 Jun 2013 15:37:15 -0500"  >&lt;p&gt;I really don&apos;t think the set bit is necessary, the vector syntax is fine. Also avoid needing to bring IWalkTerm back for sets. And yes, tie? should work in either case.&lt;/p&gt;</comment>
                    <comment id="31244" author="tomoj" created="Mon, 10 Jun 2013 15:55:58 -0500"  >&lt;p&gt;Hmm.. should:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(== (list &apos;fn (ties [x y] (list &apos;- x y)))
    (list &apos;fn (ties [z w] (list &apos;- w z)))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I&apos;d think not.&lt;/p&gt;

&lt;p&gt;Do you mean that order should always matter (take out the permutations stuff), or that it should never matter (don&apos;t use ties for cases like the above)?&lt;/p&gt;</comment>
                    <comment id="31245" author="dnolen" created="Mon, 10 Jun 2013 16:07:23 -0500"  >&lt;p&gt;Ah hm, good point. Will think on it some more.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[LOGIC-130] StackOverFlowError when walking over set</title>
                <link>http://dev.clojure.org/jira/browse/LOGIC-130</link>
                <project id="10020" key="LOGIC">core.logic</project>
                        <description>&lt;p&gt;Walking a Clojure set seems to cause a StackOverFlowError:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(run* [?s] (== ?s #{1 2 3}))

(let [s #{1 2 3}] (run* [?s] (== ?s s)))

(run* [?convertedseq ?seq] 
  (== ?seq #{1 2 3})
  (project [?seq]
    (== ?convertedseq (vector ?seq))))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;StackOverflowError 
	clojure.core.logic/walk*/fn--2722 (logic.clj:216)
	clojure.core.logic/eval2927/fn--2928 (logic.clj:956)
	clojure.core.logic.protocols/eval1478/fn--1479/G--1469--1486 (protocols.clj:55)
	clojure.core.logic/walk* (logic.clj:214)
	clojure.core.logic/walk*/fn--2722 (logic.clj:218)
	clojure.core.logic/eval2927/fn--2928 (logic.clj:956)
	clojure.core.logic.protocols/eval1478/fn--1479/G--1469--1486 (protocols.clj:55)
	clojure.core.logic/walk* (logic.clj:214)
	clojure.core.logic/walk*/fn--2722 (logic.clj:218)
	clojure.core.logic/eval2927/fn--2928 (logic.clj:956)
	clojure.core.logic.protocols/eval1478/fn--1479/G--1469--1486 (protocols.clj:55)
	clojure.core.logic/walk* (logic.clj:214)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment>core.logic 0.8.3 &lt;br/&gt;
Clojure 1.5</environment>
            <key id="16146">LOGIC-130</key>
            <summary>StackOverFlowError when walking over set</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="dnolen">David Nolen</assignee>
                                <reporter username="cderoove">Coen De Roover</reporter>
                        <labels>
                    </labels>
                <created>Tue, 16 Apr 2013 16:55:33 -0500</created>
                <updated>Tue, 16 Apr 2013 17:28:27 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30964" author="dnolen" created="Tue, 16 Apr 2013 17:28:27 -0500"  >&lt;p&gt;core.logic no longer supports unification of sets so you&apos;re just seeing an error as result of a complete lack of support. I&apos;m not against supporting basic unification of completely grounded sets, as then we only need to test for equality, but I&apos;m inclined to make the system throw if any logic vars appear in the sets.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[LOGIC-123] Allow unification with sequential in both directions</title>
                <link>http://dev.clojure.org/jira/browse/LOGIC-123</link>
                <project id="10020" key="LOGIC">core.logic</project>
                        <description>&lt;p&gt;Currently I can&apos;t find a way to enable a custom data type to do unification with sequential objects in both direction. You can use IUnifyTerms to make it work in one direction, but it isn&apos;t possible to make it work in the other direction (i.e. when the sequential object is first).&lt;/p&gt;

&lt;p&gt;The problem seemes to be in the following code:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(defn unify-with-sequential* [u v s]
  (cond
    (sequential? v)
    (&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (and (counted? u) (counted? v)
          (not= (count u) (count v)))
      nil
      (loop [u u v v s s]
        (&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (seq u)
          (&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (seq v)
            (&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt;-let [s (unify s (first u) (first v))]
              (recur (next u) (next v) s)
              nil)
            nil)
          (&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (seq v) nil s))))
    
    (lcons? v) (unify-terms v u s)
    :&lt;span class=&quot;code-keyword&quot;&gt;else&lt;/span&gt; nil))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If the final nil could be replaced with a call to a protocol (IUnifyTermsReversed ???IUnifyWithSequential ???) then I believe it would make this extensible.&lt;/p&gt;</description>
                <environment></environment>
            <key id="16104">LOGIC-123</key>
            <summary>Allow unification with sequential in both directions</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="dnolen">David Nolen</assignee>
                                <reporter username="mikera">Mike Anderson</reporter>
                        <labels>
                    </labels>
                <created>Sat, 23 Mar 2013 21:10:33 -0500</created>
                <updated>Tue, 26 Mar 2013 01:07:40 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30807" author="dnolen" created="Sat, 23 Mar 2013 21:53:56 -0500"  >&lt;p&gt;I&apos;m assume it&apos;s undesirable for your datatype to implement ISequential?&lt;/p&gt;</comment>
                    <comment id="30808" author="mikera" created="Sat, 23 Mar 2013 23:06:43 -0500"  >&lt;p&gt;It&apos;s undesirable because an expression can be a leaf node as well:&lt;/p&gt;

&lt;p&gt;(+ 3 X) ;; OK as sequential&lt;br/&gt;
7       ;; definitely not sequential!&lt;/p&gt;

&lt;p&gt;Hence making Expression implement ISequential would be problematic and break all kinds of contracts.....&lt;/p&gt;

&lt;p&gt;Trying to unify the leaf node with a sequential object should fail of course, but that&apos;s logic I need to implement myself (I think??)&lt;/p&gt;</comment>
                    <comment id="30809" author="dnolen" created="Sun, 24 Mar 2013 12:11:50 -0500"  >&lt;p&gt;I&apos;m still not following as there&apos;s some context about your use case that I&apos;m missing. Do you have a concrete core.logic example that you should think should work?&lt;/p&gt;</comment>
                    <comment id="30811" author="mikera" created="Mon, 25 Mar 2013 02:21:15 -0500"  >&lt;p&gt;Sure, here is my test case:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(let [ex1 (ex [+ 1 X])]  ;; an expression containing (+ 1 X) 
  (is (= [(ex X)] (run* [q] (fresh [op p] (== [op p q] ex1)))))  ;; fails
  (is (= [(ex X)] (run* [q] (fresh [op p] (== ex1 [op p q])))))  ;; OK
)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The first case fails (because of unify-with-sequential* returning nil as above). The second case is OK because it goes through my own implementation of IUnifyTerms. I may be wrong, but I don&apos;t think I can make it work without a change in core.logic itself.&lt;/p&gt;</comment>
                    <comment id="30815" author="dnolen" created="Mon, 25 Mar 2013 07:39:21 -0500"  >&lt;p&gt;We used to support unifying in both directions but it made for a large number of protocols that had to be implemented. Recently I&apos;ve been thinking it may be useful to provide coercion protocols, something like ICoerceToSequential. &lt;/p&gt;</comment>
                    <comment id="30820" author="mikera" created="Mon, 25 Mar 2013 19:37:36 -0500"  >&lt;p&gt;I think it is necessary to be able to support unifying in both directions somehow if custom data structures are ever going to be first-class citizens in core.logic?&lt;/p&gt;

&lt;p&gt;I see how you could achieve this with ICoerceToSequential however so that might be a good solution. We do something a bit similar in core.matrix (to handle coercions between different back-end matrix implementations).&lt;/p&gt;</comment>
                    <comment id="30821" author="dnolen" created="Mon, 25 Mar 2013 19:44:48 -0500"  >&lt;p&gt;custom data structures are already first class. Whether we should allow overloading unification of custom types with core Clojure interfaces/protocols/types is another matter entirely. &lt;/p&gt;

&lt;p&gt;And sorry for the confusion. It&apos;s not clear to me why you want sequential to work, from your examples it appears that you have a proper expression type, what advantage is there for you to unify with sequential?&lt;/p&gt;</comment>
                    <comment id="30823" author="mikera" created="Tue, 26 Mar 2013 01:07:40 -0500"  >&lt;p&gt;I think it may be important if you have &quot;sequence-like&quot; data structures that aren&apos;t precisely sequential? but are conceptually equivalent to sequences. My custom Expression type is one example, and for interop reasons things like java.util.ArrayList spring to mind.&lt;/p&gt;

&lt;p&gt;As it happens, I&apos;ve switched back to using regular lists for the moment so the issue isn&apos;t a blocker for me. But it may still be worth thinking about.&lt;/p&gt;

&lt;p&gt;Couple of advantages of doing this kind of unification would appear to be:&lt;br/&gt;
a) notational - you can use regular Clojure lists and vectors for unifying with something sequence-like&lt;br/&gt;
b) efficiency - avoid constructing a new custom object when it isn&apos;t needed (though the cost is probably too trivial to bother about in most cases....)&lt;/p&gt;

&lt;p&gt;Of course, you may decide it is simpler and purer to avoid these complications, which is fine. But it seems a shame to have all the nice extensible protocols, and not quite be able to fully extend the functionality to custom types....&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[LOGIC-87] Decomplect the narrowing of the constraint space from the search order</title>
                <link>http://dev.clojure.org/jira/browse/LOGIC-87</link>
                <project id="10020" key="LOGIC">core.logic</project>
                        <description>&lt;p&gt;From a high-level point of view a constraint solver takes a constraint space, generates a tree of narrowings of the space and runs some search algorithm on the tree. Core.logic complects the generation of this tree and the search algorithm by representing the search space as a lazy stream of the leaves of the tree. By explicitly representing the search tree we get new search algorithms, optional fair conjunction and parallel search via fork-join. &lt;/p&gt;

&lt;p&gt;More detail: &lt;a href=&quot;http://scattered-thoughts.net/blog/2012/12/19/search-trees-and-core-dot-logic/&quot;&gt;http://scattered-thoughts.net/blog/2012/12/19/search-trees-and-core-dot-logic/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Github fork: &lt;a href=&quot;https://github.com/clojure/core.logic/pull/13&quot;&gt;https://github.com/clojure/core.logic/pull/13&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Attached is a cleaned-up patch against d68e3400472c5f745e4c13d64433459e11ba4871&lt;/p&gt;</description>
                <environment></environment>
            <key id="15928">LOGIC-87</key>
            <summary>Decomplect the narrowing of the constraint space from the search order</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="dnolen">David Nolen</assignee>
                                <reporter username="jamii">Jamie Brandon</reporter>
                        <labels>
                    </labels>
                <created>Thu, 27 Dec 2012 15:01:29 -0600</created>
                <updated>Fri, 28 Dec 2012 00:41:40 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30332" author="dnolen" created="Fri, 28 Dec 2012 00:41:40 -0600"  >&lt;p&gt;Thanks! Will try to find some time this weekend to do a thorough review.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11781" name="flexible_search.patch" size="14247" author="jamii" created="Thu, 27 Dec 2012 15:01:29 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10002">Code and Test</customfieldvalue>

                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[LOGIC-86] make `defc` more useful</title>
                <link>http://dev.clojure.org/jira/browse/LOGIC-86</link>
                <project id="10020" key="LOGIC">core.logic</project>
                        <description>&lt;p&gt;As we start adding more constraints it&apos;s becoming clear we really want to have to specify less boiler plate. Instead of:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(defn -treec
  ([x fc cform] (-treec x fc cform nil))
  ([x fc cform _id]
     (reify
       clojure.lang.IFn
       (invoke [&lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; a]
         (let [x (walk a x)]
           (&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (tree-term? x)
             ((composeg
               (constrain-tree x
                 (fn [t a] ((treec t fc cform) a)))
               (remcg &lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt;)) a)
             ((composeg
               (fc x)
               (remcg &lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt;)) a))))
       IConstraintId
       (id [&lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt;] _id)
       IWithConstraintId
       (with-id [&lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; _id]
         (-treec x fc cform _id))
       IConstraintOp
       (rator [_] `treec)
       (rands [_] [x])
       IReifiableConstraint
       (reifyc [_ v r a]
         (let [x (walk* r x)]
           `(treec ~x ~cform)))
       IRelevant
       (-relevant? [_ a] &lt;span class=&quot;code-keyword&quot;&gt;true&lt;/span&gt;)
       IRunnable
       (runnable? [_ a]
         (not (lvar? (walk a x))))
       IConstraintWatchedStores
       (watched-stores [&lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt;] #{::subst}))))

(defn treec [x fc cform]
  (cgoal (-treec x fc cform)))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We should be able to write just:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(defc treec [x fc cform]
  clojure.lang.IFn
  (invoke [&lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; a]
    (let [x (walk a x)]
      (&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (tree-term? x)
        ((composeg
          (constrain-tree x
            (fn [t a] ((treec t fc cform) a)))
          (remcg &lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt;)) a)
        ((composeg
          (fc x)
          (remcg &lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt;)) a))))
  IConstraintRands
  (rands [_] [x])
  IReifiableConstraint
  (reifyc [_ v r a]
    (let [x (walk* r x)]
      `(treec ~x ~cform))))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;`defc` should intelligently fill in the details.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15926">LOGIC-86</key>
            <summary>make `defc` more useful</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="dnolen">David Nolen</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Wed, 26 Dec 2012 17:27:08 -0600</created>
                <updated>Sun, 17 Mar 2013 18:30:51 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[LOGIC-70] support for defaults in the simple unifier</title>
                <link>http://dev.clojure.org/jira/browse/LOGIC-70</link>
                <project id="10020" key="LOGIC">core.logic</project>
                        <description>&lt;p&gt;There should be a way to specify a logic var with default values. If it is not unified with something it should unify with the default provided value.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15836">LOGIC-70</key>
            <summary>support for defaults in the simple unifier</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="dnolen">David Nolen</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Mon, 19 Nov 2012 15:19:38 -0600</created>
                <updated>Sun, 17 Mar 2013 18:49:10 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[LOGIC-48] fd/in should provide a default domain if none specified</title>
                <link>http://dev.clojure.org/jira/browse/LOGIC-48</link>
                <project id="10020" key="LOGIC">core.logic</project>
                        <description>&lt;p&gt;This domain should probably be (interval 0 Long/MAX_VALUE). In order for this to work this means we should probably accept passing in the vars to assigned domains as a seqable. It would be easy to accept the current way and this new way since if the first arg is not a symbol then the new behavior is being requested.&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(fd/in [x y])
(fd/in [x y z] (interval 0 10))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment></environment>
            <key id="15656">LOGIC-48</key>
            <summary>fd/in should provide a default domain if none specified</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="dnolen">David Nolen</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Thu, 30 Aug 2012 11:35:50 -0500</created>
                <updated>Fri, 17 May 2013 00:57:46 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[LOGIC-44] ex* could expand macros in patterns</title>
                <link>http://dev.clojure.org/jira/browse/LOGIC-44</link>
                <project id="10020" key="LOGIC">core.logic</project>
                        <description>&lt;p&gt;So, tagged data structures are probably interesting in a relational context. Say you have a relation with some default logic about dogs:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(defna friendlyo [Dog-Or-Breed]
    ([:Spot] succeed)
    ([:Spike] fail)
    ([Other-Dog] (fresh [Breed] (dog-breed Other-Dog Breed) (friendlyo Breed)))
    ([(breed :miniature-dachshund)] fail)
    ([(breed :golden-retriever)] succeed)
    ;. . .)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Assume there&apos;s a (defmacro breed &lt;span class=&quot;error&quot;&gt;&amp;#91;t&amp;#93;&lt;/span&gt; `&lt;span class=&quot;error&quot;&gt;&amp;#91;:breed ~t&amp;#93;&lt;/span&gt;).&lt;/p&gt;

&lt;p&gt;That&apos;s nicer than having to drop &lt;span class=&quot;error&quot;&gt;&amp;#91;:breed :golden-retriever&amp;#93;&lt;/span&gt; in there or whatever, since it&apos;s compile-time-checkable, less error-prone, reduces duplication, etc.&lt;/p&gt;

&lt;p&gt;This little patch makes ex* expand macros in patterns so it doesn&apos;t treat e.g. (breed :golden-retriever) as introducing a new LVar called &quot;breed&quot;. Test also provided.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15582">LOGIC-44</key>
            <summary>ex* could expand macros in patterns</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="dnolen">David Nolen</assignee>
                                <reporter username="joeosborn">Joe Osborn</reporter>
                        <labels>
                        <label>enhancement</label>
                        <label>patch</label>
                        <label>test</label>
                    </labels>
                <created>Thu, 19 Jul 2012 16:32:01 -0500</created>
                <updated>Sun, 17 Mar 2013 19:05:17 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28996" author="dnolen" created="Thu, 19 Jul 2012 16:41:30 -0500"  >&lt;p&gt;I&apos;m surprised that this doesn&apos;t already work. We have support for unifying expressions in the pattern already. Look at line 1230 in tests.clj in the master branch.&lt;/p&gt;

&lt;p&gt;So this should just work, no need to explicitly support macros as far as I can tell. If it&apos;s not working, then there&apos;s a bug.&lt;/p&gt;</comment>
                    <comment id="28997" author="joeosborn" created="Thu, 19 Jul 2012 17:18:48 -0500"  >&lt;p&gt;At least on 0.7.5, matching against a macro gives a runtime error:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;Exception in thread &lt;span class=&quot;code-quote&quot;&gt;&quot;main&quot;&lt;/span&gt; java.lang.ClassCastException: clojure.core.logic.LVar cannot be &lt;span class=&quot;code-keyword&quot;&gt;cast&lt;/span&gt; to clojure.lang.IFn
	at rl.core$glyph_$fn__123$fn__144$fn__165$fn__166$_inc__167$fn__168.invoke(core.clj:61)
	at clojure.core.logic.Substitutions.bind(logic.clj:211)
	at rl.core$glyph_$fn__123$fn__144$fn__165$fn__166$_inc__167.invoke(core.clj:58)
	at clojure.core.logic$fn__1056$_inc__1057.invoke(logic.clj:1160)
	at clojure.core.logic$fn__1056$_inc__1057.invoke(logic.clj:1160)
	at clojure.core.logic$fn__898$_inc__899.invoke(logic.clj:823)
	at clojure.core.logic$fn__890$fn__891.invoke(logic.clj:828)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Using a fn instead of a macro gives the same:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;Exception in thread &lt;span class=&quot;code-quote&quot;&gt;&quot;main&quot;&lt;/span&gt; java.lang.ClassCastException: clojure.core.logic.LVar cannot be &lt;span class=&quot;code-keyword&quot;&gt;cast&lt;/span&gt; to clojure.lang.IFn
	at rl.core$drawable_$fn__235$fn__248$fn__249$_inc__250$fn__251.invoke(core.clj:67)
	at clojure.core.logic.Substitutions.bind(logic.clj:211)
	at rl.core$drawable_$fn__235$fn__248$fn__249$_inc__250.invoke(core.clj:65)
	at clojure.core.logic$fn__1056$_inc__1057.invoke(logic.clj:1160)
	at clojure.core.logic$fn__894$_inc__895.invoke(logic.clj:826)
	at clojure.core.logic$fn__1056$_inc__1057.invoke(logic.clj:1160)
	at clojure.core.logic$fn__898$_inc__899.invoke(logic.clj:823)
	at clojure.core.logic$fn__898$_inc__899.invoke(logic.clj:823)
	at clojure.core.logic$fn__898$_inc__899.invoke(logic.clj:823)
	at clojure.core.logic$fn__890$fn__891.invoke(logic.clj:828)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here&apos;s (glyph-) for reference (don&apos;t mind all the extra [], I have a weird key/value thing because of some conveniences for maintaining fact identity in a temporal database):&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(defna glyph- [Key Val]
	([[Thing] [Glyph]] (thing- [Thing]) (on-fire_ *turn* [Thing]) (== Glyph \&#948;))
	([[Thing] [Glyph]] (thing- [Thing]) (fresh [Type] (type- [Thing] [Type]) (glyph- [Type] [Glyph])))
	([[(type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; :player)] [Glyph]] (== Glyph \@))
	([[(type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; :dragon)] [Glyph]] (== Glyph \D))
	([[Type] [Glyph]] (== Glyph \?)))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;and type-enum as a macro:&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(defmacro type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; [v] `[:&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; :type ~v])&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;and as a fn:&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(defn type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; [v] [:&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; :type ~v])&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I&apos;ll mess around and see if my example works in HEAD.&lt;/p&gt;</comment>
                    <comment id="28998" author="joeosborn" created="Thu, 19 Jul 2012 17:37:36 -0500"  >&lt;p&gt;Same exception with this test case in HEAD (sorry for all the facts):&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(defrel thing- [Thing])
(defrel type- [Thing] [Type])
(fact thing- [0])
(fact thing- [1])
(fact thing- [2])
(fact type- [0] [:player])
(fact type- [1] [:dragon])
(fact type- [2] [:pig])
(defn type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; [t] [:type t])
(defna drawable- [Key]
  ([[Thing]] (thing- [Thing]) (fresh [Type] (type- [Thing] [Type]) (drawable- [Type])))
  ([[(type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; :player)]] succeed)
  ([[(type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; :dragon)]] succeed))

(deftest &lt;span class=&quot;code-keyword&quot;&gt;do&lt;/span&gt;-fns-work
	(is (= (run* [q] (drawable- [q])) &apos;(0 1))))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now that I look at it, I may be expecting a wrong-format return value, but the point is that I don&apos;t even get that far.&lt;/p&gt;

&lt;p&gt;Using the REPL, I checked out how (defna drawable- . . .) expands (tidied up slightly):&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(def drawable- (clojure.core/fn ([Key] 
  (clojure.core.logic/conda 
	  ((clojure.core.logic/fresh [Thing] (clojure.core.logic/== [Thing] Key) (thing- [Thing]) (fresh [Type] (type- [Thing] [Type]) (drawable- [Type])))) 
		((clojure.core.logic/fresh [type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt;] 
		  (clojure.core.logic/== [(type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; :player)] Key) succeed))
		((clojure.core.logic/fresh [type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt;] 
		  (clojure.core.logic/== [(type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; :dragon)] Key) succeed))))))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note the (clojure.core.logic/fresh &lt;span class=&quot;error&quot;&gt;&amp;#91;type-enum&amp;#93;&lt;/span&gt; . . .) forms, which are exactly what I would not want to see in this case.&lt;/p&gt;

&lt;p&gt;I&apos;m not really sure why this doesn&apos;t work here yet works for the matche test case.&lt;/p&gt;</comment>
                    <comment id="28999" author="dnolen" created="Thu, 19 Jul 2012 17:47:23 -0500"  >&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;[(type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; :dragon)]&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This pattern make it seem like you want to match:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;[[:type :dragon]]&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note extra level of brackets here. Is this the case?&lt;/p&gt;

&lt;p&gt;Even so I agree that the expansion doesn&apos;t look quite right. We should never descend into a seq form like that.&lt;/p&gt;</comment>
                    <comment id="29001" author="joeosborn" created="Thu, 19 Jul 2012 17:57:03 -0500"  >&lt;p&gt;Yes, that&apos;s exactly the desired outcome in this case--a tagged value in my naive interpretation. Is the reason it fails whereas the test on :1230 doesn&apos;t the fact that it&apos;s producing a vector and not a list? Changing the fn to return a list instead of a vector didn&apos;t seem to help.&lt;/p&gt;

&lt;p&gt;My patch, fwiw, doesn&apos;t exhibit that behavior (at least for macros, haven&apos;t tested it with fns).&lt;/p&gt;</comment>
                    <comment id="29002" author="dnolen" created="Thu, 19 Jul 2012 21:11:27 -0500"  >&lt;p&gt;What I mean is don&apos;t you want the following instead?&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(defna drawable- [Key]
  ([[Thing]] (thing- [Thing]) (fresh [Type] (type- [Thing] [Type]) (drawable- [Type])))
  ([(type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; :player)] succeed)
  ([(type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; :dragon)] succeed))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note that I removed a layer of square brackets.&lt;/p&gt;</comment>
                    <comment id="29005" author="joeosborn" created="Fri, 20 Jul 2012 10:28:39 -0500"  >&lt;p&gt;Nope! I actually want both. I&apos;m doing some temporal logic stuff and I wanted some conveniences for &quot;updating&quot; a fluent, so I wanted to distinguish between the &quot;key part&quot; and the &quot;value part&quot; of the arguments. It looks silly for facts with no &quot;value part&quot;, but it lets me write procedures and fns something like this:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(defrel heldo Time Fluent)
(defrel &#172;heldo Time Fluent)
(declare fluent-obtainedo) ; most recent &apos;held&apos; not terminated by a &apos;&#172;held&apos;, or fail
(defn alter-fluent [Time Rel Key NewVal]
  ;todo: error check, ensure old != &lt;span class=&quot;code-keyword&quot;&gt;new&lt;/span&gt;, old obtains, &lt;span class=&quot;code-keyword&quot;&gt;new&lt;/span&gt; does not obtain
  (doseq [old-val (run* [old-val] (fluent-obtainedo Time [Rel Key old-val]))]
    (fact &#172;heldo Time [Rel Key old-val]))
  (fact heldo Time [Rel Key NewVal]))
. . .
(fact heldo 0 [&apos;pos [0] [0 0]])
. . .
(alter-fluent 1 &apos;pos [0] [1 1])&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And I write all the non-temporal fluents that way too for consistency and to help prevent mistakes.&lt;/p&gt;</comment>
                    <comment id="29009" author="dnolen" created="Fri, 20 Jul 2012 14:58:13 -0500"  >&lt;p&gt;I&apos;ll try to give a closer look at this issue over the weekend.&lt;/p&gt;</comment>
                    <comment id="30787" author="dnolen" created="Sun, 17 Mar 2013 19:05:17 -0500"  >&lt;p&gt;We&apos;re thinking about a more general solution here: &lt;a href=&quot;http://github.com/clojure/core.logic/wiki/Better-syntax-support&quot;&gt;http://github.com/clojure/core.logic/wiki/Better-syntax-support&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11389" name="exstar-macros.patch" size="1931" author="joeosborn" created="Thu, 19 Jul 2012 16:32:01 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10002">Code and Test</customfieldvalue>

                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[LOGIC-43] LVar should print readably</title>
                <link>http://dev.clojure.org/jira/browse/LOGIC-43</link>
                <project id="10020" key="LOGIC">core.logic</project>
                        <description>&lt;p&gt;Currently LVar objects print the same as symbols; they should either print as an unreadable form, or in a way that the reader can read them back in and get an LVar. Attached patch causes them to be read in as LVars.&lt;/p&gt;

&lt;p&gt;However, (read-string (pr-str lv)) does not compare as equal to lv, because the implementation of .equals relies on their string :name objects being identical? - which they will not be, if one LVar was created by the lvar function, which uses str, and the other created by read-string, which uses String/intern.&lt;/p&gt;

&lt;p&gt;It seems plausible to say that LVars can&apos;t be compared for equality after sending them through strings, but that&apos;s awkward and unpleasant. We could instead define LVars to compare their names with = rather than with identical?, but David expressed concern about the performance implications of that change.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15571">LOGIC-43</key>
            <summary>LVar should print readably</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="dnolen">David Nolen</assignee>
                                <reporter username="amalloy">Alan Malloy</reporter>
                        <labels>
                    </labels>
                <created>Thu, 5 Jul 2012 20:20:40 -0500</created>
                <updated>Thu, 5 Jul 2012 20:20:40 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                    <attachment id="11369" name="0001-Make-lvar-print-readably.patch" size="992" author="amalloy" created="Thu, 5 Jul 2012 20:20:40 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[LOGIC-35] Core.logic equivalent of multimethods</title>
                <link>http://dev.clojure.org/jira/browse/LOGIC-35</link>
                <project id="10020" key="LOGIC">core.logic</project>
                        <description>&lt;p&gt;I need to define predicates to which I can later (and from other namespaces) attach further clauses (so not just facts). I couldn&apos;t find any such functionality in the source. Due to the extensive use of macros, hacking such a system onto core.logic from the outside is extremely difficult, if not impossible (to me at least).&lt;/p&gt;

&lt;p&gt;I&apos;d love to implement this myself too, if given an OK and rough direction.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15314">LOGIC-35</key>
            <summary>Core.logic equivalent of multimethods</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="dnolen">David Nolen</assignee>
                                <reporter username="werg">Gabriel Pickard</reporter>
                        <labels>
                        <label>enhancement</label>
                    </labels>
                <created>Mon, 2 Apr 2012 19:32:56 -0500</created>
                <updated>Fri, 28 Dec 2012 00:48:09 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28068" author="werg" created="Tue, 3 Apr 2012 18:27:45 -0500"  >&lt;p&gt;I actually did manage to tack on a prototype that covers the basic behavior I would like to see: &lt;a href=&quot;https://github.com/werg/herpderp/blob/master/src/herpderp/multo.clj&quot;&gt;https://github.com/werg/herpderp/blob/master/src/herpderp/multo.clj&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I use a set stored in a ref in the defne&apos;s metadata to manage dynamic changes to the clauses. Upon changing that set using defclause I use eval to re-define the var using defne.&lt;/p&gt;

&lt;p&gt;This might not be nice, but allows me to continue developing features against it.&lt;/p&gt;</comment>
                    <comment id="30334" author="dnolen" created="Fri, 28 Dec 2012 00:48:02 -0600"  >&lt;p&gt;I don&apos;t think the current implementation can really support this and I don&apos;t think it&apos;s wise to try to hack around the current implementation. I&apos;d be willing to consider a comprehensive solution if someone is willing to do the legwork.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[LOGIC-28] defrel cannot be called inside function</title>
                <link>http://dev.clojure.org/jira/browse/LOGIC-28</link>
                <project id="10020" key="LOGIC">core.logic</project>
                        <description></description>
                <environment></environment>
            <key id="15224">LOGIC-28</key>
            <summary>defrel cannot be called inside function</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="dnolen">David Nolen</assignee>
                                <reporter username="jasonjckn">Jason Jackson</reporter>
                        <labels>
                    </labels>
                <created>Wed, 15 Feb 2012 15:20:17 -0600</created>
                <updated>Sun, 17 Mar 2013 18:55:08 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="27779" author="dnolen" created="Mon, 20 Feb 2012 14:15:21 -0600"  >&lt;p&gt;Can you reformat the patch w/ git so it has the proper attribution information? Thanks!&lt;/p&gt;</comment>
                    <comment id="28490" author="jasonjckn" created="Sun, 13 May 2012 10:06:40 -0500"  >&lt;p&gt;New patch with attribution info. Sorry about super long turn around time, in the future I should be much faster. &lt;/p&gt;</comment>
                    <comment id="29504" author="martintrojer" created="Thu, 20 Sep 2012 03:32:40 -0500"  >&lt;p&gt;This patch solved the exact same problem for me aswell.&lt;/p&gt;

&lt;p&gt;Cheers...&lt;/p&gt;</comment>
                    <comment id="29505" author="dnolen" created="Thu, 20 Sep 2012 10:57:07 -0500"  >&lt;p&gt;I&apos;ve yet to hear a good rationale for this patch. defrel has the same semantics as def and should only exist at the top level. If someone puts more though into what defining a rel dynamically should look like I will consider it.&lt;/p&gt;</comment>
                    <comment id="29507" author="jasonjckn" created="Thu, 20 Sep 2012 14:02:02 -0500"  >&lt;p&gt;I only implemented this so I could delete relation state. There&apos;s probably a better way to do this though. &lt;/p&gt;</comment>
                    <comment id="29508" author="martintrojer" created="Fri, 21 Sep 2012 02:47:35 -0500"  >&lt;p&gt;Indeed, a make-rel function would be optimal, then you can def it (or store it somewhere else) at your leisure.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11212" name="0001-allow-defrel-to-be-called-from-within-a-function-if-.patch" size="2575" author="jasonjckn" created="Sun, 13 May 2012 10:06:40 -0500" />
                    <attachment id="10912" name="patch-defrel" size="1521" author="jasonjckn" created="Wed, 15 Feb 2012 15:20:17 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[LOGIC-26] Generate a better error when adding facts for arities that do not exist</title>
                <link>http://dev.clojure.org/jira/browse/LOGIC-26</link>
                <project id="10020" key="LOGIC">core.logic</project>
                        <description></description>
                <environment></environment>
            <key id="15146">LOGIC-26</key>
            <summary>Generate a better error when adding facts for arities that do not exist</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="dnolen">David Nolen</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Mon, 23 Jan 2012 22:33:16 -0600</created>
                <updated>Sun, 17 Mar 2013 18:54:33 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>
</channel>
</rss>