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
a
₁
a
₂ =>
S
(
nra_size
a
₁ +
nra_size
a
₂)
|
NRAUnop
op
a
₁ =>
S
(
nra_size
a
₁)
|
NRAMap
a
₁
a
₂ =>
S
(
nra_size
a
₁ +
nra_size
a
₂)
|
NRAMapProduct
a
₁
a
₂ =>
S
(
nra_size
a
₁ +
nra_size
a
₂)
|
NRAProduct
a
₁
a
₂ =>
S
(
nra_size
a
₁ +
nra_size
a
₂)
|
NRASelect
a
₁
a
₂ =>
S
(
nra_size
a
₁ +
nra_size
a
₂)
|
NRADefault
a
₁
a
₂ =>
S
(
nra_size
a
₁ +
nra_size
a
₂)
|
NRAEither
a
₁
a
₂=>
S
(
nra_size
a
₁ +
nra_size
a
₂)
|
NRAEitherConcat
a
₁
a
₂ =>
S
(
nra_size
a
₁ +
nra_size
a
₂)
|
NRAApp
a
₁
a
₂ =>
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
a
₁
a
₂ =>
max
(
nra_depth
a
₁) (
nra_depth
a
₂)
|
NRAUnop
op
a
₁ =>
nra_depth
a
₁
|
NRAMap
a
₁
a
₂ =>
max
(
S
(
nra_depth
a
₁)) (
nra_depth
a
₂)
|
NRAMapProduct
a
₁
a
₂ =>
max
(
S
(
nra_depth
a
₁)) (
nra_depth
a
₂)
|
NRAProduct
a
₁
a
₂ =>
max
(
nra_depth
a
₁) (
nra_depth
a
₂)
|
NRASelect
a
₁
a
₂ =>
max
(
S
(
nra_depth
a
₁)) (
nra_depth
a
₂)
|
NRADefault
a
₁
a
₂ =>
max
(
nra_depth
a
₁) (
nra_depth
a
₂)
|
NRAEither
a
₁
a
₂=>
max
(
nra_depth
a
₁) (
nra_depth
a
₂)
|
NRAEitherConcat
a
₁
a
₂ =>
max
(
nra_depth
a
₁) (
nra_depth
a
₂)
|
NRAApp
a
₁
a
₂ =>
max
(
nra_depth
a
₁) (
nra_depth
a
₂)
end
.
End
NRASize
.