2016-03-02 6 views
3
solve(Amounts) :- 
    Total = 1505, 
    Prices = [215, 275, 335, 355, 420, 580], 

    length(Prices, N), 
    length(Amounts, N), 
    Amounts :: 0..Total//min(Prices), 
    Amounts * Prices #= Total, 

    labeling(Amounts). 
+2

Это не SWI-Prolog. Предположительно это [tag: eclipse-prolog] – false

+0

Почему вы говорите, что с этим что-то не так? – lurker

ответ

6

В этом нет ничего плохого. Это пример из http://eclipseclp.org/examples/xkcd287.ecl.txt, и если вы не опустили линию

:- lib(ic). 

который загружает interval constraint solver, он будет работать нормально в ECLiPSe Прологе.

+2

(см. Http://xkcd.com/287/) --- ... и 'lib (ic)' - это что, библиотека для целых ограничений? –

+2

'lib (ic)' означает интервальные ограничения. Он реализует ограничения над целыми числами и действиями (представленными как интервалы с плавающей запятой). Я исправлю свой ответ. – jschimpf

+0

спасибо за разъяснение! –

2

ли работать в SWI-Пролог:

?- use_module(library(clpfd)). 
?- [user]. 
solve(Amounts) :- 
    Total = 1505, 
    Prices = [215,275,335,355,420,580], 
    length(Prices, N), 
    length(Amounts, N), 
    min_list(Prices, MinPrice), 
    MaxAmount is Total//MinPrice, 
    Amounts ins 0..MaxAmount, 
    scalar_product(Prices, Amounts, #=, Total), 
    label(Amounts). 
^D 
?- solve(X). 
X = [1, 0, 0, 2, 0, 1] ; 
X = [7, 0, 0, 0, 0, 0]. 

Но я думаю, его не проблему поиска оптимизации,
целевая функция отсутствует.

Bye