Durma sorununun ikinci tür "çelişkiyle kanıt" örneğine bir örnek olduğu konusunda haklısın - bu gerçekten olumsuz bir ifade.
Diyelim decides_halt(M)
ki, makine M
girişinin durup durmadığı bir makine olup olmadığına karar verir (bu, M
bazı makine m
ve girdiler için girişte durup durmadığına i
karar veren bir programdır ).m
i
Bunu nasıl ispatlayacağıyla ilgili bir anı unutmak, durma problemi, durma problemine karar verecek bir makine olmadığı ifadesidir. Bunu Coq'da belirtebiliriz (exists M, decides_halt M) -> False
ya da herhangi bir makinenin durma problemini çözmediğini söylemeyi tercih edebiliriz forall M, decides_halt M -> False
. Herhangi bir aksiyom olmadan bu iki formalizasyonun Coq'da eşdeğer olduğu ortaya çıkmıştır. (İspatı açıkladım, böylece nasıl çalıştığını görebilirsiniz, ama firstorder
her şeyi yapacak!)
Parameter machine:Type.
Parameter decides_halt : machine -> Prop.
(* Here are two ways to phrase the halting problem: *)
Definition halting_problem : Prop :=
(exists M, decides_halt M) -> False.
Definition halting_problem' : Prop :=
forall M, decides_halt M -> False.
Theorem statements_equivalent :
halting_problem <-> halting_problem'.
Proof.
unfold halting_problem, halting_problem'; split; intros.
- exact (H (ex_intro decides_halt M H0)).
- destruct H0.
exact (H x H0).
Qed.
Makinelerin biçimlendirilmesi, hesaplanabilirlik ve durdurmanın muhtemelen makul derecede zor olmasına rağmen, her iki ifadenin de köşegenleştirme argümanı olarak kanıtlanması zor olmadığını düşünüyorum. Daha basit bir örnek olarak, Cantor'un köşegenleştirme teoremini ispatlamak zor değildir ( isomorfik olmadıklarını ve isomorfik olmadıklarını görmek için bkz. Https://github.com/bmsherman/finite/blob/master/Iso.v#L277-L291 ).nat -> nat
nat
Yukarıdaki köşegenleştirme, nat -> nat
ve arasındaki bir izomorfizmden nasıl bir çelişki çıkarmaya başladığınıza bir örnek verir nat
. İşte bağımsız bir örnek olarak belirtilen bu kanıtın özü:
Record bijection A B :=
{ to : A -> B
; from : B -> A
; to_from : forall b, to (from b) = b
; from_to : forall a, from (to a) = a
}.
Theorem cantor :
bijection nat (nat -> nat) ->
False.
Proof.
destruct 1 as [seq index ? ?].
(* define a function which differs from the nth sequence at the nth index *)
pose (f := fun n => S (seq n n)).
(* prove f differs from every sequence *)
assert (forall n, f <> seq n). {
unfold not; intros.
assert (f n = seq n n) by congruence.
subst f; cbn in H0.
eapply n_Sn; eauto.
}
rewrite <- (to_from0 f) in H.
apply (H (index f)).
reflexivity.
Qed.
Ayrıntılara bakmadan bile, bu kanıtın yalnızca bir önyargının varlığını aldığını ve imkansız olduğunu gösterdiğini açıklayabiliriz. Biz ilk eşleşme iki yakasını isim vermek seq
ve index
. Önemli olan, itirazın özel sıradaki davranışının f := fun n => S (seq n n)
ve endeksinin index f
çelişkili olmasıdır. Durma probleminin ispatı, durma problemini dikkatlice seçilmiş bir makine (ve özellikle de varsayılan makineye bağlı olan) ile çözen bir makine hakkındaki hipotezini harekete geçirecek şekilde benzer bir çelişki yaratacaktır.