フーリエ・モツキンの消去法

フーリエ・モツキンの消去法（英: Fourier-Motzkin elimination）とは、数理論理学および計算機科学において、一次不等式からなる一階述語論理式の限量子（∀や∃）を除去するアルゴリズム。限量子消去法（英: Quantifier elimination）の1つ。1826年にジョゼフ・フーリエが発見し、1918年に L. L. Dines が再発見し、1936年に Theodore Motzkin が再々発見した。 以下の手順を繰り返し行い、限量子を除去していく。変数の定義域は実数もしくは有理数。 以下の置き換えを行う。 等式や不等式に ￢ がかかる物は反転させる。 a ≧ b は b ≦ a へ a ＞ b は b ＜ a へ a ＝ b は (a ≦ b) ∧ (b ≦ a) へ ∀x. P(x) は ￢ ∃x. ￢ P(x) へ 下記簡略化は随時行う。 常に成り立つ もしくは 常に不成立な不等式は真や偽に置き換える。 真や偽が ∧ や ∨ や ￢ に付く場合は適切に論理式を簡略化する。 ∃x. P(x) の形式において、P(x) が x を使用してなければ、∃x. を取り除く。 ∃x. P(x) の形式で、P(x) に限量子が出てこない物を探し、P(x) を選言標準形に変換する。 ∃x. (P(x) ∨ Q(x)) ⇔ (∃x. P(x)) ∨ (∃x. Q(x)) の変換を行う。 Q が x を使用していない場合、∃x. (P(x) ∧ Q) ⇔ (∃x. P(x)) ∧ Q の変換を行う。 下記公式を使い、限量子を除去する。 ∃ x . ( ⋀ h c h ≤ a h x ) ∧ ( ⋀ i c i < a i x ) ∧ ( ⋀ j b j x ≤ d j ) ∧ ( ⋀ k b k x < d k ) {\displaystyle \exists x.\left(\bigwedge _{h}c_{h}\leq a_{h}x\right)\land \left(\bigwedge _{i}c_{i}<a_{i}x\right)\land \left(\bigwedge _{j}b_{j}x\leq d_{j}\right)\land \left(\bigwedge _{k}b_{k}x<d_{k}\right)} ⇔ ( ⋀ h , j b j c h ≤ a h d j ) ∧ ( ⋀ h , k b k c h < a h d k ) ∧ ( ⋀ i , j b j c i < a i d j ) ∧ ( ⋀ i , k b k c i < a i d k ) {\displaystyle \Leftrightarrow \left(\bigwedge _{h,j}b_{j}c_{h}\leq a_{h}d_{j}\right)\land \left(\bigwedge _{h,k}b_{k}c_{h}<a_{h}d_{k}\right)\land \left(\bigwedge _{i,j}b_{j}c_{i}<a_{i}d_{j}\right)\land \left(\bigwedge _{i,k}b_{k}c_{i}<a_{i}d_{k}\right)} 上記は一般的な形式だが、より分かりやすく、2つの不等式の場合に書き下すと以下の通り。 ( ∃ x . c ≤ a x ∧ b x ≤ d ) ⇔ b c ≤ a d {\displaystyle (\exists x.c\leq ax\land bx\leq d)\Leftrightarrow bc\leq ad} ( ∃ x . c < a x ∧ b x ≤ d ) ⇔ b c < a d {\displaystyle (\exists x.c<ax\land bx\leq d)\Leftrightarrow bc<ad} ( ∃ x . c ≤ a x ∧ b x < d ) ⇔ b c < a d {\displaystyle (\exists x.c\leq ax\land bx<d)\Leftrightarrow bc<ad} ( ∃ x . c < a x ∧ b x < d ) ⇔ b c < a d {\displaystyle (\exists x.c<ax\land bx<d)\Leftrightarrow bc<ad} ∀ i . ( 1 ≤ i ≤ n → i ≠ n ) {\displaystyle \forall i.(1\leq i\leq n\to i\neq n)} に対して、Fourier–Motzkin消去法を使用し、簡略化する。 ∀ i . ( 1 ≤ i ≤ n → i ≠ n ) {\displaystyle \forall i.(1\leq i\leq n\to i\neq n)} ⇔ ∀ i . ( ( ¬ ( 1 ≤ i ≤ n ) ) ∨ ( i ≠ n ) ) {\displaystyle \Leftrightarrow \forall i.((\lnot (1\leq i\leq n))\lor (i\neq n))} ⇔ ¬ ∃ i . ¬ ( ( ¬ ( 1 ≤ i ≤ n ) ) ∨ ( i ≠ n ) ) {\displaystyle \Leftrightarrow \lnot \exists i.\lnot ((\lnot (1\leq i\leq n))\lor (i\neq n))} ⇔ ¬ ∃ i . ( 1 ≤ i ≤ n ) ∧ ( i = n ) {\displaystyle \Leftrightarrow \lnot \exists i.(1\leq i\leq n)\land (i=n)} ⇔ ¬ ∃ i . ( 1 ≤ i ) ∧ ( i ≤ n ) ∧ ( i = n ) {\displaystyle \Leftrightarrow \lnot \exists i.(1\leq i)\land (i\leq n)\land (i=n)} ⇔ ¬ ∃ i . ( 1 ≤ i ) ∧ ( i ≤ n ) ∧ ( i ≤ n ) ∧ ( n ≤ i ) {\displaystyle \Leftrightarrow \lnot \exists i.(1\leq i)\land (i\leq n)\land (i\leq n)\land (n\leq i)} ⇔ ¬ ∃ i . ( 1 ≤ i ) ∧ ( i ≤ n ) ∧ ( n ≤ i ) {\displaystyle \Leftrightarrow \lnot \exists i.(1\leq i)\land (i\leq n)\land (n\leq i)} ⇔ ¬ ∃ i . ( 1 ≤ i ) ∧ ( n ≤ i ) ∧ ( i ≤ n ) {\displaystyle \Leftrightarrow \lnot \exists i.(1\leq i)\land (n\leq i)\land (i\leq n)} ここで公式を使用する。 ⇔ ¬ ∃ i . ( 1 ≤ n ) ∧ ( n ≤ n ) {\displaystyle \Leftrightarrow \lnot \exists i.(1\leq n)\land (n\leq n)} ⇔ ¬ ∃ i . ( 1 ≤ n ) {\displaystyle \Leftrightarrow \lnot \exists i.(1\leq n)} ⇔ ¬ ( 1 ≤ n ) {\displaystyle \Leftrightarrow \lnot (1\leq n)} ⇔ 1 > n {\displaystyle \Leftrightarrow 1>n} ⇔ n < 1 {\displaystyle \Leftrightarrow n<1} 変数の定義域を整数にする場合の拡張を William Pugh が1992年に発表している。オメガテストと名付けた判定条件を追加している。 また、1972年に D. C. Cooper がフーリエ・モツキンの消去法の直接の拡張ではないが、整数変数に対する限量子消去法であるCooper法を発表している。 一次式ではなく、より一般的な多項式の場合 George E. Collins が1975年に発表した Cylindrical Algebraic Decomposition (CAD) を使用することにより、限量子消去が出来る。 ^ Satisﬁability Checking Fourier–Motzkin Variable Elimination ^ Arithmetic Decision Procedures: a simple introduction ^ The Omega Test: a fast and practical integer programming algorithm for dependence analysis ^ Theorem Proving in Arithmetic without Multiplication