Theory Status
section ‹Preliminaries›
subsection ‹Status functions›
text ‹A status function assigns to each n-ary symbol a list of indices between 0 and n-1.
These functions are encapsulated into a separate type, so that recursion on the i-th subterm
does not have to perform out-of-bounds checks (e.g., to ensure termination).›
theory Status
  imports 
    First_Order_Terms.Term
begin
typedef 'f status = "{ (σ :: 'f × nat ⇒ nat list). (∀ f k. set (σ (f, k)) ⊆ {0 ..< k})}" 
  morphisms status Abs_status
  by (rule exI[of _ "λ _. []"]) auto
setup_lifting type_definition_status
lemma status: "set (status σ (f, n)) ⊆ {0 ..< n}"
  by (transfer) auto
lemma status_aux[termination_simp]: "i ∈ set (status σ (f, length ss)) ⟹ ss ! i ∈ set ss"
  using status[of σ f "length ss"] unfolding set_conv_nth by force
lemma status_termination_simps[termination_simp]:
  assumes i1: "i < length (status σ (f, length xs))"
  shows "size (xs ! (status σ (f, length xs) ! i)) < Suc (size_list size xs)" (is "?a < ?c")
proof -
  from i1 have "status σ (f, length xs) ! i ∈ set (status σ (f, length xs))" by auto
  from status_aux[OF this] have "?a ≤ size_list size xs" by (auto simp: termination_simp)
  then show ?thesis by auto
qed
lemma status_ne:
  "status σ (f, n) ≠ [] ⟹ ∃i < n. i ∈ set (status σ (f, n))"
  using status [of σ f n]
  by (meson atLeastLessThan_iff set_empty subsetCE subsetI subset_empty)
lemma set_status_nth:
  "length xs = n ⟹ i ∈ set (status σ (f, n)) ⟹ i < length xs ∧ xs ! i ∈ set xs"
  using status [of σ f n] by force
lift_definition full_status :: "'f status" is "λ (f, n). [0 ..< n]" by auto
lemma full_status[simp]: "status full_status (f, n) = [0 ..< n]" 
  by transfer auto
text ‹An argument position i is simple wrt. some term relation, if the i-th subterm is in relation to the
  full term.›
definition simple_arg_pos :: "('f, 'v) term rel ⇒ 'f × nat ⇒ nat ⇒ bool" where 
  "simple_arg_pos rel f i ≡ ∀ ts. i < snd f ⟶ length ts = snd f ⟶ (Fun (fst f) ts, ts ! i) ∈ rel"
lemma simple_arg_posI: "⟦⋀ ts. length ts = n ⟹ i < n ⟹ (Fun f ts, ts ! i) ∈ rel⟧ ⟹ simple_arg_pos rel (f, n) i"
  unfolding simple_arg_pos_def by auto
end