2013-03-27 2 views
3

Я пытаюсь понять, почему следующая функция product-pluso возвращает неожиданные результаты. Я нашел ошибку или я не понимаю, как это работает? Я использую core.logic с CLP/FD. Я все еще участвую, поэтому я мог бы сделать это неправильно. Функция должна принимать два фактора, число и сумму. Сумма должна быть произведением факторов плюс число. Он отлично работает, если оба фактора не свежие. Затем я получаю странные результаты. Это происходит с core.logic v0.8.2.Неожиданные результаты с Clojure core.logic (с использованием CLP/FD)

(ns strang-result 
    (:refer-clojure :exclude [==]) 
    (:use 
    clojure.test 
    [clojure.core.logic :exclude [is]]) 
    (:require 
    [clojure.core.logic.fd :as fd])) 

(defn product-pluso [factor1 factor2 number sum] 
    (fd/eq (= sum (+ number (* factor1 factor2))))) 

(run* [x y] 
    (fd/in x y (fd/interval 1 38)) 
    (product-pluso x y 2 40)) 

;=> ([1 38] [2 19] [3 13] [4 10] [5 8] [6 7] [7 6] [8 5] [9 5] [10 4] [11 4] 
; [12 4] [13 3] [14 3] [15 3] [16 3] [17 3] [18 3] [19 2] [38 1]) 
+1

Чтобы уточнить, каждая пара [x y] должна умножаться на 38 (38 + 2 = 40), но многие этого не делают. –

ответ

2

Это просто ошибка. Что-то странное происходит с ограничением fd/+, которое не проверяется. Я один из ведущих разработчиков, я подал билет на это:

http://dev.clojure.org/jira/browse/LOGIC-126

UPDATE: Пожалуйста, попробуйте 0.8.3, проблема была решена, и вы должны увидеть только 4 результаты. Спасибо за отчет.

+0

Ах, я рад, что я не делал что-то неправильно. Благодаря! –

+0

@SteveSloan это хороший улов, и я очень удивлен, что он не появился раньше. Попробуем посмотреть на него в выходные и вытащить 0.8.3 с исправлением. – dnolen

+0

Отлично работает, спасибо. –

0

Вы можете решить проблему с помощью project, без project, кажется, как-то ORing в Сдерживает, а затем их операция AND.

(defn product-pluso [factor1 factor2 number sum] 
    (fresh [product] 
     (fd/+ product number sum) 
     (project [product] 
        (fd/* factor1 factor2 product)))) 
Смежные вопросы