導出原理

**導出原理**（どうしゅつげんり、）とは、により1965年に提案された原理または手法を言う。

導出原理を元とする導出の手法は、その後の定理自動証明に大きな影響を与え、またPrologなどの論理プログラミング言語の基礎となった。

## 背景
述語論理式 *P* が恒真であるかを証明する一般的な手続きは存在しないが、1930年に発表されたエルブランの定理はエルブラン領域の要素を論理式に代入して命題論理のレベルに落としその充足不能性を調べることで、*¬P* が充足不能（恒偽）であれば有限のステップで証明できることを保証している。また、エルブランの論文には単一化アルゴリズムなど他の様々なものが含まれていた。

1950年代以降、計算機上での定理証明の研究が活発になり、ギルモアのアルゴリズム(1960)やデービス・パトナムのアルゴリズム(1958,1960) が考案された。デービス・パトナムのアルゴリズムには連言標準形の使用や導出規則の考え方が含まれていた。しかし、これらはエルブランの定理の証明を直接計算機上で実現したような方法で、エルブラン領域の要素を順次生成して変数を含まない論理式(*基礎例*)を作成し命題論理のレベルで充足不能性を調べるものだったため、不要な論理式が多数生成され、非常に効率が悪かった。

プラウィツ（Dag Prawitz）は、論理式を生成してからチェックするのではなく、選言標準形に変換した論理式への適当な代入（単一化）によって充足不能性を調べる方法を1960年に提案した。
この方法は必要な基礎例のみを生成するため、不要な論理式の生成が抑えられ効率的だったが、選言標準形は全ての連言項を調べなければならないため全体の効率はいいとは言えなかった。

ロビンソンはデービス・パトナムの枠組みにプラウィツのアイデアを組み合わせ、ただ1つの導出規則と単一化による代入操作とで充足不能性を調べる導出原理を1965年に発表した。単純な規則で関係する論理式のみを段階的に具体化していく方法は、従来の方法よりはるかに効率がよく、また理論的なエレガントさを持っていたため、その後の定理自動証明に大きな影響を与えた。

## 定義
*導出*とは二つの節より新しい節を導き出す操作で、一方の節に含まれるリテラル l と、他方の節に含まれる否定リテラル \neg l をのぞき、その他のリテラルの論理和をとることで、新しい節を得ることをいう。

命題論理での導出規則を式で表せば、
\frac{
l \vee P, 
\quad \neg l \vee Q}
{P \vee Q}
と書ける。ここで上式は前提となる*親節*、下式はそれらから導かれる*導出節*（）を表す。

あるいは、別の表記法を用いて次のようにも表現できる。前提となる節を C_1 と C_2 とし, もしリテラル L \in C_1 と否定リテラル \overline{L}\in C_2  が存在するならば、導出節 C_R は以下のようになる。

:
C_R = (C_1 \setminus\{L\}) \cup (C_2 \setminus \{\overline{L}\})


導出規則は三段論法や前件肯定を一般化した規則となっている。
導出は完全な証明系であることが知られている。

### 例
 p \to q  を節形式にすると  \lnot p \lor q   となる。 C_R  を C_1, C_2  の導出節とすると、前件肯定は以下の導出と同じである。

: \begin{array}{ll}
C_1 = \lnot p \lor q & \left( p \to q \right) \\
C_2 = p \\
C_R = q & \left( \mathrm{resolvent} \right)
\end{array} 

同様に、 p \to q 、 q \to r  の節形式  \lnot p \lor q 、  \lnot q \lor r  による三段論法は以下のようになる。

: \begin{array}{ll}
C_1 = \lnot p \lor q & \left( p \to q \right) \\
C_2 = \lnot q \lor r & \left( q \to r \right) \\
C_R = \lnot p \lor r & \left( \mathrm{resolvent,\ }p \to r \right)
\end{array} 

