当有多行定义归纳构造函数的动作时,这是什么意思?

时间:2018-12-13 00:35:21

标签: coq

我在看:

Inductive aevalR : aexp -> nat -> Prop :=
  | E_ANum  : forall (n: nat),
      aevalR (ANum n) n
  | E_APlus : forall (e1 e2: aexp) (n1 n2: nat),
      aevalR e1 n1 ->
      aevalR e2 n2 ->
      aevalR (APlus e1 e2) (n1 + n2)
  | E_AMinus: forall (e1 e2: aexp) (n1 n2: nat),
      aevalR e1 n1 ->
      aevalR e2 n2 ->
      aevalR (AMinus e1 e2) (n1 - n2)
  | E_AMult : forall (e1 e2: aexp) (n1 n2: nat),
      aevalR e1 n1 ->
      aevalR e2 n2 ->
      aevalR (AMult e1 e2) (n1 * n2).

并试图理解其含义。我了解这需要算术运算。将其映射到映射到nat的函数,该nat映射到道具。但是令我困惑的是| A_AOp子句中的内容。它们的末尾没有句点,正负号的箭头指向另一个箭头。

这是什么类型的语法,应该说什么?这种归纳类型的输入是什么?像通常我在python中看到的一样:

def f(a,b,*args):

所以我知道我应该提供的输入(或多或少)。但这使我感到困惑。我该如何使用?定义是什么意思?

idk是否应该是一个简单的函数式编程问题,因为我只是在学习Coq和函数式编程,而这部分不在我正在学习的课程的函数式编程入门中:

https://softwarefoundations.cis.upenn.edu/lf-current/Imp.html

1 个答案:

答案 0 :(得分:1)

此摘要以归纳方式定义了谓词aevalR。谓词是表达式e : aexp和数字n : nat之间的关系:当aevalR e n的值为e时,n成立。竖线引入的每个子句描述了评估表达式的一种可能性。例如,E_APlus说,当e1的值为n1并且e2的值为n2时,我们知道APlus e1 e2的值为{{1 }}。

归纳命题是Coq中使用最多的工具之一。在Software Foundations一书中有一个chapter 介绍了该概念。我建议您在尝试攻打Imp章节之前,先熟悉一下那里的概念,这应该使阅读更加容易。