2007-08-12 [長年日記]
λ. ¬(∀x.P(x)) → ∃x.¬P(x)
非常にしょーもないのだが、ふと ¬(∀x.P(x)) → ∃x.¬P(x) の証明を自然演繹で書こうとして苦戦。こんな基本的な事で苦戦するなんて色々やばいな。 結局、callccを使ったプログラムを思い浮かべて証明した。 古典論理はやっぱり変態的だと思った。
Agdaでの証明
postulate callCC (|X::Set) :: Not (Not X) -> X
prop (!D::Set) (!P::D->Set)
:: Not ((x::D) -> P x) -> Exist (\(x::D)-> Not (P x))
prop k1 =
callCC (\(k2::Not (Exist (\(x::D) -> Not (P x)))) ->
let f :: (x::D) -> P x
f x = callCC (\(k3::Not (P x)) ->
let e :: Exist (\(x::D) -> Not (P x))
e = struct
fst :: D
fst = x
snd :: Not (P x)
snd = k3
in k2 e)
in k1 f)
自然演繹での証明
Agdaによる証明をそのまま翻訳したもの。
[¬P(x)]:3
───── (∃I)
∃x.¬P(x) [¬∃x.¬P(x)]:2
─────────────── (¬E)
⊥
───── (¬I{3})
¬¬P(x)
───── (¬¬)
P(x)
───── (∀I)
∀x. P(x) [¬∀x.P(x)]:1
─────────────── (¬E)
⊥
─────── (¬I{2})
¬¬∃x.¬P(x)
─────── (¬¬)
∃x.¬P(x)
─────────────── (→I{1})
¬∀x.P(x) → ∃x.¬P(x)
シーケント計算での証明
自然演繹だとややこしかったけど、シーケント計算だと実は簡単。
P(a) ├ P(a) ──────── (├ ¬) ├ P(a), ¬P(a) ──────── (├ ∃) ├ P(a), ∃x.¬P(x) ────────── (├ ∀) ├ ∀x.P(x), ∃x.¬P(x) ──────────── (¬ ├) ¬∀x.P(x) ├ ∃x.¬P(x) ─────────────── (├ →) ├ ¬∀x.P(x) → ∃x.¬P(x)

顔文字にしか見えない。
あひゃ (├ ∀)<br>でも、こういうの授業でやりませんでした?