## 一階述語論理での導出
述語論理のリテラルには個体変数が含まれるため、リテラルと否定リテラルとを単純に比較するだけでは削除できるかどうか分からない。一階述語論理ではリテラルと否定リテラルそれぞれの原子論理式が単一化できる場合に導出を行う。

また、導出の対象となる節は、冠頭標準形にして存在記号を削除したスコーレム連言標準形の論理式である。

例えば、一方の節がリテラル p(x, y)、もう一方の節がリテラル \lnot p(z, f(b)) を含む場合、適切な代入 \sigma =\left\{ z/x, y/f(b) \right\} により各リテラルは p(x, f(b))、 \lnot p(x, f(b)) と書き換えられ、同じにすることができる。ここで代入 \left\{ z/x, y/f(b) \right\} は z \to x、y \to f(b) に書き換えることを表す。

一般に論理式 F_1, F_2 を等しくする代入を F_1, F_2 の*単一化子*（）といい、そのうち最も一般的な単一化子（*最汎単一化子*）を F_1, F_2 の*mgu*（）という。上記の例の場合、両方の論理式を等しくする代入は \left\{ z/a, y/f(b), x/a \right\}、\left\{ z/x, y/c, f(b)/c \right\} など無数に存在する。これらは本来の代入 \left\{ z/x, y/f(b) \right\} に \left\{ x/a \right\} などの代入を合成したものなので、最汎単一化子 mgu は \left\{ z/x, y/f(b) \right\} である。

一階述語論理での導出は mgu を用いて次のように表現できる。

もしリテラル L_1 \in C_1 と否定リテラル \overline{L_2}\in C_2 が存在し、 L_1 と L_2 が mgu \sigma を持つ場合、以下の C_R が*2項導出節*（）である。ここで、C_1\sigma, C_2\sigma などは、それぞれの節やリテラルに代入 \sigma を行ったものを表す。

:
C_R = (C_1\sigma \setminus\{L_1\sigma\}) \cup (C_2\sigma \setminus \{\overline{L_2\sigma}\})


同様のやり方での2以上の複数の節から同時に導出することも可能であり、*超導出*（）と呼ばれる。
### 例
以下の節からの導出を考える。

: C_1 = \lnot P (x) \lor \lnot Q (y) \lor R (x, y) 

: C_2 = Q \left(a \right) 

: C_3 = P \left(b \right) 

*Q* を単一化する代入 \left\{y/a\right\} により  C_1  と  C_2 の導出を行うと、

: C_R = \lnot P (x) \lor R (x, a)  

続いて、*P* を単一化する代入 \left\{ x/b \right\} により  C_R  と  C_3 の導出を行うと、

: C_S = R \left(b, a \right) 

を得ることができる。

## 反駁による証明
**反駁**（はんばく、）とは、節の集合からの導出により空節 □ を導くことである。
反駁については以下の定理が成り立つ。

節の集合 *S* が充足不能である必要十分条件は、節の集合 *S* からの導出により空節 □ が導けることである。

これはエルブランの定理を導出に応用したものになっている。

論理式 *P* が恒真であれば \lnot P は充足不能（恒偽）であるため、節の集合に \lnot P を追加し導出を繰り返すことで空節 □ になれば、論理式 *P* が恒真であることが証明できる。

反駁により P が P_1, \dots ,P_n の論理的帰結か調べるアルゴリズムは以下のように表現できる。
# P_1, \dots ,P_n をスコーレム連言標準形 C_1, \dots ,C_n に変換する。
# \lnot P をスコーレム連言標準形 C に変換する。
# もし C, C_1, \dots ,C_n の反駁が存在すれば、 P は P_1, \dots ,P_n の論理的帰結である。
::あるいは、別の表現をすれば、
::* C, C_1, \dots ,C_n が充足不能
::* \lnot P, P_1, \dots ,P_n が充足不能
::* P_1, \dots ,P_n の解釈が \mathit{T} ならば \lnot P の解釈は \mathit{F} 
::* P_1, \dots ,P_n の解釈が \mathit{T} ならば P の解釈は \mathit{T} 
### 例
以下の公式が成り立つ時、P\left(a\right) が成り立つかどうかを証明する場合を考える。反駁の対象となる論理式は以下の論理式に \lnot P(a) を追加したものである。

