如何通过归纳证明一个程序做了什么?

时间:2009-09-22 21:52:17

标签: math proof postfix-notation induction

我有一个计算机程序,它读入一个字符数组,即用后缀表示法编写的操作数和运算符。然后程序扫描数组,通过使用堆栈计算结果,如下所示:

get next char in array until there are no more
if char is operand
    push operand into stack
if char is operator 
    a = pop from stack
    b = pop from stack
    perform operation using a and b as arguments
    push result
result = pop from stack

如何通过归纳证明此程序正确评估任何后缀表达式? (摘自练习4.16 Java中的算法(Sedgewick 2003))

2 个答案:

答案 0 :(得分:5)

我不确定您需要哪些表达式来证明该算法。但如果它们看起来像典型的RPN表达式,则需要建立如下内容:

1) algoritm works for 2 operands (and one operator)
   and 
   algorithm works for 3 operands (and 2 operators)
  ==> that would be your base case

2) if algorithm works for n operands (and n-1 operators)
  then it would have to work for n+1 operands.
  ==> that would be the inductive part of the proof
祝你好运; - )

关注数学证据,以及有时令人困惑的名字。在归纳证明的情况下,仍然需要“弄清楚”某事(某些事实或某些规则),有时候是通过演绎逻辑,但随后这些事实和规则拼凑起来构成一个更广泛的真理,购买归纳;那就是:因为基本情况被建立为真,并且因为一个证明如果X对于“n”情况是真的那么X对于“n + 1”情况也是如此,那么我们不需要尝试每一个案例,这可能是一个很大的数字,甚至是无限的)

回到基于堆栈的表达式评估器......一个最后的提示(除了Captain Segfault的优秀解释之外,你会感到过度了解......)。

The RPN expressions are  such that:
  - they have one fewer operator than operand
  - they never provide an operator when the stack has fewer than 2 operands 
    in it (if they didn;t this would be the equivalent of an unbalanced 
    parenthesis situation in a plain expression, i.e. a invalid expression).

假设表达式有效(因此不会过早提供太多运算符),操作数/运算符输入算法的顺序无关紧要;他们总是让系统处于稳定的状态:     - 在堆栈上有一个额外的操作数(但知道最终会有一个额外的操作数)或者     - 堆栈中只有少一个操作数(但是知道操作数仍然会减少一个)。

所以顺序并不重要。

答案 1 :(得分:0)

你知道归纳是什么吗?你经常看到算法是如何工作的吗? (即使你还不能证明它?)

你的归纳假设应该说,在处理第N个字符后,堆栈是“正确的”。完整RPN表达式的“正确”堆栈只有一个元素(答案)。对于部分RPN表达式,堆栈有几个元素。

然后您的证据就是将此算法(减去结果=来自堆栈行的弹出)视为将部分 RPN表达式转换为堆栈的解析器,并证明它将它们转换为正确的堆栈

查看RPN表达式的定义并向后工作可能会有所帮助。