我正在努力使用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
位置在右边。
我创建了一个辅助函数,它将比较pat
和dst
,以验证它们是否相等(如果它们将在{{{{}}}中无限替换dst
如果line
中存在pat
,则}}}
目前我在函数line
内的以下代码部分收到错误“then expected
”:
checkIfEqual
完整代码:
if(pat.Length != dst.Length) {
return false;
}
答案 0 :(得分:2)
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]
}
请注意:
你不能在函数体中放置一个循环,但你可以使用递归
predicate
是function
的简写,返回bool