1 述語論理とその意味論

推論計算モデル特論 2002 南出靖彦
述語論理とその意味論
1
1.1
述語論理 (predicate logic)
定義 1.1 (項 (term))
• 定数 c
• 変数 x
• f(t1 , . . . , tn ) (f が n 引数の関数記号)
定義 1.2 (論理式 (formula))
• p(t1 , . . . , tn ) (p が n 引数の述語記号) (原始論理式 (atomic formula))
• ¬P 否定 (negation)
• P ∨ Q 論理和, 選言 (disjunction), P ∧ Q 論理積, 連言 (conjunction)
• ∀x.P , ∃x.P
定義 1.3 (解釈 (interpretation)) M = (D, I)
• D: 空でない集合
• I(a) ∈ D
• I(f) ∈ D × . . . × D → D (f は, n 引数の関数記号)
• I(p) ∈ D × . . . × D → {T, F } (p は, n 引数の述語記号)
例 1.1 定数記号 zero, 関数記号 succ, 述語記号 even.
M = (N , I)
I(zero) =
I(succ)(x) =
I(even)(x) =
0
x+1
T x mod 2 = 0
F x mod 2 = 1
定義 1.4 付値 σ を変数の集合から D への関数とする.
• 項の解釈 M [[t]]: (V ar → D) → D
– M [[x]]σ = σ(x)
– M [[c]]σ = I(c)
– M [[f(t1 , . . . , tn )]]σ = I(f)(M [[t1 ]]σ, . . . , M [[tn]]σ)
• 論理式の解釈 M [[P ]]: (V ar → D) → {T, F }
– M [[p(t1 , . . . , tn )]]σ = I(p)(M [[t1 ]]σ, . . . , M [[tn]]σ)
1
– M [[P ∨ Q]]σ = M [[P ]]σ ∨ M [[Q]]σ
– M [[∀x.P ]]σ = ∀v ∈ D.M [[P ]]σ[v/x]
σ[v/x](y) =
v
σ(y)
(y ≡ x とき)
それ以外のとき
例 1.2 上の M = (N , I) を考える. また, 関数 σ が以下のように定義されているとする.
σ(x) = 1
σ(y) = 2
σ(v) = 0
それ以外の変数 v
以下の解釈を計算せよ.
M [[even(succ(x)) ∧ ¬even(succ(y)]]σ
M [[∀x.(¬even(x) ∨ even(succ(succ(x))))]]σ
補題 1.1 P を閉じた論理式ならば, P の解釈 M [[P ]]σ は, σ に依存しない.
定義 1.5 P, Q1, . . . , Qn を閉じた論理式とする.
• 論理式 P が充足可能 (satisfiable) ⇔ ある解釈 M が存在して, P の解釈が T となる.
• 論理式 P が充足不能 (unsatisfiable) ⇔ P の解釈が T となる解釈 M が存在しない.
• 論理式 P が論理式 Q1 , . . . , Qn の論理的帰結 ⇔ 任意の解釈 M に対して, Qi (1 ≤ i ≤ n) の
解釈が T ならば P の解釈が T .
Q1 , . . . , Qn |= P
例 1.3 Q1 , Q2 , P を以下の論理式とする.
Q1
Q2
P
= even(zero)
= ∀x.¬even(x) ∨ even(succ(succ(x)))
= even(succ(succ(zero)))
このとき
Q1 , Q2 |= P
1.2
標準形
定義 1.6
• リテラル (literal): 原始論理式または原始論理式の否定
• リテラルの 0 個以上の論理和を節 (clause) という.
– リテラルの 0 個の論理和を空節といい, と書く.
定義 1.7 論理式 P1 ∧ P2 ∧ . . . ∧ Pn を連言標準形 (conjunctive normal form) という.
• Pi は, リテラルの論理和.
補題 1.2
• ¬¬P ⇔ P .
2
• ¬(P ∨ Q) ⇔ ¬P ∧ ¬Q, ¬(P ∧ Q) ⇔ ¬P ∨ ¬Q. (De Morgan’s law)
• P ∨ (Q ∧ R) ⇔ (P ∨ Q) ∧ (P ∨ R), P ∧ (Q ∨ R) ⇔ (P ∧ Q) ∨ (P ∧ R).
例 1.4 (P ∨ ¬Q) ⇒ R
(P ∨ ¬Q) ⇒ R
⇐⇒
¬(P ∨ ¬Q) ∨ R
(1)
⇐⇒
(¬P ∧ Q) ∨ R
(2)
⇐⇒
(¬P ∨ R) ∧ (Q ∨ R)
(3)
定義 1.8 論理式 Q1 x1 Q2 x2 . . . Qn xn P を冠頭標準形 (prenex normal form) という.
• Qi は, ∀ または ∃.
• P は, ∀, ∃ を含まない.
補題 1.3 P を x を自由変数として含まない論理式とする.
• (P ∨ ∀x.Q) ⇔ ∀x.(P ∨ Q), (P ∧ ∀x.Q) ⇔ ∀x.(P ∧ Q).
• (P ∨ ∃x.Q) ⇔ ∃x.(P ∨ Q), (P ∧ ∃x.Q) ⇔ ∃x.(P ∧ Q).
• ∀x.¬Q ⇔ ¬∃x.Q
• ∃x.¬Q ⇔ ¬∀x.Q
定義 1.9 (スコーレム連言標準形)
∀x1 , . . . , xn.(C1 ∧ C2 ∧ . . . ∧ Cn )
C i は, 節.
例 1.5 ∃x.∀y.∀z.∃u.∀v.∃w.P (x, y, z, u, v, w) のスコーレム連言標準形.
∀y.∀z.∀v.P (c, y, z, f(y, z), v, g(y, z, v))
c は新しい定数記号, f, g は新しい関数記号.
例 1.6 以下の論理式のスコーレム連言標準形
• ∀x.∃y.(P (x, y) ∧ Q(x, y)) ∨ ∃x.R(x).
• ∀x.¬(∀y.P (x, y) ∨ ∃z.∀u.Q(x, z, u)).
定理 1.1 論理式 S を, 論理式 P のスコーレム連言標準形とする. P が充足不能であることと, S
が充足不能であることは同値である.
注意 1.1 P S
p(c) ⇒ ∃x.p(x)
∃x.p(x) ⇒ p(c)
定義 1.10 (代入, 例 (instance), 基礎例 (ground instance))
3
• [t1 /x1 , t2 /x2 , . . . , tn /xn ]
f(x, z)[a/x, f(b)/y, g(c)/z] ≡ f(a, g(c))
• 項 tθ を項 t の例という. (θ は代入)
• 論理式 P θ を論理式 P の例という. (θ は代入)
• 自由変数を含まない例を基礎例という.
定理 1.2 (エルブランの定理) S を節の有限集合とする. このとき, 以下の二つの性質は同値.
• S が充足不能.
• S に属する節の基礎例の有限集合が充足不能.
例 1.7 以下の節集合が充足不能であることを示す.
• {P (x), ¬P (f(a))}
• {¬P (x) ∨ Q(f(x), x), P (g(b)), ¬Q(y, z)}
定義 1.11 (エルブラン領域) H =
H0
Hi+1
=
=
∞
i=0
Hi
{c | c は定数記号 }
Hi ∪ {f(t1 , . . . , tn ) | tj ∈ Hi かつ f は n 変数の関数記号 }
定義 1.12 (エルブラン解釈) 以下の条件を満たす解釈 MH = (H, I) をエルブラン解釈という.
• I(c) = c
• I(f)(t1 , . . . , tn ) = f(t1 , . . . , tn )
アルゴリズム 1.1 (エルブランの定理の実装 (Gilmore 1960)) 節の集合 S が, 充足不能か調べ
る.
• Si : S の変数に Hi に属する項を代入した基礎例の集合
S0 , S1 , S2 , . . .
• Si が充足不能か調べる.
例 1.8 Gilmore のアルゴリズムで以下の節の集合が充足不能であることを示せ.
• {P (a), ¬P (x) ∨ Q(f(x)), ¬Q(f(a))}
• {P (x), Q(x, f(x)) ∨ ¬P (x), ¬Q(g(y), f(z))}
4
導出原理と Prolog
2
2.1
命題論理の導出原理
定義 2.1 L を命題変数, C1 , C2 を節とする. L ∈ C1 , ¬L ∈ C2 とする. この時, 節 (C1 \ {L}) ∪
(C2 \ {¬L}) を C1 と C2 の導出節 (resolvent) という.
例 2.1 P ∨ R と ¬P ∨ Q の導出節
R∨Q
例 2.2 ¬P ∨ Q ∨ R と ¬Q ∨ S の導出節.
定理 2.1 C を C1 と C2 の導出節とする. このとき, 以下が成り立つ.
C1 , C2 |= C
定義 2.2 S を節の集合, C, C1, . . . , Cn を節とする. 節の列 C1 , C2, . . . , Cn が以下の条件を満たす
とき, S からの C の導出という.
• Ci ∈ S, または Ci は, i 番目より前の節からの導出節
• Cn ≡ C
S からの の導出を, S の反駁 (refutation) という.
例 2.3 S = {¬P ∨ Q, ¬Q, P } とする. 以下の列は, S の反駁.
¬P ∨ Q, ¬Q, P, ¬P, 例 2.4 S = {P ∨ Q, ¬P ∨ Q, P ∨ ¬Q, ¬P ∨ ¬Q} の反駁を示せ.
2.2
単一化
定義 2.3
• 代入の合成 σ · θ は, t(σ · θ) = (tσ)θ で定義される.
– σ = [t1 /x1 , . . . , tn /xn ], θ = [s1 /y1 , . . . , sl /yl , u1 /z1 , . . . , um /zm ] とする. ただし, yi ∈
{x1 , . . . , xn } かつ zi ∈ {x1 , . . . , xn }. このとき,
σ · θ = [t1 θ/x1 , . . . , tn θ/xn , u1 /z1 , . . . , um/zm ]
• ある代入 σ が存在して, θ1 = θ2 · σ の時, θ2 は, θ1 より一般的 (more general) であるという.
例 2.5 代入 θ, λ を以下の代入とするとき, θ · λ を計算せよ.
θ
λ
=
=
[f(y)/x, z/y]
[a/x, b/y, y/z]
定義 2.4 E を項の対の集合とする.
• 任意の (s, t) ∈ E に対して, sθ ≡ tθ が成り立つ時, 代入 θ を E の単一化 (unifier) という. E
の単一化が存在するとき, 単一化可能という.
5
• E の任意の単一化代入より一般的な E の単一化を mgu (most general unifier) という.
記法 2.1 単一化を考えるとき, 項の対 (s, t) を s =? t と書くことにする.
例 2.6 E = {p(x, y) =? p(z, f(b))}.
• θ = [z/x, f(b)/y], λ = [a/x, f(b)/y, a/z] は, 共に E の単一化.
• θ は λ より一般的.
• mgu は θ.
アルゴリズム 2.1 (単一化 (unification) アルゴリズム) E を項の対の集合, θ を代入とする. こ
のとき, 以下の規則で E の mgu を求めることができる.
(E ∪ {t =? t}, θ)
⇒ (E, θ)
(E ∪ {x =? t}, θ)
⇒ (E[t/x], θ · [t/x])
(E ∪ {f(t1 , . . . , tn ) =? f(s1 , . . . , sn )}, θ)
(x ∈ F V (t))
⇒ (E ∪ {t1 =? s1 , . . . , tn =? sn }, θ)
定理 2.2 項の対の集合 E に対して, 以下は同値.
• E が単一化可能.
• ある θ に対して, (E, ∅) ⇒∗ (∅, θ).
(∅ は, どの変数も置き換えない代入. よって, t∅ ≡ t, ∅ · θ ≡ θ.)
このとき, 上の θ は, E の mgu である.
注意 2.1 以下は同値になる.
• 項の対の集合 E が単一化可能でない.
• (E, ∅) ⇒∗ (E , θ) となり, (E , θ) にはどの規則も適用でない. (E = ∅)
例 2.7 単一化アルゴリズムで, 以下の集合が単一化を持つか調べよ.
• {P (a, x, f(g(y))) =? P (z, f(z), f(u))}
• {f(x, x, g(x)) =? f(h(y), h(g(z)), g(h(u)))}
• {p(a, f(a)) =? p(x, x)}
• {f(g(x), y) =? f(y, x)}
2.3
一般単一化
定義 2.5
• L1 ∈ C1 , ¬L2 ∈ C2 とする. L1 と L2 が mgu σ を持つとする.
この時, 節 (C1 σ \ {L1 σ}) ∪ (C2 σ \ {¬L2 σ}) を C1 と C2 の 2 項導出節 (resolvent) という.
• 節 C の 2 個以上のリテラルが mgu σ を持つとき, Cσ を C の因子という.
6
• C1 と C2 の導出節
– C1 と C2 の 2 項導出節
– C1 の因子と C2 の 2 項導出節
– C1 と C2 の因子の 2 項導出節
– C1 の因子と C2 の因子の 2 項導出節
例 2.8 は, p(x) ∨ p(y) と ¬p(u) ∨ ¬p(v) の導出節.
• p(x) は, p(x) ∨ p(y) の因子
• ¬p(u) は, ¬p(u) ∨ ¬p(v) の因子
例 2.9 {¬p(x) ∨ q(y) ∨ r(x, f(x)), s(a), p(a), ¬r(r, x), ¬s(x) ∨ ¬q(x)} の反駁を示せ.
定理 2.3 S を節の集合とするとき, 以下は同値.
• S は, 充足不能.
• S の反駁が存在する.
アルゴリズム 2.2 P が P1 , . . . , Pn の論理的帰結か調べる.
• C1 , . . . , Cn を P1 , . . . , Pn のスコーレム連言標準形とする.
• C を ¬P のスコーレム連言標準形とする.
• C, C1, . . . , Cn の反駁が存在 ⇒ P は, P1 , . . . , Pn の論理的帰結.
– C, C1, . . . , Cn が充足不能.
– ¬P, P1 , . . . , Pn が充足不能.
– P1 , . . . , Pn の解釈が T ならば ¬P の解釈は F .
– P1 , . . . , Pn の解釈が T ならば P の解釈は T .
2.4
SLD 導出
定義 2.6 A, B1 , . . . , Bn を原始論理式とする.
• 下の形の節を確定節 (definite clause) と呼ぶ.
A ∨ ¬B1 ∨ . . . ∨ ¬Bn
確定節を以下のように書く.
A ← B1 , . . . , Bn
• 以下の形の節をゴール節という.
¬B1 ∨ . . . ∨ ¬Bn
ゴール節を以下のように書く.
← B1 , . . . Bn
定義 2.7
7
(n ≥ 0)
• 確定節 A ← B1 , . . . , Bm とゴール節 ← C1 , . . . , Cn の導出節.
← B1 θ, . . . , Bm θ, C2 θ, . . . , Cnθ
ただし, θ は A と C1 の mgu.
• 確定節の集合 P とゴール節 G からの Gn の SLD 導出
G1 , . . . , Gn
– Gi+1 は, P に含まれる確定節と Gi と導出節
– G1 ≡ G
定理 2.4 P を確定節の集合, Bi を原始論理式とする.
P |= ∃B1 ∧ . . . ∧ Bn ならば, P と ← B1 , . . . , Bn に対して SLD 反駁が存在する.
例 2.10 以下の確定節, ゴール節に対する SLD 反駁を示せ.
even(0)
even(succ(succ(x))) ← even(x)
← even(succ(y))
例 2.11 以下の確定節, ゴール節に対する SLD 反駁をすべて示せ.
add(x, 0, x)
add(x, succ(y), succ(z)) ← add(x, y, z)
← add(u, v, succ(succ(0)))
2.5
Prolog
• SLD 導出に基づくプログラミング言語.
• 深さ優先探索で SLD 反駁を探す.
– 確定節は, プログラムに現れる順番で順序付けられている.
例 2.12
• ファイル test.pl
even(0).
even(s(s(X))) :- even(X).
myappend([],Ys,Ys).
myappend([X|Xs],Ys,[X|Zs]):- myappend(Xs,Ys,Zs).
• ファイル test.pl を読み込む.
1 ?- [test].
Yes
2 ?- even(0).
Yes
8
3 ?- even(X).
X = 0 ;
X = s(s(0)) ;
X = s(s(s(s(0))))
Yes
4 ?- myappend(X,[3,4],[1,2,3]).
No
5 ?- myappend(X,[3,4],[1,2,3,4]).
X = [1, 2]
Yes
例 2.13 (停止性)
• ゴール節 myappend(X,[3,4],X) に対する導出は止まらない.
• 下のプログラムを考える.
even(s(s(X))) :- even(X).
even(0).
ゴール節 even(X) に対する導出は止まらない.
• 下のプログラムを考える.
myreverse([X|Xs],Zs) :- myreverse(Xs,Ys), append(Ys,[X],Zs).
myreverse([],[]).
myreversex([X|Xs],Zs) :- append(Ys,[X],Zs), myreversex(Xs,Ys).
myreversex([],[]).
– ゴール節 myreverse(X,[1,2]) に対する導出は止まらない.
– ゴール節 myreversex(X,[1,2]) に対する導出は止まる.
ラムダ計算と高階単一化
3
3.1
ラムダ計算
例 3.1 (ラムダ式) • 数学で関数を導入する時には, 以下のような定義で名前の付いた関数 f を導入する.
f x= x+1
• 同じ関数を付けずに表すために, λ 式の記法が用いられる.
λx.x + 1
• 関数適用
(λx.x + 1)2 = 2 + 1 = 3
9
定義 3.1 (ラムダ計算の構文)
• 変数は, ラムダ式.
• x が変数, t がラムダ式ならば, λx.t はラムダ式.
• t1 と t2 がラムダ式ならば, t1 t2 はラムダ式.
t ::= x | λx.t | tt
• 略記
t1 t2 t3 . . . tn ≡ (. . . ((t1 t2 )t3 ) . . . tn )
λx.t1 t2 ≡ λx.(t1 t2 )
定義 3.2 (自由変数 (free variable))
F V (x) =
F V (t1 t2 ) =
{x}
F V (t1 ) ∪ F V (t2 )
F V (λx.t) =
F V (t) \ {x}
定義 3.3 (アルファ同値) 束縛変数の名前の付け替えで, 同じ式と考えられる式をアルファ同値で
あるという.
λx.t =α λy.(t[y/x])
y ∈ F V (t)
• 以下, アルファ同値な式を同一視する.
例 3.2
λx.λy.xyz =α λy.λx.yxz
λx.λy.xyz =α λy.λz.yzz
定義 3.4 (代入 (substitution))
x[s/x] ≡ s
y[s/x] ≡ y
(x ≡ y)
(t1 t2 )[s/x] ≡ t1 [s/x]t2 [s/x]
(λx.t)[s/x] ≡ λx.t
(λy.t)[s/x] ≡ λy.(t[s/x])
(x ≡ y, y ∈ F V (s))
定義 3.5 (簡約 (reduction))
• β 簡約
(λx.t)s → t[s/x]
• η 簡約
λx.tx → t
ただし, x ∈ F V (t).
• t →∗β t : β 簡約を 0 回以上適用することで, t から t が得られる.
t →∗βη t : β 簡約, η 簡約を 0 回以上適用することで, t から t が得られる.
• t →β t となる式 t が存在しないとき, ラムダ式 t が β 正規形であるという. βη 正規形も
同様.
10
例 3.3
(λx.xx)(λx.xx) →β (λx.xx)(λx.xx) →β . . .
zλx.yx →η zy
例 3.4 (チャーチ数 (Church numeral)) 自然数 m を以下のラムダ式で表す.
m
= λx.λf.f(. . . (fx))
• 加算
add = λn.λm.λx.λf.(n(mxf)f)
• 乗算
mul = λn.λm.λx.λf.(nx(λz.mzf))
例 3.5 add 1 2 を簡約せよ.
定理 3.1 (Church-Rosser) t →∗ t1 かつ t →∗ t2 ならば, あるラムダ式 s が存在して, t1 →∗ s
かつ t2 →∗ s.
3.2
型付ラムダ計算
定義 3.6 (型付ラムダ計算の構文)
型
式
τ
t
::= b | τ → τ
::= c | x | λx.t | tt
ここで, c は定数記号.
定義 3.7 (型体系) Γ を以下の形式の変数と型の対応とする.
Γ ::= x1 : τ1 , . . . , xn : τn
• Γ t : τ は, 式 t が型 τ を持つことを意味する.
c ∈ Cτ
Γc:τ
x:τ ∈Γ
Γx:τ
Γ, x : τ1 t : τ2
Γ λx.t : τ1 → τ2
Γ t1 : τ1 → τ2 Γ t2 : τ1
Γ t1 t2 : τ2
例 3.6 ラムダ式 λx.λy.xy は, 型 (b → b) → b → b を持つ.
x : b → b, y : b x : b → b x : b → b, y : b y : b
x : b → b, y : b xy : b
x : b → b λy.xy : b → b
λx.λy.xy : (b → b) → b → b
例 3.7 m : b → (b → b) → b.
11
定義 3.8 (型体系 2) 各変数の型が決まっている場合.
c ∈ Cτ
c:τ
x ∈ Varτ
x:τ
x ∈ Varτ1 t : τ2
λx.t : τ1 → τ2
t1 : τ1 → τ2 t2 : τ1
t1 t2 : τ2
例 3.8 x ∈ V arb→b , y ∈ V arb とする.
x:b→b y:b
xy : b
λy.xy : b → b
λx.λy.xy : (b → b) → b → b
補題 3.1 ラムダ式が β 正規形でならば, 以下の形をしている.
• λx1 . . . xm .v t1 . . . tn .
• v は, 変数か定数.
• ti は, β 正規形.
定理 3.2
• β 簡約は, 強正規化性を持つ. (t1 →β t2 →β . . . となる無限列は存在しない.)
• βη 簡約は, 強正規化性を持つ.
3.3
高階単一化
記法 3.1 自由変数を大文字のアルファベット F, X, Y, . . . で表す.
• 正しいラムダ式
λx.F x
• 間違ったラムダ式
λx.xy
問題 3.1 (高階単一化) 単純型付ラムダ計算のラムダ式 t,s に対して, 以下を満たす代入 θ が存在
するか?
tθ =βη sθ
注意 3.1 =β η は, →β η の対称反射推移閉包.
例 3.9 自由変数 X の型を b → (b → b) → b とする.
λz.Xz(λy.y) =? λz.z
解は, 無限にある.
{X → λx.λf.x}
{X → λx.λf.fx}
{X → λx.λf.f(. . . (fx))}
代入 [t1 /X1 , . . . , tn /Xn ] を, {X → t1 , . . . , Xn → tn } と書くことにする.
12
定理 3.3
• 高階単一化問題は, 決定不能.
• 高階単一化問題は, semi-decidable.
定義 3.9 (long-βη 正規形) 以下の条件を満たすとき, λx1 ...xn.vs1 . . . sm は, long-βη 正規形で
あると言う.
• v : τ1 → . . . → τm → b. ただし, v は変数, または, 定数.
• si は, long-βη 正規形.
補題 3.2 βη 正規形のラムダ式 t に対して, long-βη 正規形のラムダ式 t が存在して以下が成り
立つ.
t →∗η t
例 3.10 変数 x の型が b → b, 変数 y の型が b の時.
λx.x =η λx.λy.xy
定数 f の型が b → (b → b) → b の時.
λy.fy =η ?
定義 3.10 λx1 . . . xk .v t1 . . . tn の形のラムダ式を考える.
• v が自由変数の場合, flexible であると言う.
• それ以外の場合, rigid であると言う.
補題 3.3 flexible なラムダ式の対は, 常に単一化を持つ.
λx1 . . . xk .F t1 . . . tm と λx1 . . . xk .G s1 . . . sn を考える.
{F → λx1 . . . xm .a, G → λx1 . . . xn .a}
例 3.11 flexible なラムダ式と rigid なラムダ式の単一化. 例として F a =? a の単一化を考える.
• Projection
{F → λx.x}
• Imitation
{F → λx.a}
アルゴリズム 3.1 (高階単一化) E を long-βη 正規形のラムダ式の等式の集合, θ を代入とする.
E と θ の対の変換 (E, θ) ⇒ (E , θ ) の規則を以下のように定める.
• Deletion
(E ∪ {t =? t}, θ) ⇒ (E, θ)
• Elimination
(E ∪ {F =? t}, θ) ⇒ (E[t/F ], θ · [t/F ])
ただし, F ∈ F V (t).
13
• Decomposition: v は, 定数または束縛変数.
(E ∪ {λxk .vt1 . . . tn =? λxk .vt1 . . . tn }, θ) ⇒ (E ∪
{λxk .ti =? λxk .ti }, θ)
1≤i≤n
• Imitation: v は, 定数または束縛変数.
(E∪{λxk .F t1 . . . tn =? λxk .vt1 . . . tm }, θ) ⇒ (E∪{F =? t, λxk .F t1 . . . tn =? λxk .vt1 . . . tm }, θ)
ここで, t = λyn .v (H1 y1 . . . yn ) . . . (Hm y1 . . . yn )
• Projection
– ラムダ式 ti は, 型 τ1 → . . . → τj → τ を持つ.
– v は, 定数または束縛変数.
(E∪{λxk .F t1 . . . tn =? λxk .v t1 . . . tm }, θ) ⇒ (E∪{F =? t, λxk .F t1 . . . tn =? λxk .v t1 . . . tm }, θ)
ここで, t = λyn .yi (H1 y1 . . . yn ) . . . (Hj y1 . . . yn ).
例 3.12 f ∈ Cb→b , a ∈ Cb とする.
({F (f a) =? f(F a)}, ∅)
⇒ ({F =? λx.f(Y x), F (f a) =? f(F a)}, ∅)
⇒ ({f(Y (f a)) =? f(f(Y a))}, [λx.f(Y x)/F ])
⇒ ({Y (f a) =? f(Y a)}, [λx.f(Y x)/F ])
Imitation
Elimination
Decomposition
⇒ ({Y =? λx.x, Y (f a) =? f(Y a)}, [λx.f(Y x)/F ]) Projection
Elimination
⇒ ({f a =? f a}, [λx.f x/F, λx.x/Y ])
例 3.13 f, g : b → b → b, F : b → b, x, G, G1, G2 : b とする.
{λx.F (fxG) =? λx.g(fxG1 )(fxG2 )}
定理 3.4 (完全性) s =? t が単一化 θ を持つならば, 以下の条件を満たす F ,δ が存在する.
({s =? t}, ∅) ⇒∗ (F, δ)
• F は flexible なラムダ式の等式の集合.
• δ は, θ より一般的.
例 3.14 単一化を持たない場合は, 止まるとは限らない.
X a =? f (Xa)
代入 [λx.f(Hx)/X] を考える.
f (H a) =? f (f (Ha))
14
3.4
高階単一化の決定不能性
定理 3.5 (Hilbert の第 10 問題) 係数が自然数の多項式 P (X1 , . . . , Xn ),Q(X1 , . . . , Xn ) に対し
て, 下の性質を満たす自然数 m1 , . . . , mn が存在するか判定する問題は, 決定不能.
P (m1 , . . . , mn ) = Q(m1 , . . . , mn )
多項式 P (X1 , . . . , Xn ),Q(X1 , . . . , Xn ) を以下のラムダ式で表現する.
p(X1 , . . . , Xn )
q(X1 , . . . , Xn )
ラムダ式 t が以下の等式の解ならば, t はチャーチ数
λz.Xz(λy.y) = λz.z
以下の等式の解を考える.
4
p(X1 , . . . , Xn ) =
q(X1 , . . . , Xn )
λz.X1 z(λy.y) =
..
.
λz.Xn z(λy.y) =
λz.z
λz.z
自然演繹 (Natural Deduction)
定義 4.1 (論理式 (formula))
• p(t1 , . . . , tn ) (p が n 引数の関数記号) (原始論理式 (atomic formula))
• ¬P ,P ∨ Q, P ∧ Q, P ⇒ Q, ∀x.P , ⊥, ∃x.P
定義 4.2 (自然演繹による証明) Γ を論理式の集合とする.
ΓP
ΓP ΓQ
∧I
ΓP ∧Q
ΓP ∧Q
∧E
ΓP
Γ, P Q
⇒I
ΓP ⇒Q
ΓP
∨I
ΓP ∨Q
(P ∈ Γ)
ΓQ
∨I
ΓP ∨Q
ΓP ∧Q
∧E
ΓQ
ΓP ⇒Q ΓP
⇒E
ΓQ
ΓP ∨Q
Γ P ∀I (x ∈ F V (Γ))
Γ ∀x.P
Γ, P R Γ, Q R
∨E
ΓR
Γ ∀x.P (x)
∀E
Γ P (t)
Γ, P ⊥
¬I
Γ ¬P
Γ P Γ ¬P
¬E
Γ⊥
Γ P (t)
∃I
Γ ∃x.P (x)
Γ ∃x.P (x) Γ, P (x) Q
∃E (x ∈ F V (Γ, Q))
ΓQ
Γ⊥
⊥
ΓP
Γ, ¬P ⊥
RAA
ΓP
15
• 古典論理 (classical logic): 上の規則を使って Γ P が導出できる時, Γ NK P と書く.
• 直観主義論理 (intuitionistic logic), 構成的論理 (constructive logic): RAA 以外の上の規則
を使って Γ P が導出できる時, Γ NJ P と書く.
注意 4.1 I の付いた規則を導入 (introduction) 規則といい, E の付いた規則を除去 (elimination)
規則という.
例 4.1
A∧B A∧B A∧B A∧B
A∧B B
A∧B A
A∧B B∧A
A∧B ⇒B∧A
例 4.2
• (A ⇒ B) ⇒ ((C ⇒ A) ⇒ (C ⇒ B)) の証明図.
• (P ∨ Q) ⇒ ((P ⇒ Q) ⇒ Q) の証明図.
• ∀x.P (x) ∨ Q ⇒ ∀x.(P (x) ∨ Q) の証明図. (ただし, x ∈ F V (Q)).
注意 4.2 ∀I の制限を取り除くと健全な証明にはならない.
x=0x=0
x = 0 ∀x.(x = 0)
x = 0 ⇒ ∀x.(x = 0)
∀x.(x = 0 ⇒ ∀x.(x = 0))
0 = 0 ⇒ ∀x.(x = 0)
例 4.3 NK では成り立つが, NJ で成り立たない性質.
• NK ¬¬P ⇒ P
¬¬P, ¬P ¬¬P ¬¬P, ¬P ¬P
¬¬P, ¬P ⊥
¬¬P P
¬¬P ⇒ P
• 排中律が NK で成り立つ. NK P ∨ ¬P , R = P ∨ ¬P
¬R, ¬¬P ¬¬P
¬R, ¬P ¬P
¬R, ¬¬P P
¬R, ¬¬P R
¬R, ¬¬P ¬R ¬R, ¬P R ¬R, ¬¬P ¬R
¬R, ¬¬P ⊥
¬R, ¬P ⊥
¬R ¬P
¬R P
¬R ⊥
P ∨ ¬P
• NK ¬(P ∧ Q) ⇒ ¬P ∨ ¬Q
• NK ¬∀x.P ⇒ ∃x.¬P
16
4.1
NJ の性質
定理 4.1 (disjunction property) NJ で P ∨ Q が証明可能ならば, P または Q が NJ で証明
可能.
定理 4.2 (existence property) NJ で ∃x.P が証明可能ならば, ある項 t が存在して, P [t/x] が
NJ で証明可能.
注意 4.3 NK では, 成立しない.
• P ∨ ¬P .
• ∃x.∀y(P (y) ⇒ P (x)).
4.2
Gödel の翻訳
定義 4.3 論理式から論理式への変換 P ◦ を以下のように定義する.
⊥◦
p(t1 , . . . , tn )◦
=
=
¬¬⊥
¬¬p(t1 , . . . , tn )
P ∧ Q◦
P ∨ Q◦
P ⇒ Q◦
∀x.P ◦
=
=
=
=
P ◦ ∧ Q◦
¬(¬P ◦ ∧ ¬Q◦ )
P ◦ ⇒ Q◦
∀x.P ◦
∃x.P ◦
=
¬∀x.¬P ◦
定理 4.3 Γ NK P と Γ◦ NJ P ◦ は, 同値である.
4.3
証明の簡約
例 4.4 ∧I と ∧E の組, ⇒ I と ⇒ E の組など I 規則と E 規則の組が証明に現れているとき証明
を簡約できる.
P, Q P P, Q Q
∧I
P, Q P ∧ Q
∧E
P, Q Q
P, Q P
∧I
P, Q Q ∧ P
P, Q Q P, Q P
∧I
P, Q Q ∧ P
P, Q, P ∧ Q P ∧ Q P, Q, P ∧ Q P ∧ Q
P, Q, P ∧ Q (P ∧ Q) ∧ (P ∧ Q)
P, Q P P, Q Q
⇒I
P, Q (P ∧ Q) ⇒ (P ∧ Q) ∧ (P ∧ Q)
P, Q (P ∧ Q)
⇒E
P, Q (P ∧ Q) ∧ (P ∧ Q)
P, Q P P, Q Q P, Q P P, Q Q
P, Q (P ∧ Q)
P, Q (P ∧ Q)
P, Q (P ∧ Q) ∧ (P ∧ Q)
注意: 簡約した証明が必ずしも小さくなるとはいえない.
17
例 4.5 ∧I と ∧E の組はないが, 簡約できる.
P ∨P P ∨P
P ∨ P, P P P ∨ P, P P
∧I
P ∨ P, P P ∧ P
P ∨P P ∧P
∧E
P ∨P P
P ∨P P ∨P
4.4
P ∨ P, P P
P ∨P P
P ∨ P, P P P ∨ P, P P
∧I
P ∨ P, P P ∧ P
∨E
P ∨ P, P P
Curry-Howard 同型対応
定義 4.4 (NJ のサブセット)
P ::= A | P ∧ Q | P ⇒ Q
A は, 命題変数.
定義 4.5 (型付ラムダ計算の構文)
型
式
τ ::= A | τ → τ | τ × τ
t ::= x | λx.t | tt | t, t | π0 (t) | π1 (t)
ここで, A は型変数.
(注意:ここでは, 定数を考えない)
Γ t0 : τ0 Γ t1 : τ1
Γ t0 , t1 : τ0 × τ1
Γ t : τ0 × τ1
Γ π0 (t) : τ0
Γ t : τ0 × τ1
Γ π1 (t) : τ1
簡約規則
π0 (t0 , t1 ) → t0
π1 (t0 , t1 ) → t1
例 4.6
x : (A → B) × A x : (A → B) × A x : (A → B) × A x : (A → B) × A
x : (A → B) × A π0 (x) : A → B
x : (A → B) × A π1 (x) : A
λx.π0 (x)π1 (x) : (A → B) × A → B
例 4.7
(λx.π0 (x)π1 (x))λy.y, v
→ π0 (λy.y, v)π1 (λy.y, v)
→ (λy.y)π1 (λy.y, v)
→ (λy.y)v
→ v
定義 4.6 (Curry-Howard の対応 (論理式と型))
Φ(A)
Φ(P ∧ Q)
=
=
A
Φ(P ) × Φ(Q)
Φ(P ⇒ Q)
=
Φ(P ) → Φ(Q)
18
定義 4.7 (Curry-Howard の対応 (証明と項)) 以下は同値.
• 論理式 P が証明可能.
• 型 Φ(P ) を持つ閉じたラムダ式が存在.
Γ t0 : Φ(P ) Γ t1 : Φ(Q)
Γ t0 , t1 : Φ(P ) × Φ(Q)
ΓP ΓQ
∧I
ΓP ∧Q
Γ t0 : Φ(P ) → Φ(Q) Γ t1 : Φ(P )
Γ t0 t1 : Φ(Q)
ΓP ⇒Q ΓP
⇒E
ΓQ
例 4.8 以下の証明図に対応するラムダ式: λx.π1 (x), π0 (x).
A∧B A∧B A∧B A∧B
A∧B B
A∧B A
A∧B B∧A
A∧B ⇒B∧A
例 4.9 (A ⇒ B) ⇒ ((C ⇒ A) ⇒ (C ⇒ B)) の証明図に対応するラムダ式.
定義 4.8 (Curry-Howard の対応 (証明と項の簡約)) 証明と項の簡約が対応している.
例 4.10 x : P , y, Q, z : P ∧ Q とする.
• P, Q Q ∧ P の証明の簡約
y, π0 x, y → y, x
• P, Q (P ∧ Q) ∧ (P ∧ Q) の証明の簡約
(λz.z, z)x, y → x, y, x, y
高階論理と Logical Framework
5
5.1
高階論理 (Higher Order Logic)
定義 5.1 (直観主義高階論理)
• 型: b は基本型, prop は論理式の型
τ ::= b | prop | τ → τ
• 項
t ::= c | x | ∀x : τ.t | τ ⇒ τ | tt | λx.t
c ∈ Cτ
c:τ
x ∈ V arτ
x:τ
x ∈ V arτ1 t : τ2
λx.t : τ1 → τ2
t1 : τ1 → τ2 t2 : τ1
t1 t2 : τ2
t1 : prop t2 : prop
t1 ⇒ t2 : prop
型 prop の項をメタ変数 φ,ψ で表す.
19
x ∈ V arτ t : prop
∀x.t : prop
例 5.1
• 数学的帰納法 P : nat → prop, x : nat
∀P.((P 0) ⇒ ∀x.(P x ⇒ P (x + 1)) ⇒ ∀x.P x)
• 関係が推移的. R : τ → τ → prop, x, y, z : τ .
λR.∀x.∀y.∀z.(Rxy ⇒ Ryz ⇒ Rxz)
定義 5.2 高階論理による証明を定義する. Γ φ は, Γ を仮定して φ が証明できることを意味し
ている.
φ∈Γ
axiom
Γφ
Γ φ ψ =β φ
conv
Γψ
Γ, φ ψ
⇒I
Γφ⇒ψ
Γφ⇒ψ Γφ
⇒E
Γψ
Γ φ x ∈ F V (Γ)
∀I
Γ ∀x.φ
Γ ∀x.φ
t : τ x ∈ V arτ
∀E
Γ φ[t/x]
例 5.2 x : b → b, y, c : b とする.
∀x.∀y.P (xy) ∀x.∀y.P (xy)
∀E
∀x.∀y.P (xy) ∀y.P ((λy.y)y)
∀E
∀x.∀y.P (xy) P ((λy.y)c)
P ((λy.y)c) = P c
conv
∀x.∀y.P (xy) P c
例 5.3 以下のように他の論理結合子を定義できる.
φ∧ψ
::= ∀x.(φ ⇒ ψ ⇒ x) ⇒ x
φ ∨ ψ ::= ∀x.(φ ⇒ x) ⇒ (ψ ⇒ x) ⇒ x
⊥ ::= ∀x.x
¬φ ::= φ ⇒ ⊥
ただし, x : prop.
• φ∧ψ φ
φ ∧ ψ, φ, ψ φ
⇒I
φ∧ψ φ∧ψ
φ ∧ ψ, φ ψ ⇒ φ
∀E
⇒I
φ ∧ ψ (φ ⇒ ψ ⇒ φ) ⇒ φ
φ∧ψ φ ⇒ ψ ⇒ φ
⇒E
φ∧ψ φ
• φ φ ∨ ψ, ⊥ φ
5.2
Logical Framework としての高階論理
注意 5.1 Logical Framework : 論理体系を形式化する体系
• メタ論理 : 高階論理
• オブジェクト論理 : 一階述語論理
20
定義 5.3 NJ の論理式を以下の形式に制限した体系を考える.
P ::= p(t1 , . . . , tn ) | ⊥ | P ⇒ Q | ∀x.P
この体系の証明を Γ N P を書くことにする.
定義 5.4 述語論理を以下のようにして, 高階論理に埋め込む.
• 基本型: o (オブジェクト論理の論理式の型)
• 定数記号 c に対して, c ∈ Cb .
• n 引数の関数記号 f に対して, f ∈ Cb→...→b→b
• n 引数の述語記号 p に対して, p ∈ Cb→...→b→o
• 高階論理の定数として以下のものを考える.
imp
: o→o→o
forall : (b → o) → o
false : o
Φ(x) =
Φ(c) =
Φ(f(t1 , . . . , tn ))
Φ(p(t1 , . . . , tn ))
Φ(P ⇒ Q)
Φ(∀x.P )
=
=
=
=
x
c
f Φ(t1 ) . . . Φ(tn )
p Φ(t1 ) . . . Φ(tn )
imp Φ(P ) Φ(Q)
forall(λx.Φ(P ))
例 5.4 ∀x.p(x, x) ⇒ p(f(y), f(y)) の埋め込み.
imp(forall(λx.p x x))(p(f y)(f y))
例 5.5 ∀x.p(x) ⇒ ∀y.q(x, y) の埋め込み.
補題 5.1 t を一階述語論理の項, P を一階述語論理の論理式とする.
• Φ(t) : b
• Φ(P ) : o
定義 5.5 (証明の埋め込み) 以下の型をもつ定数 nd を用いて, P が証明で可能であることを表す.
nd : o → prop
注意: 以下が同値になるようにしたい.
• P が一階述語論理で証明できる.
• nd(Φ(P )) が高階論理で証明できる.
21
定義 5.6 (推論規則の埋め込み) 以下の公理を高階論理に入れることで, 推論規則を埋め込む.
(nd(φ) ⇒ nd(ψ)) ⇒ nd(imp φ ψ)
nd(imp φ ψ) ⇒ nd(φ) ⇒ nd(ψ)
∀x.nd(φ) ⇒ nd(forall(λx.φ))
nd(forall(λx.φ)) ⇒ nd(φ[t/x])
nd(false) ⇒ nd(φ)
この公理の集合を N D とする. (x ∈ V arb ).
例 5.6
P, P ⇒ ⊥ N P ⇒ ⊥ P, P ⇒ ⊥ N P
⇒E
P, P ⇒ ⊥ N ⊥
⇒I
P N (P ⇒ ⊥) ⇒ ⊥
⇒I
N P ⇒ ((P ⇒ ⊥) ⇒ ⊥)
Γ A3
HOL
Γ
Γ nd(Q)
nd(P ) ⇒ nd(false)
Γ HOL nd(P )
N D, nd(P ), nd(Q) HOL nd(false)
N D, nd(P ) HOL A2
N D, nd(P ) HOL nd(Q) ⇒ nd(false)
N D, nd(P ) HOL nd(impQfalse)
N D HOL A1
N D HOL nd(P ) ⇒ nd(impQfalse)
N D HOL nd(imp P (impQfalse))
Q ≡
Γ
A1
A2
A3
≡
≡
≡
≡
imp P false
N D, nd(P ), nd(Q)
(nd(P ) ⇒ nd(impQfalse)) ⇒ nd(imp P (impQfalse))
(nd(Q) ⇒ nd(false)) ⇒ nd(impQfalse)
nd(imp P false) ⇒ nd(P ) ⇒ nd(false)
注意: A1 , A2 , A3 は, N D に含まれる公理.
例 5.7 以下の証明を高階論理に埋め込め.
∀x.p(x) ∀x.p(x)
∀x.p(x) p(f(y))
∀x.p(x) ∀y.p(f(y))
N ∀x.p(x) ⇒ ∀y.p(f(y))
定理 5.1 (Adequacy) 以下は同値.
• N D HOL nd(Φ(P ))
• N P
22
Isabelle のメタ論理
5.3
定義 5.7 (Isabelle の記法)
• 型
高階論理
Isabelle
----------------------------------prop
prop
nat → nat
nat => nat
nat → nat → nat
[nat,nat] => nat
• 項
高階論理
Isabelle
----------------------------------λx.λy.xy
%x.%y.xy
P ⇒Q
P ⇒Q⇒R
∀x.P (x)
P ==> Q
[|P; Q|] ==> R
!!x.P(x)
自由変数
?x, ?P
定義 5.8 (Isabelle による論理の定義) 直観主義一階述語論理の定義の一部
theory IFOL = Pure
typedecl o
judgment
Trueprop
:: "o => prop"
consts
-->
:: "[o, o] => o"
All
axioms
impI:
mp:
allI:
spec:
(infixr 25)
:: "(’a => o) => o"
"(P ==> Q) ==> P-->Q"
"[| P-->Q; P |] ==> Q"
"(!!x. P(x)) ==> (All (%x. P(x)))"
"(All (%x. P(x))) ==> P(x)"
end
例 5.8 (Isabelle による証明)
theory foltest = IFOL:
lemma "P --> ((P --> false) --> false)"
apply (rule impI)
23
apply (rule impI)
apply (rule mp)
apply (assumption)
apply (assumption)
done
end
例 5.9 (Isabelle による証明)
lemma "P --> ((P --> false) --> false)"
proof (rule impI)
assume P
show "(P --> false) --> false"
proof (rule impI)
assume "P --> false"
show "false"
proof (rule mp)
show "P --> false"
by assumption
show "P"
by assumption
qed
qed
qed
5.4
Isabelle の推論規則
定義 5.9 (ゴール) 証明すべきことは, 以下の形をしたサブゴールのリストで与えられる.
!!x1...xn.[| P1; P2; ....; Pn |] ==> P
P は, 原始論理式 (!!,==>を含まない).
注意: 以下は同値
• P ⇒ ∀x.Q(x)
• ∀x.P ⇒ Q(x)
ただし, x ∈ F V (P ).
定義 5.10 (推論規則: 仮定 (assumption))
• ゴール: [| P1; P2; ....; Pn |] ==> P
• P と Pi が単一化を持つ.
• このゴールは, 証明できた.
(他のゴールに単一化を適用する必要がある. )
例 5.10
24
lemma "P(f (x)) ==> P(?y)"
apply (assumption)
done
上の証明で以下の定理が証明されたことになる.
P(f(x)) ==> P(f(x))
P はどんな論理式でも, f, x はどんな項でもいいので, 以下の補題が証明できたことになる
lemma ?P(?f(?x)) ==> ?P(?f(?x))
定義 5.11 (導出原理に基づく推論: rule)
• ゴール: P
• 定理 : [| Q1; Q2; ...
; Qn |] ==> Q
• P と Q が単一化 θ を持つ
• 新ゴール: Q1’,Q2’,....,Qn’
Qi’ は Qi に代入 θ を適用した論理式
例 5.11 導出 (rule impI)
• ゴール: P --> ((P --> false) --> false)
• 定理 : (?P ==> ?Q) ==> ?P--> ?Q
• 新ゴール : P ==> ((P --> false) --> false)
定義 5.12
• ゴール: P1 ==> P
• 定理: [| Q1; Q2; ...
; Qn |] => Q
• P と Q が単一化 θ を持つ: ゴールと以下の論理式の導出
[| P1 ==> Q1; P1 ==> Q2... ; P1 ==> Qn |] ==> (P1 ==> Q)
• 新ゴール: P1’ ==> Q1’,P1’ ==> Q2’,....,P1’ ==> Qn’
P1’ は P1 に代入 θ を適用した論理式 Qi’ は Qi に代入 θ を適用した論理式.
例 5.12 導出 (rule mp)
• ゴール: [| P; P --> false |] ==> false
• 定理 : [|?R; ?R --> ?Q |]==> ?Q
[|[| P; P --> false |] ==> ?R;
[| P; P --> false |] ==> ?R --> ?Q |]==> ([| P; P --> false |] ==> ?Q)
• 新ゴール :
– [| P; P --> false |] ==> ?R
– [| P; P --> false |] ==> ?R --> false
25
定義 5.13 (Isabelle のインストール)
• 以下の URL を参照して Isabelle をインストールしてください.
http://www.cl.cam.ac.uk/Research/HVG/Isabelle/dist/packages.html
• 以下のコマンドで FOL 一階述語論理を使えるようにしてください.
% cd /usr/local/Isabelle
% ./build FOL
• xemacs が必要です.
• 以下のコマンドで, 一階述語論理を使った証明を, ファイル foltest.thy に作成できます.
/usr/local/Isabelle/bin/Isabelle -l FOL foltest.thy
6
Isabelle/HOL
6.1
Isabelle の推論規則
例 6.1 (Isabelle の実行)
• 以下のコマンドは, 論理 FOL を用いて foltest.thy というファイルに証明を書くことを意
味している.
/usr/local/Isabelle/bin/Isabelle -l FOL foltest.thy
• 一行検証を進めるには, C-c C-n.
• 一行戻るには, C-c C-u.
theory foltest = IFOL:
lemma "All (%x. P(x)) --> All (%y. P(f(y)))"
apply (rule impI)
apply (rule allI)
apply (rule spec)
apply (assumption)
done
– 一行目は, このファイルに作る理論 (theory) の名前が foltest であり foltest が理論
IFOL に基づいていることを示している.
定義 6.1 (導出原理の基づく推論 (rule))
• ゴール: !!x.P
• 定理: [|Q ?y; R ?y |]=> S ?y
[|!!x.Q (?y x); !!x.R (?y x)|]=> !!x.S (?y x)
26
• %x.P と%x.S (?y x) の単一化を考えて導出.
例 6.2 導出 (rule spec)
• ゴール: !!y.All (%x.P(x)) ==> P(f(y))
• 定理 spec : (All (%z.
?Q(z))) ==> ?Q(?z)
[|!!y. All (%x.P(x)) ==> (All (%x. ?Q y x)) |]
==> (!!y.All (%x.P(x))==> ?Q y (?z y))
• %y.P(f(y)) と%y.?Q y (?z y) には, 3 つ単一化が存在する.
• 新ゴール
– ?Q = %ab.P(f a) の場合
!!y. All (%x.P(x)) ==> (All (%x. P(f(y))))
– ?Q = %ab.P(f b),?z = %a.a の場合
!!y. All (%x.P(x)) ==> (All (%x. P(f(x))))
– ?Q = %ab.Pb,?z = % a.fa の場合
!!y. All (%x.P(x)) ==> (All (%x. P(x))))
例 6.3 ラムダ式に書き直すと λy.p(f(y)) と λy.Q y(Z y) の単一化の問題
Q
Q
= λab.p(fa)
= λab.p(fb),
Z
= λa.a
Q
= λab.P b,
Z
= λa.fa
• Imitation: Q = λab.p(Rab)
λy.f(y) =? λy.Ry(Zy)
– Imitation: R = λab.f(Sab)
λy.y =? λy.Sy(Zy)
∗ Projection: S = λab.a
∗ Projection: S = λab.b, Z = λa.a
– Projection: R = λab.b, Z = λa.fa
例 6.4 (別の単一化による導出)
lemma "All (%x. P(x)) --> All (%y. P(f(y)))"
apply (rule impI)
apply (rule allI)
apply (rule spec)
back
back
次の単一化による導出
例 6.5 (定理に対する代入)
27
lemma "All (%x. P(x)) --> All (%y. P(f(y)))"
apply (rule impI)
apply (rule allI)
定理 spec の一つ目の自由変数に P を代入
apply (rule spec[of P])
単一化は一種類
6.2
HOL
定義 6.2 (チャーチの高階論理 (HOL))
• 型
τ ::= o | i | τ → τ
• 項
t ::= c | x | tt | λx.t | t ⇒ t | t = t | t
– (λx.t)(Hilbert の 演算子) の意味. x は, τ 型とする.
∗ t を満たす要素 x が存在するとき. t を満たす τ 型の任意の元.
(λx.x > 1)
∗ t を満たす要素 x が存在しないとき. τ 型の任意の元.
c ∈ Cτ
c:τ
x ∈ V arτ
x:τ
x ∈ V arτ1 t : τ2
λx.t : τ1 → τ2
t1 : τ1 → τ2 t2 : τ1
t1 t2 : τ2
t1 : τ t2 : τ
t1 = t2 : o
t1 : o t2 : o t : τ → o
t1 ⇒ t2 : o
t : o
定義 6.3 (HOL の証明規則)
φ∈Γ
axiom
Γφ
Γ (λx.t1 )t2 = t1 [t2 /x]
Γt=t
refl
Γ t = t Γ s[t/x]
subst
Γ s[t /x]
beta
Γφ⇒ψ Γφ
⇒E
Γψ
Γ, φ ψ
⇒I
Γφ⇒ψ
例 6.6 以下のように他の論理結合子を定義できる.
::= (λx.x) = (λx.x)
∀φ ::= φ = (λx.)
∃φ ::= ∀ψ.(∀x.φx ⇒ ψ) ⇒ ψ
⊥
φ∧ψ
φ∨ψ
::= ∀φ.φ
::= ∀x.(φ ⇒ ψ ⇒ x) ⇒ x
::= ∀x.(φ ⇒ x) ⇒ (ψ ⇒ x) ⇒ x
¬φ ::= φ ⇒ ⊥
28
定義 6.4 (公理)
∀φ.∀ψ.(φ ⇒ ψ) ⇒ (ψ ⇒ φ) ⇒ (φ = ψ)
∀φ.(φ = ) ∨ (φ = ⊥)
∀φ.∀x.φx ⇒ φ((φx))
6.3
Isabelle/HOL
定義 6.5 (オブジェクト論理の文法)
HOL
Isabelle/HOL
----------------------------------
True
⊥
P ⇒Q
P ∧Q
P ∨Q
False
P --> Q
P & Q
P | Q
¬ P
~P
∀(λx.P (x))
∃(λx.P (x))
!x.P(x)
? x.P(x)
----------------------------------例 6.7 (Isabelle/HOL の使い方)
• コマンド: Isabelle holtest.thy (ディフォルトの論理は, HOL)
theory holtest = Main:
lemma "P --> ((P --> false) --> false)"
apply (rule impI)
apply (rule impI)
apply (rule mp)
apply (assumption)
apply (assumption)
done
定義 6.6 (Isabelle/HOL の論理)
impI:
mp:
(P ==> Q) ==> P-->Q
[| P-->Q;
P |] ==> Q
notI: (P ==> False) ==> ~P
notE: [| ~P; P |] ==> R
conjI: [| P; Q |] ==> P & Q
conjunct1: P & Q ==> P
29
conjunct2: P & Q ==> Q
conjE: [| P & Q; [| P; Q |] ==> R |] ==> R
disjI1: P ==> P | Q
disjI2: Q ==> P | Q
disjE: [| P | Q; P ==> R; Q ==> R |] ==> R
allI:
spec:
allE:
(!!x. P x) ==> ALL x. P x
ALL x. P x ==> P x
[| ALL x. P x; P x ==> R |] ==> R
exI: P x ==> EX x. P x
exE: [| EX x. P x; !!x. P x ==> Q |] ==> Q
FalseE: False ==> P
ccontr: (~ P ==> False) ==> P
消去規則
6.4
例 6.8
• ゴールの形: [| A | B; C1; ...; Cn|] ==> D
• ゴールの仮定の中の|を消去する推論を行う.
Γ, P R Γ, Q R
Γ, P ∨ Q R
[| ?P | ?Q; ?P ==> ?R; ?Q ==> ?R |] ==> ?R
定義 6.7 (導出原理に基づく推論: erule)
• ゴール: P1 ==> P
• 定理 : [| Q1; Q2 => ?R|] ==> ?R
• ゴールと定理で導出
• 中間ゴール
P1 ==> Q1
[| P1;Q2|] ==> P
• P1 ==> Q1 を assumption で証明.
• 中間ゴール
[| P1’;Q2’|] ==> P’
• 新ゴール: erule では, 仮定 P1’ を消去して以下の形のゴールが残る.
30
Q2’ ==> P’
例 6.9
lemma disjexch: "P | Q ==> Q | P"
apply (erule disjE)
apply
apply
apply
apply
(rule disjI2)
(assumption)
(rule disjI1)
(assumption)
done
disjexch がこの補題の名前になる.
例 6.10 以下を Isabelle/HOL で証明せよ.
• (A ⇒ B) ⇒ ((C ⇒ A) ⇒ (C ⇒ B)).
• (P ∨ Q) ⇒ ((P ⇒ Q) ⇒ Q).
• ∀x.P (x) ∨ Q ⇒ ∀x.(P (x) ∨ Q). (ただし, x ∈ F V (Q)).
• ¬¬P ⇒ P .
例 6.11 (自動証明)
lemma "(P | Q) --> (P --> Q) --> Q"
apply (auto)
例 6.12 (定数の定義)
constdefs
xor :: "[bool, bool] => bool"
"xor A B == (A & ~B) | (~A & B)"
xor_def という名前で, 上の定義が定理として登録される.
例 6.13 (定義の展開) 証明法 simp は, ゴールを書き換えによって単純化する.
lemma "xor A (~A)"
apply (simp only: xor_def)
apply (auto)
done
• :only xor_def は, xor_def のみを書き換えに用いることを示している.
例 6.14
• ... の部分を埋めて, myand, myall を完成せよ.
constdefs
myand :: "[bool, bool] => bool"
"myand == ..."
myall :: "(’a => bool) => bool"
"myall == ..."
31
上の myall のように多相型を持つ定数を定義できる.
• 下の補題を証明せよ.
lemma "myand P Q --> P"
lemma "myall (%x. P x) ==> P t"
定義 6.8 (Hilbert の 演算子)
• Isabelle/HOL での記法 Eps.
Eps(%x. P x) を SOME x.P x と書く.
• 公理
someI: "P (x::’a) ==> P (SOME x. P x)"
例 6.15 (Hilbert の 演算子)
• 逆関数の定義
constdefs
inv :: "(’a => ’b) => (’b => ’a)"
"inv(f :: ’a => ’b) == %y. SOME x. f x = y"
• 下の補題を証明せよ.
lemma "inv (%x. x) = (%x. x)
以下の HOL の公理を用いてよい.
ext:
"(!!x::’a. (f x ::’b) = g x) ==> (%x. f x) = (%x. g x)"
refl:
"t = (t::’a)"
例 6.16 (選択公理 (axiom of choice) の証明) 「任意の集合の集合 a に対して, a から
の関数 f が存在して, x ∈ a かつ x = ∅ ならば f(x) ∈ x」
lemma "(!x. ? y. Q x y) --> (? f. ! x. Q x (f x))"
Q:’a -> ’b -> bool を集合の集合と考えられる.
課題 6.1 以下の補題を証明せよ.
lemma "~(P & Q) --> (~P |~Q)"
lemma "(~ (!x. P x)) --> (? x.~(P x))"
Isabelle/HOL: データ型、原始帰納関数、帰納法
7
7.1
自然数と原始帰納関数
例 7.1 (自然数)
• 型: nat
32
aへ
• 定数: 0:nat, Suc:nat => nat
• 関数: +, -, *
• 関係: <, <=
例 7.2 (自然数に関する証明)
lemma "Suc(0) <= Suc(Suc(0)) + Suc(0)"
apply (simp)
done
定義 7.1 (原始帰納関数)
f(x1 , . . . , xn, 0) = g(x1 , . . . xn )
f(x1 , . . . , xn, y + 1) = h(x1 , . . . , xn , y, f(x1 , . . . , xn , y))
関数 g, h は, 既に定義されている関数.
例 7.3 (原始帰納関数)
consts
add :: "[nat, nat] => nat"
primrec
"add 0 y = y"
"add (Suc x) y = Suc (add x y)"
上の定義が, ディフォルトの書き換え規則に加えられる.
lemma "add (Suc 0) (Suc 0) = Suc (Suc 0)"
apply (simp)
done
例 7.4 (数学的帰納法による証明)
lemma "add x (add y z) = add (add x y) z"
apply (induct x)
apply (simp)
x に関する帰納法
apply (simp)
done
例 7.5
• 乗算を定義せよ. 加算を用いる場合は, +を用いること.
consts
mul :: "[nat, nat] => nat"
• 以下の定理を証明せよ.
lemma "mul x (y + z) = (mul x y) + (mul x z)"
課題 7.1 以下の定理を証明せよ. 幾つか補題を証明しておく必要がある.
lemma "add x y = add y x"
33
7.2
リストと帰納法
定義 7.2 (リストの定義) Isabelle/HOL では, 以下のようにリストが定義されてりる.
datatype ’a list = Nil
("[]")
| Cons ’a "’a list" (infixr "#" 65)
#を, 0#[] のように中置記法の演算子として使えるように定義されている.
例 7.6 Main では, 既にリストが定義されているので, 以下のようにして PreList をベースにし
てリストを定義する.
theory MyList = PreList:
datatype ’a list = Nil
("[]")
| Cons ’a "’a list" (infixr "#" 65)
定義 7.3 (原始帰納関数の定義)
consts
app :: "[’a list, ’a list] => ’a list" (infixr "@" 65)
rev :: "’a list => ’a list"
primrec
"[]@ ys = ys"
"(x#xs)@ys = x#(xs@ ys)"
primrec
"rev [] = []"
"rev (x#xs) = (rev xs)@(x#[])"
例 7.7 (リストに関する帰納法)
lemma app_Nil2: "xs@[] = xs"
apply (induct xs)
apply (simp)
apply (simp)
done
以下のようにすると, この定理が simp で標準的に使われる書き換えの規則に加えられる.
lemma app_Nil2[simp]: "xs@[] = xs"
例 7.8 以下の補題を証明せよ.
lemma app_assoc: "(xs@ys)@zs = xs@(ys@zs)"
lemma rev_app: "rev (xs@ys) = rev ys @ rev xs"
lemma "rev (rev xs) = xs"
課題 7.2 リストの反転を別の方法で以下のように定義する.
consts
itrev :: "[’a list, ’a list] => ’a list"
primrec
"itrev [] ys = ys"
"itrev (x#xs) ys = itrev xs (x#ys)"
34
このとき, 以下の定理を証明せよ.
lemma "itrev xs [] = rev xs"
注意: 補助的な補題が必要になる.
データ型を定義するとなにが起こるか
7.3
例 7.9
• データ型 nat を定義すると nat_rec が定義される.
datatype nat = 0 | Suc nat
コマンド term nat_rec の型を調べられる.
"nat_rec" :: "[’a, [nat, ’a] => ’a, nat] => ’a"
nat.recs という名前で, 以下の定理が加えられる.
nat_rec ?f1.0 ?f2.0 0 = ?f1.0
nat_rec ?f1.0 ?f2.0 (Suc ?nat) = ?f2.0 ?nat (nat_rec ?f1.0 ?f2.0 ?nat)
例 7.10 constdefs
myadd ::
"myadd x
mymul ::
"mymul x
"[nat, nat] =>
y == nat_rec y
"[nat, nat] =>
y == nat_rec 0
nat"
(%a.%b. Suc b) x"
nat"
(%a. %b. myadd b y) x"
例 7.11 (帰納法) データ型を定義すると帰納法の定理が加えられる.
• nat.induct
[| ?P 0; !!n. ?P n ==> ?P (Suc n) |] ==> ?P ?n
nat.induct を直接使うこともできる.
lemma "add x (add y z) = add (add x y) z"
apply (rule nat.induct [of _ x])
apply (simp)
apply (simp)
done
7.4
集合
定義 7.4 (集合の記法)
• t set: t 型の集合
35
数学
Isabelle/HOL
---------------------------------∅
{}
x∈A
A⊂B
A∪B
A∩B
x:A
A <= B
A Un B
A Int B
A\B
{x}
A - B
{x}
例 7.12
lemma "(A Un B) Int C = (A Int C) Un (B Int C)"
apply (auto)
done
lemma "x : (A Un {y}) --> (x : A | x = y)"
apply (auto)
done
7.5
例: 式の評価
定義 7.5
• 以下の文法で定義される式の評価を考える.
e ::= i | x | e + e | e − e
– i は, 自然数の定数
– x は, 変数
• σ を変数から自然数への関数とする.
[[i]]σ
[[x]]σ
[[e1 + e2 ]]σ
[[e1 − e2 ]]σ
=
=
=
=
例 7.13
• 式の形式化
types var = nat
datatype exp =
|
|
|
NatExp nat
VarExp var
PlusExp exp exp
MinusExp exp exp
注意: 変数を自然数で表している.
36
i
σ(x)
[[e1 ]]σ + [[e2 ]]σ
[[e2 ]]σ − [[e2 ]]σ
• 評価
consts
eval :: "[exp, var => nat] => nat"
primrec
"eval
"eval
"eval
"eval
(NatExp i) env = i"
(VarExp x) env = env x"
(PlusExp e1 e2) env = eval e1 env + eval e2 env"
(MinusExp e1 e2) env = eval e1 env - eval e2 env"
例 7.14
• 自由変数の定義
consts
fv :: "exp => var set"
primrec
"fv (NatExp i) = {}"
"fv (VarExp x) = {x}"
"fv (PlusExp e1 e2) = fv e1 Un fv e2"
"fv (MinusExp e1 e2) = fv e1 Un fv e2"
• 証明
lemma "!env. (!x. (x:fv exp --> env1 x = env2 x)) --> eval exp env1 = eval exp env2"
apply (induct exp)
apply (auto)
done
7.6
集合の帰納的定義
例 7.15
• 偶数の集合の定義
consts
even :: "nat set"
inductive even
intros
even_base: "0 : even"
even_step: "x : even ==> Suc (Suc x) : even"
• 導入規則: even_base,even_step が定理になる.
• even.induct: 帰納法の定理が自動的に生成される
[| ?xa : even; ?P 0; !!x. [| x : even; ?P x |] ==> ?P (Suc (Suc x)) |]
==> ?P ?xa
37
例 7.16 even.induct による証明.
lemma "x : even --> y : even --> x + y : even"
apply (rule impI)
apply
apply
apply
apply
(erule even.induct)
(simp)
(rule impI)
(simp)
apply (rule even_step)
apply (assumption)
done
例 7.17
• 下の集合を帰納法で定義せよ.
{2n 3m | n, m ∈ N }
• 下を定理を証明せよ.
lemma "x : twothree --> y : twothree --> x * y : twothree"
注意: 乗算の結合律を以下の形で使う.
apply (simp add: mult_assoc)
8
8.1
多相型, 依存型
System F
定義 8.1 (多相ラムダ計算 (Polymorphic lambda calculus,System F))
型
項
x:τ ∈Γ
Γx:τ
τ ::= α | τ → τ | ∀α.τ
t ::= x | λx : τ.t | tt | Λα.t | t[τ ]
Γ, x : τ1 t : τ2
Γ λx : τ1 .t : τ1 → τ2
Γ t : τ α ∈ F T V (Γ)
Γ Λα.t : ∀α.τ
Γ t1 : τ1 → τ2 Γ t2 : τ1
Γ t1 t2 : τ2
Γ t : ∀α.τ
Γ t[τ ] : τ [τ /α]
例 8.1 (λx : ∀α.α → α.(x[β → β])(x[β]))(Λα.λx : α.x) : β → β
x : ∀α.α → α x[β → β] : (β → β) → (β → β) x : ∀α.α → α x[β] : (β → β)
x : ∀α.α → α (x[β → β])(x[β]) : β → β
λx : ∀α.α → α.(x[β → β])(x[β]) : (∀α.α → α) → (β → β)
Λα.λx : α.x : ∀α.α → α
(λx : ∀α.α → α.(x[β → β])(x[β]))(Λα.λx : α.x) : β → β
例 8.2 型を list(τ ) で拡張する.
nil : ∀α.list(α)
cons : ∀α.α → list(α) → list(α)
38
• cons[nat]1(nil[nat]) : list(nat)
• Λα.λf:β → α.λx:β.cons[α](fx)(nil[α]) の型を示せ.
定義 8.2 (簡約)
(λx : τ.t)s →β t[s/x]
(Λα.t)[τ ] →β t[τ /α]
例 8.3
(λx : ∀α.α → α.(x[β → β])(x[β]))(Λα.λx : α.x)
→β
→β
→β
→β
(Λα.λx : α.x)[β → β]((Λα.λx : α.x)[β])
(λx : β → β.x)((Λα.λx : α.x)[β])
(λx : β → β.x)(λx : β.x)
(λx : β.x)
定義 8.3 (高階命題論理)
• 論理式
φ ::= x | ∀x.φ | φ ⇒ φ
• 証明
Γ, φ ψ
⇒I
Γφ⇒ψ
φ∈Γ
axiom
Γφ
Γ φ x ∈ F V (Γ)
∀I
Γ ∀x.φ
• 他の論理演算子
Γφ⇒ψ Γφ
⇒E
Γψ
Γ ∀x.φ
∀E
Γ φ[ψ/x]
φ∧ψ
::= ∀x.(φ ⇒ ψ ⇒ x) ⇒ x
φ∨ψ
⊥
::= ∀x.(φ ⇒ x) ⇒ (ψ ⇒ x) ⇒ x
::= ∀x.x
例 8.4 型 (∀α.(A → B → α) → α) → A のラムダ式を見つけよ. A ∧ B ⇒ A の証明をラムダ式
として書くことになる.
8.2
依存型
例 8.5 (依存型 (dependent type))
• 長さが 10 のリストの型
list(10)
• 長さが x のリストに対して, 長さが 2x のリストを返す関数
λx.x@x : list(x) → list(2x)
定義 8.4 (依存型ラムダ計算)
• 構文
型
κ ::= ∗ | Πx : τ.κ
τ ::= b | Πx : τ.τ | τ t
項
t ::= x | λx : τ.t | tt
カインド
注意: 直観的には, カインドは型の型. 通常の型のカインドは ∗.
カインドの例: list : Πx : nat.∗.
依存型の例: Πx : nat.Πy : list(x).list(x + 1).
39
• 判定 Γ κ
Γ, x : τ κ
Γ Πx : τ.κ
Γ∗
• 判定 Γ τ : κ
Γ τ : Πx : τ .κ Γ t : τ Γ τ t : κ[t/x]
Γ, x : τ1 τ2 : ∗
Γ Πx : τ1 .τ2 : ∗
b ∈ Tκ
Γb:κ
Γ τ : κ κ =β κ
Γτ :κ
• 判定 Γ t : τ
Γ t1 : Πx : τ1 .τ2 Γ t2 : τ1
Γ t1 t2 : τ2 [t2 /x]
Γ, x : τ1 t : τ2 Γ Πx : τ1 .τ2 : ∗
Γ λx : τ1 .t : Πx : τ1 .τ2
c ∈ Cτ
Γc:τ
x:τ ∈Γ
Γx:τ
Γ t : τ τ =β τ Γt:τ
記法 8.1
• x ∈ F V (τ2 ) のとき, Πx : τ1 .τ2 を τ1 → τ2 と書く.
• x ∈ F V (κ) のとき, Πx : τ.κ を τ → κ と書く.
定義 8.5 (代入)
∗[t/x] = ∗
(Πx : τ.κ)[t/x] = Πx : τ [t/x].(κ[t/x])
b[t/x] = b
(Πx : τ1 .τ2 )[t/x] = Πx : τ1 [t/x].(τ2[t/x])
(τ t1 )[t/x] = (τ [t/x])(t1 [t/x])
c[t/x] = c
(λx : τ.t1 )[t/x] = λx : (τ [t/x]).(t1[t/x])
(t1 t2 )[t/x] = (t1 [t/x])(t2 [t/x])
定義 8.6 (簡約)
(λx : τ.t1 )t2 →β t1 [t2 /x]
例 8.6
(λy : nat.λx : (Πz : list(y).list(y)).x)0 →β λx : (Πz : list(0).list(0)).x
注意 8.1 この体系は, LF の体系とほぼ同じ. ただし, LF では, =β の代わりに =βη を考える.
例 8.7 list : nat → ∗ とし, list(n) が, 長さが n のリストの型とする.
• 定数の型
nil : list(0)
cons : Πn : nat.Πx : nat.Πy : list(n).list(n + 1)
40
• 上の記法を使うと下のように単純化できる
cons : Πn : nat.nat → list(n) → list(n + 1)
• 例: cons 0 3 nil : list(1)
例 8.8 型定数として nat : ∗, T : nat → ∗, 定数として 0 : nat, S : nat → nat, t : Π.x : nat.T (x)
を考える.
• 下の式の型の導出を示せ. また, 簡約せよ.
(λg : cnat.t(g 0 S))(λx : nat.λf : nat → nat.f(fx)) : T (S(S(0)))
ただし, cnat は, nat → (nat → nat) → nat を省略したものとする.
• 下の式の型の導出を示せ. また, 簡約せよ.
(λg : cnat.λx.T (g 0 S).x)(λx : nat.λf : nat → nat.f(fx))
例 8.9 (述語論理との対応)
• カインドを以下の形式に拡張する.
κ ::= Prop | Set | Πx : τ.κ
• τ : Set ならば, τ は値の型.
– 関数記号の型: b → . . . → b → b.
• τ : Prop ならば, τ は論理式に対応
– 述語記号のカインド: b → . . . → b → Prop.
例 8.10 nat : Set, P : nat → Prop とする. ∀x : nat.P (x) を下のラムダに対応させることがで
きる.
Πx : nat.P x : Prop
例 8.11 ∀x : nat.Q(x, y) ⇒ Q(t, y) をラムダ式で表現する. Q : nat → nat → Prop とする.
(Πx : nat.Q x y) → Q t y : Prop
証明
(λz : (Πx : nat.Qxy).zt) : (Πx : nat.Qxy) → Qty
8.3
CC (Calculus of Construction)
定義 8.7 (CC)
• 構文
型
s ::= Prop | Set
κ ::= s | Πx : τ.κ | Πx : κ.κ
τ ::= b | Πx : τ.τ | Πx : κ.τ | τ t | λx : τ.τ | λx : κ.τ | τ τ
項
t ::= x | λx : τ.t | λx : κ.t | tt | tτ
ソート
カインド
41
• 判定 Γ κ
Γ, x : τ κ
Γ Πx : τ.κ
Γs
Γ, x : κ1 κ2
Γ Πx : κ1 .κ2
• 判定 Γ τ : κ
Γ τ : Πx : τ .κ Γ t : τ Γ τ t : κ[t/x]
Γ, x : τ1 τ2 : s
Γ Πx : τ1 .τ2 : s
Γ, x : κ τ : s
Γ Πx : κ.τ : s
x:κ∈Γ
Γx:κ
b ∈ Tκ
Γb:κ
Γ τ : κ κ =β κ
Γτ :κ
• 判定 Γ t : τ
Γ, x : τ1 t : τ2 Γ Πx : τ1 .τ2 : s
Γ λx : τ1 .t : Πx : τ1 .τ2
Γ t1 : Πx : τ1 .τ2 Γ t2 : τ1
Γ t1 t2 : τ2 [t2 /x]
Γ, x : κ t : τ Γ Πx : κ.τ2 : s
Γ λx : κ.t : Πx : κ.τ
Γ t1 : Πx : κ.τ1 Γ τ2 : κ
Γ tτ2 : τ1 [τ2 /x]
c ∈ Cτ
Γc:τ
x:τ ∈Γ
Γx:τ
Γ t : τ τ =β τ Γt:τ
例 8.12
• Sysmte F
Λα.λx : α.x : ∀α.α → α
• CC
λy:Set.λx:y.x
: Πy:Set.Πz:y.y
: Πy:Set.y → y
注意: 型変数と変数を区別しない.
定義 8.8 (簡約 (reduction))
(λx : τ.t)s →β t[s/x]
(λx : κ.t)τ →β t[τ /x]
(λx : τ .τ )t →β τ [t/x]
(λx : κ.τ )τ →β τ [τ /x]
定理 8.1 (Church-Rosser) t →∗β t1 かつ t →∗β t2 ならば, あるラムダ式 s が存在して, t1 →∗β s
かつ t2 →∗β s.
定理 8.2 β 簡約は, 強正規化性を持つ.
42
• Γ t : τ ならば, t は強正規化性を持つ.
(t →β t1 →β t2 →β . . . となる無限列は存在しない.)
• Γ τ : κ ならば, τ は強正規化性を持つ.
• Γ κ ならば, κ は強正規化性を持つ.
定理 8.3 Γ t : τ が成り立つかは, 決定可能.
例 8.13 list : Set → nat → Set とし, list(x)(n) が, 要素の型 x, 長さが n のリストの型とする.
• 定数の型
nil : Πx : Set.list(x)(0)
cons : Πx : Set.Πn : nat.x → list(x)(n) → list(x)(n + 1)
• 例: cons nat 0 3 (nil nat) : list(nat)(1).
例 8.14 型定数として nat : Set,T : nat → Set, 定数として 0 : nat, S : nat → nat, t : Π.x :
nat.T (x) を考える.
• 下の式の型の導出を示せ. また, 簡約せよ.
(λg : cnat.t(g nat 0 S))(λy : Set.λx : y.λf : y → y.f(fx)) : T (S(S(0)))
ただし, cnat は, Πx : Set.x → (x → x) → x を省略したものとする.
• 下の式の型の導出を示せ. また, 簡約せよ.
(λg : cnat.λx.T (g nat 0 S).x)(λy : Set.λx : y.λf : y → y.f(fx))
例 8.15 R : nat → nat → Prop とする.
• 関係 R が対称的 ∀x : nat.∀y : nat.R(x, y) → R(y, x)
Sym(R) ≡ Πx : nat.Πy : nat.Rxy → Ryx
• 関係 R が推移的 ∀x : nat.∀y : nat.∀z : nat.R(x, y) → R(y, z) → R(x, z)
T rans(R) ≡ Πx : nat.Πy : nat.Πz.nat.Rxy → Ryz → Rxz
• 関係が R が対称的, 推移的, さらに Rxy ならば Rxx.
ΠR : nat → nat → Prop.Sym(R) → T rans(R) → Rxy → Rxx
証明
λR : nat → nat → Prop.λA : Sym(R).λB : T rans(R).λC : Rxy.BxyxC(AxyC)
例 8.16 R : nat → Prop を自然数上の集合と考える.
• A ⊆ B は以下のように定義できる.
Πx : nat.Ax → Bx
• (A ⊆ B) ⇒ (B ⊆ C) ⇒ (A ⊆ C) を型として定義せよ.
• 上の型を持つ式を見つけるることで, 上の性質を証明せよ.
43
Coq のインストール
8.4
例 8.17 (Coq のインストール)
• 下の URL から Coq をダウンロードしインストールする.
http://coq.inria.fr/distrib-eng.html
9
Coq
9.1
Coq による証明
定義 9.1 (Coq の文法)
CC
Coq
----------------------------------Πx : A.B
(x:A)B
λx : A.B
[x:A]B
A→B
A -> B
P ⇒Q
P -> Q
----------------------------------例 9.1
Coq < Section example1.
Coq < Variable P:Prop.
Coq < Lemma example1 : P -> ((P -> False) -> False).
1 subgoal
============================
P->(P->False)->False
example1 < Intro.
1 subgoal
導入規則で証明
H : P
============================
(P->False)->False
example1 < Intro H1.
1 subgoal
H1: 生成される仮定の名前
H : P
H1 : P->False
============================
False
44
example1 < Apply H1.
1 subgoal
仮定 H1 を適用
H : P
H1 : P->False
============================
P
example1 < Assumption.
Subtree proved!
example1 < Qed.
Intro.
仮定を用いて証明
証明の終わり
Intro H1.
Apply H1.
Assumption.
example1 is defined
• コマンド Print で完成した証明に対応するラムダ式を表示することができる.
Coq < Print example1.
example1 = [H:P; H0:(P->False)](H0 H)
: P->(P->False)->False
これは, λH : P.λH0 : (P → False).H0 H に対応している.
• セクションを閉じる. Variable で導入した仮定を無効にする.
Coq < End example1.
定義 9.2 (Intro) Π の導入規則による証明
• A → B を証明
AB
A→B
A を仮定して, B を証明.
• Πx : A.B すなわち, ∀x : A.B を証明
x:AB
Πx : A.B
x が A 型の変数であることを仮定して, B を証明.
定義 9.3 (Apply) Π の消去規則による証明
• 定理 (仮定)Πx : Set.B を使って, B[C/x] を証明.
Πx : Set.B
B[C/x]
注意: 高階単一化を用いる. B[C/x] と B の単一化で, C を決定.
45
• 定理 (仮定)A → B を使って, B を証明.
A→B A
B
新ゴール A.
例 9.2 下の定理を証明せよ.
Section example1’.
Variable A:Prop.
Variable B:Prop.
Variable C:Prop.
Lemma example1’ : (A -> B) -> (C -> A) -> (C -> B).
...
Qed.
End example1’.
例 9.3
Section example2.
Variable A:Set.
Variable P:A -> Prop.
Variable f:A -> A.
Lemma example2 : ((x:A)(P x)) -> (y:A)(P (f y)).
Intro.
Intro.
Apply H.
Qed.
End example2.
例 9.4 Apply の引き数として, 式を書くことができる.
Section example2’.
Variable A:Set.
Variable P:A -> Prop.
Variable f:A -> A.
Lemma example2’ : ((x:A)(P x)) -> (y:A)(P (f y)).
Intro.
Intro.
Apply (H (f y)).
Qed.
End example2’.
H:(x:A)(P x) かつ (f y):A なので, (H (f y)) は P (f y) 型を持つ.
例 9.5
Section example4.
Definition sym := [R:nat->nat->Prop](x,y:nat)(R x y) -> (R y x).
Definition trans := [R:nat->nat->Prop](x,y,z:nat)
46
(R x y) -> (R y z) -> (R x z).
Lemma example4: (R:nat->nat->Prop)(sym R) -> (trans R) ->
((x,y:nat)(R x y) -> (R x x)).
....
End example4.
Definition により, sym や trans を定義の右辺と同一視できる.
9.2
帰納的な型の定義
例 9.6 (帰納的データ型の定義)
Coq < Inductive nat : Set :=
nat is defined
nat_rect is defined
nat_ind is defined
O : nat | S : nat -> nat.
nat_rec is defined
Coq < Check nat_ind.
nat_ind
: (P:(nat->Prop))(P O)->((n:nat)(P n)->(P (S n)))->(n:nat)(P n)
Coq < Check nat_rec.
nat_rec
: (P:(nat->Set))(P O)->((n:nat)(P n)->(P (S n)))->(n:nat)(P n)
同時に ι 規則と呼ばれる書き換え規則が導入される.
nat_rec P f1 f2 O → ι f1
nat_rec P f1 f2 (S x) → ι f2 x (nat_rec f1 f2 x)
例 9.7 (再帰関数の定義)
Fixpoint plus [n:nat] : nat -> nat :=
[m:nat]Cases n of
O => m
| (S p) => (S (plus p m))
end.
例 9.8 乗算 mult を定義せよ.
Fixpoint mult [n:nat] : nat -> nat :=
....
定義 9.4 Elim n: n に関する帰納用による証明.
例 9.9
Lemma plusassoc: (x,y,z:nat)(plus x (plus y z)) = (plus (plus x y) z).
Intros.
Elim x.
Simpl.
47
Apply refl_equal.
Intros.
Simpl.
Rewrite H.
Apply refl_equal.
Qed.
• Simpl: β 及び帰納的関数定義 (ι 規則) を用いた書き換え.
• Rewrite H: 定理 (仮定)H を用いたゴールの書き換え.
• refl equal :
x = x
例 9.10 (自然数のリスト)
Inductive list : Set := nil : list | cons : nat -> list -> list.
Fixpoint app [l:list] : list -> list
:= [m:list]Cases l of
nil => m
| (cons a l1) => (cons a (app l1 m))
end.
Infix RIGHTA 7 "^" app.
以下の定理を証明せよ.
Lemma app_associative: (l,m,n : list)((l^m)^ n)=(l^(m^n)).
課題 9.1 リストの反転 rev を定義し, 下の定理を証明せよ.
Fixpoint rev [l:list] : list :=
...
Lemma revrev: (xs:list)((rev (rev xs)) = xs).
9.3
帰納的定義による論理記号の定義
定義 9.5
Inductive and [A,B:Prop] : Prop := conj : A -> B -> (and A B).
Inductive or [A,B:Prop] : Prop
:= or_introl : A -> (or A B)
| or_intror : B -> (or A B)
例 9.11 次の定理を証明せよ.
Lemma orexample: (P,Q:Prop)(or P Q) -> ((P -> Q) -> Q).
48
9.4
依存型
例 9.12 長さが n のリスト:nlist n.
• 型の定義
Inductive nlist : nat -> Set
:= niln : (nlist O)
| consn : (l:nat)nat -> (nlist l) -> (nlist (S l)).
• リストの連結の定義
Fixpoint napp [a,b:nat; l:(nlist a)] : (nlist b) -> (nlist (plus a b))
:= [m:(nlist b)]
<[d:nat](nlist (plus d b))> Cases l of
niln => m
| (consn c x l1) => (consn (plus c b) x (napp c b l1 m))
end.
9.5
その他の証明法
定義 9.6 (Assert) A → B を A → C と C → B から示す.
Lemma assertexample: (A:Prop;f:nat->nat;x,y:nat)A -> (A -> (x = y))
-> ((f x) = (f y)).
Intros.
Assert H1: x = y.
Apply H0.
Assumption.
Rewrite H1.
Apply refl_equal.
Qed.
Assert H1: x = y.
これは, H1 という名前で, 仮定 x = y を追加し, 証明すべきゴールとして x = y を追加する.
課題 9.2
• 式を以下のデータ型で定義する.
Inductive exp
:= NatExp :
| VarExp :
| AddExp :
: Set
nat -> exp
nat -> exp
exp -> exp -> exp.
• eval,fv を定義せよ.
Fixpoint eval [e:exp]:(nat->nat) -> nat :=
...
Fixpoint fv [e:exp]:(nat -> Prop)
...
49
• 次の定理を証明せよ.
Lemma fveval: (e:exp;env1,env2:nat->nat)
((x:nat)((fv e x) -> ((env1 x) = (env2 x)))) ->
((eval e env1) = (eval e env2)).
参考文献
[1] H. Barendregt and H. Geuvers.
Proof-assistants using dependents type systems.
In
A. Robinson and A. Voronkov eds., Handbook of Automated Reasoning, Vol. 2, chapter 18.
Elsevier, 2001.
[2] C.-L. Chang and R. C.-T. Lee. Symbolic Logic and Mechanical Theorem Proving. Academic
Press, 1973.
[3] J. H. Gallier. Logic for Computer Science: Foundations of Automatic Theorem Proving.
Harper & Row, Publishers, 1986.
[4] M. J. C. Gordon and T. F. Melham. Introduction to HOL: A theorem proving environment
for higher order logic. Cambridge University Press, 1993.
[5] G. P. Huet. A unification algorithm for typed λ-calculus. Theoretical Computer Science,
1(1), 1975.
[6] T. Nipkow, L. C. Paulson, and M. Wenzel. Isabelle/HOL. 2002. LNCS 2283.
[7] L. C. Paulson. Isabelle: A Generic Theorem Prover. 1994. LNCS 828.
[8] F. Pfenning. Logical frameworks. In A. Robinson and A. Voronkov eds., Handbook of
Automated Reasoning, Vol. 2, chapter 17. Elsevier, 2001.
[9] A. Robinson and A. Voronkov eds. Handbook of Automated Reasoning. Elsevier, 2001.
[10] W. Snyder and J. Gallier. Higher-order unification revisited: Complete sets of transformations. Journal of Symbolic Computation, 8(1), 1989.
[11] D. van Dalen. Logic and Structure, Third Edition. Springer-Verlag, 1991.
[12] 小野寛晰. 情報科学における論理. 日本評論社, 1994.
[13] 大堀淳. プログラミング言語の基礎理論. 共立出版, 1997.
[14] 有川節夫, 原口誠. 述語論理と論理プログラミング. オーム社, 1988.
[15] 龍田真. 型理論. 近代科学社, 1992.
[16] 林晋. 数理論理学. コロナ社, 1989.
50