Module Qcert.NRA.Lang.NRASize


Require Import Lia.
Require Import DataRuntime.
Require Import NRA.

Section NRASize.
  Context {fruntime:foreign_runtime}.

  Fixpoint nra_size (a:nra) : nat :=
    match a with
    | NRAGetConstant s => 1
    | NRAID => 1
    | NRAConst d => 1
    | NRABinop op aa₂ => S (nra_size a₁ + nra_size a₂)
    | NRAUnop op a₁ => S (nra_size a₁)
    | NRAMap aa₂ => S (nra_size a₁ + nra_size a₂)
    | NRAMapProduct aa₂ => S (nra_size a₁ + nra_size a₂)
    | NRAProduct aa₂ => S (nra_size a₁ + nra_size a₂)
    | NRASelect aa₂ => S (nra_size a₁ + nra_size a₂)
    | NRADefault aa₂ => S (nra_size a₁ + nra_size a₂)
    | NRAEither aa₂=> S (nra_size a₁ + nra_size a₂)
    | NRAEitherConcat aa₂ => S (nra_size a₁ + nra_size a₂)
    | NRAApp aa₂ => S (nra_size a₁ + nra_size a₂)
    end.

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

  Fixpoint nra_depth (a:nra) : nat :=
    match a with
    | NRAGetConstant s => 0
    | NRAID => 0
    | NRAConst d => 0
    | NRABinop op aa₂ => max (nra_depth a₁) (nra_depth a₂)
    | NRAUnop op a₁ => nra_depth a
    | NRAMap aa₂ => max (S (nra_depth a₁)) (nra_depth a₂)
    | NRAMapProduct aa₂ => max (S (nra_depth a₁)) (nra_depth a₂)
    | NRAProduct aa₂ => max (nra_depth a₁) (nra_depth a₂)
    | NRASelect aa₂ => max (S (nra_depth a₁)) (nra_depth a₂)
    | NRADefault aa₂ => max (nra_depth a₁) (nra_depth a₂)
    | NRAEither aa₂=> max (nra_depth a₁) (nra_depth a₂)
    | NRAEitherConcat aa₂ => max (nra_depth a₁) (nra_depth a₂)
    | NRAApp aa₂ => max (nra_depth a₁) (nra_depth a₂)
    end.

End NRASize.