É possível provar indecidibilidade do problema de parada em Coq?

23

Eu estava assistindo as " Cinco etapas da aceitação da matemática construtiva ", de Andrej Bauer, e ele diz que existem dois tipos de provas por contradição (ou duas coisas que os matemáticos chamam de prova por contradição):

  1. Suponha que seja falso ... blá blá blá, contradição. Portanto, é verdadeiro.PP
  2. Suponha que seja verdadeiro ... blá blá blá, contradição. Portanto, é falso.PP

O primeiro é equivalente à Lei do Meio Excluído (LEM) e o segundo é como provar a negação.

A prova da indecidibilidade do Problema da Parada (HP) é uma prova por contradição: suponha que exista uma máquina que possa decidir a HP ... blá blá blá, contradição. Portanto, não existe.DD

Então, seja " existe e pode decidir o HP". Suponha que seja verdadeiro ... blá blá blá, contradição. Portanto, é falso.PDPP

Isso parece o segundo tipo de prova por contradição; portanto, é possível provar a indecidibilidade do problema de parada no Coq (sem assumir o LEM)?

Edição: Gostaria de ver alguns pontos sobre como provar isso usando contradição. Eu sei que isso também pode ser provado usando a diagonalização.

Rafael Castro
fonte
2
@cody Por que uma afirmação negativa requer contradição? Ou você está restringindo a Coq?
David Richerby
3
@DavidRicherby Na verdade, estou exagerando um pouco, pois isso só acontece na ausência de axiomas. Nesse caso, o primeiro passo (mais baixo) de uma prova (sem cortes) deve ser Não Introdução na dedução natural intuicionista. No caso de existir axiomas / hipóteses, nunca é demais aplicar esse passo primeiro, pois é invertível, mas às vezes pode ser evitado.
Cody
2
Você conhece o trabalho com o mesmo título? (Acho que lá eu explicitamente estado que a prova usual da não-existência do Deter Oracle é construtivo.)
Andrej Bauer
1
@AndrejBauer, eu não sei. Apenas encontrei. Sim, você afirma que "A prova usual da inexistência do oráculo Halting é mais um exemplo de prova construtiva de negação".
Rafael Castro
1
@ RafaelCastro: como estudante de graduação, você está fazendo boas perguntas. Estou apenas encorajando você a ir corajosamente aonde nenhum estudante de graduação (ou pelo menos não muitos) tenha ido antes.
Andrej Bauer

Respostas:

20

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).

Tej Chajed
fonte
Bem vindo ao site! Espero que você fique por perto - você pode fazer um breve tour para ver mais sobre como o Stack Exchange funciona.
David Richerby
2
Esqueci que esse problema também é provado por um argumento de diagonalização. Sua resposta é interessante, mas eu gostaria de ver alguns pontos sobre se é possível provar o HM usando uma contradição no Coq. Vou deixar isso mais claro na pergunta.
Rafael Castro