Qcert.NRA.Lang.NRASize


Section NRASize.

  Context {fruntime:foreign_runtime}.

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

  Lemma nra_size_nzero (a:nra) : nra_size a 0.

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

End NRASize.