【问题标题】:Speaking computer science in mathematicalese用数学语言讲计算机科学
【发布时间】:2011-03-22 11:48:53
【问题描述】:

我正在撰写一篇关于计算机科学主题的相当长的专着。但是,我通常发现自己不得不用数学术语写一些计算机科学概念,这对我来说很难。例如,假设我想编写一个 for 循环或 void 函数。我大部分时间都去我的 Knuth、Cormen 或 Sedgewick,但现在还不够。是否有“手册”或一些文本可以作为将计算机科学转化为数学的示例?

编辑

让我说得更具体一些(谢谢 Uri)。我的意思是:例如,我有一个 void 函数,它返回一个长度为 n 的随机字符串。这引起了我的好奇心,我什至不知道如何在数学中表示 void 函数......但这只是一个例子。

【问题讨论】:

  • 不想这么说,但这三本可能是最数学的 CS 书籍。如果您精疲力尽,我认为您可能必须成为该主题的先驱。 :)
  • @sheep: :) 我希望我...那些书根本没有涉及的理论。
  • 如果你给我发了一份手稿和具体问题,也许我可以帮助你离线。在从事软件开发之前,我是一名数学教授。 johndcook.com/contact.html
  • 至于长度为 n 的随机字符串,您可以简单地说“X 是长度为 n 的随机字符串...”,然后明确说明“随机”的含义。例如,它是从某个字母表的所有 n 字母字符串中均匀随机选择的吗?

标签: computer-science math


【解决方案1】:

我认为你必须更具体。你说的是翻译算法吗?把代码写成伪代码?

还有更多“数学”形式,其中许多用于程序的形式验证。 它们通常基于离散数学。

根据您要执行的操作,Hoare Logic 是表示算法步骤的好方法,恕我直言。

您还可以使用Z notation 正式指定一些架构和协议。

【讨论】:

  • 我见过的每一种形式的构造符号都是离散数学的某种形式——通常是数理逻辑、集合论、组合学和代数。像 Z 这样的形式规范语言在很大程度上基于离散数学的构造。
【解决方案2】:

求和或乘积符号可能可以替代一些 for 循环。其他可能可以表示为逻辑量词(“存在 i 使得 a[i] 具有某些属性” 或“a[i] 对所有 i 都有一些属性”)。 (对不起,我不知道如何渲染这些 在 Markdown 中......希望你明白。)

“无效函数”...嗯,也许是一些方便的逻辑符号来陈述先决条件 和后置条件,因为这些函数只对它们的副作用有用?

但我认为大多数数学家对算法的描述足够熟悉,可以理解任何合理的伪代码约定。试着远离 在某些特定编程中需要“语言律师”技能水平的任何事情 语言。

【讨论】:

  • :) “语言律师”,我喜欢这个。顺便说一句,我尝试了 for 循环的求和,一位数学家差点杀了我,同时说“是的,是的,但你没有在这里添加任何东西!”......
  • @Dervin:好吧,你去吧……别想太多!简洁明了,尝试学习并遵守任何特定主题的约定,数学家(甚至是普通人!)将不胜感激。
  • +1 当我尝试使用求和和乘积符号代替 For 循环时,收到了一位数学家的相同评论。
【解决方案3】:

解决您的具体问题:在数学中,如果它不带参数并返回长度为 n 的随机字符串,那么它可能根本就不是函数!也就是说,如果 f() 不等于 f()(例如,f() = rand()),那么根据定义 f() 不是函数。您可以根据自己的喜好以不同的方式解决这个问题:您可以将状态参数传递给它并让它返回修改后的状态参数,或者您可以将其设为多值函数并返回所有可能的值,或者您可以使用两个函数: f(n, state) 给出下一个长度为 n 的随机字符串,而 g(n, state) 给出生成 f(n, state) 后的新状态。

【讨论】:

    【解决方案4】:

    您可以查看 Alexander Stepanov 和 Paul McJones 的 Elements of Programming

    本书采用演绎法 通过附属程序进行编程 用抽象的数学 使他们能够工作的理论。 这些理论的规范, 根据这些编写的算法 理论、定理和引理 描述它们的属性是 一起呈现。实施 真实的算法 编程语言是核心 书。而规格,其中 是针对人类的,应该, 甚至必须,将严谨与 适当的非正式性,代码, 发给计算机的, 必须绝对精确,即使在 一般。

    【讨论】:

    • 我喜欢这本书,但大多数实际算法等都是用 C++ 方言表达的,“数学”符号保留用于定义概念和属性(即使这样,它们也经常分解为C++)。我认为它不能很好地作为如何用数学符号表示程序的示例,本书中的程序使用 C++,甚至没有使用伪代码。
    • 是的,这应该是一个很大的免责声明。尽管如此,我认为数学概念和真实编程语言结构之间的映射可能对 OP 有用。
    猜你喜欢
    • 2013-01-29
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    相关资源
    最近更新 更多