5

私はしばらく clojure を使用してきましたが、core.logic から始めたばかりです。

のようなドメインが与えられた場合、 のような1 2 3 42 つのベクトルのベクトルを取得したいと考えています([[1 2] [3 4]])

注: これは、私が実際にやろうとしていることの単純化されたバージョンです。:) 参照: https://github.com/adamhoward/lineup

Web で not-membero の定義を見つけました。

(defne not-membero [x l]
  ([_ []])
  ([_ [?y . ?r]]
    (!= x ?y)
    (not-membero x ?r)))

そして、私はそれを次のように使用しようとしています:

(run 1 [q]
     (fresh [w x
             y z]
            (== q [[w x]
                   [y z]])
            (infd w x y z (domain 1 2 3 4))
            (everyg distinctfd [[w x] [y z]])
            (everyg #(not-membero % [y z]) [w x])))

これを Emacs で実行すると、Evaluation aborted.メッセージが表示されます。

切り替えようとすると、元に戻ります。これは私memberoにとって理にかなっています。最初のベクトルのすべての要素は、2 番目のベクトルのメンバーです。not-membero([[1 2] [1 2]])[w x][y z]

でも、電話しrun 2たら返ってき([[1 2] [1 2]] [[1 2] [1 3]])ます。[[1 2] [1 3]]上記のルールに対してどのように正しいのかわかりません。私はeveryg正しく理解していませんか?ガイダンス (rtfmanual、rtfbook、rtfdissertation を含む) をいただければ幸いです。

ありがとう。

編集:これを解決した可能性があります。

奇妙な結果についてはまだわかりませんがmembero、目標の代わりにこれを実行できることがわかりました:not-membero

(everyg #(distinctfd (conj [y z] %)) [w x])

[w x]conj'd toの各要素に[y z]は、すべての個別の値が含まれます。これは not-membero よりも効率が悪いかもしれないので、私はまだ助けを求めています。

4

1 に答える 1

1

あなたの例はこれと同じことをしているようです:

(run* [q]
  (fresh [w x y z]
    (fd/in w x y z (fd/domain 1 2 3 4))
    (== q [[w x] [y z]])
    (fd/distinct [w x y z])))

しかし、サッカーの問題を見て...

(ns test
  (:refer-clojure :exclude [==])
  (:use clojure.core.logic)
  (require [clojure.core.logic.fd :as fd]))

(defn game [g] (fresh [a b c d e] (== g [a b c d e])))

(def players (range 1 11))

(defne not-membero [x l]
  ([_ []])
  ([_ [?y . ?r]]
    (!= x ?y)
    (not-membero x ?r)))

(defne plays [player games]
  ([_ []])
  ([_ [?f ?s . ?r]]
   (membero player ?f) ; if you play this game
   (not-membero player ?s) ; do not play next game
   (plays player ?r))
  ([_ [?f ?s . ?r]]
   (membero player ?s)
   (not-membero player ?f)
   (plays player ?r)))

(defne goalies [games]
  ([[[_ _ _ _ ?a]
     [_ _ _ _ ?b]
     [_ _ _ _ ?c]
     [_ _ _ _ ?d]]]
    (fd/in ?a ?b ?c ?d (apply fd/domain players))
    (not-membero 1 [?a ?b ?c ?d]) ; star player != goalie
    (fd/distinct [?a ?b ?c ?d]))) ; not goalie twice

(defn -main [& args]
  (run 1 [q]
    (fresh [a b c d]
      (game a)
      (game b)
      (game c)
      (game d)
      (== q [a b c d])
      (goalies q)
      (everyg #(plays % q) players))))
于 2013-01-27T12:41:42.133 に答える