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 Mdecide se sua entrada é uma máquina que interrompe (ou seja, Mé um programa que, para algumas máquinas me entradas i, decide se mpá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 firstorderfará 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 -> nate natnão são isomorfos).
A diagonalização acima fornece um exemplo de como você pode derivar uma contradição de um isomorfismo entre nat -> nate 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 seqe 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).