SATにおいて重要な概念です。at leastとat most制約は、互いに変換可能ということになります。なので、通常はどちらかだけの制約を持てば、十分です。
Σx(i)≦kのとき、xの個数がNなら
Σ~x(i)≧N-k
と変換できます。1の最大数がk個以下が必要なら、0の最小数がN-k個以上であれば良い訳です。
例えば、N=10,k=9のとき、1となる個数を9個以下にしたいときは、0となる個数を1個以上にすればよい、
です。
以下は、AIでの補足説明です。
リテラル数を (N) としたときの “most k” と “least k” の関係を、
直感的に理解できる図で説明します。
📘 基本の意味(前提)
least k:
「少なくとも (k) 個は真である」
→ 真のリテラル数が (k, k+1, …, N) の領域を表すmost k:
「高々 (k) 個が真である」
→ 真のリテラル数が (0, 1, …, k) の領域を表す
📊 図で見る “most k” と “least k” の関係
■ リテラル数 (N) に対する真リテラル数の軸
0 k N
|--------|--------|
■ least k(少なくとも k 個)
0 k N
|--------|================|
↑ least k はここから右側
■ most k(高々 k 個)
0 k N
|================|--------|
most k はここまで ↑
🎯 両者の関係をまとめた図
真リテラル数 →
0 k N
|========|========|
↑ ↑
most k least k
(0〜k) (k〜N)
- most k と least k は ちょうど k を境界に左右に分かれる
- つまり、
- most k:真リテラル数が k 以下
- least k:真リテラル数が k 以上
🔍 さらに直感的にいうと
- most k は「真が 多すぎない」ことを要求
- least k は「真が 少なすぎない」ことを要求
- どちらも 真リテラル数の範囲を制約するが、
方向が逆になっている
リテラルという言葉は、論理や制約プログラミングの世界ではとても基本的で重要な概念です。
ここで一度、丁寧に整理しておきますね。
🔍 リテラル(literal)とは?
論理式を構成する最小単位で、変数またはその否定のこと。
具体的には:
- 変数:
- (x), (y), (a_3) など
- その否定:
- (\neg x), (\neg y), (\neg a_3)
この 「変数」または「否定された変数」 をまとめて リテラル と呼びます。
🧩 例で理解する
例1:
論理変数 (x, y, z) があるとき、リテラルは:
- (x)
- (\neg x)
- (y)
- (\neg y)
- (z)
- (\neg z)
合計 6 個のリテラルが存在します。
🧠 なぜ “リテラル” という概念が必要なのか?
論理式(CNF、DNF、PB制約など)を扱うとき、
「真偽を持つ最小の要素」 を数えたり制約したりする必要があります。
たとえば:
least k:
「リテラルのうち 少なくとも k 個 が真」most k:
「リテラルのうち 高々 k 個 が真」
このときの「リテラルの個数」がまさに literal count です。
🎯 直感的なイメージ
変数 x がある → リテラルは x と ¬x の2つ
ただし、制約の文脈では 「式に登場するリテラル」だけを数える のが普通です。
📌 まとめ
| 用語 | 意味 |
|---|---|
| 変数 | 真偽値を持つ基本要素 |
| リテラル | 変数またはその否定(例:x, ¬x) |
| リテラル数 N | 制約に登場するリテラルの総数 |
| least k | N 個のリテラルのうち少なくとも k 個が真 |
| most k | N 個のリテラルのうち高々 k 個が真 |
必要なら、
- CNF や PB(Pseudo-Boolean)でのリテラルの扱い
- リテラルと節(clause)の関係
- SAT ソルバー内部でのリテラルの扱い
なども詳しく説明できますよ。