Theory CardinalityAnalysisSpec

theory CardinalityAnalysisSpec
imports ArityAnalysisSpec CardinalityAnalysisSig ConstOn
theory CardinalityAnalysisSpec
imports ArityAnalysisSpec CardinalityAnalysisSig ConstOn
begin

locale CardinalityPrognosisEdom = CardinalityPrognosis +
  assumes edom_prognosis:
    "edom (prognosis ae as a (Γ, e, S)) ⊆ fv Γ ∪ fv e ∪ fv S"

locale CardinalityPrognosisShape = CardinalityPrognosis +
  assumes prognosis_env_cong: "ae f|` domA Γ = ae' f|` domA Γ ⟹ prognosis ae as u (Γ, e, S) = prognosis ae' as u (Γ, e, S)"
  assumes prognosis_reorder: "map_of Γ = map_of Δ  ⟹  prognosis ae as u (Γ, e, S) = prognosis ae as u (Δ, e, S)"
  assumes prognosis_ap: "const_on (prognosis ae as a (Γ, e, S)) (ap S) many"
  assumes prognosis_upd: "prognosis ae as u (Γ, e, S) ⊑ prognosis ae as u (Γ, e, Upd x # S)"
  assumes prognosis_not_called: "ae x = ⊥ ⟹ prognosis ae as a (Γ, e, S) ⊑ prognosis ae as a (delete x Γ, e, S)"
  assumes prognosis_called: "once ⊑ prognosis ae as a (Γ, Var x, S) x"

locale CardinalityPrognosisApp = CardinalityPrognosis +
  assumes prognosis_App: "prognosis ae as (inc⋅a) (Γ, e, Arg x # S) ⊑ prognosis ae as a (Γ, App e x, S)"

locale CardinalityPrognosisLam = CardinalityPrognosis +
  assumes prognosis_subst_Lam: "prognosis ae as (pred⋅a) (Γ, e[y::=x], S) ⊑ prognosis ae as a (Γ, Lam [y]. e, Arg x # S)"

locale CardinalityPrognosisVar = CardinalityPrognosis +
  assumes prognosis_Var_lam: "map_of Γ x = Some e ⟹ ae x = up⋅u ⟹ isVal e ⟹ prognosis ae as u (Γ, e, S) ⊑ record_call x ⋅ (prognosis ae as a (Γ, Var x, S))"
  assumes prognosis_Var_thunk: "map_of Γ x = Some e ⟹ ae x = up⋅u ⟹ ¬ isVal e ⟹ prognosis ae as u (delete x Γ, e, Upd x # S) ⊑ record_call x ⋅ (prognosis ae as a (Γ, Var x, S))"
  assumes prognosis_Var2: "isVal e ⟹ x ∉ domA Γ ⟹ prognosis ae as 0 ((x, e) # Γ, e, S) ⊑ prognosis ae as 0 (Γ, e, Upd x # S)"

locale CardinalityPrognosisIfThenElse = CardinalityPrognosis +
  assumes prognosis_IfThenElse: "prognosis ae (a#as) 0 (Γ, scrut, Alts e1 e2 # S) ⊑ prognosis ae as a (Γ, scrut ? e1 : e2, S)"
  assumes prognosis_Alts: "prognosis ae as a (Γ, if b then e1 else e2, S) ⊑ prognosis ae (a#as) 0 (Γ, Bool b, Alts e1 e2 # S)"

locale CardinalityPrognosisLet = CardinalityPrognosis + CardinalityHeap + ArityAnalysisHeap +
  assumes prognosis_Let:
  "atom ` domA Δ ♯* Γ ⟹ atom ` domA Δ ♯* S ⟹ edom ae ⊆ domA Γ ∪ upds S ⟹ prognosis (Aheap Δ e⋅a ⊔ ae) as a (Δ @ Γ, e, S) ⊑ cHeap Δ e⋅a ⊔ prognosis ae as a (Γ, Terms.Let Δ e, S)"

locale CardinalityHeapSafe = CardinalityHeap + ArityAnalysisHeap +
  assumes Aheap_heap3: "x ∈ thunks Γ ⟹ many ⊑ (cHeap Γ e⋅a) x ⟹ (Aheap Γ e⋅a) x = up⋅0"
  assumes edom_cHeap: "edom (cHeap Δ e⋅a) = edom (Aheap Δ e⋅a)"

locale CardinalityPrognosisSafe =
  CardinalityPrognosisEdom +
  CardinalityPrognosisShape +
  CardinalityPrognosisApp +
  CardinalityPrognosisLam + 
  CardinalityPrognosisVar +
  CardinalityPrognosisLet +
  CardinalityPrognosisIfThenElse +
  CardinalityHeapSafe +
  ArityAnalysisLetSafe

end