<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="/rss.xsl"?><rss version="2.0"><channel><title>boogie Discussions Rss Feed</title><link>http://boogie.codeplex.com/Thread/List.aspx</link><description>boogie Discussions Rss Description</description><item><title>New Post: Boogie Grammar</title><link>http://boogie.codeplex.com/discussions/439169</link><description>&lt;div style="line-height: normal;"&gt;Now, I have a parser that follows &lt;a href="http://research.microsoft.com/en-us/um/people/leino/papers/krml178.pdf" rel="nofollow"&gt;http://research.microsoft.com/en-us/um/people/leino/papers/krml178.pdf&lt;/a&gt;. But it disagrees with Boogie on the following line:&lt;br /&gt;
&lt;br /&gt;
I generate:&lt;br /&gt;
&lt;br /&gt;
const unique java.lang.SecurityManager : JavaType &amp;lt;: unique java.lang.Object complete;&lt;br /&gt;
&lt;br /&gt;
Boogie wants it be&lt;br /&gt;
&lt;br /&gt;
const unique java.lang.SecurityManager : JavaType extends unique java.lang.Object complete;&lt;br /&gt;
&lt;br /&gt;
Can I safely assume that &amp;quot;&amp;lt;:&amp;quot; is now called &amp;quot;extends&amp;quot;?&lt;br /&gt;
&lt;br /&gt;
PS: mod (&amp;quot;%&amp;quot;) is not accepted either. What should I use instead? &lt;br /&gt;
&lt;/div&gt;</description><author>schaef</author><pubDate>Tue, 07 May 2013 23:01:05 GMT</pubDate><guid isPermaLink="false">New Post: Boogie Grammar 20130507110105P</guid></item><item><title>New Post: Instantiation in Boogie</title><link>http://boogie.codeplex.com/discussions/442759</link><description>&lt;div style="line-height: normal;"&gt;I have a question that I think is related to the way Z3 does the instantiation of quantified variables. The first example below verifies OK, while the second one is not verified correctly by Boogie, although they are very similar. The only difference is that for the second example, in the axiom related to the function Range(...) I quantify over the global variable &amp;quot;next&amp;quot; (representing the next field of a cell in a linked list). Although the procedure addModulo11 makes  &amp;quot;next[this] := null;&amp;quot; and hence the axiom about Range(...) should help to prove the post-condition of addModulo11, this does not happen.&lt;br /&gt;
&lt;br /&gt;
In the first example, &amp;quot;next[this]&amp;quot; is simply given as a parameter to the function Range(...), so there is no instantiation of &amp;quot;next&amp;quot;. I think that's why the first example works.&lt;br /&gt;
&lt;br /&gt;
Does anyone know why this instantiation of &amp;quot;next&amp;quot; doesn't work in the second example?&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;//First example
//it works
//type Ref is intended to represent object references
type Ref;
const null:Ref;
var val: [Ref]int;
var next: [Ref]Ref;

function Range(this: Ref, val:[Ref]int, next:[Ref]Ref, x:int, y:int) returns (bool);

axiom (forall this:Ref, x:int, y:int, val: [Ref]int, next: [Ref]Ref :: 
{Range(this,val,next,x,y)}
  ((this == null)  ==&amp;gt; Range(this,val,next,x,y) == true ) 
   &amp;amp;&amp;amp; 
  ((this != null)==&amp;gt; Range(this,val,next,x,y) == false)  
 );
         
procedure addModulo11(this: Ref) 
modifies val, next;
requires  Range(this,val,next,0,8);
ensures  Range(next[this],val,next,0,8) ;
{ 
  next[this] := null;
}
//end of first example&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;//second example
//doesn't work
//type Ref is intended to represent object references
type Ref;
const null:Ref;
var val: [Ref]int;
var next: [Ref]Ref;

function Range(this: Ref, val:[Ref]int, next:[Ref]Ref, x:int, y:int) returns (bool);

