パターンのところが新しいです。ひとつひとつ見ていきます。
まず、S関数ですが、パターンの加算に関する制約です。 S(min, max, type, pattern...)
これ自体は、今までの最大、最小と同じ意味で、
type 0: min<= X <=max
type 1: X>=min
type 2: X<=max
という制約になります。上の
S(2,0,1..) は、最小2以上 という制約になります。 P(n, パターン)
nは、パターン開始日n のnです。
P(1, xx)は、パターン開始日1のところの日をxのスタートとする という意味です。ここでは、スケジュール開始日の第一日目がxで 第2日目もxであるならマッチして、P(1,xx)の結果は1を返します。
マッチしなければ、0を返します。
P(2,!xxx)は、パターン開始日2のところの日をxのスタートとするという 意味になります。パターン開始日2がスケジュール日(1月1日から1月29)の間 マッチするする部分をSで加算することになります。
まとめると、
最初の日のxxと、最初の日から1月29日まで!xxxにマッチする部分を
加算して、2以上という制約になります。
面倒ですが、「連続休みを2回以上」という制約にしたい場合は、
この行をコピペすればよいです。
勿論、xの定義、第一日の定義、スケジュール日の定義は各々の環境で違ってくるでしょうが、

なお、日の定義は左のようになっています。

これで平準化前の「連続休みを2回以上」制約が記述できました。
この結果は、勤務表自動作成ソフト スケジュールナースで、14秒かかりました。
今回は、前回と違って、分離した2回以上連続休みしか数えないので、公公公を 2連続休み2回とカウントする不具合はありません。
できれば、休み間隔は、公公-- 2週間--公公
にできればより良い(平準化)、というご要望がありました。
明日実装してみたいと思います。