我相信查找抽象解释理论对您会有所帮助,该理论为基于格的程序分析稍有不同的领域中的类似问题提供了非常彻底的答案。
在我看来,您正在使用基于代数的框架。我在这里使用通用代数的意义上的代数一词,我假设对代数结构的约束是由术语之间的相等性给出的。抽象(或层次结构)进入图片有两种不同的感觉。
- 抽象是两个特定代数之间的关系。您可能要说一个代数具有比另一个代数更丰富的结构,或者您可以用一个代数解决的每个问题都可以用另一个代数解决。这种关系就是形式化的购买同态或代数之间的其他映射。
- 作为代数族的抽象层次结构。在您的情况下,这些将是具有某些属性的三角肌家族。作为更一般的示例,请考虑所有部分排序的集合。我们可以将晶格,分布晶格和布尔晶格视为具有更丰富属性的一系列子族。
这两个概念密切相关但又不同。
两种结构之间的抽象
抽象解释的见解在于,赋予您考虑的结构以顺序概念很有用。考虑两种结构
(M,fM) 和 (N,fN),带有 fM:M→M 和 fN:N→N 作为感兴趣的操作。
通用代数意义上的同态看起来像这样:
h:M→N 是满足平等的功能 h(fM(a))=fN(h(a))。
我们可以将上面出现的两个结构视为预定结构
(M,=,fM) 和 (N,=,fN)
我们可以将同态重写为一个满足
- 如果 a=b 然后 h(a)=h(b)和
- 对所有人 a 在 M, h(fM(a))=fN(h(a))。
现在,假设您还有其他一些可行的近似概念。例如,当我们在程序验证中处理状态集时,子集包含对于某些应用是有意义的,或者在自动推导中处理公式时,蕴含是有意义的。更笼统地说,我们可以考虑
(M,⪯,fM) 和 (N,⊑,fN),在哪里 ⪯ 和 ⊑ 是预购商品。
现在,我们可以使用抽象函数代替同构
α:M→N 这是
- 单调的,意味着每当 a⪯b 我们有 α(a)⊑α(b)和
- 与操作半通勤: α(fM(a))⊑fN(α(a)) 对所有人 a 在 M。
抽象函数明确提出以下想法: N 是对结构的抽象 M,然后评估中的一项 N 不能产生更精确的结果(相对于 N),而不是评估 M 然后将其映射到 N。
现在我们可以问是否有必要用抽象而不是细化的方法来解决问题。意思是,我们不能说M 是对 N并按条件制定条件。这正是具体化功能所要做的。
一个具体化功能 γ:N→M是单调和满足不等式fM(γ(b))⪯γ(fN(b))。
抽象和具体化条件在抽象解释中称为健全性条件。在特殊情况下α 和 γ形成Galois连接时,抽象和具体化条件是等效的。通常,它们不是等效的。
到目前为止,我们所做的每一件事都只是形式化了一对结构之间的抽象概念。我所说的话可以用范畴论的语言更简洁地概括。由于您在上面发表了评论,因此我避免了使用类别。
抽象层次结构
假设我们有一个结构 M被赋予预购和一些操作。我们可以考虑所有结构N 这样 N 是...的抽象 M在上述意义上。如果我们有那个N1 是...的抽象 N2 两者都是 M,我们具有层次结构的三个元素。关系“是...的抽象”允许我们定义结构之间的前置关系。让我们将通过抽象排序的结构族称为层次结构。
如果考虑您的示例,则看来您的抽象三角肌可能是某个层次结构中最大元素的候选者。我不确定,因为抽象的三角肌似乎是三角肌家族而不是特定的三角肌。
现在,您可以考虑不同的层次结构。所有三角肌的层次结构。基于上述各种考虑的子层次结构。抽象解释上下文中的一个特定示例是与给定powerset晶格在Galois连接中的完整晶格的层次结构,以及仅由分布或布尔布尔晶格组成的子层次结构。
正如马丁·伯杰(Martin Berger)在评论中指出的那样,层次结构之间的抽象概念被类别之间的附加概念所捕获。
分类的观点
有一条评论要求对类别进行更多评论。该评论不再存在,但我还是会回应。
让我们退后一步,从更一般的角度看一下您在设计三角肌中正在做的事情以及我上面已经描述的内容。我们有兴趣了解我们在软件上下文中操作的实体的基本结构以及这些实体之间的关系。
第一个重要的认识是,我们不仅对一组元素感兴趣,而且对我们可以在这些元素上执行的操作以及这些操作的属性感兴趣。这种直觉驱动着面向对象编程中类的设计以及代数结构的定义。您已经在deltoid的定义中明确了这种直觉,该定义已经确定了一些令人感兴趣的操作。更一般而言,这是代数描述的基础思维过程。我们需要确定我们的操作是什么以及它们具有什么属性。此步骤告诉我们正在使用的类型结构。
第二个认识是我们不仅对一组元素感兴趣,而且对抽象关系也很感兴趣。我能想到的最简单的形式化抽象方法是考虑预定集。我们可以将预排序集合视为对集合中包含近似概念的事物的严格概括。
理想情况下,我们希望在以上两种见解都是一流公民的环境中工作。意思是说,我们想要一个像代数一样的类型化设置,但也想要一个前置变量的近似感知设置。朝这个方向的第一步是考虑晶格。格子是概念上有趣的结构,因为我们可以用两种等效的方式对其进行定义。
- 我们可以方程式地将晶格定义为一个集合 (L,⊓,⊔)配备了见面和加入操作。然后,我们可以得出通过定义偏序a⊑b 随时保持 a⊓b=a。
- 另一种方法是将晶格定义为部分有序集 (L,⊑) 满足中的每一对元素 L具有唯一的最大下限和最小上限。然后,我们可以从偏序中推导出Meet和Join操作。
因此,晶格是一种数学结构,可以从代数或逼近的角度进行研究。此处的缺点是,晶格的元素本身不具有影响近似关系的类型结构。意思是,我们不能基于具有更多或更少结构的概念来比较元素。
在您遇到问题的情况下,您可以将类别视为对预言的自然概括,它可以捕捉代数环境中的近似概念(在态射中)和类型结构。类别理论的设置使我们可以省去各种不必要的区别,而将重点放在您关心的实体的结构上以及该结构的近似上。通用属性和附加功能为您提供了非常强大的词汇和工具,以帮助您了解您感兴趣的结构的概况,并对甚至不同抽象级别等直观概念也可以进行严格的数学处理。
关于我对抽象三角肌的评论,看来您想要的是一个类别。抽象三角肌是类似于集合类别的特定类别。您还在考虑其他类别。我最初以为您定义的三角函数在范畴论的意义上将是终端(或最终)对象。
您正在研究类别理论为其提供非常令人满意的答案的问题。希望您能自己得出这个结论。
参考文献
- 逻辑程序的抽象解释和应用,Patrick Cousot和Radhia Cousot。本文的前半部分是有关抽象解释主题的一般教程风格的介绍。
- 抽象解释框架 Patrick Cousot和Radhia Cousot。本文非常详细地讨论了我上面概述的有关抽象和具体化功能的所有可能性。
- 程序分析框架的系统设计,Patrick Cousot和Radhia Cousot。这篇文章介绍了程序分析环境中抽象层次的概念。
- Francesco Ranzato和Francesco Tapparo 通过抽象解释进行广义强保存。本文将这些思想应用于保留时态逻辑公式的不同抽象上下文中。您将在此处找到布尔和分布抽象的有效示例。
- 抽象解释,逻辑关系和Kan扩展,Samson Abramsky。提出了关于上述顺序理论材料的范畴理论观点。