Z3 Dafny,用序列中的值替换索引

Z3 Dafny,用序列中的值替换索引,z3,verification,dafny,Z3,Verification,Dafny,在的Dafny教程中,s[i:=v]被定义为按顺序用v替换索引i。 但在预期的方法调用中,使用该方法总是失败,找到表达式 例如,在下面的代码中交换两个索引 var a:int :=input[j]; var b:int :=input[j-1]; input[j := b]; //expected method call, found expression input[j-1 := a]; //expected method call, found expression 在交换两个索引的情况下

在的Dafny教程中,
s[i:=v]
被定义为按顺序用
v
替换索引
i
。 但在
预期的方法调用中,使用该方法总是失败,找到表达式

例如,在下面的代码中交换两个索引

var a:int :=input[j];
var b:int :=input[j-1];
input[j := b]; //expected method call, found expression
input[j-1 := a]; //expected method call, found expression
在交换两个索引的情况下,使用
s[i:=v]
的正确方法是什么。

您可以编写

var a:int :=input[j];
var b:int :=input[j-1];
input := input[j:=b] ;
input := input[j-i : a];
更简洁,但可能更难阅读

input := input[ j := input[j-1] ][ j-1 := input[j] ] ;

谢谢,但它给出了错误:“赋值的LHS必须表示可变变量”。实际上我不想再做一个局部变量,因为它会给程序的其余部分带来很多麻烦。有没有办法进行就地交换?那是因为
index
不是可变变量。正确的解决方案是创建另一个变量。(请参见示例。)对于就地交换,请使用数组而不是序列。