File indexing completed on 2025-02-02 03:54:48
0001 <!DOCTYPE html> 0002 <html><head> 0003 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 0004 <title>test.vpr</title> 0005 <meta name="generator" content="KF5::SyntaxHighlighting - Definition (Viper) - Theme (Breeze Dark)"/> 0006 </head><body style="background-color:#232629;color:#cfcfc2"><pre> 0007 <span style="font-weight:bold">import </span><span style="color:#f44f4f">"foo.tdf"</span> 0008 <span style="font-weight:bold">import </span><span style="color:#f44f4f">"foo.txt"</span> 0009 <span style="font-weight:bold">import </span><span style="color:#f44f4f">"foo.txt"</span> 0010 0011 <span style="font-weight:bold">domain</span> <span style="color:#8e44ad">Foo[T]</span> <span style="color:#3f8058">{</span> 0012 <span style="font-weight:bold">axiom</span> <span style="color:#8e44ad">named</span> <span style="color:#3f8058">{</span> <span style="font-weight:bold">forall</span> x: <span style="color:#2980b9">Int</span>:: <span style="color:#3daee9">{</span><span style="font-style:italic">lookup(x)</span><span style="color:#3daee9">}</span> len(lookup(x)) == foobar(x) <span style="color:#3f8058">}</span> 0013 <span style="font-weight:bold">axiom</span> <span style="color:#3f8058">{</span> <span style="font-weight:bold">forall</span> x: <span style="color:#2980b9">Int</span> :: <span style="color:#3daee9">{</span><span style="font-style:italic">lookup(x)</span><span style="color:#3daee9">}</span> <span style="color:#3daee9">{</span><span style="font-style:italic">len(lookup(x))</span><span style="color:#3daee9">}</span> len(lookup(x)) == foobar(x) <span style="color:#3f8058">}</span> <span style="color:#7a7c7d">// anonymous</span> 0014 <span style="color:#3f8058">}</span> 0015 0016 <span style="color:#7a7c7d">// this is a comment</span> 0017 0018 <span style="color:#7a7c7d">/* This is also</span> 0019 <span style="color:#7a7c7d"> * another multi-line comment</span> 0020 <span style="color:#7a7c7d"> * With a string "string" and</span> 0021 <span style="color:#7a7c7d"> * an import "foo.bar" inside */</span> 0022 0023 <span style="color:#7a7c7d">// Any copyright is dedicated to the Public Domain.</span> 0024 <span style="color:#7a7c7d">// http://creativecommons.org/publicdomain/zero/1.0/</span> 0025 0026 <span style="font-weight:bold">import </span><span style="color:#f44f4f">"empty.sil"</span> 0027 0028 <span style="font-weight:bold">method</span> <span style="color:#8e44ad">test1</span>(xs: <span style="color:#2980b9">Seq</span>[<span style="color:#2980b9">Ref</span>]) <span style="color:#3f8058">{</span> 0029 <span style="font-weight:bold">inhale</span> <span style="font-weight:bold">forall</span> i: <span style="color:#2980b9">Int</span> :: 0 <= i && i < |xs| ==> xs[i]<span style="font-style:italic">.f</span> != <span style="color:#f67400">0</span> 0030 <span style="color:#3f8058">}</span> 0031 0032 <span style="font-weight:bold">function</span> <span style="color:#8e44ad">$</span>(n: <span style="color:#2980b9">Ref</span>, m: <span style="color:#2980b9">Ref</span>): Node 0033 0034 <span style="font-weight:bold">domain</span> <span style="color:#8e44ad">Foo[T]</span> <span style="color:#3f8058">{</span> 0035 <span style="font-weight:bold">function</span> <span style="color:#8e44ad">enc</span>(arg: T): Foo[T] 0036 <span style="font-weight:bold">function</span> <span style="color:#8e44ad">dec</span>(arg: Foo[T]): T 0037 0038 <span style="font-weight:bold">axiom</span> <span style="color:#8e44ad">ax_Dec</span> <span style="color:#3f8058">{</span> 0039 <span style="font-weight:bold">forall</span> arg: T :: 0040 dec( enc(arg) ) == arg 0041 <span style="color:#3f8058">}</span> 0042 0043 <span style="font-weight:bold">axiom</span> <span style="color:#8e44ad">ax_Enc</span> <span style="color:#3f8058">{</span> 0044 <span style="font-weight:bold">forall</span> arg: Foo[T] :: 0045 <span style="color:#3daee9">{</span> <span style="font-style:italic">enc(</span> <span style="font-style:italic">dec(arg)</span> <span style="font-style:italic">),</span> <span style="font-style:italic">foo(bar,</span> <span style="font-style:italic">i)</span> <span style="color:#3daee9">}</span> 0046 <span style="color:#3daee9">{</span> <span style="font-style:italic">dec(arg)</span> <span style="color:#3daee9">}</span> 0047 enc( dec(arg) ) == arg 0048 <span style="color:#3f8058">}</span> 0049 <span style="color:#3f8058">}</span> 0050 0051 <span style="font-weight:bold">function</span> <span style="color:#8e44ad">myFunc</span>(arg: <span style="color:#2980b9">Int</span>): <span style="color:#2980b9">Int</span> 0052 <span style="font-weight:bold">requires</span> <span style="color:#27aeae;font-weight:bold">true</span> || <span style="color:#27aeae;font-weight:bold">false</span> 0053 <span style="font-weight:bold">ensures</span> arg <= <span style="color:#f67400">0</span> ==> <span style="font-weight:bold">result</span> == -<span style="color:#f67400">1</span> 0054 <span style="font-weight:bold">ensures</span> arg > <span style="color:#f67400">0</span> ==> <span style="font-weight:bold">result</span> == arg 0055 <span style="color:#3f8058">{</span> 0056 arg > <span style="color:#f67400">0</span> ? arg : myFunc(arg - <span style="color:#f67400">1</span>) 0057 <span style="color:#3f8058">}</span> 0058 0059 <span style="font-weight:bold">field</span> <span style="color:#8e44ad">value</span>: <span style="color:#2980b9">Int</span> 0060 <span style="font-weight:bold">field</span> <span style="color:#8e44ad">next</span>: <span style="color:#2980b9">Ref</span> 0061 0062 <span style="font-weight:bold">predicate</span> <span style="color:#8e44ad">list</span>(xs: <span style="color:#2980b9">Ref</span>) <span style="color:#3f8058">{</span> 0063 <span style="font-weight:bold">acc</span>(xs<span style="font-style:italic">.value</span>) && <span style="font-weight:bold">acc</span>(xs<span style="font-style:italic">.next</span>) 0064 && ( list(xs<span style="font-style:italic">.next</span>) ) 0065 <span style="color:#3f8058">}</span> 0066 0067 <span style="font-weight:bold">define</span> <span style="color:#8e44ad">myPureMacro</span>(abc) abc 0068 0069 <span style="font-weight:bold">define</span> <span style="color:#8e44ad">myStmtMacro</span>(abc) <span style="color:#3f8058">{</span> 0070 <span style="font-weight:bold">inhale</span> abc 0071 <span style="font-weight:bold">exhale</span> abc 0072 <span style="color:#3f8058">}</span> 0073 0074 <span style="font-weight:bold">method</span> <span style="color:#8e44ad">smokeTest</span>() <span style="color:#3f8058">{</span> 0075 0076 <span style="font-weight:bold">inhale</span> <span style="color:#27aeae;font-weight:bold">false</span>; <span style="font-weight:bold">exhale</span> <span style="color:#27aeae;font-weight:bold">false</span> 0077 <span style="font-weight:bold">assume</span> <span style="color:#27aeae;font-weight:bold">false</span>; <span style="font-weight:bold">assert</span> <span style="color:#27aeae;font-weight:bold">false</span> 0078 0079 <span style="color:#7a7c7d">//magic wands</span> 0080 <span style="font-weight:bold">var</span> s: <span style="color:#2980b9">Set</span>[<span style="color:#2980b9">Int</span>] 0081 <span style="font-weight:bold">assert</span> s <span style="color:#3f8058">setminus</span> s != s 0082 0083 <span style="color:#3f8058">}</span> 0084 0085 <span style="color:#7a7c7d">//:: special comment</span> 0086 <span style="color:#7a7c7d">/*</span> 0087 <span style="color:#7a7c7d"> gfdgfd</span> 0088 <span style="color:#7a7c7d">*/</span> 0089 0090 <span style="font-weight:bold">method</span> <span style="color:#8e44ad">testHighlights</span>() <span style="font-weight:bold">returns</span> ( res: <span style="color:#2980b9">Set</span>[<span style="color:#2980b9">Seq</span>[<span style="color:#2980b9">Multiset</span>[Foo[<span style="color:#2980b9">Int</span>]]]] ) 0091 <span style="font-weight:bold">requires</span> <span style="color:#27aeae;font-weight:bold">true</span> 0092 <span style="font-weight:bold">ensures</span> <span style="color:#27aeae;font-weight:bold">false</span> 0093 <span style="color:#3f8058">{</span> 0094 <span style="font-weight:bold">var</span> a: <span style="color:#2980b9">Int</span>; <span style="font-weight:bold">var</span> b: <span style="color:#2980b9">Bool</span>; <span style="font-weight:bold">var</span> c: <span style="color:#2980b9">Ref</span>; <span style="font-weight:bold">var</span> d: <span style="color:#2980b9">Rational</span>; <span style="font-weight:bold">var</span> e: <span style="color:#2980b9">Perm</span> 0095 <span style="font-weight:bold">var</span> x: <span style="color:#2980b9">Seq</span>[<span style="color:#2980b9">Int</span>]; <span style="font-weight:bold">var</span> y: <span style="color:#2980b9">Set</span>[<span style="color:#2980b9">Int</span>]; <span style="font-weight:bold">var</span> z: <span style="color:#2980b9">Multiset</span>[<span style="color:#2980b9">Int</span>] 0096 <span style="font-weight:bold">var</span> t1: <span style="color:#2980b9">Set</span>[<span style="color:#2980b9">Int</span>] := <span style="color:#2980b9">Set</span>(a, <span style="color:#f67400">1</span>, <span style="color:#f67400">2</span>) 0097 <span style="font-weight:bold">var</span> t2: <span style="color:#2980b9">Seq</span>[<span style="color:#2980b9">Int</span>] := <span style="color:#2980b9">Seq</span>(a, a, a) 0098 <span style="font-weight:bold">var</span> t3: <span style="color:#2980b9">Multiset</span>[<span style="color:#2980b9">Int</span>] := <span style="color:#2980b9">Multiset</span>(a, a, <span style="color:#f67400">0</span>, <span style="color:#f67400">0</span>, <span style="color:#f67400">0</span>) 0099 0100 <span style="font-weight:bold">assert</span> myFunc(<span style="color:#f67400">331</span>) > -<span style="color:#f67400">2</span> 0101 0102 myStmtMacro( myFunc(<span style="color:#f67400">331</span>) == -<span style="color:#f67400">331</span> ) 0103 0104 <span style="color:#fdbc4b;font-weight:bold">while</span> ( <span style="color:#27aeae;font-weight:bold">true</span> ) 0105 <span style="font-weight:bold">invariant</span> <span style="color:#27aeae;font-weight:bold">true</span> 0106 <span style="color:#3f8058">{</span> 0107 <span style="font-weight:bold">var</span> aa: <span style="color:#2980b9">Ref</span> 0108 aa := <span style="color:#27aeae;font-weight:bold">null</span> 0109 <span style="font-weight:bold">var</span> bb: <span style="color:#2980b9">Int</span> 0110 bb := <span style="color:#f67400">33</span> 0111 <span style="color:#3f8058">}</span> 0112 0113 <span style="color:#fdbc4b;font-weight:bold">if</span> ( <span style="color:#27aeae;font-weight:bold">true</span> ) <span style="color:#3f8058">{</span> 0114 <span style="font-weight:bold">assert</span> <span style="color:#27aeae;font-weight:bold">true</span> 0115 <span style="color:#3f8058">}</span> <span style="color:#fdbc4b;font-weight:bold">elseif</span> ( <span style="color:#27aeae;font-weight:bold">false</span> ) <span style="color:#3f8058">{</span> 0116 <span style="font-weight:bold">assert</span> <span style="color:#27aeae;font-weight:bold">false</span> 0117 <span style="color:#3f8058">}</span> <span style="color:#fdbc4b;font-weight:bold">else</span> <span style="color:#3f8058">{</span> 0118 <span style="font-weight:bold">assert</span> <span style="color:#27aeae;font-weight:bold">true</span> 0119 <span style="color:#3f8058">}</span> 0120 0121 <span style="color:#7a7c7d">//forperm r: Ref :: true</span> 0122 <span style="color:#7a7c7d">//exists</span> 0123 <span style="color:#7a7c7d">//forall</span> 0124 <span style="font-weight:bold">assert</span> ! <span style="color:#27aeae;font-weight:bold">false</span> 0125 <span style="font-weight:bold">assert</span> <span style="color:#f67400">0</span> +<span style="color:#f67400">321</span> - <span style="color:#f67400">0</span> -<span style="color:#f67400">321</span> == <span style="color:#f67400">0</span> 0126 <span style="color:#3f8058">}</span> 0127 0128 <span style="font-weight:bold">field</span> <span style="color:#8e44ad">f</span>:<span style="color:#2980b9">Int</span> 0129 0130 <span style="font-weight:bold">method</span> <span style="color:#8e44ad">test02</span>(x: <span style="color:#2980b9">Ref</span>) 0131 <span style="font-weight:bold">requires</span> <span style="font-weight:bold">acc</span>(x<span style="font-style:italic">.f</span>, <span style="font-weight:bold">write</span>) 0132 <span style="font-weight:bold">ensures</span> <span style="font-weight:bold">acc</span>(x<span style="font-style:italic">.f</span>, <span style="font-weight:bold">write</span>) 0133 <span style="color:#3f8058">{</span> 0134 <span style="font-weight:bold">define</span> <span style="color:#8e44ad">A</span> <span style="color:#27aeae;font-weight:bold">true</span> 0135 <span style="font-weight:bold">define</span> <span style="color:#8e44ad">B</span> <span style="font-weight:bold">acc</span>(x<span style="font-style:italic">.f</span>, <span style="font-weight:bold">write</span>) 0136 0137 <span style="font-weight:bold">package</span> A --* B 0138 <span style="font-weight:bold">wand</span> w := A --* B 0139 0140 <span style="color:#7a7c7d">//apply w</span> 0141 0142 <span style="color:#fdbc4b;font-weight:bold">label</span> my_lbl 0143 0144 <span style="color:#fdbc4b;font-weight:bold">goto</span> my_lbl 0145 0146 <span style="font-weight:bold">fresh</span> x 0147 0148 <span style="font-weight:bold">var</span> p: <span style="color:#2980b9">Perm</span> 0149 0150 <span style="font-weight:bold">var</span> r: <span style="color:#2980b9">Ref</span>; r := new (*) 0151 0152 <span style="font-weight:bold">constraining</span> ( p ) <span style="color:#3f8058">{</span> 0153 <span style="font-weight:bold">exhale</span> <span style="font-weight:bold">acc</span>(x<span style="font-style:italic">.f</span>, p) 0154 <span style="color:#3f8058">}</span> 0155 0156 <span style="font-weight:bold">assert</span> <span style="color:#f67400">0</span> == ( <span style="font-weight:bold">let</span> a == (<span style="color:#f67400">11</span> + <span style="color:#f67400">22</span>) <span style="font-weight:bold">in</span> a+a ) 0157 <span style="color:#3f8058">}</span> 0158 </pre></body></html>