1
所以我一直在試圖教自己clojure和core.logic,並決定嘗試和實施一個解決方案,產品總和問題(http://en.wikipedia.org/wiki/Impossible_Puzzle)。使用core.logic解決總和產品謎題
到目前爲止,我已經實施了前兩個步驟。
(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)))
這似乎給出正確的答案時域侷限於單一數量(解決方案),但如果我延長該域立即停止工作。
在單個成員域中搜索時的結果也包含多次答案。它似乎是由每次遞歸調用引起的,但我不確定爲什麼。
最後,我希望有人可以快速瀏覽一下我的非唯一因素函數。這感覺就像一個閃光點,我想知道是否有人可以提出一個更好的選擇?
感謝您的幫助, 院長