Você está exatamente certo de que o problema da parada é um exemplo do segundo tipo de "prova por contradição" - é realmente apenas uma afirmação negativa.
Suponha que decides_halt(M)
é um predicado que diz que a máquina M
decide se sua entrada é uma máquina que interrompe (ou seja, M
é um programa que, para algumas máquinas m
e entradas i
, decide se m
pára na entrada i
).
Esquecendo por um momento sobre como provar isso, o problema da parada é a afirmação de que não existe uma máquina que decida o problema da parada. Podemos afirmar isso no Coq como (exists M, decides_halt M) -> False
, ou talvez preferimos dizer que qualquer máquina não resolve o problema da parada forall M, decides_halt M -> False
. Acontece que, sem axiomas, essas duas formalizações são equivalentes na Coq. (Eu expliquei a prova para que você possa ver como ela funciona, mas firstorder
fará a coisa toda!)
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.
Eu acho que nenhuma das afirmações é muito difícil de provar como argumento de diagonalização, embora formalizar máquinas, computabilidade e parada seja provavelmente um desafio razoável. Para um exemplo mais simples, não é muito difícil de provar o teorema diagonalização de Cantor (veja https://github.com/bmsherman/finite/blob/master/Iso.v#L277-L291 para uma prova de que nat -> nat
e nat
não são isomorfos).
A diagonalização acima fornece um exemplo de como você pode derivar uma contradição de um isomorfismo entre nat -> nat
e nat
. Aqui está a essência dessa prova descrita como um exemplo independente:
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.
Mesmo sem olhar para os detalhes, podemos ver pela afirmação de que essa prova toma a mera existência de uma bijeção e demonstra que é impossível. Primeiro, damos os dois lados da bijeção os nomes seq
e index
. A chave é que o comportamento da bijeção na sequência especial f := fun n => S (seq n n)
e seu índice index f
é contraditório. A prova do problema de parada derivaria uma contradição de maneira semelhante, instanciando sua hipótese sobre uma máquina que resolve o problema de parada com uma máquina cuidadosamente escolhida (e em particular uma que realmente depende da máquina assumida).