归纳规范:自上而下与自下而上与推理规则?

时间:2012-02-07 04:07:12

标签: math recursion logic theory induction

请耐心等待。我首先要从书中描述一个例子,然后在最后提出我的问题。

根据编程语言范例的文本:

  

归纳规范是一种指定一组的强大方法   值。为了说明这种方法,我们用它来描述某种方法   自然数的子集S N = {0,1,2,.... 。 }

自上而下的定义:

当且仅当

时,自然数n在S中
  1. n = 0,或
  2. n-3∈S。
  3. 我们知道0∈S。因此3∈S,因为(3 - 3)= 0和 0∈S。类似地6∈S,因为(6-3)= 3和3∈S。继续这样,我们 可以得出结论,所有3的倍数都在S中。

    其他自然数字怎么样?是1∈S?我们知道1!= 0,所以 第一个条件不满意。此外,(1-3)= -2,这不是自然的 数字因此不是S的成员。因此第二个条件 不满意。

    自下而上的定义:

    将集合S定义为N中包含的最小集合并满足 以下两个属性:

    1. 0∈S,
    2. 如果n∈S,则n +3∈S。
    3. “最小集合”是满足属性1和2的那个,即a 满足属性1和2的任何其他集的子集。很容易看出 只有一个这样的集合:如果S1和S2都满足属性1和 2,两者都是最小的,那么S1⊆S2(因为S1最小),S2⊆S1 (因为S2最小),因此S1 = S2。我们需要这个额外条件,因为 否则有很多套满足剩下的两个条件

      推理规则:

      _____
      0 ∈ S
      
      n ∈ S
      ---------
      (n+3) ∈ S
      

      这只是前一版本定义的简写表示法。 每个条目都称为推理规则,或者只是一个规则;水平的 line被读作“if-then”。该行上方的部分称为 hypothesis 或者先行者;该行下面的部分称为结论结果。 当列出两个或多个假设时,它们通过连接 隐含的“和”


      现在问题就出现了。

      • 可能最重要的问题是为什么我需要知道这些归纳定义,以及它们在现实案例中有用吗?
      • 为什么Google几乎没有返回归纳定义的结果?
      • 如果自上而下,自下而上和推理规则基本上显示相同的东西,为什么我们需要3种方法来编写相同的东西?
      • 为什么我很难找到问题的归纳定义比书中的例子复杂一点,如下所示。

      我想找到以下2个问题的自上而下,自下而上和推断定义。你不必给我答案,但我确实想知道如何得出归纳定义。我从哪里开始?是否有系统的方法来处理这类问题(一个方法)?

      1. {2n+3m +1 | n,m ∈ N}
      2. {(n, 2n+1) | n ∈ N}
      

3 个答案:

答案 0 :(得分:3)

你在这里问过很多问题,所以希望这个回复可以回答所有这些问题。如果有什么需要澄清的话,请告诉我。

您的第一个问题 - 为什么我们需要归纳定义? - 最容易回答。在计算机科学中,大量结构被归纳地定义。例如,您的简单链接列表具有归纳定义

  • 空列表是一个链表。
  • 单个节点后跟链表是一个链表

或二叉树:

  • 空树是二叉树。
  • 具有两个二叉树子节点的节点是二叉树。

或正则表达式:

  • ∅是正则表达式。
  • ε是正则表达式。
  • a是每个字符的正则表达式
  • 如果R1和R2是正则表达式,则R1 | R2是正则表达式。
  • 如果R1和R2是正则表达式,则R1 R2是正则表达式。
  • 如果R是正则表达式,则R *是正则表达式。
  • 如果R是正则表达式,则(R)是正则表达式。

这些定义有许多不错的属性。首先,它们适用于递归算法。如果要访问二叉树中的每个节点,我们可以使用二叉树的归纳定义来构建一个简单的访问算法:

  • 要访问空树,不要做任何事。
  • 访问由节​​点和两个子树组成的树:
    • 访问节点
    • 访问左子树
    • 访问正确的子树

类似地,如果我们想要操纵正则表达式的结构 - 例如为它构建一个匹配的自动机 - 那么归纳定义可以让我们从正则表达式中逐步构建自动机。

归纳定义也可用于正式证明结构的属性。例如,这是AVL树的正式定义:

  • 单个节点是0阶
  • 的AVL树
  • 具有一个或两个子级为0的AVL树的节点是1级的AVL树。
  • 具有两个子节点的节点,其顺序为n-1的AVL树或具有n-1阶AVL树的一个子节点和另一个n-3阶AVL树的子节点是n阶的AVL树。 / LI>

