Почему run * не работает с натуральным номером в core.logic? - PullRequest
3 голосов
/ 20 декабря 2011

Я играю с арифметическим приложением Peano core.logic на GitHub .Когда я пытаюсь

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

Clojure выдает ошибку, однако,

(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))))

Трассировка стека:1019 *

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"]])

1 Ответ

2 голосов
/ 21 декабря 2011

Это похоже на тонкий регресс между core.logic 0.6.5 и 0.6.7.Чтобы выяснить причину проблемы, требуется больше исследований.

Тем временем я переписал функцию-преемник, чтобы использовать conso вместо llist.

Я думаю, что это большеидиоматический код minikanren / core.logic.

s теперь принимает 2 аргумента: число и следующее число.

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

Исправленный код исправляет вашвыпуск.

...