Clojure 用core.logic解和积之谜
所以我一直在努力自学clojure和core.logic,并决定尝试实现一个求和积问题的解决方案() 到目前为止,我已经实现了前两个步骤Clojure 用core.logic解和积之谜,clojure,prolog,clojure-core.logic,minikanren,Clojure,Prolog,Clojure Core.logic,Minikanren,所以我一直在努力自学clojure和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]
(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)))
当域被限制为(解决方案)中的单个数字时,这似乎给出了正确的答案,但如果我扩展该域,它将立即停止工作
在单个成员域上搜索时的结果也多次包含答案。这似乎是由不可理解的求和数的每次递归引起的,但我不确定为什么
最后,我希望有人能快速查看我的非唯一因子函数。这感觉有点像个预兆,我想知道是否有人能提出更好的替代方案
谢谢你的帮助,
Dean我不认为仅使用CLP(FD)工具就可以解决这个难题(尽管精通Prolog的人可能能够回答这个问题),我在Prolog中看到的解决方案需要某种形式的子查询工具,如
setof