Module NRASize


Section NRASize.
  Require Import Omega.
  Require Import BasicRuntime NRA.

  Context {fruntime:foreign_runtime}.

  Fixpoint nra_size (a:nra) : nat :=
    match a with
    | AID => 1
    | AConst d => 1
    | ABinop op aa₂ => S (nra_size a₁ + nra_size a₂)
    | AUnop op a₁ => S (nra_size a₁)
    | AMap aa₂ => S (nra_size a₁ + nra_size a₂)
    | AMapConcat aa₂ => S (nra_size a₁ + nra_size a₂)
    | AProduct aa₂ => S (nra_size a₁ + nra_size a₂)
    | ASelect aa₂ => S (nra_size a₁ + nra_size a₂)
    | ADefault aa₂ => S (nra_size a₁ + nra_size a₂)
    | AEither aa₂=> S (nra_size a₁ + nra_size a₂)
    | AEitherConcat aa₂ => S (nra_size a₁ + nra_size a₂)
    | AApp aa₂ => S (nra_size a₁ + nra_size a₂)
    | AGetConstant s => 1
    end.

  Lemma nra_size_nzero (a:nra) : nra_size a <> 0.
Proof.
    induction a; simpl; omega.
  Qed.

  Fixpoint nra_depth (a:nra) : nat :=
    match a with
    | AID => 0
    | AConst d => 0
    | ABinop op aa₂ => max (nra_depth a₁) (nra_depth a₂)
    | AUnop op a₁ => nra_depth a
    | AMap aa₂ => max (S (nra_depth a₁)) (nra_depth a₂)
    | AMapConcat aa₂ => max (S (nra_depth a₁)) (nra_depth a₂)
    | AProduct aa₂ => max (nra_depth a₁) (nra_depth a₂)
    | ASelect aa₂ => max (S (nra_depth a₁)) (nra_depth a₂)
    | ADefault aa₂ => max (nra_depth a₁) (nra_depth a₂)
    | AEither aa₂=> max (nra_depth a₁) (nra_depth a₂)
    | AEitherConcat aa₂ => max (nra_depth a₁) (nra_depth a₂)
    | AApp aa₂ => max (nra_depth a₁) (nra_depth a₂)
    | AGetConstant s => 0
    end.

End NRASize.