Theory Prefix

theory Prefix
imports Main
begin

(* 
  Prefixes and Prefix Closure of traces 
*)
definition prefix :: "'e list ⇒ 'e list ⇒ bool" (infixl ‹≼› 100)
where
"(l1 ≼ l2) ≡ (∃l3. l1 @ l3 = l2)" 

definition prefixclosed :: "('e list) set ⇒ bool"
where
"prefixclosed tr ≡ (∀l1 ∈ tr. ∀l2. l2 ≼ l1 ⟶ l2 ∈ tr)"

(* the empty list is a prefix of every list *)
lemma empty_prefix_of_all: "[] ≼ l" 
  using prefix_def [of "[]" l] by simp

(* the empty list is in any non-empty prefix-closed set *)
lemma empty_trace_contained: "⟦ prefixclosed tr ; tr ≠ {} ⟧ ⟹ [] ∈ tr"
proof -
  assume 1: "prefixclosed tr" and
         2: "tr ≠ {}"
  then obtain l1 where "l1 ∈ tr" 
    by auto
  with 1 have "∀l2. l2 ≼ l1 ⟶ l2 ∈ tr" 
    by (simp add: prefixclosed_def)
  thus "[] ∈ tr" 
    by (simp add: empty_prefix_of_all)
qed

(* the prefix-predicate is transitive *)
lemma transitive_prefix: "⟦ l1 ≼ l2 ; l2 ≼ l3 ⟧ ⟹ l1 ≼ l3"
  by (auto simp add: prefix_def)

end