axiom (forall this:Ref, x:int, y:int, val: [Ref]int, next: [Ref]Ref :: 
{Range(this,val,next,x,y)}
  (next[this] == null)  ==&amp;gt; 
     Range(this,val,next,x,y) == true  
   &amp;amp;&amp;amp; 
    (next[this] != null)==&amp;gt; 
     Range(this,val,next,x,y) == false);
         

procedure addModulo11(this: Ref) 
modifies val, next;
requires  Range(this,val,next,0,8);
ensures  Range(this,val,next,0,8);
{ 
  next[this] := null;
}&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;</description><author>ligianistor</author><pubDate>Tue, 07 May 2013 03:54:52 GMT</pubDate><guid isPermaLink="false">New Post: Instantiation in Boogie 20130507035452A</guid></item><item><title>New Post: [Dafny]Cannot verify the assertion which is the loop invariant</title><link>http://boogie.codeplex.com/discussions/441000</link><description>&lt;div style="line-height: normal;"&gt;Hi Rustan,&lt;br /&gt;
&lt;br /&gt;
After checking some information about e-matching, it is making lots of sense to me. I appreciate your detailed explaination.&lt;br /&gt;
&lt;br /&gt;
Thanks&lt;br /&gt;
Yuyan&lt;br /&gt;
&lt;/div&gt;</description><author>Yuyan</author><pubDate>Wed, 24 Apr 2013 12:51:10 GMT</pubDate><guid isPermaLink="false">New Post: [Dafny]Cannot verify the assertion which is the loop invariant 20130424125110P</guid></item><item><title>New Post: Boogie Grammar</title><link>http://boogie.codeplex.com/discussions/439169</link><description>&lt;div style="line-height: normal;"&gt;Well, yes there would be a lot of work to make it work with Java. Anyway, we borrowed a JavaCC grammar from Freiburg, which is now in the Joogie repository in case you are interested. &lt;br /&gt;
&lt;/div&gt;</description><author>schaef</author><pubDate>Wed, 24 Apr 2013 03:42:56 GMT</pubDate><guid isPermaLink="false">New Post: Boogie Grammar 20130424034256A</guid></item><item><title>New Post: Boogie Grammar</title><link>http://boogie.codeplex.com/discussions/439169</link><description>&lt;div style="line-height: normal;"&gt;The grammar is pretty stable.  But, if you want to change the .atg file so that it instead produces Java, I would have expected many more changes than just out-parameters.  Moreover, what would be a good rewrite of the code in Java without out-parameters?&lt;br /&gt;
&lt;/div&gt;</description><author>rustanleino</author><pubDate>Wed, 24 Apr 2013 00:20:58 GMT</pubDate><guid isPermaLink="false">New Post: Boogie Grammar 20130424122058A</guid></item><item><title>New Post: [Dafny]Cannot verify the assertion which is the loop invariant</title><link>http://boogie.codeplex.com/discussions/441000</link><description>&lt;div style="line-height: normal;"&gt;Hi Yuyan,&lt;br /&gt;
&lt;br /&gt;
The problem you have encountered has to do with triggering.  But before I explain it, let me just remark about the loops.  My remark is that I think it's much easier to understand the problem from just look at the Dafny code itself, without going into the details of how loops are translated from Dafny into Boogie (and, as you have included above, even inside Boogie when Boogie cuts back-edges).  To get started debugging your program in the context of Dafny, you don't need to know the translation of loops; you just need to know that a loop invariant is assumed on entry to the loop body (and is checked again at the end of the loop body).&lt;br /&gt;
&lt;br /&gt;
Here's the issue you have encountered.  You have a loop invariant that you have written as follows:&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;invariant (forall z :: 0 &amp;lt;= z  &amp;amp;&amp;amp; z &amp;lt; result ==&amp;gt; a[x+z] == a[y+z]);&lt;/code&gt;&lt;/pre&gt;

