Algorithm 20世纪90年代的编程-计算程序以检查阵列是否上升

Algorithm 20世纪90年代的编程-计算程序以检查阵列是否上升,algorithm,formal-methods,Algorithm,Formal Methods,我正在努力读完这本书:90年代的编程 我在解决练习10.12时遇到困难,该练习要求我们解决: var f : array of int {0<=#f} ; var s : bool ; s : s == (Ai,j|0<=i & i<=j & j<#f : f.i<=f.j) 约束函数是 t = #f - n 这项任务取得了进展 n:=n+1 我知道这个解决方案非常简单,但当我试图保持I0的不变性时,

我正在努力读完这本书:90年代的编程

我在解决练习10.12时遇到困难,该练习要求我们解决:

      var f : array of int {0<=#f}
    ; var s : bool
    ; s : s == (Ai,j|0<=i & i<=j & j<#f : f.i<=f.j)
约束函数是

    t = #f - n
这项任务取得了进展

    n:=n+1
我知道这个解决方案非常简单,但当我试图保持I0的不变性时,我总是会陷入困境

有人能告诉我如何计算赋值以保持I0的不变性吗


谢谢。

您是否能够将
s
的含义从正式规范语言翻译成“普通英语”?是的,它是对语句的谓词演算的翻译:s等价“数组f是升序的”。符号是格里斯和施耐德对离散数学的逻辑方法。严格地说,它是“非下降”,不是“上升”,但这是正确的翻译。考虑到您的解决方案通过分配给
n
而取得了进展,您不认为缺少了什么吗?具体来说,是否有可能构造一个不分配给
s
的解决方案?谢谢dasblinkenlight,但我不同意您对谓词的解释。安妮·卡尔德韦伊也是。幸运的是,对数学谓词的解释不是一个意见问题,所以其他人对它的解释不正确并不重要。下面是一个反例:考虑<代码> f={1,1} <代码>,按照您的规范,当程序终止时,<代码> S/<代码>应该被设置为<代码>真< /代码>,因为所有三个有效的赋值<代码> < <代码> >代码> j>代码>,即<代码> i=0,j=0 < /代码>,<代码> i=0,j=1和i=1,j=1
    B : n != #f
    t = #f - n
    n:=n+1