夜勤2連勤の後、2連勤禁止の制約が以下のように動いていない



■No8の制約の意図するところを、言葉にすると、「夜勤2連勤の後、2連勤」を禁止
になります。Xは、休みで、✓X=勤務になります。
✓X✓X=2連勤務になります。

■解は、上制約に違反していないことに注意してください。
解「2連夜勤勤務の後、勤入」は、「夜勤2連勤の後、2連勤」を禁止、となんら矛盾しません。禁止していないので、ありえることになります。

■パターンは、全要素に対してANDで動作します。No.8で禁止しているのは、6パターン全体のAND 「入明入明勤勤」を禁止しているだけです。これは、解「入明入明勤入」を含みません。よって「あり得る」ことになります。

一方、
■No.9は、「入明入明勤」を禁止にしています。もし「入明入明」が来たとすると次は、
「入明入明休」しかありえない訳です。
■No.10は、さらに「入明入明休」まできたときに「入明入明休勤」を禁止しているので、
「入明入明休休」以外ありえない、つまり「夜勤2連勤の後は、2連休でなけれならない」という仕様の実現になっている訳です。

こうした、パターンに関しては、制約設計者の生みの苦しみ部分だと思います。一般の利用書は、出来上がった行制約パターンを利用するだけで済むので、立ち入ることはないのですが、制約を設計する人は、そうはいきません。一つ一つ解決していけばよいと思います。

一般に、長いパターンは、短いパターンに規制されています。今回で言えば、

と記述されているので、夜勤2連続可能者の明け後は、すでに、No.6で、休みか入り、に限定されています。ちなみに、2連夜勤後の休みは、No.9で限定されているので、No.10のX✓Xの部分は、*✓Xとしてもよいです。(*は、Dont’care ブランク)

もう一つ注意点としては、パターンをいじったら、今月自動にしておくと、先月からの連続部分も正しく、動作します。その際に、先月分の長さが足りていることが必要になります。

一般には、最長パターンー1分の先月データが必要となります。