2013-07-21 3 views
2

Я хочу реализовать очень простой автомат, который ограничивает число последовательных 1s в списке единиц и нулей (например, [0,1,1,0,1,1,1]).Как использовать clpfd: automaton для ограничения значения счетчика в SICStus Prolog?

Мой автомат выглядит следующим образом:

% 'Day' is a list of clpfd variables 
% 'Allowed' is an integer 
% 
% consecutiveOnes(+Day, +Allowed) 
consecutiveOnes(Day, Allowed) :- 

    automaton(Day, _, Day, 
     [source(n)], 
     [ 
     arc(n, 0, n, [0] ), 
     arc(n, 1, n, [C+1]) 
     ], 
     [C], 
     [0], 
     [_N] 
    ). 



% example 1: 
% consecutiveOnes([0,0,0,1,1,1], 2) -> there are three consecutive 1s and we allow only 2 -> Fail. 

% example 2: 
% consecutiveOnes([0,1,1,1,0,0], 2) -> there are three consecutive 1s and we allow only 2 -> Fail. 


% example 3: 
% consecutiveOnes([0,1,1,0,0,0], 2) -> there are only two consecutive 1s and we allow 2 -> OK 

Как я могу добавить ограничение для счетчика C с указанием C <= Allowed в код Пролога выше?

ответ

2

Возможно, лучше сформулировать это с дополнительными состояниями. Например, для более чем двух последовательных 1s:

:- use_module(library(clpfd)). 

at_most_two_consecutive_ones(Day) :- 
    automaton(Day, 
     [source(n),sink(n),sink(n1),sink(n2)], 
     [arc(n, 0, n), 
     arc(n, 1, n1), 
     arc(n1, 1, n2), 
     arc(n1, 0, n), 
     arc(n2, 1, false), 
     arc(n2, 0, n) 
     ]). 

Пример запросов:

?- at_most_two_consecutive_ones([0,0,0,1,1,1]). 
false. 

?- at_most_two_consecutive_ones([0,1,1,0,1,1]). 
true. 

?- at_most_two_consecutive_ones([0,1,1,0,1,0]). 
true. 

Для более общего решения, вы должны построить автомат по требованию, когда дается максимальная длина пробега.

Смежные вопросы