While I think this is the most natural (and most symmetric) way to express this property, it doesn't work well with Z3.  The reason is that, to use this quantifier, Z3 wants to instantiate it, and it instantiates quantifiers based on matching patterns.  As expressed here, the quantifier has no matching pattern, and therefore Z3 is not able to make use of it.&lt;br /&gt;
&lt;br /&gt;
I cannot give full justice to understanding matching patterns here, but let me say what matters in this situation.  The matching pattern is a term that includes the bound variable (z), is larger than the bound variable itself (that is, z is not a valid matching pattern), and is not so large that it includes an interpreted symbol (here, +).  Intuitively, if there were a matching pattern T(z), then if Z3 happened to encounter a term of the form T(m) for some term m, then it would instantiate the quantifier with z := m.&lt;br /&gt;
&lt;br /&gt;
To rewrite your loop invariant so that Z3 can find a matching pattern for it, you can write:&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;invariant forall z :: x &amp;lt;= z &amp;lt; x + result ==&amp;gt; a[z] == a[z-x+y];&lt;/code&gt;&lt;/pre&gt;

Here, the term a[z] is a good matching pattern.  If you change your loop invariant to this one, then your program will verify (even without the assert in the loop body).&lt;br /&gt;
&lt;br /&gt;
See &lt;a href="http://rise4fun.com/Dafny/XKuk" rel="nofollow"&gt;http://rise4fun.com/Dafny/XKuk&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
  Rustan&lt;br /&gt;
&lt;/div&gt;</description><author>rustanleino</author><pubDate>Wed, 24 Apr 2013 00:17:32 GMT</pubDate><guid isPermaLink="false">New Post: [Dafny]Cannot verify the assertion which is the loop invariant 20130424121732A</guid></item><item><title>New Post: [Dafny]Cannot verify the assertion which is the loop invariant</title><link>http://boogie.codeplex.com/discussions/441000</link><description>&lt;div style="line-height: normal;"&gt;I specified the LCP problem: (&lt;a href="http://rise4fun.com/Dafny/QPa8" rel="nofollow"&gt;http://rise4fun.com/Dafny/QPa8&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
I think we translate a while statement (while(E) invariant J; {S}) as:&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;  assert J;
  havoc xs;
  assume J;
  if (E){ 
     S; 
     assert J;
     assume false;
  } else {}
&lt;/code&gt;&lt;/pre&gt;

