面向对象模型的“对象”的数学形式定义/计数器部分


9

这是我在数学SE论坛上提出的一个问题,在此已被推荐给我。所以这里的问题是

我在形式数学和理论计算机科学方面都是新手,因此如果您发现我的问题没有适当的表述,请多多包涵。在模拟现实世界时,面向对象建模对于定义复杂的交互似乎非常有用。但是它主要用于编程。我想知道我们在数学上是否有类似的概念。当我们进行编程时,我们可以理解“对象”和“面向对象编程”的概念,并加以实现。但是,我们是否有基于集合论的“对象”的正式定义?或就此而言,还有其他形式数学理论吗?

我们可以实现/正式定义三个主要的面向对象的建模概念吗?1.封装2.继承3.多态

我知道问题太笼统了,但是如果您也可以提供一些指示,以便我能更好地理解这些概念,我将不胜感激。


2
我认为确实有两个问题。一种是要求面向对象概念的形式化。另一个要求数学中的面向对象的概念。也许最好问两个单独的问题。有很多资料可以回答第一个问题,尽管第二个问题可能很少。(也许明天我会抽出时间来回答这个问题。)
戴夫·克拉克

谢谢..您能否建议我将面向对象概念的形式化材料视为标准或“教科书”?我将等待您回答第二个问题。...:)
user1260776 2012年

2
(几年前)的标准书是《对象论》。最新的工作是Featherweight Java。还有一系列称为“面向对象语言基础 ”的研讨会旨在解决这些问题。
戴夫·克拉克2012年

谢谢!将通过他们......另外,我偶然发现了“演算”,这是密切相关的,我的问题..
user1260776

Answers:


9

答案很复杂,有两个原因。

  1. 计算机科学中的不同人对术语“对象”的解释不同。一种是对象由打包在一起的一些数据和操作组成。另一个是对象是所有但还具有“状态”的对象,即它是可变实体的某种形式。

  2. 与“变化”的含义(以及不断变化的“实体”的含义)以及数学描述是否实际上捕获了可变的实体有关的哲学问题很深。

数据+运算意义上的对象:这在数学上是很标准的。拿任何小组理论教科书。它将在某处有一个定义,例如HGX=GXG-1个。(它是一个共轭运算符。)HG是该术语中的“对象”。它有一些数据(G)和一个运算 XGXG-1个。或者您也可以选择一对GXGXG-1个 或三重 GXGXG-1个XG-1个XG。您可以使用具有lambda抽象和某种方式形成元组的任何功能编程语言来构造此类“对象”。阿巴迪和卡德利的“对象理论”广泛地处理了这种对象。

状态的对象(或变化的对象):数学有这样的东西吗?我不这么认为。我还没有看到数学家谈论任何改变的东西,而不是他/她的职业生涯。牛顿曾经写过X 假设粒子的位置发生了变化,并且 X˙对于它的变化率。数学家们最终发现,牛顿在说的是一个函数XŤ 从实数到向量空间,以及 X˙ 是另一个这样的函数,它是 XŤ 关于 Ť。由此,许多具有深远思想的数学家得出结论,变化并不真正存在,而您所拥有的只是时间的函数。但是牛顿力学的变化不是位置,而是粒子。该位置是其瞬时状态。没有数学家或物理学家会假装粒子是数学概念。这是物理上的事情。

对象也是如此。它们是“物理”事物,状态是它们的数学属性。有关此方面的详细讨论,请参见《 Abelson和Sussman的计算机程序结构和解释》的第3章。这是麻省理工学院的一本教科书,他们将其教给所有科学家和工程师,我认为他们完全理解“物理”事物。

粒子不是数学的事实并不意味着我们不能在数学上处理它们。如果您要求数学家为两粒子系统建模,他将立即组成两个函数并调用它们X1个ŤX2Ť。因此,两个粒子减少为两个无意义的索引(1和2)。这是数学家的说法,我们不知道这些粒子是什么,我们不在乎。我们需要知道的是它们的位置独立(或独立)发展。因此,我们将通过两个单独的函数对它们进行建模。

