有许多表示程序结构的方法(如UML类图等)。如果有一个以严格的数学方式描述程序的约定,我感兴趣。我特别感兴趣的是为此目的使用数学符号。
示例:类表示为集(字段,属性)和函数(对集合元素进行操作)。父类'字段是子类的子集'。函数用伪代码描述,它必须看起来像这样......
答案 0 :(得分:2)
答案 1 :(得分:2)
答案 2 :(得分:1)
是的,有Floyd-Hoare Logic。
答案 3 :(得分:1)
有很多方法,但我认为它们中的大多数都不便于表达结构,因为结构在默认的数学概念中通常是不可表达的。主要的例外当然是功能编程语言。想想折叠(catamorphisme),群体,代数等等。
对于命令式编程,我知道Z的存在,它使用(纯粹的和扩展的)lambda演算集理论和(一阶)谓词逻辑。但是,我不认为这很方便。使用数学表达结构的唯一好处是你可以证明它的相关事实。但是如果你想这样做,请看看JML,Spec#或Eiffel。
答案 4 :(得分:1)
取决于您想要完成的任务,但是使用特定语言走这条路会让您陷入困境。
例如,请参阅C ++ FAQ Lite上的circle-ellipse discussion。
答案 5 :(得分:1)
本书采用演绎法 通过附属计划进行编程 用抽象的数学 使他们工作的理论。 [...]
我相信Alexander Stepanov和Paul McJones的Elements of Programming非常接近你所寻找的。 p>
概念是对...的描述 对一种或多种类型的要求 根据存在和 程序属性,类型 属性和定义的类型函数 关于类型。
答案 6 :(得分:1)
Z,已经提到过,几乎就是你所描述的。它有一些用于面向对象建模的变体,但我认为如果你想对类进行建模,你可以使用“标准Z”模式。
还有Alloy,它更新,受Z的启发。它的符号可能更接近于面向对象。它也是可分析的,即你可以检查你创建的模型是否满足某些条件,但它不能证明属性成立,只是试图在有限的范围内反驳。
文章Dependable Software by Design是对Alloy及其同类产品的精彩介绍,以及可用类似工具的表格。
答案 7 :(得分:1)
您正在寻找functional programming.有几种函数式编程语言,它们都基于一种称为Lambda calculus的基本数学理论。用LISP等函数式编程语言编写的程序是他们自己的数学表示。 ; - )
答案 8 :(得分:0)
有一种数学语言实际上描述了一个程序,或者说它的操作。您获取初始状态,然后转换此状态,直到达到所需的目标状态。转换产生必须执行的程序代码。
请参阅Wikipedia article about Hoare logic。
基本思想是,对于每个函数(无论你将它放入类或旧函数中),你都有一个前置条件和一个后置条件。例如,前提条件是您有一个具有>= 0
元素的数组。后置条件是每个元素[i]必须由< = element [j]为每个i< = j。
通常的描述是“函数对数组进行排序”。但是数学术语允许您将输入(必须与前提条件匹配)转换为输出(必须与后置条件匹配)。
使用它有点笨拙,特别是对于更复杂的程序,但有些例子非常令人印象深刻。通常情况下,您会得到非常紧凑的代码,因为结果看起来相当复杂,但首先尝试使用。
答案 9 :(得分:0)
我想建议编程代数。这是一种计算方法,使用Relational Algebra和Galois Connections。
如果您对此主题有进一步的兴趣,可以找到由Shin-Cheng Mu和JoséNunoOliveira(here)撰写的精彩论文slides。
使用关系代数和一阶逻辑,与Alloy,函数编程和契约设计(很容易应用于面向对象的编程)有很好的协同作用。