Theory Code_Generation

section ‹Executable checker and producer›

theory Code_Generation
  imports Examples_Compiler Examples_Egg Examples_Acyclic_EGraph
begin

text ‹
  Only the equality-saturation-specific layer is exported.  Terms,
  substitutions, positions, and position enumeration come from
  sessionFirst_Order_Terms; the specification theorem targets
  sessionFirst_Order_Rewriting.  The exported acyclic-e-graph
  functions include both the global dynamic-programming extractor and the
  certificate checker for e-class equality.
›

export_code
  apply_step apply_steps check_explanation
  tokenize_egg parse_egg_sexp decode_egg_line
  compile_egg_explanation check_egg_explanation
  check_merge_log_from check_merge_log recorded_merges
  check_extraction
  wf_acyclic_egraph instantiate_enode best_eclass_term
  extract_prefix extract_egraph extract_eclass
  canonical_prefix canonical_eclass check_dag_class check_certified_egraph
  run_bounded_search find_explanation
  in SML

export_code
  apply_step apply_steps check_explanation
  tokenize_egg parse_egg_sexp decode_egg_line
  compile_egg_explanation check_egg_explanation
  check_merge_log_from check_merge_log recorded_merges
  check_extraction
  wf_acyclic_egraph instantiate_enode best_eclass_term
  extract_prefix extract_egraph extract_eclass
  canonical_prefix canonical_eclass check_dag_class check_certified_egraph
  run_bounded_search find_explanation
  in Haskell module_name Equality_Saturation_Checker

definition produced_steps :: "(string, string) certificate_step list" where
  "produced_steps =
    the (find_explanation demo_rules [] (forward_generator demo_rules) 2
      demo_start demo_result)"

lemma produced_steps_accepted:
  "check_explanation demo_rules [] produced_steps demo_start demo_result"
proof -
  have "find_explanation demo_rules [] (forward_generator demo_rules) 2
      demo_start demo_result = Some produced_steps"
    unfolding produced_steps_def
    using demo_search_succeeds
    by (cases "find_explanation demo_rules []
          (forward_generator demo_rules) 2 demo_start demo_result") auto
  then show ?thesis by (rule find_explanation_accepted)
qed

value "check_explanation demo_rules [] produced_steps demo_start demo_result"
value "check_egg_explanation egg_compiler_rules egg_compiler_flat_output
  egg_compiler_start egg_compiler_final"
value "map (λst. case st of
    Rule_At p i d σ  (p, i, d)
  | Merge_At p i d  (p, i, d)) produced_steps"

end