# Theory IsaFoR

```(*  Title:      Benchmarks/Datatype_Benchmark/IsaFoR.thy
Author:     Rene Thiemann, UIBK

Benchmark consisting of datatypes defined in IsaFoR.
*)

section ‹Benchmark Consisting of Datatypes Defined in IsaFoR›

theory IsaFoR
imports HOL.Real
begin

datatype (discs_sels) ('f, 'l) lab =
Lab "('f, 'l) lab" 'l
| FunLab "('f, 'l) lab" "('f, 'l) lab list"
| UnLab 'f
| Sharp "('f, 'l) lab"

datatype (discs_sels) 'f projL = Projection "(('f × nat) × nat) list"

datatype (discs_sels) ('f, 'v) "term" = Var 'v | Fun 'f "('f, 'v) term list"
datatype (discs_sels) ('f, 'v) ctxt =
Hole ("□")
| More 'f "('f, 'v) term list" "('f, 'v) ctxt" "('f, 'v) term list"

type_synonym ('f, 'v) rule = "('f, 'v) term × ('f, 'v) term"
type_synonym ('f, 'v) trs  = "('f, 'v) rule set"

type_synonym ('f, 'v) rules = "('f, 'v) rule list"
type_synonym ('f, 'l, 'v) ruleLL  = "(('f, 'l) lab, 'v) rule"
type_synonym ('f, 'l, 'v) trsLL   = "(('f, 'l) lab, 'v) rules"
type_synonym ('f, 'l, 'v) termsLL = "(('f, 'l) lab, 'v) term list"

datatype (discs_sels) pos = Empty ("ε") | PCons "nat" "pos" (infixr "<#" 70)

type_synonym  ('f, 'v) prseq = "(pos × ('f, 'v) rule × bool × ('f, 'v) term) list"
type_synonym  ('f, 'v) rseq = "(pos × ('f, 'v) rule × ('f, 'v) term) list"

type_synonym ('f, 'l, 'v) rseqL   = "((('f, 'l) lab, 'v) rule × (('f, 'l) lab, 'v) rseq) list"
type_synonym ('f, 'l, 'v) dppLL   =
"bool × bool × ('f, 'l, 'v) trsLL × ('f, 'l, 'v) trsLL ×
('f, 'l, 'v) termsLL ×
('f, 'l, 'v) trsLL × ('f, 'l, 'v) trsLL"

type_synonym ('f, 'l, 'v) qreltrsLL =
"bool × ('f, 'l, 'v) termsLL × ('f, 'l, 'v) trsLL × ('f, 'l, 'v) trsLL"

type_synonym ('f, 'l, 'v) qtrsLL =
"bool × ('f, 'l, 'v) termsLL × ('f, 'l, 'v) trsLL"

datatype (discs_sels) location = H | A | B | R

type_synonym ('f, 'v) forb_pattern = "('f, 'v) ctxt × ('f, 'v) term × location"
type_synonym ('f, 'v) forb_patterns = "('f, 'v) forb_pattern set"

type_synonym ('f, 'l, 'v) fptrsLL =
"(('f, 'l) lab, 'v) forb_pattern list × ('f, 'l, 'v) trsLL"

type_synonym ('f, 'l, 'v) prob = "('f, 'l, 'v) qreltrsLL + ('f, 'l, 'v) dppLL"

type_synonym ('f, 'a) lpoly_inter = "'f × nat ⇒ ('a × 'a list)"
type_synonym ('f, 'a) lpoly_interL = "(('f × nat) × ('a × 'a list)) list"

type_synonym 'v monom = "('v × nat) list"
type_synonym ('v, 'a) poly = "('v monom × 'a) list"
type_synonym ('f, 'a) poly_inter_list = "(('f × nat) × (nat, 'a) poly) list"
type_synonym 'a vec = "'a list"
type_synonym 'a mat = "'a vec list"

datatype (discs_sels) arctic = MinInfty | Num_arc int
datatype (discs_sels) 'a arctic_delta = MinInfty_delta | Num_arc_delta 'a
datatype (discs_sels) order_tag = Lex | Mul

type_synonym 'f status_prec_repr = "(('f × nat) × (nat × order_tag)) list"

datatype (discs_sels) af_entry =
Collapse nat
| AFList "nat list"

type_synonym 'f afs_list = "(('f × nat) × af_entry) list"
type_synonym 'f prec_weight_repr = "(('f × nat) × (nat × nat × (nat list option))) list × nat"

datatype (discs_sels) 'f redtriple_impl =
Int_carrier "('f, int) lpoly_interL"
| Int_nl_carrier "('f, int) poly_inter_list"
| Rat_carrier "('f, rat) lpoly_interL"
| Rat_nl_carrier rat "('f, rat) poly_inter_list"
| Real_carrier "('f, real) lpoly_interL"
| Real_nl_carrier real "('f, real) poly_inter_list"
| Arctic_carrier "('f, arctic) lpoly_interL"
| Arctic_rat_carrier "('f, rat arctic_delta) lpoly_interL"
| Int_mat_carrier nat nat "('f, int mat) lpoly_interL"
| Rat_mat_carrier nat nat "('f, rat mat) lpoly_interL"
| Real_mat_carrier nat nat "('f, real mat) lpoly_interL"
| Arctic_mat_carrier nat "('f, arctic mat) lpoly_interL"
| Arctic_rat_mat_carrier nat "('f, rat arctic_delta mat) lpoly_interL"
| RPO "'f status_prec_repr" "'f afs_list"
| KBO "'f prec_weight_repr" "'f afs_list"

datatype (discs_sels) list_order_type = MS_Ext | Max_Ext | Min_Ext  | Dms_Ext
type_synonym 'f scnp_af = "(('f × nat) × (nat × nat) list) list"

datatype (discs_sels) 'f root_redtriple_impl = SCNP list_order_type "'f scnp_af" "'f redtriple_impl"

type_synonym 'f sig_map_list = "(('f × nat) × 'f list) list"
type_synonym ('f, 'v) uncurry_info = "'f × 'f sig_map_list × ('f, 'v) rules × ('f, 'v) rules"

datatype (discs_sels) arithFun =
Arg nat
| Const nat
| Sum "arithFun list"
| Max "arithFun list"
| Min "arithFun list"
| Prod "arithFun list"
| IfEqual arithFun arithFun arithFun arithFun

datatype (discs_sels) 'f sl_inter = SL_Inter nat "(('f × nat) × arithFun) list"
datatype (discs_sels) ('f, 'v) sl_variant =
Rootlab "('f × nat) option"
| Finitelab "'f sl_inter"
| QuasiFinitelab "'f sl_inter" 'v

type_synonym ('f, 'v) crit_pair_joins = "(('f, 'v) term × ('f, 'v) rseq × ('f, 'v) term × ('f, 'v) rseq) list"

datatype (discs_sels) 'f join_info = Guided "('f, string) crit_pair_joins" | Join_NF | Join_BFS nat

type_synonym unknown_info = string

type_synonym dummy_prf = unit

datatype (discs_sels) ('f, 'v) complex_constant_removal_prf = Complex_Constant_Removal_Proof
"('f, 'v) term"
"(('f, 'v) rule × ('f, 'v) rule) list"

```