"konulu tetiklemek için bulunan şartlar yok" uzunluk p
arasında içerdiği bir dize olan başka dizidir. Not: p
ve l
objektif pat
içerdiği dize line
var olup olmadığını görmektir dizilerDafny uzunca <code>l</code> arasında içerdiği bir dize, <code>pat</code> sahip bir dizi <code>line</code> sahip hata mesajı
uzunluğu değildir. Eğer öyleyse, bu yöntem -1
döndürmesi gerekmiyorsa, kelimenin ilk harfinin line
dizini içinde döndürülmelidir. Bize "konulu tetiklemek için bulunamadı terimleri" veriyoruz
değişmezler hataları döngü için ensures exists j :: (0<= j < l) && j == pos;
ve invariant forall j :: 0 <= j < iline ==> j != pos;
Benim mantık onlar döngü içinde iken endeks bulunamadı olmasıdır vardır. Ve garantiler bir endeksle karşılaştığında.
Neyin yanlış olabilirdi? Ben şu hataları alıyorum
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;
}
: Burada screenshot of Dafny output
the code on rise4fun İşte
kodudur.0 <= pos < l
Ve
forall j :: 0 <= j < iline ==> j != pos
Has:
exists j :: (0<= j < l) && j == pos;
daha iyi olarak yazılabilir Could: