{-# OPTIONS --prop --rewriting #-}

open import Calf.CostMonoid

module Calf.Types.BoundedFunction (costMonoid : CostMonoid) where

open CostMonoid costMonoid

open import Calf.Prelude
open import Calf.Metalanguage
open import Calf.Step costMonoid
open import Calf.Types.Bounded costMonoid

open import Level using (_⊔_)
open import Relation.Binary
open import Data.Product

bounded : (A : tp pos)  cmp cost  tp neg
bounded A n = Σ+- (U (F A)) λ u  IsBounded⁻ A u n

Ψ : (A : tp pos)  (B : val A  tp pos)  (val A  )  tp neg
Ψ A B p =
  Σ+- (U(Π A  a  F (B a)))) λ f 
    Π A λ a  IsBounded⁻ (B a) (f a) (p a)

dom :  {} {a} {A : Set a} {B : Set a}  Rel B   Rel (A  B) (a  )
dom {A = A} r f1 f2 =  (a : A)  r (f1 a) (f2 a)

Ψ/relax :  A B {p p'}  dom _≤_ p p' 
                 (f : cmp (Ψ A B p)) 
                 cmp (Ψ A B p')
Ψ/relax A B h (func , prf) = func ,
  λ a  bound/relax  _  h a) (prf a)