Python チュートリアル5 では、And,Or,Not演算の記述方法について見てみます。

5個の月曜日のうち、1日だけ公休ではない月曜日がある、という仕様を実現します。

今、A=公休ではない =~公休 という表記にします。
ΣA==1 という制約を実現すればよいことになります。
ΣA==1は、ΣA>=1 かつ ΣA <=1 を実現すればよいことになります。

  1. ΣA>=1は、Or演算で実現できます。
  2. ΣA<=1は、全ての二つの組み合わせで、禁止にすればよい
     

という二つの制約を実現します。2番目の制約が面倒ですが、Python itertoolsを使うと簡単に記述できます。
二つの組み合わせの禁止は、ドモルガンの法則により~(~c &~d)=c|dとなるので、公休のORを取ればよい、ということになります。
日本語で言うと、どちらも公休でないを禁止=どちらか公休である、となりOR演算に帰着します。

import sc3
import itertools

for person in 全スタッフ:
    vlist=[]
    s='言語公休回数'+' '+staffdef[person]+'\n'

    for day in 月:
        v=sc3.GetShiftVar(person,day,'公休')
        vlist.append(v)
    sc3.AddHard(~vlist[0] | ~vlist[1] | ~vlist[2] | ~vlist[3] | ~vlist[4],s)#互いに等価な制約

    for v in itertools.combinations(vlist,2):
        sc3.AddHard(v[0] | v[1],s)