그래서 저는 clojure와 core.logic을 가르치려고 노력했으며 sum product 문제 (http://en.wikipedia.org/wiki/Impossible_Puzzle)에 대한 해결책을 구현하려고했습니다.core.logic을 사용하여 sum product riddle을 푸십시오.
지금까지 처음 두 단계를 구현했습니다.
(ns sum-product-problem.core
(:refer-clojure :exclude [==])
(:use clojure.core.logic)
(:require [clojure.core.logic.fd :as fd]))
(def non-unique-factors
(tabled [product]
(fresh [p q x y]
(fd/in p q x y (fd/interval 2 99))
(fd/>= q p)
(fd/* p q product)
(fd/>= y x)
(fd/* x y product)
(fd/distinct [p x]))))
(defn inscruitable-summands [sum x]
(fresh [y product]
(conde
[(fd/> (* 2 x) sum)]
[(fd/in y (fd/interval 2 99))
(fd/+ x y sum)
(fd/* x y product)
(non-unique-factors product)
(inscruitable-summands sum (+ x 1))])))
(defn solution []
(run* [q]
(fd/in q (fd/interval 17 17))
(inscruitable-summands q 2)))
이 도메인은 (솔루션)에 하나의 숫자로 제한 될 때 정답을 제공하지만 확장 할 경우 도메인 즉시 작동을 멈 춥니 것으로 보인다.
단일 구성원 도메인을 검색 할 때 결과에는 답변이 여러 번 포함됩니다. 그것은 inscruitable-summands의 각각의 재귀에 기인 한 것 같습니다. 그러나 나는 왜 그 이유가 확실하지 않습니다.
마지막으로 누군가가 내 고유하지 않은 기능을 빠르게 살펴볼 수 있기를 바랍니다. 그것은 약간의 교묘 한 느낌과 나는 더 나은 대안을 제안 할 수 있는지 궁금해하고 있었나요? 도움을
감사합니다, 딘 나 '
내가 (더 나은 프롤로그에 정통한 사람이 하나를 대답 할 수있을 수 있지만)이 퍼즐 혼자 CLP (FD)을 풀수 시설 믿지 않아요