2015年度情報論理学講義資料

2015 年度 情報論理学 講義資料 (4)
青戸等人
1
単一化と 単一化手続き
照合問題では, 左辺に 代入し て 右辺を 得ら え る かと いう 問題を 考え た. 左辺だけ
ではな く , 右辺に も 代入を し て , 同じ 項を 得る こ と ができ る かと いう 問題を 単一化
問題と いう . 単一化手続き は, 述語論理の自動定理証明や合流性検証手続き の基本
的な 構成要素と な っ て いる .
定義 1 (単一化) 項 s と 項 t が単一化可能 (unifiable) である と は, sσ = tσ と な る よ
う な 代入 σ が存在する と き を いう . こ のよ う な 代入 σ を , s と t の単一化子 (unifier)
と よ ぶ.
例 2 単一化のさ ま ざま な 例を 示す.
• s = f(x, b) と t = f(g(a), y) と お く と , s と t は単一化可能. 代入 σ = {x :=
g(a), y := b} は s と t の単一化子. 実際, sσ = tσ = f(g(a), b).
• f(x, a) と f(g(y), y) は単一化可能. {x := g(a), y := a} は単一化子. 同じ 変数が
複数出現する 場合に 注意.
• f(x, a) と f(y, x) は単一化可能. {x := a, y := a} は単一化子. 同じ 変数が両方
の項に 出現する 場合に 注意.
• g(x) と g(y) は単一化可能. 以下の代入はすべて 単一化子. σ1 = {x := y},
σ2 = {y := x}, σ3 = {x := z, y := z}, σ4 = {x := a, y := a}, σ5 = {x :=
g(a), y := g(a)}, . . .. つま り , 単一化子は一般的に は複数ある .
• f(x, x) と f(a, b) は単一化不能. 第 1 引数を 同じ に する に は, 代入に x := a が
必要だが, そ う する と , 第 2 引数が同じ に な ら な い.
• f(x, y) と g(z) は単一化不能. 代入に よ っ て , f や g は不変な ので, ど んな 代入
σ を と っ て も , f(x, y)σ 6= g(x, y)σ .
• g(y) と g(g(y)) は単一化不能. 代入 σ = {y := g(y)} は単一化子に な ら な いこ
と に 注意.
単一化子は一般に 複数ある が, そ のう ち , 最も 一般的な も の (最汎単一化子) が存
在する . 最汎単一化子を 与え る 準備と し て , ま ず, 代入順序に ついて 説明する .
1
def
定義 3 (代入順序) 代入集合上の関係 - を 次のよ う に定める: σ - τ ⇐⇒ ∃ρ. ρ ◦ σ =
τ.
def
代入の合成の定義: (ρ ◦ σ)(x) ⇐⇒ ρ(σ(x)) に 注意し て おく 1 .
補題 4 関係 - は擬順序 (反射的かつ推移的な 関係).
直観的に は, σ - τ は, τ よ り σ の方が一般的な 代入である こ と を 表わし て いる .
例 5 以下が成立する .
• {x := f(y)} - {x := f(a), y := a}. な ぜな ら , {x := f(a), y := a} = {y :=
a} ◦ {x := f(y)}.
• {x := y} - {y := x}, {y := x} - {x := y}. な ぜな ら , {y := x} = {y :=
x} ◦ {x := y}, {x := y} = {x := y} ◦ {y := x}.
• {x := y} - {x := z, y := z}, {y := x} - {x := z, y := z}. な ぜな ら ,
{x := z, y := z} = {y := z}◦{x := y}, {x := z, y := z} = {x := z}◦{y := x}.
定義 6 (最汎単一化子) 代入 σ が項 s と t の最汎単一化子 (most general unifier) で
ある と は, (1) σ は s と t の単一化子, かつ, (2) s と t の任意の単一化子 ρ に ついて
σ<
∼ ρ が成立する , と き を いう . 項 s と t の最汎単一化子 (の 1 つ ) を , mgu(s, t) を
記す 2 .
例 7 g(x) と g(y) の単一化子は, {x := y}, {y := x}, {x := t, y := t} (t ∈
/ {x, y})
と な る . こ のと き , {x := y} と {y := x} は, g(x) と g(y) の最汎単一化子. {x :=
t, y := t} (t ∈
/ {x, y}) は, 最汎ではな い単一化子と な る .
2 つの項 s, t が与え ら れた と き に , s と t が単一化可能であ る か否かを 判定する 問
題を 単一化問題と よ び, s ? ≈? t に よ り 表す. 以下では, s ? ≈? t と t ? ≈? s を 同一視
する .
単一化問題を E = {s1 ? ≈? t1 , . . . , sn ? ≈? tn } のよ う に 有限集合へ一般化する . こ
のと き , E の単一化子と は, i = 1, . . . , n に ついて si σ = ti σ と な る 代入 σ のこ と で
あり , E の単一化子 σ で, E の任意の単一化子 ρ に ついて σ <
∼ ρ と な る も のを 単一
化問題 E の解と よ ぶ.
以下では, 単一化問題を 解く 手続き (単一化手続き ) を , 導出規則で与え る (図 1).
こ の手続き は, 単一化問題 E と 代入 σ の対 hE, σi に 関する 導出を 行いな がら 問題
def
こ れは数学の世界では標準的な 代入の合成の定義. 一方, 計算機科学の世界では, (ρ ◦ σ)(x) ⇐⇒
σ(ρ(x)) と する 場合も と き ど き 見かけ る . こ のよ う な 左を 先に 適用する 関数合成に は, 記号 “◦” でな
1
def
く , 記号 “;” を 用いる こ と を 推奨する: (ρ; σ)(x) ⇐⇒ σ(ρ(x)). こ れは, “;” はプロ グラ ムの statement
の合成の標準的な 記法である ので, こ の順番は直観に 合う .
2
すぐ 次の例で示すよ う に , 最汎単一化子は 1 つと は限ら な いが, ど の最汎単一化子であっ て も ,
最汎である と いう 性質から そのう ち 1 つを 考え れば十分である . こ のため, 唯一に定ま る かのよ う に
mgu(s, t) を 記し て も 問題な い.
2
Delete
h{x ? ≈? x} ⊎ E, σi
hE, σi
Decompose
h{f (s1 , . . . , sn ) ? ≈? f (t1 , . . . , tn )} ⊎ E, σi
h{s1 ? ≈? t1 , . . . , sn ? ≈? tn } ∪ E, σi
Eliminate
Crash
Occur-Check
h{x ? ≈? t} ⊎ E, σi
h{x := t}(E), {x := t} ◦ σi
x∈
/ V(t)
h{f (s1 , . . . , sn ) ? ≈? g(t1 , . . . , tm )} ⊎ E, σi
⊥
h{x ? ≈? t} ⊎ E, σi
⊥
f 6= g
x ∈ V(t), x 6= t
図 1: 単一化手続き
を 解く . 導出規則は, 上の式を 下の式へ変形する , と 読む よ う に 記述さ れて いる .
X ⊎ Y は直和集合 (disjoint union, 積集合が空 (X ∩ Y = ∅) と な る 和集合 X ∪ Y ) を
表わす. な お, s ? ≈? t と t ? ≈? x は同一視さ れる ので, 例え ば, Eliminate 規則は対
hE ⊎ {t ? ≈? x}, σi に ついて も 適用さ れる こ と に 注意する . hE, σi から hF, ρi (も し
く は hE, σi から ⊥) がこ れら の規則で導出さ れる こ と を hE, σi ❀ hF, ρi (も し く は
hE, σi ❀ ⊥) と 記す. 直観的に は, E はま だ残っ て いる 単一化問題, σ はこ れま で
解いた部分解を 表わす. 単一化でき な いこ と が判明し た場合に は ⊥ が導出さ れる .
単一化問題 s ? ≈? t を 解く に は, h{s ? ≈? t}, ∅i から 導出を 始めて , 導出が ⊥ で終
わっ た 場合に は解は単一化不能であ り , h∅, σi で終わっ た 場合は単一化可能と な る .
こ のと き , σ は, 単一化問題の解 (実際に は最汎単一化子) と な る .
定義 8 (単一化手続き )
入力: 単一化問題 s ? ≈? t
出力: 項 s と 項 t が単一化可能か否か, 単一化可能な 場合に はそ の最汎単一化子
h{s ? ≈? t}, ∅i から 図 1 の導出規則に よ る 導出を 可能な 限り 繰り 返す. ⊥ が得ら れた
場合は, 単一化不能を 返す. ま た, h∅, σi が得ら れた場合は, σ を 最汎単一化子と し
て 返す.
例9
• h{f(x, b) ? ≈? f(g(a), y)}, ∅i ❀ h{x ? ≈? g(a), b ? ≈? y)}, ∅i ❀ h{b ? ≈? y}, {x :=
g(a)}i ❀ h{y ? ≈? b}, {x := g(a)}i ❀ h∅, {x := g(a), y := b)}i.
• h{h(a, y, x) ? ≈? h(a, y, c)}, ∅i ❀ h{a ? ≈? a, y ? ≈? y, x ? ≈? c}, ∅i ❀ h{y ? ≈?
y, x ? ≈? c}, ∅i ❀ h{x ? ≈? c}, ∅i ❀ h∅, {x := c}i.
3
• h{f(x, x) ? ≈? f(a, b)}, ∅i ❀ h{x ? ≈? a, x ? ≈? b}, ∅i ❀ h{a ? ≈? b}, {x := a}i ❀
⊥.
定理 10 (単一化手続き の正し さ ) 項 s と t が単一化可能な と き , そ の時に かぎ り ,
単一化手続き は s と t の最汎単一化子を 返す.
演習 11 単一化手続き の正し さ に ついて , 付録の証明を 確認せよ .
代入に 関する データ 型や関数を お く Subst ス ト ラ ク チャ に , 関数の合成を する
compose 関数およ び単一化手続き を 実現する unify 関数を 追加し よ う . compose σ ρ
は, ρ ◦ σ を 表わす代入を 返す. unify (s,t) は s と t が単一化可能な と き SOME σ (σ
は s と t の最汎単一化子) を 返し , 単一化不能な 場合には NONE を 返す. unify 関数本
体の let 文のな かの main 関数が, 導出規則を 適用し て 導出を 繰り 返す部分であ り ,
第 1 引数が E に 部分, 第 2 引数が σ に 部分に 対応する . 導出規則で ⊥ が得ら れる と
こ ろ では, NONE を 返し , 単一化に成功する と き は最終的に E が空リ スト と な り , 19
行目で SOME σ が返さ れる .
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
(* subst.sml *)
signature SUBST =
sig
type subst
...
val compose: subst -> subst -> subst
val unify: Term.term * Term.term -> subst option
end
structure Subst: SUBST =
struct
local
structure AL = AssocList
structure L = List
structure LP = ListPair
structure T = Term
in
type subst = (Var.key * Term.term) list
...
19
20
21
(* composition of substitutions: rho o sigma *)
fun compose sigma rho = ...
22
23
24
25
26
27
28
29
30
fun unify (term1,term2) =
let fun main [] sigma = SOME sigma
| main ((T.Var x, t)::rest) sigma =
...
...
...
| main ((T.Fun (f,ts), T.Fun (g,us))::rest) sigma =
...
4
31
32
33
34
35
36
37
...
...
| main ((t, T.Var x)::rest) sigma =
rest) sigma
in main [(term1,term2)] []
end
end (* of local *)
end
main ((T.Var x, t)::
演習 12 関数 compose およ び unify を 完成さ せよ .
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
(* 実行例 *)
# Subst.unify (T.fromString "f(?x,b)", T.fromString "f(g(a),?y)");
val it = _ : ((string * int) * Term.term) list option
# Subst.toString (valOf it);
val it = "{?x := g(a), ?y := b}" : string
# Subst.unify (T.fromString "f(?x,a)", T.fromString "f(g(?y),?y)");
val it = _ : ((string * int) * Term.term) list option
# Subst.toString (valOf it);
val it = "{?x := g(a), ?y := a}" : string
# Subst.unify (T.fromString "f(?x,a)", T.fromString "f(?y,?x)");
val it = _ : ((string * int) * Term.term) list option
# Subst.toString (valOf it);
val it = "{?x := a, ?y := a}" : string
# Subst.unify (T.fromString "f(?x)", T.fromString "f(?y)");
val it = _ : ((string * int) * Term.term) list option
# Subst.toString (valOf it);
val it = "{?x := ?y}" : string
# Subst.unify (T.fromString "f(?x,?x)", T.fromString "f(a,b)");
val it = _ : ((string * int) * Term.term) list option
# isSome it;
val it = false : bool
# Subst.unify (T.fromString "f(?x)", T.fromString "g(?y)");
val it = _ : ((string * int) * Term.term) list option
# isSome it;
val it = false : bool
# Subst.unify (T.fromString "g(?y)", T.fromString "g(g(?y))");
val it = _ : ((string * int) * Term.term) list option
# isSome it;
val it = false : bool
こ こ では, 代入を 文字列に 変換する Subst.toString 関数を 用意し て 使っ て いる .
5
2
危険対と 危険対補題
加算の書き 換え 規則
R=
(
+(0, y)
→ y
+(s(x), y) → s(+(x, y))
)
に よ る 項 +(s(x), +(0, y)) の書き 換え を 考え て みよ う . こ の項に は, 書き 換え 可能な
位置が 2 箇所存在する . こ のため, 次のよ う に , 2 通り の書き 換え が可能:
s(+(x, +(0, y))) R ← +(s(x), +(0, y)) →R +(s(x), y)
こ の場合, 片方の書き 換え に よ っ て , も う 一方の書き 換え が出来な く な る こ と はな
いため,
s(+(x, +(0, y))) →R s(+(x, y)) R ← +(s(x), y)
のよ う に , 2 通り の書き 換え のど ち ら を 先に やっ て も 最終的に 同じ 計算結果が得ら
れる . し かし , こ のよ う な 場合ばかり ではな い.
例 13 次のよ う に , 加算の書き 換え 規則に 結合律の規則を 追加し て みよ う :




+(0, y)
→ y
 (1)

′
R =
(2)
+(s(x), y)
→ s(+(x, y))


 (3)
+(x, +(y, z)) → +(+(x, y), z) 
今度は,
+(+(x, 0), y) R′ ← +(x, +(0, y)) →R′ +(x, y)
と な り , 片方の書き 換え を 行う と , 対応する 他方の書き 換え が出来な く なっ て し ま っ
て いる . 実際, 得ら れた 2 つの項はさ ら に書き 換え る こ と が出来な い (つま り , 正規
形に な っ て いる ). 従っ て , ど ち ら の書き 換え を 行う かに よ っ て , 計算結果が異な っ
て し ま う . こ のよ う な 状況は, 2 つの書き 換え 規則 (2) と (3) が “重なっ て いる ” こ と
に 起因し て いる .
こ のよ う に, 非決定的な計算において は, 異なる 計算順序を 使っ て も 同じ 計算結果
が得ら れる かは自明ではない. ど のよ う な計算順序を 使っ て も 同じ 計算結果が得ら れ
る と いう 性質は, 合流性 (confluence) も し く はチャ ーチ・ ロッ サー性 (Church-Rosser
property, CR と 略す ) と よ ばれ, 項書き 換え システム に基づく 定理自動証明に重要な
役割を 果た す. 合流性の解析に 重要と な る のが, 書き 換え 規則の重な り であ り , こ
れは単一化に よ っ て 計算する こ と ができ る .
定義 14 (重なり ) l1 → r1 と l2 → r2 を 書き 換え 規則と し , 一般性を 失う こ と な く ,
l1 → r1 と l2 → r2 に 用いら れて いる 変数は名前替え を 行っ て 別々 に な っ て いる も の
と する (つま り , V(l1 ) ∩ V(l2 ) = ∅). ま た , l1 → r1 と l2 → r2 は同じ 書き 換え 規則
を と っ て き て も よ いが, そ の場合も 用いら れて いる 変数は別々 と な る よ う に 変え る
も のと する . こ のと き , 項 l2 のある 非変数部分項 l2 |p と l1 が単一化可能である と き ,
位置 p で l1 → r1 は l2 → r2 へ重なる と いい, こ の重な り を l1 → r1 >p l2 → r2 と 記
す. ただし , l1 → r1 と l2 → r2 が (変数名だけ が異な る ) 同じ 書き 換え 規則で, p = ε
のと き は (自明に ) 単一化可能と な る ので, そ の場合は除外する も のと する .
6
例 15 例 13 の項書き 換え システム R′ の書き 換え 規則 (1)∼ (3) を 考え る . こ のと き ,
以下の 7 つの重な り がある .
• l1 → r1 = (1), l2 → r2 = (3), p = ǫ と と る と , mgu(+(x′ , +(y ′ , z ′ )), +(0, y)) =
{x′ := 0, y := +(y ′ , z ′ )} と な る ので, 位置 ǫ で書き 換え 規則 (1) は書き 換え 規
則 (3) へ重な る . 同様に , 位置 ǫ で書き 換え 規則 (3) は書き 換え 規則 (1) へ重
なる .
• l1 → r1 = (1), l2 → r2 = (3), p = 2 と と る と , mgu(+(y ′ , z ′ ), +(0, y)) =
{y ′ := 0, z ′ := y} と な る ので, 位置 2 で書き 換え 規則 (1) は書き 換え 規則 (3) へ
重な る .
• l1 → r1 = (2), l2 → r2 = (3), p = ǫ と と る と , mgu(+(x′ , +(y ′ , z ′ )), +(s(x), y)) =
{x′ := s(x), y := +(y ′ , z ′ )} と な る ので, 位置 ǫ で書き 換え 規則 (1) は書き 換え
規則 (3) へ重な る . 同様に, 位置 ǫ で書き 換え 規則 (1) は書き 換え 規則 (3) へ重
なる .
• l1 → r1 = (2), l2 → r2 = (3), p = 2 と と る と , mgu(+(y ′ , z ′ ), +(s(x), y)) =
{y ′ := s(x), z ′ := y} と な る ので, 位置 2 で書き 換え 規則 (1) は書き 換え 規則 (3)
へ重な る .
• l1 → r1 = (3), l2 → r2 = (3), p = 2 と と る と , mgu(+(y ′ , z ′ ), +(x, +(y, z))) =
{y ′ := x, z ′ := +(y, z)} と な る ので, 位置 2 で書き 換え 規則 (3) は書き 換え 規
則 (3) へ重な る .
定義 16 (危険頂, 危険対) R を 項書き 換え シス テ ム , l1 → r1 , l2 → r2 ∈ R, 位置
p で l1 → r1 が l2 → r2 へ重な る と する 3 . σ = mgu(l2 |p , l1 ) と おく と き , l2 [r1 ]p σ ←
l2 σ → r2 σ を 危険頂 (critical peak) と よ ぶ. 項の対 hl2 [r1 ]p σ, r2 σi を 危険対 (critical
pair) と よ ぶ. l1 → r1 の l2 → r2 へ重な り l1 → r1 >p l2 → r2 から 得ら れる 危険頂の
集合を CPK(l1 → r1 , l2 → r2 ), 危険対の集合を CP(l1 → r1 , l2 → r2 ) と 記す. R を
任意の 2 つの書き 換え 規則の重な り から 得ら れる 危険頂の集合を CPK(R), 危険対
の集合を CP(R) と 記す.
例























17 例 13 の項書き 換え シス テム R′ を 考え る . こ のと き , CPK(R) =
(1) >ǫ (3) :
+(y ′ , z ′ )
(3) >ǫ (1) :
+(+(0, y ′ ), z ′ )
(1) >2 (3) :
+(x′ , y)
(2) >ǫ (3) :
s(+(x, +(y ′ , z ′ ))
(3) >ǫ (2) :
+(+(s(x), y ′ ), z ′ )
(2) >2 (3) :
+(+(x′ , s(x)), y)
(3) >2 (3) : +(x′ , +(+(y ′ , y), z))
←
+(0, +(y ′ , z ′ ))
←
+(0, +(y ′ , z ′ ))
←
+(x′ , +(0, y))
←
+(s(x), +(y ′ , z ′ ))
←
+(s(x), +(y ′ , z ′ ))
←
+(x′ , +(s(x), y))
← +(x′ , +(y ′ , +(y, z)))
→
→
→
→
→
→
→
+(+(0, y ′ ), z ′ )
+(y ′ , z ′ )
+(+(x′ , 0), y)
+(+(s(x), y ′ ), z ′ )
s(+(x, +(y ′ , z ′ ))
+(x′ , s(+(x, y)))
+(+(x′ , y ′ ), +(y, z))
(重な り のと き に 述べた よ う に , 変数は重な り がな いよ う に 名前替え さ れて いる こ と に 注意. ま
た, l1 → r1 と l2 → r2 は (変数名を 変え た ) 同じ 書き 換え 規則でも よ いが, そ のと き は p = ǫ の場合
は除外さ れて いる こ と に 注意.
3
7

























(1) >ǫ (3) :
h+(y ′ , z ′ ),




(3) >ǫ (1) :
h+(+(0, y ′ ), z ′ ),





h+(x′ , y),
 (1) >2 (3) :
CP(R) =
(2) >ǫ (3) :
hs(+(x, +(y ′ , z ′ )),



(3) >ǫ (2) :
h+(+(s(x), y ′ ), z ′ ),





(2) >2 (3) :
h+(+(x′ , s(x)), y),


 (3) > (3) : h+(x′ , +(+(y ′ , y), z)),
2
+(+(0, y ′ ), z ′ )i
+(y ′ , z ′ )i
+(+(x′ , 0), y)i
+(+(s(x), y ′ ), z ′ )i
s(+(x, +(y ′ , z ′ ))i
+(x′ , s(+(x, y)))i
+(+(x′ , y ′ ), +(y, z))i























以下では, 項 t の位置 p1 , . . . , pn の部分項を s1 , . . . , sn で置き 換え て 得ら れる 項を
t[s1 , . . . , sn ]p1 ,...,pn と 記す.
以下の補題は, 書き 換え が分岐する と き , そ の分岐が合流する ケ ース と 合流し な
いケ ース に おけ る 危険頂と の関係を 示し て いる .
補題 18 (危険対補題) R を 項書き 換え シス テ ム , l1 → r1 , l2 → r2 ∈ R, t1 l1 →r1 ←
∗
→l1 →r1 ◦ →l2 →r2
s →l2 →r2 t2 と する . こ のと き , 以下のいづれかが成立する . (1) t1 −
∗
∗
∗
◦ l1 →r1 ←
− t2 , (2) t1 −
→l2 →r2 ◦ l1 →r1 ← ◦ l2 →r2 ←
− t2 , (3) ある 文脈 C , 代入 θ, およ び,
危険頂 v1 ← u → v2 ∈ CPK(l1 → r1 , l2 → r2 ) も し く は v2 ← u → v1 ∈ CPK(l2 →
r2 , l1 → r1 ) が存在し て , t1 = C[v1 θ], s = C[uθ], t2 = C[v2 θ] が成立する .
合流性に関係する 関数を 置く Cr スト ラ ク チャ を cr.sml を 用意し , cr.sml に危険頂
を 計算する 関数を 作る . 関数 cpkRule isIdentical (l1,r1) (l2,r2) は CPK(l1 →
r1 , l2 → r2 ) を 計算する . こ こ で, isIdentical は l1 → r1 と l2 → r2 が同一の書き
換え 規則かど う かを 表わすブール値 (true ま たは false) である .
関数 cpkRule は, ま ず, l2 の構造に関する 再帰によ り , l2 |p (∈
/ V) と l1 が単一化可能
な箇所を すべて 数え 上げる . こ れを 行っ て いる のが, 補助関数 cpkTerm である . 具体
的には, l2 |p と l1 が単一化可能と な る よ う な p すべて について の, 文脈 C = l2 []p と
σ = mgu(l2 |p , l1 ) の対を リ スト にし て 返す. cpkTerm t は, t の真部分項について 出来
る [hC1 , σ1 i, . . . , hCn , σn i] に , t = l2 |p と l1 が単一化可能に は h, σi を 追加し て 返す.
前者についての再帰的な計算は, t = f (t1 , . . . , tn ) のと き , cpkTermList [ ] [t1 , . . . , tn ]
の形でよ びだす. cpkTermList [t1 , . . . , ti−1 ] [ti , . . . , tn ] は, ti の部分項に ついて 出来
′
′
る [hC1′ , σ1′ i, . . . , hCm
, σm
i] を 計算し , 文脈 Cj′ を Cj′′ = [t1 , . . . , ti−1 , Cj′ , ti+1 , . . . , tn ] と
′′
′
いう リ ス ト 文脈に 修正し , [hC1′′ , σ1′ i, . . . , hCm
, σm
i] を 返す.
最後に , こ のよ う に し て 得ら れた文脈 C と σ から , C[r1 ]σ ← l1 σ ← r1 σ を そ れぞ
れ計算すれば, すべて の危険頂が得ら れる .
ま た, l1 → r1 と l2 → r2 が同一の書き 換え 規則の場合に は, 根位置での重な り を
再帰の一回目はス キッ プする 必要がある . こ のため, cpkTermProper 関数を 用意し
て いる . ま た, 書き 換え 規則 l1 → r1 と l2 → r2 に 同じ 変数がな いよ う に , 変数の名
前替え を する 関数 rename やリ ス ト に 関する 補助関数 mapAppend を 用いて いる . 関
数 rename l1 → r1 l2 → r2 は, l1 → r1 に 表われる 変数のイ ン デッ ク ス の最大値 n を
計算し て , l2 → r2 の変数のイ ン デッ ク ス に そ れぞれ n + 1 増やし て やればよ い.
1
2
(* cr.sml *)
signature CR =
8
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
sig
val cpk: (Term.term * Term.term) list
-> (Term.term * Term.term * Term.term) list
end
structure Cr: CR =
struct
local
structure L = List
structure LU = ListUtil
structure T = Term
in
fun cpkRule isIdentical (l1,r1) (l2,r2) =
let fun cpkTerm (T.Var _) = []
| cpkTerm (t as T.Fun (f,ts)) =
let val atRoot = case Subst.unify (t,l1) of
SOME sigma => [(fn x=>x, sigma)]
| NONE => []
val atArgs =
L.map
(fn (C,sigma) => (fn x => T.Fun (f,C x), sigma))
(cpkTermList [] ts)
in atRoot @ atArgs
end
and cpkTermProper (T.Var _) = ...
| cpkTermProper (t as T.Fun (f,ts)) = ...
and cpkTermList _ [] = []
| cpkTermList us (t::ts) =
let val atHead = ...
val atTail = cpkTermList (us@[t]) ts
in atHead @ atTail
end
in L.map (fn (C,sigma) => (Subst.apply sigma (C r1),
Subst.apply sigma l2,
Subst.apply sigma r2))
(if isIdentical
then (cpkTermProper l2)
else (cpkTerm l2))
end
41
42
43
44
45
46
47
48
49
50
51
52
fun cpk rs =
LU.mapAppend
(fn lr1 => (LU.mapAppend
(fn lr2 => let val (lr1’, lr2’) =
Trs.rename (lr1, lr2)
in cpkRule (lr1 = lr2) lr1’ lr2’
end)
rs))
rs
end (* of local *)
end (* of struct *)
9
53
54
55
56
57
58
59
60
61
62
63
64
(* list_util.sml *)
...
val mapAppend: (’a -> ’b list) -> ’a list -> ’b list
...
fun mapAppend f [] = []
| mapAppend f (x::xs) = (f x) @ (mapAppend f xs)
...
(* trs.sml *)
...
val rename: (Term.term * Term.term) * (Term.term * Term.term)
-> (Term.term * Term.term) * (Term.term * Term.term)
...
演習 19 危険頂を 計算する 関数 cpk を 完成さ せよ .
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
A
(* 実行例 *)
# val R = List.map Trs.rdRule ["+(0,?y) -> ?y", "+(s(?x),?y) -> s
(+(?x,?y))", "+(?x,+(?y,?z)) -> +(?x,+(?y,?z))"];
...
# val CPK = Cr.cpk R;
...
# List.map (fn (v1,u,v2) => print ("<" ^ (Term.toString v1) ^ " <- "
^ (Term.toString u) ^ " -> " ^ (Term.toString v2) ^ ">\n")) CPK
;
<+(?y_1,?z_1) <- +(0,+(?y_1,?z_1)) -> +(0,+(?y_1,?z_1))>
<+(?x_1,?y) <- +(?x_1,+(0,?y)) -> +(?x_1,+(0,?y))>
<s(+(?x,+(?y_1,?z_1))) <- +(s(?x),+(?y_1,?z_1)) -> +(s(?x),+(?y_1,?
z_1))>
<+(?x_1,s(+(?x,?y))) <- +(?x_1,+(s(?x),?y)) -> +(?x_1,+(s(?x),?y))>
<+(0,+(?y,?z)) <- +(0,+(?y,?z)) -> +(?y,?z)>
<+(s(?x_1),+(?y,?z)) <- +(s(?x_1),+(?y,?z)) -> s(+(?x_1,+(?y,?z)))>
<+(?x_1,+(?x,+(?y,?z))) <- +(?x_1,+(?x,+(?y,?z))) -> +(?x_1,+(?x,+(?
y,?z)))>
val it = [(), (), (), (), (), (), ()] : unit list
#
代入の性質に関す る 証明
(補題 4 の証明) (反射性) 任意の代入 σ に ついて , ∅ ◦ σ = σ . よ っ て , - は反射的.
(推移性) σ - τ - ξ と する . こ のと き , 定義よ り , あ る ρ1 , ρ2 に ついて ρ1 ◦ σ = τ
かつ ρ2 ◦ τ = ξ と な る . する と , ξ = ρ2 ◦ τ = ρ2 ◦ (ρ1 ◦ σ) = (ρ2 ◦ ρ1 ) ◦ σ . よ っ て ,
σ - ξ が成立. よ っ て , - は推移的.
以下の代入に 関する 性質は, 次節で用いる .
10
補題 20 (代入の性質)
1. xτ = tτ と する . こ のと き , 任意の項 u に ついて (u{x := t})τ = uτ .
2. {x := t} - τ かつ x ∈
/ V(t) な ら ば, xτ = tτ .
3. ρ ◦ σ - τ な ら ば, σ - τ .
4. x ∈
/ V(t), x ∈
/ dom(σ), V(t) ∩ dom(σ) = ∅ と する . こ のと き , {x := t} ◦ σ - τ
な ら ば, {x := t} - τ .
(証明)
1. xτ = tτ と 仮定する . こ のと き , (u{x := t})τ = uτ と な る こ と を u に 関する
帰納法で示す.
(a) u = x ∈ V の場合. こ のと き , (x{x := t})τ = tτ = xτ よ り 成立.
(b) u = y ∈ V, x 6= y の場合. こ のと き , (y{x := t})τ = yτ = yτ よ り 成立.
(c) u = f (u1 , . . . , un ) の場合. こ のと き , 帰納法の仮定を 用いて, (f (u1 , . . . , un ){x :=
t})τ = f ((u1 {x := t})τ, . . . , (un {x := t})τ ) = f (u1 τ, . . . , un τ ) = f (u1 , . . . , un )τ
と な り , 成立.
2. {x := t} - τ , x ∈
/ V(t) と する . こ のと き , あ る 代入 ρ が存在し て , τ =
ρ ◦ {x := t}. よ っ て , xτ = ρ({x := t}(x)) = ρ(t). 一方, x ∈
/ V(t) よ り ,
tτ = ρ({x := t}(t)) = ρ(t). よ っ て , xτ = tτ が成立.
3. ρ ◦ σ - τ と する . こ のと き , ある 代入 ξ が存在し て , τ = ξ ◦ (ρ ◦ σ). よ っ て ,
τ = (ξ ◦ ρ) ◦ σ よ り , σ - τ .
4. x ∈
/ V(t), x ∈
/ dom(σ), V(t) ∩ dom(σ) = ∅ と 仮定する . こ のと き , ({x := t} ◦
σ)(x) = {x := t}(σ(x)) = {x := t}(x) = t ({x := t} ◦ σ ◦ {x := t})(x) = {x :=
t}(σ({x := t}(x))) = {x := t}(σ(t)) == {x := t}(t) = t y 6= x に ついて は,
({x := t}◦σ)(y) = {x := t}(σ(y)) ({x := t}◦σ◦{x := t})(y) = ({x := t}◦σ)(y)
よ っ て , {x := t} ◦ σ = {x := t} ◦ σ ◦ {x := t}. 従っ て , {x := t} ◦ σ - τ な ら
ば, {x := t} ◦ σ ◦ {x := t} - τ と な り , ゆえ に , {x := t} - τ .
B
単一化手続き の正し さ の証明
補題 21 ❀ は整礎, つま り , hE0 , σ0 i ❀ hE1 , σ1 i ❀ · · · な る 無限導出列は存在し
な い.
S
(証明) E を 単一化問題と する と き , V(E) = {V(s) ∪ V(t) | s ? ≈? t ∈ E}, |E| =
Σ{|s| + |t| | s ? ≈? t ∈ E} と 定義する . ま た , w(hEi , Φi i) = h|V(Ei )|, |Ei |i と お く .
こ のと き , > を 自然数上の自然な 順序と する と き , w(hEi , Φi i)(>)lex w(hEi+1 , Φi+1 i.
無限導出列があっ た と する と , w(hE0 , Φ0 i)(>)lex w(hE1 , Φ1 i) > · · · な る 無限列があ
る こ と に な る が, こ れは矛盾.
11
補題 22 ❀ に よ る 導出は ⊥ も し く は h∅, σi で終了する .
(証明) 補題 21 よ り 導出はいつも 終了する . 題意が成立し ないと し て , hE, σi (E 6= ∅)
で終了し たと する . こ のと き , E 6= ∅ よ り , s ? ≈? t ∈ E が存在. root(s), root(t) ∈ F
のと き は, Decompose も し く は Clash が適用可能. s = x ∈ V(も し く は t ∈ F) のと
き は, x ∈
/ V(t) なら Eliminate が, x ∈ V(t) かつ x 6= t なら Occur-Check が, x ∈ V(t)
かつ x = t な ら Delete が適用可能. よ っ て , 終了と いう 仮定に 矛盾.
補題 23 hE, σi ❀ hE ′ , σ ′ i と する . こ のと き , V(E) ∩ dom(σ) = ∅ な ら ば, V(E ′ ) ∩
dom(σ ′ ) = ∅.
(証明) hE, σi ❀ hE ′ , σ ′ i で使われた導出規則に よ り 場合分け する .
1. (Delete) こ のと き , E = {x ? ≈? x} ∪ E ′ かつ σ = σ ′ . よ っ て , V(E ′ ) ⊆ V(E)
よ り 明ら か.
2. (Decompose) こ のと き , E = {f (s1 , . . . , sn ) ? ≈? f (t1 , . . . , tn )} ⊎ F , E ′ =
{s1 ? ≈? t1 , . . . , sn ? ≈? tn } ∪ F , かつ, σ = σ ′ . こ のと き , V(E ′ ) = V(E) よ り
明ら か.
3. (Eliminate) こ のと き , E = {x ? ≈? t} ⊎ F , E ′ = {x := t}(F ) = {u{x :=
t} ? ≈? v{x := t} | u ? ≈? v ∈ F }, x ∈
/ V(t), かつ, σ ′ = {x := t} ◦ σ . こ のと
き , V(E ′ ) = V(E) \ {x}, dom(σ ′ ) = dom(σ) ∪ {x} よ り 明ら か.
定義 24 E を 単一化問題, σ を 代入と する . 代入 τ が hE, σi の解であ る と は, τ が
E の解であり , かつ, σ - τ と な る と き を いう .
補題 25 hE, σi ❀ hE ′ , σ ′ i, V(E) ∩ dom(σ) = ∅ と する . こ のと き , τ が hE, σi の解
である と き , そ の時に 限り , τ は hE ′ , σ ′ i の解.
(証明) hE, σi ❀ hE ′ , σ ′ i で使われた導出規則に よ り 場合分け する .
1. (Delete) こ のと き , E = {x ? ≈? x} ∪ E ′ かつ σ = σ ′ . 任意の代入 τ に ついて ,
xτ = xτ である こ と から 明ら か.
2. (Decompose) こ のと き , E = {f (s1 , . . . , sn ) ? ≈? f (t1 , . . . , tn )} ⊎ F , E ′ =
{s1 ? ≈? t1 , . . . , sn ? ≈? tn }∪F , かつ, σ = σ ′ . よ っ て , ∀i (1 ≤ i ≤ n). si τ = ti τ
⇔ f (s1 , . . . , sn )τ = f (t1 , . . . , tn )τ よ り 明ら か.
3. (Eliminate) こ のと き , E = {x ? ≈? t} ⊎ F , E ′ = {x := t}(F ) = {u{x :=
t} ? ≈? v{x := t} | u ? ≈? v ∈ F }, x ∈
/ V(t), かつ, σ ′ = {x := t} ◦ σ .
• (⇐) τ が hE, σi の解であ る と 仮定する . する と , xτ = tτ , 任意の u ? ≈?
v ∈ F に つ いて uτ = vτ , かつ , σ - τ . ま ず, {x := t} ◦ σ - τ か
ら , 補題 20(3) よ り , σ - τ . ま た , xτ = tτ であ る から , 補題 20(1) よ
り , (u{x := t})τ = uτ = vτ = (v{x := t})τ と な る . よ っ て , 任意の
u′ ? ≈? v ′ ∈ {x := t}(F ) に ついて u′ τ = v ′ τ . よ っ て , τ は {x := t}(F ) の
解. 以上よ り , τ は hE ′ , σ ′ i の解.
12
• (⇒) τ が hE ′ , σ ′ i の解であ る と 仮定する . する と , 任意の u ? ≈? v ∈ F
に ついて (u{x := t})τ = (v{x := t})τ , かつ, {x := t} ◦ σ - τ . ま ず,
{x := t} ◦ σ - τ から , 補題 20(3) よ り , σ - τ が成立する . いま , 仮定
から V(E) ∩ dom(σ) = ∅ な ので, x ∈
/ dom(σ) かつ V(t) ∩ dom(σ) = ∅ が
成立する . よ っ て , x ∈
/ V(t), {x := t} ◦ σ - τ から , 補題 20(4) よ り ,
{x := t} - τ . よ っ て , x ∈
/ V(t) なので, 補題 20(2) よ り , xτ = tτ が成立.
xτ = tτ と 補題 20(1) よ り , 任意の u ? ≈? v ∈ F に ついて uτ = (u{x :=
t})τ = (v{x := t})τ = vτ と な る . 従っ て , τ は E = {x ? ≈? t} ⊎ F の解.
以上よ り , τ は hE, σi の解.
∗
補題 26 hE, σi ❀ hF, ρi, V(E) ∩ dom(σ) = ∅ と する . τ が hE, σi の解である と き ,
そ の時に 限り , τ は hF, ρi の解.
∗
(証明) hE, σi ❀ hF, ρi, 導出の長さ に 関する 帰納法で示す. 導出の長さ が 0 のと き
∗
は明ら か. 導出の長さ が > 0 のと き , 導出は, hE, σi ❀ hE ′ , σ ′ i ❀ h∅, τ i と おけ る .
こ のと き , V(E) ∩ dom(σ) = ∅ の仮定と 補題 23 よ り , 仮定 V(E ′ ) ∩ dom(σ ′ ) = ∅.
よ っ て , 帰納法の仮定が適用でき て , τ が hE ′ , σ ′ i の解 ⇔ τ が hF, ρi の解. よ っ て ,
補題 25 よ り , 題意が成立.
∗
補題 27 h{s ? ≈? t}, ∅i ❀ h∅, τ i な ら ば, τ は s と t の単一化子.
(証明) τ は h∅, τ i の解. よ っ て , V({s ? ≈? t}) ∩ dom(∅) = ∅ な ので, 補題 26 よ り ,
τ は h{s ? ≈? t}, ∅i の解. 従っ て , τ は s と t の単一化子.
∗
補題 28 h{s ? ≈? t}, ∅i ❀ h∅, τ i と する . σ が s と t の単一化子な ら ば, τ - σ .
(証明) σ を s と t の単一化子と する . こ のと き , σ は h{s ? ≈? t}, ∅i の解. よ っ て ,
V({s ? ≈? t}) ∩ dom(∅) = ∅ な ので, 補題 26 よ り , σ は h∅, τ i の解. 従っ て , τ - σ .
∗
補題 29 h{s ? ≈? t}, ∅i ❀ h∅, τ i と する . こ のと き , τ は s と t の最汎単一化子.
(証明) 補題 27 よ り , τ は s と t の単一化子. ま た, σ を s と t の単一化子と する と ,
補題 28 よ り , τ - σ . よ っ て , τ は s と t の最汎単一化子.
∗
補題 30 hE, σi ❀ ⊥, V(E) ∩ dom(σ) = ∅ と する . こ のと き , hE, σi は解を 持たな
∗
い. 特に , h{s ? ≈? t}, ∅i ❀ ⊥ な ら ば, s と t は単一化不能.
∗
(証明) hE, σi ❀ ⊥ の導出の長さ に 関する 帰納法で示す.
1. 導出の長さ が 1 の場合. hE, σi ❀ ⊥ に 用いら れた導出規則で場合分け する .
(a) (Crash) こ のと き , E = {f (s1 , . . . , sn ) ? ≈? g(t1 , . . . , tm )} ⊎ F (f 6= g). 任
意の代入 σ に ついて f (s1 , . . . , sn )σ 6= g(t1 , . . . , tm )σ と な る から , hE, σi
は解を 持たな い.
13
(b) (Occur-Check) こ のと き , E = {x ? ≈? t} ⊎ F (x ∈ V(t), x 6= t). よ っ て ,
任意の代入 σ に ついて xσ 6= tσ と な る から , hE, σi は解を 持たな い.
∗
2. 導出の長さ が > 1 の場合. hE, σi ❀ hE ′ , σ ′ i ❀ ⊥ と おく と , 帰納法の仮定よ
り , hE ′ , σ ′ i は解を 持たな い. よ っ て , hE, σi が解を も つと する と , 補題 25 に
矛盾.
定理 31 s ? ≈? t を 単一化問題と する と き , h{s ≤? t}, ∅i から 始ま る 導出は (a) h∅, σi
で終了する か, も し く は (b) ⊥ で終了し ,
(a) ⇔ s と t は単一化可能かつ σ は s と t の最汎単一化子
(b) ⇔ s と t は単一化不能
が成立する .
(証明) 補題 22 よ り , h{s ? ≈? t}, ∅i から 始ま る 導出は h∅, σi も し く は ⊥ で終了する .
1. (⇒) h∅, σi で終了し たと する . こ のと き , 補題 29 よ り σ は s と t の最汎単一化
子. ま た, 最汎単一化子が存在する から , s と t は単一化可能.
(⇐) s と t が単一化可能と する . も し (b) が成立する と , 補題 30 よ り , s と t
は単一化不能と な る ので矛盾.
2. (⇒) 補題 30 よ り 成立.
(⇐) s と t が単一化不能と する . も し (a) が成立する と , 1 と 同様に補題 29 よ り
σ は s と t の最汎単一化子と な り , s と t は単一化可能と な る から , 矛盾. よ っ
て , (b) が成立.
C
危険対補題の証明
(補題 18 の証明) t1 l1 →r1 ,p1 ,σ ← s →l2 →r2 ,p2 ,σ t2 と する . こ こ で, V(l1 ) ∩ V(l2 ) = ∅ よ
り , 同じ 代入 σ を 用いて いる と 仮定し て よ いこ と に 注意する . 位置 p1 , p2 の関係に
よ っ て 場合分け する
1. p1 k p2 の場合. こ のと き , s = s[l2 σ, l1 σ]p1 ,p2 , t1 = s[l2 σ, r1 σ]p1 ,p2 , t2 =
s[r2 σ, l1 σ]p1 ,p2 と おける . よって, t2 = s[r2 σ, l1 σ]p1 ,p2 →l1 →r1 s[r2 σ, r1 σ]p1 ,p2 l2 →r2 ←
s[l2 σ, r1 σ]p1 ,p2 = t1 と な る ので, (1)(およ び (2)) が成立する .
2. p1 > p2 の場合. こ のと き , p1 = p2 .w と おけ る . 2 通り に 場合分け する .
(a) l2 の変数位置 wx が存在し て wx 6 w が成立する 場合. こ のと き , あ る q
が存在し て w = wx .q と お け る . l2 |wx = x, {p ∈ Pos(l2 ) | x = l2 |p } =
{w1 , . . . , wn }, wx = w1 と おく . こ のと き , 任意の i に ついて , s|p2 .wi =
14
(l2 σ)|wi = σ(x). ま た , p1 = p2 .w = p2 .wx .q = p2 .w1 .q . よ っ て , l1 σ =
s|p1 = s|p2 .w1 .q = (s|p2 )|w1 .q = (l2 σ)|w1 .q = σ(x)|q . 以上よ り ,
t1 =
=
=
=
=
=
=
=
s[r1 σ]p1
s[r1 σ]p2 .w1 .q
s[s[r1 σ]w1 .q ]p2
s[l2 σ[r1 σ]w1 .q ]p2
s[l2 σ[r1 σ]w1 .q ]p2
s[l2 σ[r1 σ, (l2 σ)|w2 .q , . . . , (l2 σ)|wn .q ]w1 .q,w2 .q,...,wn .q ]p2
s[l2 σ[r1 σ, σ(x)|q , . . . , σ(x)|q ]w1 .q,w2 .q,...,wn .q ]p2
s[l2 σ[r1 σ, l1 σ, . . . , l1 σ]w1 .q,w2 .q,...,wn .q ]p2
が成立する . 次に, 代入 σ̂ を , 任意の z ∈ V(l2 )\{x} について σ̂(z) = σ(z),
σ̂(x) = σ(x)[r1 σ]q と おく と ,
l2 σ̂ =
=
=
=
(l2 [x, . . . , x]w1 ,...,wn )σ̂
l2 σ̂[σ̂(x), . . . , σ̂(x)]w1 ,...,wn
l2 σ[σ(x)[r1 σ]q , . . . , σ(x)[r1 σ]q ]w1 ,...,wn
l2 σ[r1 σ, . . . , r1 σ]w1 .q,...,wn .q
よ っ て,
t1 =
→l1 →r1 ,p2 .w2 .q
→l1 →r1 ,p2 .w3 .q
→l1 →r1 ,p2 .wn .q
=
→l2 →r2 ,p2
s[l2 σ[r1 σ, l1 σ, . . . , l1 σ]w1 .q,w2 .q,...,wn .q ]p2
s[l2 σ[r1 σ, r1 σ, . . . , r1 σ]w1 .q,w2 .q,...,wn .q ]p2
···
s[l2 σ[r1 σ, r1 σ, . . . , r1 σ]w1 .q,w2 .q,...,wn .q ]p2
s[l2 σ̂]p2
s[r2 σ̂]p2
が成立する . 一方, σ(x) = σ(x)[l1 σ]q →l1 →r1 σ(x)[r1 σ]q = σ̂(x) であっ た
から ,
∗
t2 = s[r2 σ]p2 −
→l1 →r1 s[r2 σ̂]p2
∗
よ っ て , t1 →
− l1 →r1 →l2 →r2 s[r2 σ̂]p2
l1 →r1 ∗
←
− t2 と な り , (1) が成立する .
(b) 任意の l2 の変数位置 wx について wx 66 w と なる 場合. こ のと き , p1 = p2 .q
と おく と , l2 |q は l2 の非変数部分項. よ っ て ,
l1 σ = s|p1 = s|p2 .q = (s|p2 )|q = (l2 σ)|q = (l2 |q )σ
が成立する . こ れは l1 と l2 |q が単一化可能な こ と を 意味する から , τ =
mgu(l1 , l2 |q ) - σ が存在する . 従っ て , σ = θ ◦ τ と な る 代入 θ およ び危険
頂 l2 [r1 ]q τ ← l2 τ → r2 τ ∈ CPK(l1 → r1 , l2 → r2 ) が存在する . C = s[]p2
ととると,
t1 = s[r1 σ]p1 = s[l2 σ[r1 σ]q ]p2 = C[l2 [r1 ]q σ] = C[l2 [r1 ]q τ θ]
s = s[l2 σ]p2 = C[l2 σ] = C[l2 τ θ]
t2 = s[r2 σ]p2 = C[r2 σ] = C[r2 τ θ]
と な り , (3) が成立する .
15
3. p1 < p2 の場合. こ れと き p1 > p2 と 対称的と な る だけ であ る から , 場合 2. と
同様に し て , (2) ま たは (3) が成立する こ と が示せる .
16