2013-04-01 18 views
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))) 

這似乎給出正確的答案時域侷限於單一數量(解決方案),但如果我延長該域立即停止工作。

在單個成員域中搜索時的結果也包含多次答案。它似乎是由每次遞歸調用引起的,但我不確定爲什麼。

最後,我希望有人可以快速瀏覽一下我的非唯一因素函數。這感覺就像一個閃光點,我想知道是否有人可以提出一個更好的選擇?

感謝您的幫助, 院長

回答

0

我不相信這個難題是CLP(FD)解設施單獨(好像有人在序言更好精通也許能回答這個問題),解決方案我在Prolog中看過需要某種形式的子查詢工具,如setof