Theory DeclSemAsDenotFSet

theory DeclSemAsDenotFSet
  imports Lambda ValuesFSet
begin
  
section "Declarative semantics as a denotational semantics"

fun E :: "exp ⇒ env ⇒ val set" where
  Enat: "E (ENat n) ρ = { v. v = VNat n }" |
  Evar: "E (EVar x) ρ = { v. ∃ v'. lookup ρ x = Some v' ∧ v ⊑ v' }" |
  Elam: "E (ELam x e) ρ = { v. ∃ f. v = VFun f ∧ (∀ v1 v2. (v1, v2) ∈ fset f 
    ⟶ v2 ∈ E e ((x,v1)#ρ)) }" |
  Eapp: "E (EApp e1 e2) ρ = { v3. ∃ f v2 v2' v3'. 
      VFun f ∈ E e1 ρ ∧ v2 ∈ E e2 ρ ∧ (v2', v3') ∈ fset f ∧ v2' ⊑ v2 ∧ v3 ⊑ v3' }" |
  Eprim: "E (EPrim f e1 e2) ρ = { v. ∃ n1 n2. VNat n1 ∈ E e1 ρ 
          ∧ VNat n2 ∈ E e2 ρ ∧ v = VNat (f n1 n2) }" |
  Eif: "E (EIf e1 e2 e3) ρ = { v. ∃ n. VNat n ∈ E e1 ρ
         ∧ (n = 0 ⟶ v ∈ E e3 ρ) ∧ (n ≠ 0 ⟶ v ∈ E e2 ρ) }"

end