Theory Reduction

subsection ‹Reduction relation›

theory Reduction
  imports Substitution
begin

inductive red_term :: "[trm, trm] ⇒ bool"  (infixl ‹⇢› 50) 
      and red_cmd :: "[cmd, cmd] ⇒ bool"  (infixl ‹C⇢› 50)
where
  beta   [intro]: "(λ T : t)°r ⇢ t[r/0]T" |
  struct [intro]: "(μ (T1→T2) : c)°s ⇢ μ T2 : (c[0 = 0 (◇ ∙ (liftM_trm s 0))]C)" |
  rename [intro]: "⟦ 0 ∉ (fmv_trm t 0) ⟧ ⟹ (μ T : (<0> t)) ⇢ dropM_trm t 0" |
  mueta  [intro]: "<i> (μ T : c) C⇢ (dropM_cmd (c[0 = i ◇]C) i)" |

  lambda [intro]: "⟦ s ⇢ t ⟧ ⟹ (λ T : s) ⇢ (λ T : t)" |
  appL   [intro]: "⟦ s ⇢ u ⟧ ⟹ (s°t) ⇢ (u°t)" |
  appR   [intro]: "⟦ t ⇢ u ⟧ ⟹ (s°t) ⇢ (s°u)" |
  mu     [intro]: "⟦ c C⇢ d ⟧ ⟹ (μ T : c) ⇢ (μ T : d)" |
  cmd    [intro]: "⟦ t ⇢ s ⟧ ⟹ (<i> t) C⇢ (<i> s)"

inductive_cases redE [elim]:
  "`i ⇢ s"
  "(λ T : t) ⇢ s"
  "s°t ⇢ u"
  "(μ T : c) ⇢ t"
  "<i> t C⇢ c"

text‹Reflexive transitive closure›

inductive beta_rtc_term :: "[trm, trm] ⇒ bool"  (infixl ‹⇢*› 50) where
  refl_term [iff]: "s ⇢* s" |
  step_term: "⟦s ⇢ t; t ⇢* u⟧ ⟹ s ⇢* u"

lemma step_term2: "⟦s ⇢* t; t ⇢ u⟧ ⟹ s ⇢* u"
  by (induct rule: beta_rtc_term.induct) (auto intro: step_term)

inductive beta_rtc_command :: "[cmd, cmd] ⇒ bool"  (infixl ‹C⇢*› 50) where
  refl_command [iff]: "c C⇢* c" |
  step_command: "c C⇢ d ⟹ d C⇢* e ⟹ c C⇢* e"

text‹The beta reduction relation is included in the reflexive transitive closure.›
lemma rtc_term_incl [intro]: "s ⇢ t ⟹ s ⇢* t"
  by (meson beta_rtc_term.simps)

lemma [intro]: "c C⇢ d ⟹ c C⇢* d"
  by(auto intro: step_command)

text‹Proof that the reflexive transitive closure as defined above is transitive.›
  
lemma rtc_term_trans [intro]: "s ⇢* t ⟹ t ⇢* u ⟹ s ⇢* u"
  by(induction rule: beta_rtc_term.induct) (auto simp add: step_term)

lemma rtc_command_trans[intro]: "c C⇢* d ⟹ d C⇢* e ⟹ c C⇢* e"
  by(induction rule: beta_rtc_command.induct) (auto simp add: step_command)

text‹Congruence rules for the reflexive transitive closure.›

lemma rtc_lambda: "s ⇢* t ⟹ (λ T : s) ⇢* (λ T : t)"
  apply(induction rule: beta_rtc_term.induct)
  by force (meson red_term_red_cmd.lambda step_term)

lemma rtc_appL: "s ⇢* u ⟹ (s°t) ⇢* (u°t)"
  apply(induction rule: beta_rtc_term.induct)
  by force (meson appL step_term)
    
end