我在看:
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
答案 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章节之前,先熟悉一下那里的概念,这应该使阅读更加容易。