有许多方法可以表示程序的结构(例如UML类图等)。我想知道是否有一种约定以严格、数学的方式描述程序。我特别关注使用数学符号来达到这个目的。
例如:类被表示为集合(字段、属性)和操作集合元素的函数。父类的字段是子类字段的子集。函数用伪代码描述,必须看起来像这样...
有许多方法可以表示程序的结构(例如UML类图等)。我想知道是否有一种约定以严格、数学的方式描述程序。我特别关注使用数学符号来达到这个目的。
例如:类被表示为集合(字段、属性)和操作集合元素的函数。父类的字段是子类字段的子集。函数用伪代码描述,必须看起来像这样...
有很多方法,但我认为大部分都不方便表达结构,因为结构通常无法用默认的数学概念来表达。当然,主要例外是函数式编程语言。想想折叠(catamorphisme)、群、代数等。
对于命令式编程,我知道存在 Z,它使用(纯粹和扩展的)λ演算集合论和(一阶)谓词逻辑。然而,我认为这并不是很方便。使用数学来表达结构的唯一好处是你可以证明关于它的东西。但如果你想这样做,请看看 JML、Spec# 或 Eiffel。
Z已经被提到,它基本上就是你所描述的。有一些针对面向对象建模的变体,但我认为如果你想建模类,使用“标准Z”的模式就可以达到相当高的水平。
还有Alloy,它是较新的、受Z启发的工具。它的符号表示可能更接近于面向对象。它也是可分析的,即您可以检查您创建的模型是否满足某些条件,但它不能证明属性保持不变,只能在有限范围内尝试反驳。
文章Dependable Software by Design是Alloy及其类似工具的一个很好的介绍,同时列出了可用的类似工具的表格。
有一种数学语言,实际上描述了一个程序或者说它的操作。你从初始状态开始,然后转换这个状态,直到达到所需的目标状态。这些转换产生的程序代码必须被执行。
请参阅维基百科关于霍尔逻辑的文章。
基本思想是对于每个函数(无论是将其放入类中还是放入旧式函数中),都有前置条件和后置条件。例如,前置条件可以是您拥有一个具有>= 0
个元素的数组。后置条件是每个i <= j的元素[i]必须小于等于element[j]。
通常的描述是“该函数对数组进行排序”。但是数学术语允许您将输入(必须匹配前置条件)转换为输出(必须匹配后置条件)。
对于更复杂的程序来说,使用起来有点不方便,但其中一些示例非常令人印象深刻。通常情况下,您会得到非常紧凑的代码作为结果,看起来相当复杂,但第一次尝试就能运行。