我听说过(结构性)归纳法。它使您可以从较小的结构中构建有限的结构,并为证明这种结构的原理提供证明。这个想法很明确。
但是共生呢?它是如何工作的?怎么能说出无限结构的定论呢?
有(至少)两个角度需要解决,即共归作为一种定义事物的方式和一种证明技术。
关于共生作为证明技术,共生和双仿真之间是什么关系?
我听说过(结构性)归纳法。它使您可以从较小的结构中构建有限的结构,并为证明这种结构的原理提供证明。这个想法很明确。
但是共生呢?它是如何工作的?怎么能说出无限结构的定论呢?
有(至少)两个角度需要解决,即共归作为一种定义事物的方式和一种证明技术。
关于共生作为证明技术,共生和双仿真之间是什么关系?
Answers:
首先,要消除可能的认知失调:对无限结构的推理不是问题,我们一直在这样做。只要结构是有限可描述的,那不是问题。以下是几种常见的无限结构类型:
在归纳定义从基本构造块构建结构的地方,共归定义从如何解构的角度塑造结构。例如,其元素在集合中的列表类型A
在Coq中定义如下:
Inductive list (A:Set) : Set :=
| nil : list A
| cons : A -> list A -> list A.
通俗地说,该list
类型是包含内置的所有值最小的类型nil
和cons
构造,与公理。相反,我们可以定义最大的类型,该类型包含从这些构造函数构建的所有值,同时保持区分公理:
CoInductive colist (A:Set) : Set :=
| conil : colist A
| cocons : A -> colist A -> colist A.
list
与的子集同构colist
。此外,还colist
包含无限列表:带有cocons
on的列表cocons
。
CoFixpoint flipflop : colist ℕ := cocons 1 (cocons 2 flipflop).
CoFixpoint from (n:ℕ) : colist ℕ := cocons n (from (1 + n)).
flipflop
from 0
如果结果是从较小的块构建的,则递归定义的格式正确:递归调用必须在较小的输入上起作用。如果结果构建了更大的对象,则corecursive定义的格式正确。归纳法看待构造函数,共归法看待析构函数。请注意,对偶性不仅会变小,而且会变大,输入也变大。例如,上述flipflop
和from
定义格式正确的原因是,cocons
在两种情况下,corecursive调用均由对构造函数的调用来保护。
关于归纳对象的陈述具有归纳证明,而关于共归对象的陈述具有共归证明。例如,让我们在colists上定义无限谓词。从直觉上讲,无穷无尽的Collist并非以结束conil
。
CoInductive Infinite A : colist A -> Prop :=
| Inf : forall x l, Infinite l -> Infinite (cocons x l).
为了证明形式的colists from n
是无限的,我们可以通过共归进行推理。from n
等于cocons n (from (1 + n))
。这表明from n
大于from (1 + n)
,这是通过共归假设无限的,因此from n
是无限的。
共生作为证明技术也适用于最终物体。直观地讲,关于对象的归纳证明基于对象的构建方式。归纳证明基于对象如何分解。
在研究确定性系统时,通常通过归纳规则定义等价关系:如果可以通过一系列转换从一个系统转换到另一个系统,则两个系统是等效的。尽管内部结构不同,但这样的定义往往无法捕获不确定性系统最终可能具有相同(可观察)行为的许多不同方式。(共导对于描述非终止系统也很有用,即使它们是确定性的,但这也不是我在此要重点介绍的内容。)
非确定性系统(例如并发系统)通常由标记的过渡系统建模。LTS是其中标记了边缘的有向图。每个边缘代表系统的可能过渡。LTS的轨迹是图形中路径上的边缘标签序列。
双相似性是一个共生性质。可以将其定义为运算符的最大固定点:它是最大的关系,当扩展该关系以标识等效状态时,它保持不变。
Coq和归纳结构的演算
标记的过渡系统和双仿真
Davide Sangiorgi。Pi演算:移动过程理论。剑桥大学出版社,2003年。[ 亚马逊 ]
一章中的认证程序与相关类型由A. Chlipala