thys/Turing.thy
changeset 250 745547bdc1c7
parent 190 f1ecb4a68a54
child 288 a9003e6d0463
--- a/thys/Turing.thy	Thu May 02 13:19:50 2013 +0100
+++ b/thys/Turing.thy	Thu May 09 18:16:36 2013 +0100
@@ -111,6 +111,10 @@
   shows "is_final (s, tp) = (s = 0)"
 by (case_tac tp) (auto)
 
+lemma is_finalI [intro]:
+  shows "is_final (0, tp)"
+by (simp add: is_final_eq)
+
 lemma after_is_final:
   assumes "is_final c"
   shows "is_final (steps c p n)"
@@ -120,6 +124,16 @@
 apply(auto)
 done
 
+lemma is_final:
+  assumes a: "is_final (steps c p n1)"
+  and b: "n1 \<le> n2"
+  shows "is_final (steps c p n2)"
+proof - 
+  obtain n3 where eq: "n2 = n1 + n3" using b by (metis le_iff_add)
+  from a show "is_final (steps c p n2)" unfolding eq
+    by (simp add: after_is_final)
+qed
+
 lemma not_is_final:
   assumes a: "\<not> is_final (steps c p n1)"
   and b: "n2 \<le> n1"
@@ -164,6 +178,29 @@
   qed
 qed
 
+lemma least_steps: 
+  assumes "steps0 (1, tp) A n = (0, tp')"
+  shows "\<exists> n'. (\<forall>n'' < n'. \<not> is_final (steps0 (1, tp) A n'')) \<and> 
+               (\<forall>n'' \<ge> n'. is_final (steps0 (1, tp) A n''))"
+proof -
+  from before_final[OF assms] 
+  obtain n' where
+    before: "\<not> is_final (steps0 (1, tp) A n')" and
+    final: "steps0 (1, tp) A (Suc n') = (0, tp')" by auto
+  from before
+    have "\<forall>n'' < Suc n'. \<not> is_final (steps0 (1, tp) A n'')"
+      using not_is_final by auto
+  moreover
+  from final 
+    have "\<forall>n'' \<ge> Suc n'. is_final (steps0 (1, tp) A n'')" 
+      using is_final[of _ _ "Suc n'"] by (auto simp add: is_final_eq)
+  ultimately
+  show "\<exists> n'. (\<forall>n'' < n'. \<not> is_final (steps0 (1, tp) A n'')) \<and> (\<forall>n'' \<ge> n'. is_final (steps0 (1, tp) A n''))"
+    by blast
+qed
+
+
+
 (* well-formedness of Turing machine programs *)
 abbreviation "is_even n \<equiv> (n::nat) mod 2 = 0"