2011-12-19 10 views
3

私はcore.logicのPeano算術演算アプリケーションでGitHubに遊んでいます。私はClojureのがエラーを吐くcore.logicのnatural-numberでrun *が動作しないのはなぜですか?

(run* [q] (natural-number one)) 

をしようとすると意図したように、しかし、

(run 1 [q] (natural-number one)) 

(_.0)に成功します。いくつかの実装の詳細はありますか?

編集:

私は、次のコードを実行している:

(ns myns.core 
    (:refer-clojure :exclude [==]) 
    (:use [clojure.core.logic])) 

(defn s [n] 
    "Returns n's succeeding natural number" 
    (llist n [])) 

(def zero 0) 
(def one (s zero)) 
(def two (s one)) 
(def three (s two)) 
(def four (s three)) 
(def five (s four)) 
(def six (s five)) 

(defn natural-number [x] 
    "A relation where x is a natural number" 
    (matche [x] 
      ([zero]) 
      ([(s ?x)] (natural-number ?x)))) 

スタックトレースは次のとおりです。

clojure.core.logic.LVar cannot be cast to clojure.lang.IFn 
    [Thrown class java.lang.ClassCastException] 

0: myns.core$natural_number$fn__177103$_inc__177104$fn__177113$fn__177114$_inc__177115$fn__177116.invoke(core.clj:194) 
1: clojure.core.logic.Substitutions.bind(logic.clj:208) 
2: myns.core$natural_number$fn__177103$_inc__177104$fn__177113$fn__177114$_inc__177115.invoke(core.clj:192) 
3: clojure.core.logic$eval175682$fn__175691$_inc__175692.invoke(logic.clj:808) 
4: clojure.core.logic$eval175682$fn__175683$fn__175684.invoke(logic.clj:813) 
5: clojure.lang.LazySeq.sval(LazySeq.java:42) 
6: clojure.lang.LazySeq.seq(LazySeq.java:67) 
7: clojure.lang.Cons.next(Cons.java:39) 
8: clojure.lang.LazySeq.next(LazySeq.java:92) 
9: clojure.lang.RT.next(RT.java:580) 

project.clj

(defproject myns "1.0.0-SNAPSHOT" 
    :description "FIXME: write description" 
    :dependencies [[org.clojure/clojure "1.3.0"] 
        [org.clojure/core.logic "0.6.7"]]) 
+0

エラーとは何ですか? –

+0

'clojure.core.logic.LVarはclojure.lang.IFn'にキャストできません – Peteris

+0

使用したフレームワークとエラースタックのトレースを含めてください。 –

答えて

2

これはcore.logic 0.6.5と0.6.7の間の微妙な回帰のようです。問題の根本に到達するには、より多くの調査が必要です。

その間にの代わりにconsoを使用するように後継関数を書き直しました。

もっと慣れ親しんだminikanren/core.logicコードだと思います。

sは2つの引数をとります:番号と次の番号。

(run* [q] (s zero one)) 
;=> (_.0) 

revised codeは問題を修正します。

+0

調査のおかげで、リレーショナル定義は実際に動作します。 – Peteris

+0

遅れて申し訳ありませんが、この回帰は現在マスターで修正されています。 – dnolen