互感类型的解决方法

时间:2018-04-05 01:29:20

标签: coq

考虑一种简单的语言,它有自然数,自然数的向量,变量,以及+, - 和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表示整数。

1 个答案:

答案 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.
相关问题