使用这个定义,可以正式证明AVL树是平衡的。

我们可以类似地使用这些类型的定义来证明有关编程语言的属性。大多数语言都有某种归纳定义,因此通过证明程序的每个部分都保留了一些信息,我们可以从头开始建立正确的证据。

你的第二个问题 - 为什么谷歌没有提出归纳定义的任何例子? - 我认为是因为它将其解释为“定义归纳”,而不是将其解释为术语本身。如果你查找递归定义,那么你会发现很多归纳定义的例子,因为归纳定义和递归定义彼此非常相似。

你的第三个问题 - 为什么我们需要多种方式来表达同样的事情? - 也很容易。如果你想证明一个系统的某些东西,归纳定义是很好的。如果你证明它适用于基本元素,那么表明较大的元素保留了该属性,你可以证明它总是正确的。递归定义适用于编写程序,因为递归函数往往会向后运行归纳。推理规则与逻辑证明系统相关联,并为使用经典逻辑证明系统属性提供了一个起点。

你的第四个问题 - 为什么你找不到任何例子? - 通过花一点时间查看您所知道的经典数据结构和算法,可以轻松修复。您可以归纳定义多少数据结构?尝试查看链接列表,二叉树,红黑树,AVL树等,以获得灵感。你会如何定义图表? DAG?同样,尝试查看句法结构。例如,您如何归纳地定义平衡括号的字符串? C中的函数原型怎么样?

你的最后一个问题 - 是否有解决这些问题的系统方法? - 有一个否定的答案。您可以定义相似于在输入上模拟任意图灵机的重复,并且由于停止问题是不可判定的,因此没有解决这些问题的一般过程。但是,确实存在许多方法。试着看Graham,Knuth和Patashnik的“具体数学”,了解如何解决复发问题。

希望这有帮助!

答案 1 :(得分:2)

除了“使用你的大脑”之外,没有系统的方法。 但你很幸运,因为这两个例子确实非常接近原始的例子:

1。如果a)k = 1或b)k-2 ∈ S或c)k-3 ∈ S

,则自然数k在S中

1。 a)0 ∈ S b)If n ∈ S, then n+2 ∈ S c)If n ∈ S, then n+3 ∈ S

2。如果a)k=0 and l=1或b)(k-1, l-2) ∈ S

,则一对自然数(k,l)在S中

2。 a)(0,0) ∈ S b)If (k,l) ∈ S, then (k+1, l+2) ∈ S

答案 2 :(得分:1)

  

为什么我需要知道这些归纳定义,它们在实际情况下如何有用?

归纳定义适用于:

  1. 证明有关集合成员的属性。例如可以归纳定义lambda terms,然后可以证明有关这些术语的定理。您将使用一种称为Structural Induction的证明技术。
  2. 编写可操纵集合成员的函数。我们一直在函数式编程中这样做。例如列表可以归纳定义。然后使用algebraic data type在代码中表示该归纳定义,然后我们可以像下面的length函数一样在列表上编写函数。另一个例子是归纳图,请查阅本文Inductive Graphs and Functional Graph Algorithms
type List a
  = Empty
  | Cons a (List a)

length : List a -> Int
length list =
  case list of
    Empty ->
      0

    Cons _ xs ->
      1 + length xs
  

为什么Google几乎没有归纳定义返回任何结果?

我不知道,但是这个book上有一个不错的章节(第3章-施工技术),上面有大量示例。

  

为什么我们需要三种写同一件事的方式?

不同的观点为您提供了思考同一件事的不同方法,它们可以帮助您塑造直觉。阅读Developing Your Intuition for Math。在这种特殊情况下,自上而下的定义适合于计算对象何时是集合的成员,而自下而上的定义(推理规则只是自下而上的定义的简写)适合于生成集合的成员

  

为什么我很难找到关于问题的归纳定义,而不是本书的例子。

我在上面分享的这本书Discrete Structures, Logic, and Computability (4th Edition)在第3章中提供了大量示例和练习,供您分别理解和练习。

  

如何推导归纳定义?我从哪里开始?

感受一下集合中的元素。我将首先列出集合中的某些元素,然后看一下它们如何相互关联。我一直在寻找无法用简单元素定义的基本元素,然后从那些基本元素中寻找可以写下哪些规则来获取其他元素。

在尝试了几个小时后才看。

Answer至1。

Answer至2。

  

有没有系统的方法?

不。玩这个问题。提出想法并进行测试。阅读Polya的How to Solve It,以发展您的问题解决能力。