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