Hence I would like to know why I cannot verify the assertion which is exactly the loop invariant.&lt;br /&gt;
&lt;br /&gt;
According the execution traces at the end, I think the assertion (assertion1) below failed at anon23:&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;assert (forall z#5: int :: true ==&amp;gt; 0 &amp;lt;= z#5 &amp;amp;&amp;amp; z#5 &amp;lt; result#3 ==&amp;gt; $Unbox(read($Heap, a#0, IndexField(x#1 + z#5))): int == $Unbox(read($Heap, a#0, IndexField(y#2 + z#5))): int);
&lt;/code&gt;&lt;/pre&gt;

However, the assertion(assertion2) below has been asserted in the loop head at anon0:&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;assert $w0 ==&amp;gt; (forall z#4: int :: true ==&amp;gt; 0 &amp;lt;= z#4 &amp;amp;&amp;amp; z#4 &amp;lt; result#3 ==&amp;gt; $Unbox(read($Heap, a#0, IndexField(x#1 + z#4))): int == $Unbox(read($Heap, a#0, IndexField(y#2 + z#4))): int);&lt;/code&gt;&lt;/pre&gt;

I am thinking assertion2 would be taken as an assumption in the following proof, which could entail assertion1. Therefore I am confused why the assertion1 failed.&lt;br /&gt;
&lt;br /&gt;
Execution traces:&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;anon0:
    $_Frame := (lambda&amp;lt;alpha&amp;gt; $o: ref, $f: Field alpha :: $o != null &amp;amp;&amp;amp; read($Heap, $o, alloc) ==&amp;gt; false);
    // ----- assignment statement ----- C:\Docs\2013SpringWork\paperreview\lcp.dfy(11,10)
    assume true;
    assume true;
    result#3 := 0;
    assume {:captureState &amp;quot;C:\Docs\2013SpringWork\paperreview\lcp.dfy(11,10)&amp;quot;} true;
    // ----- while statement ----- C:\Docs\2013SpringWork\paperreview\lcp.dfy(12,3)
    $PreLoopHeap0 := $Heap;
    $decr0$init$0 := _System.array.Length(a#0) - result#3;
    havoc $w0;
    goto anon25_LoopHead;

  anon25_LoopHead:
    assume $w0 ==&amp;gt; (0 &amp;lt;= result#3 ==&amp;gt; true) &amp;amp;&amp;amp; (0 &amp;lt;= result#3 &amp;amp;&amp;amp; result#3 + x#1 &amp;lt;= _System.array.Length(a#0) ==&amp;gt; true) &amp;amp;&amp;amp; (0 &amp;lt;= result#3 &amp;amp;&amp;amp; result#3 + x#1 &amp;lt;= _System.array.Length(a#0) &amp;amp;&amp;amp; result#3 + y#2 &amp;lt;= _System.array.Length(a#0) ==&amp;gt; true);
    assert $w0 ==&amp;gt; 0 &amp;lt;= result#3;
    assert $w0 ==&amp;gt; result#3 + x#1 &amp;lt;= _System.array.Length(a#0);
    assert $w0 ==&amp;gt; result#3 + y#2 &amp;lt;= _System.array.Length(a#0);
    assert $w0 ==&amp;gt; x#1 != y#2;
    assume $w0 ==&amp;gt; (forall z#4: int :: true ==&amp;gt; (0 &amp;lt;= z#4 ==&amp;gt; true) &amp;amp;&amp;amp; (0 &amp;lt;= z#4 &amp;amp;&amp;amp; z#4 &amp;lt; result#3 ==&amp;gt; true));
    assert $w0 ==&amp;gt; (forall z#4: int :: true ==&amp;gt; 0 &amp;lt;= z#4 &amp;amp;&amp;amp; z#4 &amp;lt; result#3 ==&amp;gt; $Unbox(read($Heap, a#0, IndexField(x#1 + z#4))): int == $Unbox(read($Heap, a#0, IndexField(y#2 + z#4))): int);
    assume (forall&amp;lt;alpha&amp;gt; $o: ref, $f: Field alpha :: { read($Heap, $o, $f) } $o != null &amp;amp;&amp;amp; read(old($Heap), $o, alloc) ==&amp;gt; read($Heap, $o, $f) == read($PreLoopHeap0, $o, $f));
    assume $HeapSucc($PreLoopHeap0, $Heap);
    assume (forall&amp;lt;alpha&amp;gt; $o: ref, $f: Field alpha :: { read($Heap, $o, $f) } $o != null &amp;amp;&amp;amp; read($PreLoopHeap0, $o, alloc) ==&amp;gt; read($Heap, $o, $f) == read($PreLoopHeap0, $o, $f) || $_Frame[$o, $f]);
    assume _System.array.Length(a#0) - result#3 &amp;lt;= $decr0$init$0 &amp;amp;&amp;amp; (_System.array.Length(a#0) - result#3 == $decr0$init$0 ==&amp;gt; true);
    goto anon25_LoopDone, anon25_LoopBody;

  anon25_LoopBody:
    assume {:partition} true;
    goto anon26_Then, anon26_Else;

  anon26_Else:
    assume {:partition} $w0;
    goto anon13;

  anon13:
    assert a#0 != null;
    goto anon32_Then, anon32_Else;

  anon32_Then:
    assume {:partition} x#1 + result#3 &amp;lt; _System.array.Length(a#0);
    assert a#0 != null;
    goto anon15;

  anon15:
    goto anon33_Then, anon33_Else;

  anon33_Then:
    assume {:partition} x#1 + result#3 &amp;lt; _System.array.Length(a#0) &amp;amp;&amp;amp; y#2 + result#3 &amp;lt; _System.array.Length(a#0);
    assert a#0 != null;
    assert 0 &amp;lt;= x#1 + result#3 &amp;amp;&amp;amp; x#1 + result#3 &amp;lt; _System.array.Length(a#0);
    assert a#0 != null;
    assert 0 &amp;lt;= y#2 + result#3 &amp;amp;&amp;amp; y#2 + result#3 &amp;lt; _System.array.Length(a#0);
    goto anon17;

  anon17:
    assume (x#1 + result#3 &amp;lt; _System.array.Length(a#0) ==&amp;gt; true) &amp;amp;&amp;amp; (x#1 + result#3 &amp;lt; _System.array.Length(a#0) &amp;amp;&amp;amp; y#2 + result#3 &amp;lt; _System.array.Length(a#0) ==&amp;gt; true);
    goto anon34_Then, anon34_Else;

  anon34_Else:
    assume {:partition} x#1 + result#3 &amp;lt; _System.array.Length(a#0) &amp;amp;&amp;amp; y#2 + result#3 &amp;lt; _System.array.Length(a#0) &amp;amp;&amp;amp; $Unbox(read($Heap, a#0, IndexField(x#1 + result#3))): int == $Unbox(read($Heap, a#0, IndexField(y#2 + result#3))): int;
    goto anon19;

  anon19:
    assume {:captureState &amp;quot;C:\Docs\2013SpringWork\paperreview\lcp.dfy(12,3): loop entered&amp;quot;} true;
    $decr0$0 := _System.array.Length(a#0) - result#3;
    // ----- assert statement ----- C:\Docs\2013SpringWork\paperreview\lcp.dfy(18,5)
    havoc z#13;
    goto anon35_Then, anon35_Else;

  anon35_Then:
    assume {:partition} 0 &amp;lt;= z#13;
    goto anon21;

 anon21:
    goto anon36_Then, anon36_Else;

anon36_Then:
    assume {:partition} 0 &amp;lt;= z#13 &amp;amp;&amp;amp; z#13 &amp;lt; result#3;
    assert a#0 != null;
    assert {:subsumption 0} 0 &amp;lt;= x#1 + z#13 &amp;amp;&amp;amp; x#1 + z#13 &amp;lt; _System.array.Length(a#0);
    assert a#0 != null;
    assert {:subsumption 0} 0 &amp;lt;= y#2 + z#13 &amp;amp;&amp;amp; y#2 + z#13 &amp;lt; _System.array.Length(a#0);
    goto anon23;

  anon23:
    assume (forall z#5: int :: true ==&amp;gt; (0 &amp;lt;= z#5 ==&amp;gt; true) &amp;amp;&amp;amp; (0 &amp;lt;= z#5 &amp;amp;&amp;amp; z#5 &amp;lt; result#3 ==&amp;gt; true));
    assert (forall z#5: int :: true ==&amp;gt; 0 &amp;lt;= z#5 &amp;amp;&amp;amp; z#5 &amp;lt; result#3 ==&amp;gt; $Unbox(read($Heap, a#0, IndexField(x#1 + z#5))): int == $Unbox(read($Heap, a#0, IndexField(y#2 + z#5))): int);
    // ----- assignment statement ----- C:\Docs\2013SpringWork\paperreview\lcp.dfy(20,12)
    assume true;
    assume true;
    result#3 := result#3 + 1;
    assume {:captureState &amp;quot;C:\Docs\2013SpringWork\paperreview\lcp.dfy(20,12)&amp;quot;} true;
    assert 0 &amp;lt;= $decr0$0 || _System.array.Length(a#0) - result#3 == $decr0$0;
    assert _System.array.Length(a#0) - result#3 &amp;lt; $decr0$0;
    assume (0 &amp;lt;= result#3 ==&amp;gt; true) &amp;amp;&amp;amp; (0 &amp;lt;= result#3 &amp;amp;&amp;amp; result#3 + x#1 &amp;lt;= _System.array.Length(a#0) ==&amp;gt; true) &amp;amp;&amp;amp; (0 &amp;lt;= result#3 &amp;amp;&amp;amp; result#3 + x#1 &amp;lt;= _System.array.Length(a#0) &amp;amp;&amp;amp; result#3 + y#2 &amp;lt;= _System.array.Length(a#0) ==&amp;gt; true);
    assume (forall z#4: int :: true ==&amp;gt; (0 &amp;lt;= z#4 ==&amp;gt; true) &amp;amp;&amp;amp; (0 &amp;lt;= z#4 &amp;amp;&amp;amp; z#4 &amp;lt; result#3 ==&amp;gt; true));
    goto anon25_LoopHead;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;</description><author>Yuyan</author><pubDate>Sat, 20 Apr 2013 14:01:14 GMT</pubDate><guid isPermaLink="false">New Post: [Dafny]Cannot verify the assertion which is the loop invariant 20130420020114P</guid></item><item><title>New Post: Documentation of BVD</title><link>http://boogie.codeplex.com/discussions/439788</link><description>&lt;div style="line-height: normal;"&gt;Have you ever used a dynamic debugger to figure out what's going wrong with the execution of a program?  BVD is a bit similar.  Do not expect it to explicitly advise you on how you must change your program to make it correct.  Rather, think of it as dreaming up a counterexample to the correctness of your program and showing you that counterexample, and your job is then to prevent the verifier from thinking about this counterexample, either by fixing your program to render the counterexample impossible or to strengthen your specifications (typically, a loop invariant or a precondition) to constrain the verifier's dreams.&lt;br /&gt;
&lt;br /&gt;
Perhaps you'll find the &lt;a href="http://rise4fun.com/Dafny/tutorial/guide" rel="nofollow"&gt;Dafny Guide&lt;/a&gt; useful in explaining how the verifier deals with loops and recursion.&lt;br /&gt;
&lt;br /&gt;
  Rustan&lt;br /&gt;
&lt;/div&gt;</description><author>rustanleino</author><pubDate>Tue, 16 Apr 2013 00:04:23 GMT</pubDate><guid isPermaLink="false">New Post: Documentation of BVD 20130416120423A</guid></item><item><title>New Post: Documentation of BVD</title><link>http://boogie.codeplex.com/discussions/439788</link><description>&lt;div style="line-height: normal;"&gt;Hi,&lt;br /&gt;
&lt;br /&gt;
many thanks ! i already read that paper, but couldn't understand that &amp;quot;how to figure out the failing condition&amp;quot; , in particular how the values on different states in the program can help us to verify the program (as BVD is showing the memory values in different states of the program).&lt;br /&gt;
&lt;br /&gt;
many thanks in advance !&lt;br /&gt;
-asif&lt;br /&gt;
&lt;/div&gt;</description><author>asiif</author><pubDate>Mon, 15 Apr 2013 23:54:18 GMT</pubDate><guid isPermaLink="false">New Post: Documentation of BVD 20130415115418P</guid></item><item><title>New Post: Documentation of BVD</title><link>http://boogie.codeplex.com/discussions/439788</link><description>&lt;div style="line-height: normal;"&gt;I recommend starting with the following &lt;a href="http://research.microsoft.com/en-us/um/people/moskal/papers.html" rel="nofollow"&gt;BVD paper&lt;/a&gt;, &amp;quot;The Boogie Verification Debugger&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  Rustan&lt;br /&gt;
&lt;/div&gt;</description><author>rustanleino</author><pubDate>Mon, 15 Apr 2013 23:20:14 GMT</pubDate><guid isPermaLink="false">New Post: Documentation of BVD 20130415112014P</guid></item><item><title>New Post: Documentation of BVD</title><link>http://boogie.codeplex.com/discussions/439788</link><description>&lt;div style="line-height: normal;"&gt;any help about documentation..&lt;br /&gt;
&lt;br /&gt;
thanks&lt;br /&gt;
-asif&lt;br /&gt;
&lt;/div&gt;</description><author>asiif</author><pubDate>Wed, 10 Apr 2013 13:55:48 GMT</pubDate><guid isPermaLink="false">New Post: Documentation of BVD 20130410015548P</guid></item><item><title>New Post: Documentation of BVD</title><link>http://boogie.codeplex.com/discussions/439627</link><description>&lt;div style="line-height: normal;"&gt;Hi,&lt;br /&gt;
&lt;br /&gt;
i am looking for more documentation in order to learn the BVD tool, I have only manage to found  one paper on BVD. Any comments !&lt;br /&gt;
&lt;br /&gt;
many thanks!&lt;br /&gt;
&lt;/div&gt;</description><author>asiif</author><pubDate>Tue, 09 Apr 2013 11:35:34 GMT</pubDate><guid isPermaLink="false">New Post: Documentation of BVD 20130409113534A</guid></item><item><title>New Post: Boogie Grammar</title><link>http://boogie.codeplex.com/discussions/439169</link><description>&lt;div style="line-height: normal;"&gt;Great, thanks. But running the latest version through Coco(.jar) gives me an error in:&lt;br /&gt;
&lt;br /&gt;
ProcFormals&amp;lt;bool incoming, bool allowWhereClauses, out VariableSeq/*!*/ ds&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Coco/R (Apr 19, 2011)&lt;br /&gt;
-- line 224 col 52: &amp;quot;&amp;gt;&amp;quot; expected&lt;br /&gt;
-- line 224 col 75: &amp;quot;|&amp;quot; expected&lt;br /&gt;
2 errors detected&lt;br /&gt;
&lt;br /&gt;
And I don't see the problem yet. Maybe, the Java version is outdated. Is this grammar working for C#?&lt;br /&gt;
&lt;/div&gt;</description><author>schaef</author><pubDate>Sun, 07 Apr 2013 05:33:46 GMT</pubDate><guid isPermaLink="false">New Post: Boogie Grammar 20130407053346A</guid></item><item><title>New Post: Boogie Grammar</title><link>http://boogie.codeplex.com/discussions/439169</link><description>&lt;div style="line-height: normal;"&gt;Yes, the Boogie grammar is recorded in the Coco parser-generator file Source/Core/BoogiePL.atg.&lt;br /&gt;
&lt;br /&gt;
  Rustan&lt;br /&gt;
&lt;/div&gt;</description><author>rustanleino</author><pubDate>Fri, 05 Apr 2013 00:13:07 GMT</pubDate><guid isPermaLink="false">New Post: Boogie Grammar 20130405121307A</guid></item><item><title>New Post: Boogie Grammar</title><link>http://boogie.codeplex.com/discussions/439169</link><description>&lt;div style="line-height: normal;"&gt;Hi,&lt;br /&gt;
Is there a grammar for Boogie readable by some parser generator? Didn't find it in the repository. I'm building a tool in Java which takes Boogie as input and I don't want to come up with yet another IVL, but writting the grammar by hand is somehow painful as well. So it would be cool to have s.th. that is &amp;quot;really&amp;quot; compatible.&lt;br /&gt;
-Martin&lt;br /&gt;
&lt;/div&gt;</description><author>schaef</author><pubDate>Fri, 05 Apr 2013 00:10:49 GMT</pubDate><guid isPermaLink="false">New Post: Boogie Grammar 20130405121049A</guid></item><item><title>New Post: Inconsistency is reported when two conditions are conjuncted in an assertion.</title><link>http://boogie.codeplex.com/discussions/435206</link><description>&lt;div style="line-height: normal;"&gt;In fact, I do not know why this happens, but I am very interested in this issue..&lt;br /&gt;
&lt;br /&gt;
Nightrise&lt;br /&gt;
&lt;/div&gt;</description><author>Nightrise</author><pubDate>Sat, 23 Mar 2013 00:01:14 GMT</pubDate><guid isPermaLink="false">New Post: Inconsistency is reported when two conditions are conjuncted in an assertion. 20130323120114A</guid></item><item><title>New Post: Refinement in Chalice</title><link>http://boogie.codeplex.com/discussions/435464</link><description>&lt;div style="line-height: normal;"&gt;Hi Joao,&lt;br /&gt;
&lt;br /&gt;
Stepwise refinement has stopped being supported when a major change to how functions and predicates are handled has been implemented (fixing a soundness issue).  I believe the latest revision &lt;em&gt;before&lt;/em&gt; this change was &lt;a href="http://chalice.codeplex.com/SourceControl/changeset/1233b86dbd15" rel="nofollow"&gt;1233b86dbd15&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Note however, that we have fixed several bugs and made other improvements to Chalice in the mean-time.  You might find certain things not working correctly.&lt;br /&gt;
&lt;br /&gt;
Best,&lt;br /&gt;
Stefan&lt;br /&gt;
&lt;br /&gt;
PS: Also note that Chalice now has its own repository at &lt;a href="http://chalice.codeplex.com" rel="nofollow"&gt;chalice.codeplex.com&lt;/a&gt;.&lt;br /&gt;
&lt;/div&gt;</description><author>stefanheule</author><pubDate>Wed, 06 Mar 2013 00:50:12 GMT</pubDate><guid isPermaLink="false">New Post: Refinement in Chalice 20130306125012A</guid></item><item><title>New Post: Refinement in Chalice</title><link>http://boogie.codeplex.com/discussions/435464</link><description>&lt;div style="line-height: normal;"&gt;Hi,&lt;br /&gt;
&lt;br /&gt;
I would like to experiment with Chalice to do some stepwise refinement, but when I run chalice on my example, I get an error message stating that stepwise refinements are currently not supported. I am using the default development version (default branch).&lt;br /&gt;
&lt;br /&gt;
Which version do I have to use to experiment with stepwise refinement?&lt;br /&gt;
&lt;br /&gt;
Many thanks in advance,&lt;br /&gt;
Joao&lt;br /&gt;
&lt;/div&gt;</description><author>jff</author><pubDate>Tue, 05 Mar 2013 17:13:11 GMT</pubDate><guid isPermaLink="false">New Post: Refinement in Chalice 20130305051311P</guid></item><item><title>New Post: Inconsistency is reported when two conditions are conjuncted in an assertion.</title><link>http://boogie.codeplex.com/discussions/435206</link><description>&lt;div style="line-height: normal;"&gt;Inconsistency is reported when two conditions (n.data == 5 and n.Valid()) are conjuncted in the assertion in a method Main. However It is fine if the two conditions are asserted separately.&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;class Node&amp;lt;T&amp;gt; {
  var list: seq&amp;lt;T&amp;gt;;
  var footprint: set&amp;lt;Node&amp;lt;T&amp;gt;&amp;gt;;

  var data: T;
  var next: Node&amp;lt;T&amp;gt;;

  function Valid(): bool
    reads this, footprint;
  {
    this in this.footprint &amp;amp;&amp;amp; null !in this.footprint &amp;amp;&amp;amp;
    (next == null ==&amp;gt; list == [data]) &amp;amp;&amp;amp;
    (next != null ==&amp;gt;
        next in footprint &amp;amp;&amp;amp; next.footprint &amp;lt;= footprint &amp;amp;&amp;amp;
        this !in next.footprint &amp;amp;&amp;amp;
        list == [data] + next.list &amp;amp;&amp;amp;
        next.Valid())
  }

  method Init(d: T)
    modifies this;
    ensures Valid() &amp;amp;&amp;amp; fresh(footprint - {this});
    ensures list == [d];
    ensures data == d;
  {
    data := d;
    next := null;
    list := [d];
    footprint := {this};
  }

 method Main()
  {
    var n :=  new Node&amp;lt;int&amp;gt;.Init(5);
    //assert n.data == 5;
    //assert n.Valid();
    assert n.data == 5 &amp;amp;&amp;amp; n.Valid(); // inconsistency occurs
  }
}&lt;/code&gt;&lt;/pre&gt;

Thanks&lt;br /&gt;
Yuyan&lt;br /&gt;
&lt;/div&gt;</description><author>Yuyan</author><pubDate>Sun, 03 Mar 2013 23:09:21 GMT</pubDate><guid isPermaLink="false">New Post: Inconsistency is reported when two conditions are conjuncted in an assertion. 20130303110921P</guid></item><item><title>New Post: How to use function's attribute?</title><link>http://boogie.codeplex.com/discussions/434291</link><description>&lt;div style="line-height: normal;"&gt;OK.&lt;br /&gt;
&lt;br /&gt;
Thanks&lt;br /&gt;
Yuyan&lt;br /&gt;
&lt;/div&gt;</description><author>Yuyan</author><pubDate>Tue, 26 Feb 2013 12:14:30 GMT</pubDate><guid isPermaLink="false">New Post: How to use function's attribute? 20130226121430P</guid></item></channel></rss>