Sプログラム計算可能性 定義1.3 (1) 関数 f (Σ* 上の(部分)関数)に対し,次の条件を満たす Sプログラム A を,f を計算するSプログラムという。 (ただし,Dom(f) は f の定義域) すべての x ∈ Σ* に対し, x ∈ Dom(f) ⇒ Aに x を与えて実行すると f(x) を出力して停止する x ∉ Dom(f) ⇒ Aに x を与えて実行すると,正常終了しない なお,実行が halt 文で終了することを,正常終了と考える (2) 関数 f に対し,それを計算するSプログラムが存在するとき, f をSプログラム計算可能という $ Sプログラムの実行環境は未定義 % & 変数の数は有限であれば良い(メインメモリ無限大) 表記法1.1 SプログラムAに対し A(x): A に x を与えて実行したときの出力 述語 Σ* のすべての元に対して,1(真) か 0(偽) を返す全域関数 万能Sプログラム 次に定義される関数 comp を計算するSプログラム comp(p, x) = A(x), p が,あるSプログラム A のコードのとき, 0, p がSプログラムのコードになっていないとき, 定理1.2 関数 comp を計算する万能Sプログラム univ が存在する 証明の概略 p と x が与えられたとき,univ はおおまかにいって, 次の手順で comp を計算する (1) p が標準形Sプログラムの2進数コードになっているかを調べ, もし p が正しいコードでなければ,即座に 0 を出力して終了 (2) p があるSプログラムAのコードだった場合には, A の x に対する実行をシミュレートし,halt文で終了した場合には 同じ出力を出して計算を終了する. ステップ(1) はやさしい 定理1.2 証明の概略つづき ステップ(2) 変数 pc : A の pc v : A の変数のリスト (v1,...,vL) 動作 A のプログラムに従い,pcとvを更新する pc = 0 となったとき,v の第一成分を出力して終了 prog univ (input p, x); if ¬is-prog?(p) then halt(0) end-if K ← get(p,1); L ← get(p,2); ss ← get(p,3); v ← (x, ε,...,ε); A が停止しないとき, pc ← 1; while pc ≠ 0 do A の pc が 0 にならない s ← get(ss, pc); 文sを実行(pcの変更も含む) end-while ⇒ univ は停止しない halt(get(v,1)) end-prog L − 1 t-comp A が正常終了しない場合,comp( !A" , x) は未定義 comp は部分関数 !A" は A の2進コード ↓ 全域化 t-comp(p, x) = $ A(x), % & 0, p が,ある A のコードで しかも A(x) が正常終了するとき その他のとき. 定理1.3 t-comp を計算するSプログラムは存在しない. つまり,t-comp はSプログラム計算不可能 定理1.3証明 背理法:t-comp を計算するSプログラムの存在を仮定 次のような関数 h を考える ! 1, t-comp(x, x) = 0 のとき h(x) = " # 0, t-comp(x, x) ≠ 0 のとき h(x) の定義より,∀x, h(x) ≠ t-comp(x, x) t-comp を計算するSプログラム ⇒ hを計算するSプログラム Ah ph = &Ah' とおくと, h(x) = comp(ph, x) = t-comp(ph, x) ← h(x) は全域的 ここで,x = ph と,とると,h(ph) = t-comp(ph, ph) 矛 盾 定理1.3 証明(対角線論法) Σ*の元を,次の順に並べ,w1, w2, ... とする. 長さの短い順,長さが同じなら2進数読みで小さい順 つまり,w1 = 0, w2 = 1, w3 = 00, w4 = 01, ... t-comp(wi, wj) の表 d(wi) の表 w1 w2 w3 . . . wi w1 0 0 0 0 w2 0 0 0 0 w3 . .. wi 0 0 0 0 1 10 11 1010 対角成分 変更 0→1 0以外→0 w1 w2 w3 . . . wi w1 w2 w3 w3 1 1 1 0 " 1, t-comp(wi, wi) = 0 のとき, d(wi) = # $ 0, t-comp(wi, wi) ≠ 0 のとき. 定理2.7 証明(対角線論法) つづき w1 w2 w3 . . . wi w1 w2 w3 . . . wi w1 0 0 0 0 w1 w2 0 0 0 0 w2 w3 .. . wi 0 0 0 0 w3 1 10 11 1010 1 1 1 w3 0 t-comp を計算するSプログラム ⇒ dを計算するSプログラム Ad wd = "Ad# とする 表の作り方より,t-comp(wd, wd) ≠ d(wd) 一方,wd は d を計算するSプログラムのコードなので, t-comp(wd, wd) = d(wd) 矛 盾 定理1.4 次の述語は計算不可能 ! 1, p が,あるSプログラム A のコードで, halt?(p, x) = " しかも,A(x) が正常終了するとき, # 0, その他のとき. halt? が計算可能なら,halt? を計算するSプログラムと comp を計算するSプログラムunivを用いて, t-comp を計算するSプログラムが作れる 定理1.3に反する prog t-comp (input p, x); if ¬halt?(p,x) then halt(0) else halt(univ(p,x)) end-if end-prog
© Copyright 2024 ExpyDoc