Theory Halting
theory Halting
  imports "HOL-IMP.Big_Step"
begin
definition "halts c s ≡ (∃s'. (c, s) ⇒ s')"
text ‹A simple program that does not halt:›
definition "loop ≡ WHILE Bc True DO SKIP"
lemma loop_never_halts[simp]: "¬ halts loop s"
  unfolding halts_def
proof clarify
  fix s' assume "(loop, s) ⇒ s'"
  then show False
    by (induction loop s s' rule: big_step_induct) (simp_all add: loop_def)
qed
section ‹Halting Problem›
text ‹
Given any encoding ‹f› (of programs to states), there is no Program ‹H› such that 
for all programs ‹c›, ‹H› terminates in a state ‹s'› which has at variable ‹x› the
answer whether ‹c› halts.›
theorem halting: 
  "∄H. ∀c. ∃s'. (H, f c) ⇒ s' ∧ (halts c (f c) ⟷ s' x > 0)"
  (is "∄H. ?P H")
proof clarify
  fix H assume assm: "?P H"
  
  let ?inv_H = "H ;; IF Less (V x) (N 1) THEN SKIP ELSE loop" 
  
  obtain s' where 
    s'_def: "(H, f ?inv_H) ⇒ s'" and 
    s'_halts: "halts ?inv_H (f ?inv_H) ⟷ (s' x > 0)" 
    using assm by blast
  
  show False
  proof(cases "halts ?inv_H (f ?inv_H)")
    case True
    then have "halts (IF Less (V x) (N 1) THEN SKIP ELSE loop) s'"
      unfolding halts_def using big_step_determ s'_def by fast
    then have "halts loop s'"
      using s'_halts True halts_def by auto
    then show False by auto
  next
    case False
    then have "¬ halts SKIP s'"
      using s'_def s'_halts halts_def by force
    then show False using halts_def by auto
  qed
qed
end