函数中的Dafny语法错误

时间:2016-04-20 22:14:02

标签: dafny

我正在努力使用dafny语法。

searchAndReplace收到三个字符数组。我们假设line[s][n][a][k][e]; pat[n][a],dst为[h][i]。我想在pat中搜索line的所有匹配项,并将其替换为dst,从而生成[s][h][i][k][e]

方法find将返回line中等于pat的第一个字母的指示。

方法delete会从pat处的line处移除at find,并移动at+p之后的所有其他元素在左边以填充空格。

通过移动insert和{{1}之间的所有字符,方法dst将腾出空格,以line添加到at at at + p } p位置在右边。

我创建了一个辅助函数,它将比较patdst,以验证它们是否相等(如果它们将在{{{{}}}中无限替换dst如果line中存在pat,则}}} 目前我在函数line内的以下代码部分收到错误“then expected”:

checkIfEqual

完整代码:

if(pat.Length != dst.Length) {
    return false;
   }

1 个答案:

答案 0 :(得分:2)

Dafny中的

function是纯粹的,归纳式的,并且使用与命令式methods不同的语法。您不能在函数内使用命令式语言功能。在这种情况下,您允许使用:

  • 条件语句if cond { s1* } else { s2* }

  • 循环语句while cond { s1* }

相反,函数体必须是表达式:

predicate checkIfEqual(pat:array<char>, dst:array<char>)
  requires pat!=null && dst!=null;
  reads pat;
  reads dst;
{
     pat.Length == dst.Length 
  && forall i:nat :: i < pat.Length ==> pat[i] == dst[i]
}

虽然这里不需要,但Dafny确实有一个条件表达式(ite):

predicate checkIfEqual(pat:array<char>, dst:array<char>)
  requires pat!=null && dst!=null;
  reads pat;
  reads dst;
{
  if pat.Length != dst.Length then false 
  else forall i:nat :: i < pat.Length ==> pat[i] == dst[i]
}

请注意:

  • 你不能在函数体中放置一个循环,但你可以使用递归

  • predicatefunction的简写,返回bool