初学者在这里! 我如何解释看起来像这样的记录?
Record test A B :=
{
CA: forall m, A m;
CB: forall a b m, CA m ==> B(a,b);
}
我试图了解该记录的实例是什么样,而且,将量化引理作为一种类型意味着什么。
答案 0 :(得分:4)
您正在写的东西没有任何意义,因为符号_ ==> _
应该链接两个布尔值。但是CA
的类型为A m
,它本身是一种类型,而不是布尔值。
前进的一种可能性是使CA
为布尔型函数,可以表示A
谓词。
您的假设记录的另一个困难是,我们不知道A
和B
的输入类型是什么,因此我假设我们生活在T
的环境类型中出现哪些量化。所以这是一个变体:
Record test (T : Type) (A : T -> Prop) (B : T * T -> bool) :=
{
CA : T -> bool;
CA_A : forall m, CA m = true -> A m;
CB : forall a b m, (CA m ==> B(a, b)) = true
}.
此示例使您理解该逻辑语言中有两个不同的概念:bool
值和Prop
值。它们代表不同的事物,有时可以合并在一起,但是您需要在脑海中清楚地区分,以保留初学者的类别。
对于您的最后一句话“将量化引理作为一种类型意味着什么”,这是另一种解释。
使用常规编程语言进行编程时,可以返回整数数组。但是,您不能明确表示要返回特定长度的整数数组。在Gallina(Coq的基本编程语言)中,您可以定义长度为10的数组类型。让我们假设将这种类型写为array n
。因此array 10
和array 11
将是两种不同的类型。将数字n
作为输入并返回长度为n
的数组作为输出的函数将具有以下类型:
forall n, array n
因此,具有量化公式作为类型的对象就是一个函数。
从逻辑的角度来看,语句forall n, array n
通常被理解为,对于每一个n
,都存在一个size n
数组。这句话对您来说可能并不奇怪。
因此,数组的类型取决于索引。现在我们可以想到另一种类型,例如,n
是质数的证明类型 。假设此类型写为prime n
。当然,有些数字不是质数,例如,prime 4
类型根本不包含任何证明。现在,我可以编写一个名为test_prime : nat -> bool
的函数,其属性为当返回true
时,我可以保证输入是素数。可以这样写:
forall n, test_prime n = true -> prime n
现在,如果我想定义所有正确的主要测试函数的集合,我希望将一个函数及其正确性的证明关联到一个数据中,因此我将定义以下数据类型。
Record certified_prime_test :=
{
test_prime : nat -> bool;
certificate : forall n, test_prime n = true -> prime nat
}.
因此包含通用量化公式的记录可以属于以下两种类别之一:一个组件是该函数之一,其输出在同一族的几种类型中都不同(例如array
的示例),或者这些组件中的一个实际上带来了有关作为功能的另一个组件的更多逻辑信息。在certified_prime_test
示例中,certificate
组件带来了有关test_prime
函数的更多信息。