考虑一种简单的语言,它有自然数,自然数的向量,变量,以及+, - 和nth
等一些运算。天真的,我会用Coq对它进行编码:
Require Import Coq.Vectors.Vector.
Inductive NExpr: Type :=
| NVarValue: nat -> NExpr
| NConst: nat -> NExpr
| NPlus : NExpr -> NExpr -> NExpr
| NMinus: NExpr -> NExpr -> NExpr
| NNth : forall n, VExpr n -> NExpr -> NExpr
with
VExpr (n:nat): Type :=
| VVarValue: nat -> VExpr n
| VConst: Vector.t nat n -> VExpr n.
当然,由于产生错误的已知限制,这不起作用:"错误:对于每种归纳类型,参数在语法上应该相同。"
在Coq中编码此类语言的正确方法是什么?。当然,我应该能够写一个eval
函数,按https://softwarefoundations.cis.upenn.edu/lf-current/Imp.html
评估时,矢量的维数使用如下:
match e with
...
| @NNth v i => match Compare_dec.lt_dec (evalNexp st i) n with
| left p => Vnth (evalNexp st v) p
| right _ => 0
end
N.B。在此示例中,VExpr
不依赖于NExpr,但将来可能会添加构造函数,其中一些构造函数可能使用NExpr
。此外,我可能需要添加更多类型,例如,ZExpr
表示整数。
答案 0 :(得分:2)
您可以更改第二个归纳法,以便它使用索引而不是参数。
Require Import Coq.Vectors.Vector.
Inductive NExpr: Type :=
| NVarValue: nat -> NExpr
| NConst: nat -> NExpr
| NPlus : NExpr -> NExpr -> NExpr
| NMinus: NExpr -> NExpr -> NExpr
| NNth : forall n, VExpr n -> NExpr -> NExpr
with
VExpr : nat -> Type :=
| VVarValue: forall n, nat -> VExpr n
| VConst: forall n, Vector.t nat n -> VExpr n.