2013-04-01 8 views
1

그래서 저는 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)을 풀수 시설 믿지 않아요

답변

0

, 솔루션 Prolog에서 보았을 때 setof 같은 하위 쿼리 기능이 필요합니다.