Sie haben genau Recht, dass das Stopp-Problem ein Beispiel für die zweite Art von "Beweis durch Widerspruch" ist - es ist wirklich nur eine negative Aussage.
Angenommen, es decides_halt(M)
handelt sich um ein Prädikat, das besagt, dass die Maschine M
entscheidet, ob ihre Eingabe eine Maschine ist, die anhält (dh M
ein Programm, das für einige Maschinen m
und Eingaben i
entscheidet, ob sie m
bei der Eingabe anhält i
).
Das Problem des Anhaltens ist die Aussage, dass es keine Maschine gibt, die über das Problem des Anhaltens entscheidet. Wir könnten dies in Coq als (exists M, decides_halt M) -> False
angeben, oder vielleicht möchten wir lieber sagen, dass eine bestimmte Maschine das Problem des Anhaltens nicht löst forall M, decides_halt M -> False
. Es stellt sich heraus, dass diese beiden Formalisierungen ohne Axiome in Coq äquivalent sind. (Ich habe den Beweis formuliert, damit Sie sehen können, wie es funktioniert, aber firstorder
ich werde das Ganze machen!)
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.
Ich denke, dass beide Aussagen nicht allzu schwierig als Diagonalisierungsargument zu beweisen sind, obwohl die Formalisierung von Maschinen, die Berechenbarkeit und das Anhalten wahrscheinlich eine angemessene Herausforderung darstellen. Für ein einfacheres Beispiel ist es nicht allzu schwer Cantors diagonalization Theorem (siehe zu beweisen https://github.com/bmsherman/finite/blob/master/Iso.v#L277-L291 für einen Beweis dafür , dass nat -> nat
und nat
ist nicht isomorph).
Die obige Diagonalisierung gibt ein Beispiel dafür, wie Sie einen Widerspruch aus einem Isomorphismus zwischen nat -> nat
und ableiten können nat
. Hier ist das Wesentliche dieses Beweises, der als eigenständiges Beispiel angeführt wird:
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.
Auch ohne die Details zu betrachten, können wir aus der Aussage ersehen, dass dieser Beweis die bloße Existenz einer Bijektion annimmt und zeigt, dass es unmöglich ist. Zuerst geben wir den beiden Seiten der Bijektion die Namen seq
und index
. Der Schlüssel ist, dass das Verhalten der Bijektion bei der speziellen Sequenz f := fun n => S (seq n n)
und ihrem Index index f
widersprüchlich ist. Der Beweis des Halteproblems würde auf ähnliche Weise einen Widerspruch herleiten und seine Hypothese über eine Maschine aufstellen, die das Halteproblem mit einer sorgfältig ausgewählten Maschine löst (und insbesondere eine, die tatsächlich von der angenommenen Maschine abhängt).