# \forall x \ ((S(x) \lor T(x)) \to P(x)), 
# \forall x \ (S(x) \lor R(x)), 
# \lnot R(a) 

最初の論理式は (\forall x \ (S(x) \to P(x)) \land (\forall x \ (T(x) \to P(x)) と等価なため、次の2つの節で表現できる。

:C_1 = \lnot S(x) \lor P(x)

:C_2 = \lnot T(x) \lor P(x)

2番目の論理式は以下の節になる。 

:C_3 = S(x) \lor R(x)

さらに3番目は以下の節になる。

:C_4 = \lnot R(a)

証明したい論理式の否定は以下の節である。

:C_5 = \lnot P(a)

これらの節 {C_1, C_2, C_3, C_4, C_5} が反駁の対象となる節集合である。

C_3 と C_4 の R についての導出を考えると、\left\{ x/a \right\} の代入により以下が導かれる。

:C_6 = S \left(a \right)

C_1 と C_6 の S についての導出を考えると、

:C_7 = P\left(a\right)

最後に C_5 と C_7 の導出により空節 □ が導かれ、P\left(a\right) が成り立つことを証明できる。

## 証明戦略
導出は２つの節を前提として導出節を導くものであるので、どの節に導出規則を適用するかについては様々な選択肢があり、そのやり方により効率が大幅に異なる。代表的な証明戦略として以下のものがある。
* 線形導出（）
:前提となる節の一方を、頂上節（）として指定した節と、頂上節から導出された節に限定する方法。導出木を書くと導出の流れが線状に一列に並ぶため、線形導出と呼ばれる。論理プログラミング言語の代表であるPrologで用いられる*SLD導出*（）は線形導出の一種である。
* 入力導出（）
:前提となる節の一方を最初に与えられた節集合の要素（導出された節以外の節）に限定する方法。
* 支持集合戦略（）
:あらかじめ支持集合という節の集合を指定しておき、前提となる節の一方を支持集合の節とそこから導出された節に限定する方法。節集合*S*、*T* があり*S-T* が充足可能であるとき*T* は*S* の支持集合と言う。目標に関係ないところを探索しないよう導出の対象を制限することで、より効率的な導出を行うための手法で、1965年に Lawrence Wos らが提案した。
* 意味導出（）
:論理式のモデルあるいは解釈を利用して導出の対象を制限し、探索の空間を狭めることで効率的な導出を行う手法。特定のモデルにおいて真となる可能性がある節と偽となる可能性のある節とを親節に選ぶ Slagle の Semantic Clash resolution など様々な方法がある。

## 脚注




## 関連項目

* 数理論理学
** 命題論理
** 述語論理

* 自動定理証明
* 論理プログラミング
* エルブランの定理
** ギルモアのアルゴリズム
** デービス・パトナムのアルゴリズム
** DPLLアルゴリズム

## 参考文献
* 
* 
* 
* 
* 
*J. Alan Robinson. "A Machine-Oriented Logic Based on the Resolution Principle." J. Assoc. Comput. Mach. 12, pp.23-41, 1965.
*Davis Martin. *The Early History of Automated Deduction*. in *Handbook of Automated Reasoning*, *Volume I*, Alan Robinson and Andrei Voronkov(ed), 2001. ISBN 9780444829498.
* Robert Kowalski. *Logic for Problem Solving*. North Holland, Elsevier, 1979.　ISBN 978-0444003683
* 
*佐藤 泰介. *[https://cir.nii.ac.jp/crid/1050282812854402176 導出原理による定理証明]*. 情報処理 22(11), pp.1024-1036, 1981.

## 外部リンク
* 
* 
* Notes on computability and resolution (pdf)
* 述語論理とその意味論 (pdf) 筑波大学講義資料