5

Sussman の講義http://www.infoq.com/presentations/We-Really-Dont-Know-How-To-Computeを見た後、core.logic と core.match を試してみたいと思いました。私が知っている唯一の例は、私が子供の頃にやっていた制約問題ソルバーです。これは、SICP コースで使用され、講演で言及された例です。

ベイカー、クーパー、フレッチャー、ミラー、スミスは、5 階建ての集合住宅の異なるフロアに住んでいます。ベイカーは最上階に住んでいません。クーパーは最下階に住んでいません。フレッチャーは最上階にも最下階にも住んでいません。ミラーはクーパーより高層階に住んでいます。スミスはフレッチャーの隣の階に住んでいません。フレッチャーはクーパーの隣の階には住んでいません。みんなどこに住んでる?

Rosettacode サイトでこれを見つけました: http://rosettacode.org/wiki/Dinesman%27s_multiple-dwelling_problem#PicoLisp

しかし、それがどのように clojure に変換されるのかはよくわかりません。誰かが core.logic または core.match を使用してこれを解決する例を提供できることを願っています

4

2 に答える 2

3

これがcore.logicの解決策です。利用可能な同じプリミティブがないため、picolisp アルゴリズムと完全に同等ではありませんが、一般的な考え方は同じです。permuteo問題を紹介してくれてありがとう -とを発明するのは楽しかったしbeforeo、 を使う最初の言い訳ができcondaた。 編集condaそこを使用することは恐ろしく間違っていました、そして私はconde今に戻っています。まあ、いつか。

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

(defn rembero [x l out]
  (fresh [head tail]
    (conso head tail l)
    (conde [(== x head) (== out tail)]
           [(fresh [new-out]
              (conso head new-out out)
              (rembero x tail new-out))])))

(defn permuteo [a b]
  (conde [(emptyo a) (emptyo b)]
         [(fresh [head tail b-tail]
            (conso head tail a)
            (rembero head b b-tail)
            (permuteo tail b-tail))]))

(defn beforeo [x y l]
  (fresh [head tail]
    (conso head tail l)
    (conde [(== x head) (fresh [more-tail]
                          (rembero y tail more-tail))]
           [(beforeo x y tail)])))

(defn not-adjacento [x y l]
  (fresh [head tail more]
    (conso head tail l)
    (resto tail more)
    (conde [(== x head) (membero y more)]
           [(== y head) (membero x more)]
           [(not-adjacento x y tail)])))

(run* [tenants]
  (fresh [a b c d e]
    (== [a b c d e] tenants)
    (permuteo tenants '[Cooper Baker Fletcher Miller Smith])
    (!= e 'Baker)
    (!= a 'Cooper)
    (!= a 'Fletcher)
    (!= e 'Fletcher)
    (beforeo 'Cooper 'Miller tenants)
    (not-adjacento 'Smith 'Fletcher tenants)
    (not-adjacento 'Fletcher 'Cooper tenants)))

;; ([Smith Cooper Baker Fletcher Miller])
于 2012-07-01T08:27:14.457 に答える
2

私は自分でLPの旅を始めたばかりです。最初の取り組みは、 http://rooms.jmpup.comで自動生成されたロジックパズルのソルバーであるhttps://github.com/amalloy/doorsです。現在、すべてのパズルに一般的に役立ついくつかの関係が定義されていますが、特定のパズルをプログラムで実際にcore.logicに変換する作業は行っていません。あなたは私が手動で翻訳した1つのパズルを見ることができます-ウェブページのプレゼンテーションcore.logicエンコーディング。おそらくこれにより、core.logicの使用方法がわかりますが、私自身はまだ慣れていないため、不完全な点があるはずです。

編集

picolispソリューションを検討した後、直接否定のサポートがまだ存在しないため、core.logicに直接変換されるとは思いません。

于 2012-06-29T06:11:51.913 に答える