Prolog限制列表

时间:2016-12-18 15:47:32

标签: prolog clpfd

我正试图通过Sicstus Prolog使用限制编程。

问题是:我有一组插槽和一组可以使用一个或两个插槽的电视剧。我必须最大化插槽的规格数量。

% slots(SlotID)
slots([17, 18, 24, 58, 59, 109, 184, 185, 202]).

% serie(Name, Cost, Duration, Other restriction)
serie(1, 1000, 60, 1).
serie(2, 1500, 30, 0).
...

如果持续时间为60,则系列需要2个连续的时隙,如果持续时间为30,则系列只需要一个。系列的数量大于插槽,因此无法显示某些系列。

问题是,我需要说持续60分钟的系列必须是连续的,例如在前面的例子中,id为1的系列可以在[17,18]或[58,59]或[184,185]中显示,但我不知道该怎么做。

我使用了global_cardinality(Programation, Values),因此Programation中的域变量的序列号为0或1(如果持续时间为30)和0或2(如果持续时间为60)。这样,id为1的série,如果出现在程序中,则必须有2个插槽。但我想让它成为连续的,但我不知道该怎么做。

这段代码就是我们所拥有的,但它不起作用:

conseqNumber(_, _, 0, _, _).        
conseqNumber(Programation, SlotIndex, SlotsNumber, Size, SerieId):-
        SlotIndex #=< Size, 
        element(SlotIndex, Programation, SerieId2),
        SerieId2 #= SerieId,
        SlotIndexAux #= SlotIndex +1,
        SlotsNumberAux #= SlotsNumber - 1,
        conseqNumber(Programation, SlotIndexAux, SlotsNumberAux, Size, SerieId).    


checkIfConsecutiveAux(Programation, DurationList, Size, SlotIndex, IndexCounter):- 
        element(SlotIndex, Programation, SerieId),
        element(SerieId, DurationList, SerieDuration),
        SlotsNumber #= (SerieDuration / 30) - 1,
        SlotIndexAux #= SlotIndex + 1,
        conseqNumber(Programation, SlotIndexAux, SlotsNumber, Size, SerieId),
        IndexCounter #= SlotIndexAux + SlotsNumber. 


checkIfConsecutive(_, _, Size, SlotIndex):- SlotIndex #> Size.
checkIfConsecutive(Programation, DurationList, Size, SlotIndex):- 
        checkIfConsecutiveAux(Programation, DurationList, Size, SlotIndex, IndexCounter),
        checkIfConsecutive(Programation, DurationList, Size, IndexCounter).

抱歉英文不好

0 个答案:

没有答案