Theory Pattern_Completeness_Improved_Algorithm

theory Pattern_Completeness_Improved_Algorithm
  imports 
    Pattern_Completeness_List
    FCF_List
    Finite_IDL_Solver
begin

text ‹Combining the three solvers to get the full algorithm of section 5:
  arbitrary-to-fcf: @{const pat_complete_impl_fcf},
  fcf-to-idl: @{const pattern_completeness_context.fcf_solver_alg}, and
  idl-solver: @{const default_fidl_solver}

definition decide_pat_complete :: "_  _  (('f × 's list) × 's)list  ('f,'v,'s)pats_problem_list  bool" where
  "decide_pat_complete rn rv Cs P = (let 
      m = max_arity_list Cs;
      Cl = constr_list Cs; 
      Cm = Mapping.of_alist Cs;
      k = compute_k_parameter P;
      (IS,CD) = compute_inf_card_sorts_bnd k Cs;
      solve = pattern_completeness_context.fcf_solver_alg (Mapping.lookup Cm) m Cl CD default_fidl_solver
     in pat_complete_impl_fcf m Cl (λ s. s  IS) (Mapping.lookup Cm) rn rv solve P)" 

theorem decide_pat_complete:
  assumes dist: "distinct (map fst Cs)" 
    and non_empty_sorts: "decide_nonempty_sorts (sorts_of_ssig_list Cs) Cs = None" 
    and P: "snd `  (vars ` fst ` set (concat (concat P)))  set (sorts_of_ssig_list Cs)"
    and ren: "renaming_funs rn rv" 
  shows "decide_pat_complete rn rv Cs P  pats_complete (map_of Cs) (pat_list ` set P)"
proof -
  let ?k = "compute_k_parameter P" 
  interpret pattern_completeness_list Cs ?k
    apply unfold_locales
    using dist non_empty_sorts compute_k_parameter_1 .
  have nemp:
    " f τs τ τ'. f : τs  τ in map_of Cs  τ'  set τs  ¬ empty_sort (map_of Cs) τ'"
    using C_sub_S by (auto intro!: nonempty_sort)
  obtain inf cd where "compute_inf_card_sorts_bnd ?k Cs = (inf,cd)" by force
  with compute_inf_card_sorts_bnd(2,3)[OF refl nemp dist this]
  have cics: "compute_inf_card_sorts_bnd ?k Cs = (compute_inf_sorts Cs, min ?k o card_of_sort (map_of Cs))"
    by (simp add: Compute_Nonempty_Infinite_Sorts.compute_inf_sorts(2) dist nemp)
  have Cm: "Mapping.lookup (Mapping.of_alist Cs) = map_of Cs" using dist
    using lookup_of_alist by fastforce
  have fcf: "pattern_completeness_context.fcf_solver_alg (map_of Cs) (max_arity_list Cs) (constr_list Cs)
       (min ?k  card_of_sort (map_of Cs)) default_fidl_solver
    = fcf_solver_alg default_fidl_solver" 
    unfolding compute_card_sorts by auto
  show ?thesis
    apply (unfold decide_pat_complete_def Let_def case_prod_beta cics fst_conv snd_conv)
    unfolding pat_complete_impl_fcf_def Cm
    apply (rule pat_complete_impl[OF ren _ refl P refl])
    by (rule fcf_solver_alg'[OF default_fidl_solver, folded fcf])
qed
  
export_code decide_pat_complete checking 
end