Module cNRAEnvSize


Section cNRAEnvSize.
  Require Import Omega.
  Require Import BasicRuntime.
  Require Import cNRAEnv.

  Context {fruntime:foreign_runtime}.

  Fixpoint nraenv_core_size (a:nraenv_core) : nat
    := match a with
         | ANID => 1
         | ANConst d => 1
         | ANBinop op aa₂ => S (nraenv_core_size a₁ + nraenv_core_size a₂)
         | ANUnop op a₁ => S (nraenv_core_size a₁)
         | ANMap aa₂ => S (nraenv_core_size a₁ + nraenv_core_size a₂)
         | ANMapConcat aa₂ => S (nraenv_core_size a₁ + nraenv_core_size a₂)
         | ANProduct aa₂ => S (nraenv_core_size a₁ + nraenv_core_size a₂)
         | ANSelect aa₂ => S (nraenv_core_size a₁ + nraenv_core_size a₂)
         | ANDefault aa₂ => S (nraenv_core_size a₁ + nraenv_core_size a₂)
         | ANEither aa₂ => S (nraenv_core_size a₁ + nraenv_core_size a₂)
         | ANEitherConcat aa₂ => S (nraenv_core_size a₁ + nraenv_core_size a₂)
         | ANApp aa₂ => S (nraenv_core_size a₁ + nraenv_core_size a₂)
         | ANGetConstant _ => 1
         | ANEnv => 1
         | ANAppEnv aa₂ => S (nraenv_core_size a₁ + nraenv_core_size a₂)
         | ANMapEnv a₁ => S (nraenv_core_size a₁)
       end.

  Lemma nraenv_core_size_nzero (a:nraenv_core) : nraenv_core_size a <> 0.
Proof.
    induction a; simpl; omega.
  Qed.
  
  Fixpoint nraenv_core_depth (a:nraenv_core) : nat :=
    match a with
    | ANID => 0
    | ANConst d => 0
    | ANBinop op aa₂ => max (nraenv_core_depth a₁) (nraenv_core_depth a₂)
    | ANUnop op a₁ => nraenv_core_depth a
    | ANMap aa₂ => max (S (nraenv_core_depth a₁)) (nraenv_core_depth a₂)
    | ANMapConcat aa₂ => max (S (nraenv_core_depth a₁)) (nraenv_core_depth a₂)
    | ANProduct aa₂ => max (nraenv_core_depth a₁) (nraenv_core_depth a₂)
    | ANSelect aa₂ => max (S (nraenv_core_depth a₁)) (nraenv_core_depth a₂)
    | ANDefault aa₂ => max (nraenv_core_depth a₁) (nraenv_core_depth a₂)
    | ANEither aa₂=> max (nraenv_core_depth a₁) (nraenv_core_depth a₂)
    | ANEitherConcat aa₂=> max (nraenv_core_depth a₁) (nraenv_core_depth a₂)
    | ANApp aa₂ => max (nraenv_core_depth a₁) (nraenv_core_depth a₂)
    | ANGetConstant _ => 0
    | ANEnv => 0
    | ANAppEnv aa₂ => max (nraenv_core_depth a₁) (nraenv_core_depth a₂)
    | ANMapEnv a₁ => (S (nraenv_core_depth a₁))
    end.

End cNRAEnvSize.