使用core.logic来解决总和产品之谜

时间:2013-04-01 02:01:02

标签: clojure prolog clojure-core.logic minikanren

所以我一直在尝试自学clojure和core.logic,并决定尝试实现和产品问题的解决方案(http://en.wikipedia.org/wiki/Impossible_Puzzle)。

到目前为止,我已实施了前两个步骤。

(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引起的,但我不确定为什么。

最后,我希望有人可以快速浏览一下我的非独特因素功能。感觉有点像一个小屋,我想知道是否有人能提出更好的选择?

感谢您的帮助, 迪安

1 个答案:

答案 0 :(得分:0)

我不相信这个难题可以单独使用CLP(FD)设施解决(尽管精通Prolog的人可能能够回答这个问题),我在Prolog中看到的解决方案需要某种形式的子查询设施,如setof