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


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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.