2016-04-04 26 views
2

"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:

cevap

2

Sana bu sorunlu iddialarda bulunan üzere nicelik kullanmanız gerekir sanmıyorum aynı anlama gelir:

pos >= iline 

Ölçücüyü kaldırarak, çözücünün niceleyiciyi başlatması gereğini ortadan kaldırdınız ve bu nedenle tetiklemeye gerek yoktur.

Ayrıca, desen bulunmazsa yönteminizin -1 döndüreceğini düşünüyorum. emin olmak için size dikkate almanız gerekir Yani doğrulamak:

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; 
} 

http://rise4fun.com/Dafny/J4b0

İlgili konular