达夫尼 "no terms found to trigger on" 错误信息
Dafny "no terms found to trigger on" error message
我有一个数组 line
,其中包含一个长度为 l
的字符串,
pat
是另一个数组,其中包含一个长度为 p
的字符串。
注意:p
和l
不是数组的长度
objective就是看pat
中包含的字符串是否存在于line
中。如果是这样,这个方法应该 return 单词第一个字母 line
中的索引,如果不是,它应该 return -1
.
给我们 "no terms found to trigger on" 错误的不变量是 ensures exists j :: ( 0<= j < l) && j == pos;
和 invariant forall j :: 0 <= j < iline ==> j != pos;
我的循环逻辑是,当它们在循环中时,找不到索引。确保是遇到索引时。
可能有什么问题?
代码如下:
method find(line:array<char>, l:int, pat:array<char>, p:int) returns (pos:int)
requires line!=null && pat!=null;
requires 0 <= l < line.Length;
requires 0 <= p < pat.Length;
ensures exists j :: ( 0<= j < l) && j == pos;
{
var iline:int := 0;
var ipat:int := 0;
var initialPos:int := -1;
while(iline<l && ipat<pat.Length)
invariant 0<=iline<=l;
invariant 0<=ipat<=pat.Length;
invariant forall j :: 0 <= j < iline ==> j != pos;
{
if(line[iline]==pat[ipat] && (line[iline]!=' ' && pat[ipat]!=' ')){
if(initialPos==-1){
initialPos := iline;
}
ipat:= ipat + 1;
}
else{
if(ipat>0){
if(line[iline] == pat[ipat-1]){
initialPos := initialPos + 1;
}
}
ipat:=0;
initialPos := -1;
}
if(ipat==p){
return initialPos;
}
iline := iline + 1;
}
return initialPos;
}
我收到以下错误:
screenshot of Dafny output
我认为您不需要使用量词来做出那些有问题的断言:
exists j :: ( 0<= j < l) && j == pos;
最好写成:
0 <= pos < l
和
forall j :: 0 <= j < iline ==> j != pos
同义:
pos >= iline
通过删除量词,您不再需要求解器实例化量词,因此不需要触发器。
此外,如果未找到模式,我认为您的方法将 return -1
。所以你需要考虑到这一点以使其验证:
method find(line:array<char>, l:int, pat:array<char>, p:int) returns (pos:int)
requires line!=null && pat!=null
requires 0 <= l < line.Length
requires 0 <= p < pat.Length
ensures 0 <= pos < l || pos == -1
{
var iline:int := 0;
var ipat:int := 0;
pos := -1;
while(iline<l && ipat<pat.Length)
invariant 0<=iline<=l
invariant 0<=ipat<=pat.Length
invariant -1 <= pos < iline
{
if(line[iline]==pat[ipat] && (line[iline]!=' ' && pat[ipat]!=' ')){
if(pos==-1){
pos := iline;
}
ipat:= ipat + 1;
} else {
if(ipat>0){
if(line[iline] == pat[ipat-1]){
pos := pos + 1;
}
}
ipat:=0;
pos := -1;
}
if(ipat==p) {
return;
}
iline := iline + 1;
}
return;
}
我有一个数组 line
,其中包含一个长度为 l
的字符串,
pat
是另一个数组,其中包含一个长度为 p
的字符串。
注意:p
和l
不是数组的长度
objective就是看pat
中包含的字符串是否存在于line
中。如果是这样,这个方法应该 return 单词第一个字母 line
中的索引,如果不是,它应该 return -1
.
给我们 "no terms found to trigger on" 错误的不变量是 ensures exists j :: ( 0<= j < l) && j == pos;
和 invariant forall j :: 0 <= j < iline ==> j != pos;
我的循环逻辑是,当它们在循环中时,找不到索引。确保是遇到索引时。
可能有什么问题?
代码如下:
method find(line:array<char>, l:int, pat:array<char>, p:int) returns (pos:int)
requires line!=null && pat!=null;
requires 0 <= l < line.Length;
requires 0 <= p < pat.Length;
ensures exists j :: ( 0<= j < l) && j == pos;
{
var iline:int := 0;
var ipat:int := 0;
var initialPos:int := -1;
while(iline<l && ipat<pat.Length)
invariant 0<=iline<=l;
invariant 0<=ipat<=pat.Length;
invariant forall j :: 0 <= j < iline ==> j != pos;
{
if(line[iline]==pat[ipat] && (line[iline]!=' ' && pat[ipat]!=' ')){
if(initialPos==-1){
initialPos := iline;
}
ipat:= ipat + 1;
}
else{
if(ipat>0){
if(line[iline] == pat[ipat-1]){
initialPos := initialPos + 1;
}
}
ipat:=0;
initialPos := -1;
}
if(ipat==p){
return initialPos;
}
iline := iline + 1;
}
return initialPos;
}
我收到以下错误: screenshot of Dafny output
我认为您不需要使用量词来做出那些有问题的断言:
exists j :: ( 0<= j < l) && j == pos;
最好写成:
0 <= pos < l
和
forall j :: 0 <= j < iline ==> j != pos
同义:
pos >= iline
通过删除量词,您不再需要求解器实例化量词,因此不需要触发器。
此外,如果未找到模式,我认为您的方法将 return -1
。所以你需要考虑到这一点以使其验证:
method find(line:array<char>, l:int, pat:array<char>, p:int) returns (pos:int)
requires line!=null && pat!=null
requires 0 <= l < line.Length
requires 0 <= p < pat.Length
ensures 0 <= pos < l || pos == -1
{
var iline:int := 0;
var ipat:int := 0;
pos := -1;
while(iline<l && ipat<pat.Length)
invariant 0<=iline<=l
invariant 0<=ipat<=pat.Length
invariant -1 <= pos < iline
{
if(line[iline]==pat[ipat] && (line[iline]!=' ' && pat[ipat]!=' ')){
if(pos==-1){
pos := iline;
}
ipat:= ipat + 1;
} else {
if(ipat>0){
if(line[iline] == pat[ipat-1]){
pos := pos + 1;
}
}
ipat:=0;
pos := -1;
}
if(ipat==p) {
return;
}
iline := iline + 1;
}
return;
}