同样,建模面向对象程序的标准数学方法是将每个对象视为状态空间的索引。唯一的区别是,由于对象来来去去,并且系统的结构是动态的,因此我们需要将其扩展到“可能的世界”模型,其中每个世界基本上都是索引的集合。对象的分配和释放将涉及从一个世界转移到另一个世界。

不过有一个问题。与机械学不同,我们希望对象的状态被封装。但是,对对象的数学描述使状态无处不在,从而完全破坏了封装。有一种称为“关系参数性”的数学技巧,可用于将内容缩减为大小。除了强调这是一个数学技巧,而不是封装的非常概念性的解释之外,我现在不再赘述。封装进行数学建模的第二种方法是精化状态并根据可观察事件描述对象行为。为了对这两种模型进行很好的讨论,我可以向您介绍名为Algol-like Languages的Objects and classes的论文。


[添加说明:]

关于对象的数学基础的很好的分析可以在William Cook的文章“ 重新理解理解数据抽象 ”中找到。


2
我知道这里有人可以回答……
安德烈·鲍尔

感谢Uday的宝贵时间和详细的答复。当我问这个问题时,我只是在思考“数据+运算”,而我从来没有想到组理论可以将“对象”表示为“数据+运算”。另外,我还将浏览您引用的链接。
user1260776 2012年

@AndrejBauer。是的,我可能过分了。OP可能使用“数学”作为形式化的词汇,而不是一门学科。
乌代·雷迪

@Uday,我可能没有适当地表达问题,但是当我指的是“数学”时,我显然指的是形式数学。我的想法是““集合论”构成了数学的基础,如何从集合论的角度来“解释”或“推导” OO建模的对象。我们如何将所有这些集合在一起-集合论,对象和形式逻辑(例如一阶逻辑)...”尽管我不太了解您的答案,但是我能够“理解”您所说的话,并且向您保证,这是我所期待的答案。谢谢!(我的想法还没有完全组织好,请原谅我仍然是新手:))
user1260776 2012年

2
@ user1260776。我明白。但我的观点是,“形式”和“数学”是不同的想法。您可以形式化概念,而不必将其简化为数学(或从数学中衍生)。牛顿使力学正式化,但并没有费心将“粒子”简化为“集合”。我个人很高兴跟随牛顿的领导,并承认我不会减少的事情。但是,我想我们必须知道何时减少和何时不减少。在接受过物理学家的培训后,我发现这很容易做到。对于许多其他计算机科学家来说,这可能并不容易。
乌代·雷迪

0

认为abelson&sussman所著的经典经典书“计算机程序的结构和解释” [1]基于方案(一种Lisp变体)对对象进行了很好的理论描述。现在免费在线!这确实说明了如果您有某种存储局部状态的机制,那么即使将对象定向的概念也可以嵌入到lambda演算(〜aka Lisp)中。据我了解,这是许多年来的一本标准MIT教科书。不是说这是对主题的最好参考;可以肯定的是,在这一点上还有其他更好的选择。

我不认为这在我听到的任何地方都已经完全形式化,但松散地说,对象基本上是由代码+数据组成的,形式为

  • 方法(带有参数)
  • 状态,即实例变量

以某种封装形式。可以说,继承等其他方面并不是根本。正如abelson&sussman所述,他们称之为“语法糖”。

[1] abelson&sussman的计算机程序的结构和解释


3
当然,面向对象编程意义上的对象已经形式化。有Abadi&Cardelli,Castanga和Kim Bruce撰写的有关该主题的书。FOOL系列已有10年的研讨会,专门讨论面向对象编程的基础。ECOOP和OOPSLA会议定期在OO的基础上发表论文。确实,有关OO语义的第一篇论文大约有20年的历史了。
戴夫·克拉克

@vzn,感谢您的回答。我会
仔细

DC-我说的不好。更准确地说,可以肯定地说,什么构成了“对象”或什么是OOP的关键/基本组成部分的正式定义在文献中往往有很大不同。随着时间的流逝,定义可能已经大大扩展。例如,我怀疑继承是在以后添加的,最初的想法主要是封装形式的代码和数据。
vzn 2012年

我不能说基本的OOP功能的另一个例子是多重继承,例如在C ++中可以看到,但是在Java中有意避免使用,而是转而使用接口。等等
vzn 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.