Qcert.DNNRC.Lang.DNNRCSize


Section size.


  Context {fruntime:foreign_runtime}.
  Context {A plug_type:Set}.

  Context (plug_size:plug_type→nat).

  Fixpoint dnnrc_size (d:dnnrc A plug_type)
    := match d with
       | DNNRCVar _ _ ⇒ 1
       | DNNRCConst _ _ ⇒ 1
       | DNNRCBinop _ _ d1 d2 ⇒ S (dnnrc_size d1 + dnnrc_size d2)
       | DNNRCUnop _ _ d0 ⇒ S (dnnrc_size d0)
       | DNNRCLet _ _ d1 d2 ⇒ S (dnnrc_size d1 + dnnrc_size d2)
       | DNNRCFor _ _ d1 d2 ⇒ S (dnnrc_size d1 + dnnrc_size d2)
       | DNNRCIf _ d1 d2 d3 ⇒ S (dnnrc_size d1 + dnnrc_size d2 + dnnrc_size d3)
       | DNNRCEither _ d1 _ d2 _ d3 ⇒ S (dnnrc_size d1 + dnnrc_size d2 + dnnrc_size d3)
       | DNNRCGroupBy _ _ _ d0 ⇒ S (dnnrc_size d0)
       | DNNRCCollect _ d0 ⇒ S (dnnrc_size d0)
       | DNNRCDispatch _ d0 ⇒ S (dnnrc_size d0)
       | DNNRCAlg _ pt sdl ⇒ S (plug_size pt + (fold_left (fun acc sc ⇒ dnnrc_size (snd sc) + acc) sdl 0))
       end.

  Lemma dnnrc_size_nzero (d:dnnrc A plug_type) : dnnrc_size d ≠ 0.

End size.