Theory Lambda_Free_KBO_App
section ‹The Applicative Knuth--Bendix Order for Lambda-Free Higher-Order Terms›
theory Lambda_Free_KBO_App
imports Lambda_Free_KBO_Util
abbrevs ">t" = ">⇩t"
and "≥t" = "≥⇩t"
begin
text ‹
This theory defines the applicative Knuth--Bendix order, a variant of KBO for ‹λ›-free
higher-order terms. It corresponds to the order obtained by applying the standard first-order KBO on
the applicative encoding of higher-order terms and assigning the lowest precedence to the
application symbol.
›
locale kbo_app = gt_sym "(>⇩s)"
for gt_sym :: "'s ⇒ 's ⇒ bool" (infix ‹>⇩s› 50) +
fixes
wt_sym :: "'s ⇒ nat" and
ε :: nat and
ext :: "(('s, 'v) tm ⇒ ('s, 'v) tm ⇒ bool) ⇒ ('s, 'v) tm list ⇒ ('s, 'v) tm list ⇒ bool"
assumes
ε_gt_0: "ε > 0" and
wt_sym_ge_ε: "wt_sym f ≥ ε" and
ext_ext_irrefl_before_trans: "ext_irrefl_before_trans ext" and
ext_ext_compat_list: "ext_compat_list ext" and
ext_ext_hd_or_tl: "ext_hd_or_tl ext"
begin
lemma ext_mono[mono]: "gt ≤ gt' ⟹ ext gt ≤ ext gt'"
by (simp add: ext.mono ext_ext_compat_list[unfolded ext_compat_list_def, THEN conjunct1])
fun wt :: "('s, 'v) tm ⇒ nat" where
"wt (Hd (Var x)) = ε"
| "wt (Hd (Sym f)) = wt_sym f"
| "wt (App s t) = wt s + wt t"
inductive gt :: "('s, 'v) tm ⇒ ('s, 'v) tm ⇒ bool" (infix ‹>⇩t› 50) where
gt_wt: "vars_mset t ⊇# vars_mset s ⟹ wt t > wt s ⟹ t >⇩t s"
| gt_sym_sym: "wt_sym g = wt_sym f ⟹ g >⇩s f ⟹ Hd (Sym g) >⇩t Hd (Sym f)"
| gt_sym_app: "vars s = {} ⟹ wt t = wt s ⟹ t = Hd (Sym g) ⟹ is_App s ⟹ t >⇩t s"
| gt_app_app: "vars_mset t ⊇# vars_mset s ⟹ wt t = wt s ⟹ t = App t1 t2 ⟹ s = App s1 s2 ⟹
ext (>⇩t) [t1, t2] [s1, s2] ⟹ t >⇩t s"
abbreviation ge :: "('s, 'v) tm ⇒ ('s, 'v) tm ⇒ bool" (infix ‹≥⇩t› 50) where
"t ≥⇩t s ≡ t >⇩t s ∨ t = s"
end
end