请耐心等待。我首先要从书中描述一个例子,然后在最后提出我的问题。
根据编程语言范例的文本:
归纳规范是一种指定一组的强大方法 值。为了说明这种方法,我们用它来描述某种方法 自然数的子集S N = {0,1,2,.... 。 }
自上而下的定义:
当且仅当
时,自然数n在S中我们知道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和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 或者先行者;该行下面的部分称为结论或结果。 当列出两个或多个假设时,它们通过连接 隐含的“和”
现在问题就出现了。
我想找到以下2个问题的自上而下,自下而上和推断定义。你不必给我答案,但我确实想知道如何得出归纳定义。我从哪里开始?是否有系统的方法来处理这类问题(一个方法)?
1. {2n+3m +1 | n,m ∈ N}
2. {(n, 2n+1) | n ∈ N}
答案 0 :(得分:3)
你在这里问过很多问题,所以希望这个回复可以回答所有这些问题。如果有什么需要澄清的话,请告诉我。
您的第一个问题 - 为什么我们需要归纳定义? - 最容易回答。在计算机科学中,大量结构被归纳地定义。例如,您的简单链接列表具有归纳定义
或二叉树:
或正则表达式:
这些定义有许多不错的属性。首先,它们适用于递归算法。如果要访问二叉树中的每个节点,我们可以使用二叉树的归纳定义来构建一个简单的访问算法:
类似地,如果我们想要操纵正则表达式的结构 - 例如为它构建一个匹配的自动机 - 那么归纳定义可以让我们从正则表达式中逐步构建自动机。
归纳定义也可用于正式证明结构的属性。例如,这是AVL树的正式定义:
使用这个定义,可以正式证明AVL树是平衡的。
我们可以类似地使用这些类型的定义来证明有关编程语言的属性。大多数语言都有某种归纳定义,因此通过证明程序的每个部分都保留了一些信息,我们可以从头开始建立正确的证据。
你的第二个问题 - 为什么谷歌没有提出归纳定义的任何例子? - 我认为是因为它将其解释为“定义归纳”,而不是将其解释为术语本身。如果你查找递归定义,那么你会发现很多归纳定义的例子,因为归纳定义和递归定义彼此非常相似。
你的第三个问题 - 为什么我们需要多种方式来表达同样的事情? - 也很容易。如果你想证明一个系统的某些东西,归纳定义是很好的。如果你证明它适用于基本元素,那么表明较大的元素保留了该属性,你可以证明它总是正确的。递归定义适用于编写程序,因为递归函数往往会向后运行归纳。推理规则与逻辑证明系统相关联,并为使用经典逻辑证明系统属性提供了一个起点。
你的第四个问题 - 为什么你找不到任何例子? - 通过花一点时间查看您所知道的经典数据结构和算法,可以轻松修复。您可以归纳定义多少数据结构?尝试查看链接列表,二叉树,红黑树,AVL树等,以获得灵感。你会如何定义图表? DAG?同样,尝试查看句法结构。例如,您如何归纳地定义平衡括号的字符串? C中的函数原型怎么样?
你的最后一个问题 - 是否有解决这些问题的系统方法? - 有一个否定的答案。您可以定义相似于在输入上模拟任意图灵机的重复,并且由于停止问题是不可判定的,因此没有解决这些问题的一般过程。但是,确实存在许多方法。试着看Graham,Knuth和Patashnik的“具体数学”,了解如何解决复发问题。
希望这有帮助!
答案 1 :(得分:2)
除了“使用你的大脑”之外,没有系统的方法。 但你很幸运,因为这两个例子确实非常接近原始的例子:
1
。如果a)k = 1
或b)k-2 ∈ S
或c)k-3 ∈ 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
2
。 a)(0,0) ∈ S
b)If (k,l) ∈ S, then (k+1, l+2) ∈ S
答案 2 :(得分:1)
为什么我需要知道这些归纳定义,它们在实际情况下如何有用?
归纳定义适用于:
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,以发展您的问题解决能力。