Skip to content

Commit 981bb5c

Browse files
committed
various fixes
1 parent 4ac565b commit 981bb5c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+2374
-2000
lines changed

bin/alk.jar

-213 KB
Binary file not shown.

input/symb/test0.alk

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
symbolic $a:array<int>;
2+
a = $a;
3+
assume a.size() < 2;
4+
min = a[0];
5+
i = 1;
6+
while (i < a.size())
7+
invariant a
8+
invariant b
9+
invariant c
10+
modifies i
11+
{
12+
if (a[i] < min) min = a[i];
13+
i = i+1;
14+
15+
assert d;
16+
}

input/symb/test1.alk

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
plateau(a: array<int>)
2+
requires forall i:int :: 0 <= i && i < a.size() - 1 ==> a[i] <= a[i+1]
3+
ensures (forall k:int :: forall l:int :: 0 <= k && k <= l && l < a.size() && a[k] == a[l] ==> (l-k) <= result)
4+
{
5+
lg = 1;
6+
i = 1;
7+
while (i < a.size())
8+
invariant (forall k:int :: forall l:int ::
9+
0 <= k && k <= l && l < i && a[k] == a[l]
10+
==>
11+
(l-k) <= lg)
12+
modifies lg
13+
{
14+
if (a[i] == a[i - lg]) lg = lg+1;
15+
i = i + 1;
16+
}
17+
}
18+
19+
symbolic $a: array<int>;
20+
a = $a;
21+
assume a.size() < 4;
22+
assume forall i:int :: 0 <= i && i < a.size()-1 ==> a[i] <= a[i+1];
23+
x = plateau(a);

input/symb/test2.alk

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
plateau(a: array<int>) : int
2+
requires forall i:int :: 0 <= i && i < a.size()-1 ==> a[i] <= a[i+1]
3+
ensures (forall k:int :: forall l:int ::
4+
0 <= k && k <= l && l < a.size() && a[k] == a[l]
5+
==>
6+
(l-k) <= result)
7+
{
8+
lg = 1;
9+
i = 1;
10+
while (i < a.size())
11+
invariant (forall k:int :: forall l:int ::
12+
0 <= k && k <= l && l < i && a[k] == a[l]
13+
==>
14+
(l-k) <= lg)
15+
modifies lg
16+
{
17+
if (a[i] == a[i - lg]) lg = lg+1;
18+
i = i + 1;
19+
}
20+
return lg;
21+
}
22+
23+
symbolic $a: array<int>;
24+
a = $a;
25+
//assume a.size() < 4;
26+
assume forall i:int :: 0 <= i && i < a.size()-1 ==> a[i] <= a[i+1];
27+
//x = plateau(a);
28+
for (i = 0; i < 4; ++i)
29+
{
30+
havoc a;
31+
assume a.size() == i;
32+
x[i] = plateau(a);
33+
}
34+
35+
assert x[0] <= x[1] && x[1] <= x[2] && x[2] <= x[3];
36+
37+
Internal error [0:0]
38+
Unknown Z3 check! [5:3]

input/symb/test3.alk

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
symbolic $n: int;
2+
n = $n;
3+
sum = 0;
4+
i = 1;
5+
6+
while (i <= n)
7+
invariant sum == (i-1)*i/2
8+
{
9+
sum = sum + i;
10+
i = i + 1;
11+
}

input/symb/test4.alk

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
alg12(a: array<int>) : int
2+
{
3+
lg = 1;
4+
i = 1;
5+
while (i < a.size())
6+
{
7+
if (a[i] == a[i - lg]) lg = lg+1;
8+
i = i + 1;
9+
}
10+
return lg;
11+
}
12+
13+
symbolic $a: array<int>;
14+
a = $a;
15+
assume forall i:int :: 0 <= i && i < a.size()-1 ==> a[i] <= a[i+1];
16+
assume a.size() == 3;
17+
18+
x = alg12(a);

input/symb/test5.alk

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
askIth(out a:array<int>, i:int) : int
2+
requires a.size() > 0 && 0 <= i && i < a.size()-1
3+
ensures a[i] <= a[i+1]
4+
ensures result > 0 ==> result == i
5+
{
6+
if (a[i] > a[i+1]) {
7+
temp = a[i];
8+
a[i] = a[i+1];
9+
a[i+1] = temp;
10+
return i;
11+
}
12+
return 0;
13+
}
14+
15+
sorted(out a) {
16+
return forall j:int :: forall k:int ::
17+
0 <= j && j <= last && last < k &&
18+
k < a.size() ==> a[j] <= a[k];
19+
}
20+
21+
bubbleSort(out a: array<int>) {
22+
last = a.size()-1;
23+
while (last > 0)
24+
invariant sorted(a)
25+
{
26+
n1 = last;
27+
i = 0;
28+
while (i < n1)
29+
invariant forall j:int ::
30+
0 <= j && j < i ==> a[j] <= a[i]
31+
{
32+
last = askIth(a, i);
33+
i = i + 1;
34+
}
35+
}
36+
}

input/symb/test6.alk

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
@symbolic $a: array<int>;
2+
a = $a;
3+
@assume forall i:int :: 0 <= i && i < a.size()-1 ==> a[i] <= a[i+1];
4+
slp = 1;
5+
i = 1;
6+
while (i < a.size())
7+
@invariant i <= a.size()
8+
@invariant (forall k:int :: forall l:int ::
9+
0 <= k && k <= l && l < i && a[k] == a[l]
10+
==>
11+
(l-k) <= slp)
12+
@modifies slp
13+
@modifies i
14+
{
15+
if (a[i] == a[i - slp]) slp = slp+1;
16+
i = i + 1;
17+
}

input/symb/test7.alk

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
@symbolic $a: array<int>;
2+
a = $a;
3+
@assume forall i:int :: 0 <= i && i < a.size()-1 ==> a[i] <= a[i+1];
4+
slp = 1;
5+
i = 1;
6+
while (i < a.size())
7+
@invariant slp <= i
8+
@invariant (forall k:int :: forall l:int ::
9+
0 <= k && k <= l && l < i && a[k] == a[l]
10+
==>
11+
(l-k) <= slp)
12+
@modifies slp, i
13+
{
14+
if (a[i] == a[i - slp]) slp = slp+1;
15+
i = i + 1;
16+
}

input/test5.alk

+7-17
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,7 @@
1-
a = { "a" |-> 5 };
2-
3-
{} x = a.keys()
4-
5-
// map-uri (keys)
6-
// invariantii trebuie procesati intr-o singura executie (nu o executie pentru fiecare invariant)
7-
8-
// apel conditional la Z3 (-pr)
9-
// dataflow -> cautare secventiala si minim in tablou
10-
// conversia structurilor si a map-urilor in Z3
11-
12-
// redenumit keyword-urile assert, assume, requires, ensures, symbolic, modifies -> @
13-
// operatorul : pentru apartenenta la un tip de date:
14-
// @requires a : array<int> && x : int; -> din gramatica
15-
// @ensures result : int; -> din gramatica
16-
// type assertions
17-
// @Trusted
1+
@symbolic $a : array<int>, $i : int;
2+
a = $a;
3+
@assume a.size() == 8;
4+
a.pushFront($i);
5+
@assert a.topFront() == $i;
6+
b = $a;
7+
@assert b.topFront() == b[0];

input/test7.alk

+12-14
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
1-
a = [1, 2, 3, 4, 5];
2-
i = 0;
3-
minim = a[0];
1+
// map-urile au fost rezolvate
42

5-
while (i < a.size())
6-
// invariant i <= a.size()
7-
// invariant forall j : int :: 0 <= j && j < i ==> minim <= a[j]
8-
// modifies i, minim
9-
{
10-
if (a[i] < minim)
11-
{
12-
minim = a[i];
13-
}
14-
i++;
15-
}
163

4+
// putem pune in orice ordine modifies, invariant !!!!!!!! nu se poate o lista
5+
// am formatat path condition -> de adaugat Type Constraints
176

7+
// functiile ce nu au ensures, nu sunt verificate
8+
// rezolvat problema cu bracket cand ambele valori sunt concrete dar array-ul are valori simbolice
9+
// rezolvat cazul cu UNKNOWN -> unkown Z3 check
10+
// tratat cazul in care nu se defineste tipul de return
11+
// tratat cazul in care avem result dar nu avem return
12+
// invariant poate fi valoare concreta booleana
13+
// invariantii sunt verificati intr-un singur thread
14+
// am adaugat optiunea -prover pentru a specifica proverul
1815

16+
// executia simbolica a functiilor "predicat"

output.log

+12-22
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,16 @@
1-
Can't use return outside function scope.
2-
a |-> $a_0
3-
[result] |-> $minim_0
4-
minim |-> $minim_0
5-
i |-> $i_0
6-
j |-> $j_1
7-
8-
Note that the execution was symbolic.
9-
Path condition: ($i_0<=$a_0.size()) && forall $j_1 : int :: ((0<=$j_1)&&($j_1<$i_0)) ==> ($minim_0<=$a_0[$j_1]) && !($i_0<$a_0.size()) ($j_0 : int, $i_0 : int, $j_1 : int, $minim_0 : int, $a_0 : array<int>)
10-
11-
Can't use return outside function scope.
12-
a |-> $a_0
13-
[result] |-> $minim_0
14-
minim |-> $minim_0
15-
i |-> $i_0
16-
j |-> $j_1
17-
18-
Note that the execution was symbolic.
19-
Path condition: ($i_0<=$a_0.size()) && forall $j_1 : int :: ((0<=$j_1)&&($j_1<$i_0)) ==> ($minim_0<=$a_0[$j_1]) && !($i_0<$a_0.size()) ($j_0 : int, $i_0 : int, $j_1 : int, $minim_0 : int, $a_0 : array<int>)
20-
21-
Successfully verified: findMin
221
a |-> $a
2+
slp |-> $slp_0
3+
i |-> $i_1
234

245
Note that the execution was symbolic.
25-
Path condition: forall $j_4 : int :: ((0<=$j_4)&&($j_4<$a.size())) ==> ($[result]_0<=$a[$j_4]) && exists $j_5 : int :: ((0<=$j_5)&&($j_5<$a.size())) ==> ($[result]_0==$a[$j_5]) ($[result]_0 : int, $j_4 : int, $a : array<int>, $j_5 : int)
6+
Note that the Z3 engine was used for verification!
7+
Path condition:
8+
forall $i_0 : int :: ((0<=$i_0)&&($i_0<($a.size()-1))) ==> ($a[$i_0]<=$a[($i_0+1)]) &&
9+
($slp_0<=$i_1) &&
10+
forall $k_1 : int :: forall $l_1 : int :: ((((0<=$k_1)&&($k_1<=$l_1))&&($l_1<$i_1))&&($a[$k_1]==$a[$l_1])) ==> (($l_1-$k_1)<=$slp_0) &&
11+
!($i_1<$a.size())
12+
Type constraints:
13+
$slp_0 : int
14+
$i_1 : int
15+
$a : array<int>
2616

src/main/java/ast/ASTHelper.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ public static List<FunctionDeclAST> getFunctions(AST root)
1212
List<FunctionDeclAST> lst = new ArrayList<>();
1313
ASTVisitor<List<FunctionDeclAST>> visitor = new ASTVisitor<>(lst);
1414
visitor.register((tree) -> tree instanceof FunctionDeclAST, (tree, payload) -> {
15-
payload.add((FunctionDeclAST) tree);
15+
if (!((FunctionDeclAST) tree).getEnsures().isEmpty())
16+
payload.add((FunctionDeclAST) tree);
1617
});
1718
visitor.visit(root);
1819
return lst;

src/main/java/ast/ASTStack.java

+9-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,15 @@ private Result<?> makeStep()
8888
if (!stack.empty())
8989
{
9090
top = stack.peek();
91-
top.assign(result);
91+
try
92+
{
93+
top.assign(result);
94+
}
95+
catch (InternalException e)
96+
{
97+
top.handle(e);
98+
return null;
99+
}
92100
}
93101
}
94102
else

src/main/java/execution/Execution.java

+20-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import ast.enums.ParamType;
88
import ast.expr.SymIDAST;
99
import ast.stmt.FunctionDeclAST;
10+
import ast.type.DataTypeAST;
1011
import execution.exhaustive.EnvironmentMapper;
1112
import execution.helpers.AnnoHelper;
1213
import execution.parser.env.*;
@@ -204,7 +205,25 @@ private void execute()
204205
if (config.hasStaticVerif())
205206
{
206207
config.getIOManager().write("Note that the execution was symbolic.");
207-
config.getIOManager().write("Path condition: " + conditionPath.toString());
208+
if (conditionPath.verifies())
209+
{
210+
config.getIOManager().write("Note that the " + config.getProver() + " engine was used for verification.");
211+
}
212+
config.getIOManager().write("Path condition: \n" + conditionPath.toString(3));
213+
config.getIOManager().write("Type constraints: ");
214+
Map<String, DataTypeAST> typesConstraints = conditionPath.getIdTypes(false);
215+
StringBuilder sb = new StringBuilder();
216+
for (int j=0; j < 3; j++)
217+
{
218+
sb.append(" ");
219+
}
220+
List<String> types = new ArrayList<>();
221+
for (Map.Entry<String, DataTypeAST> entry : typesConstraints.entrySet())
222+
{
223+
types.add(entry.getKey() + " : " + entry.getValue());
224+
}
225+
sb.append(String.join("\n ", types));
226+
config.getIOManager().write(sb.toString());
208227
config.getIOManager().write("");
209228
}
210229
}

src/main/java/execution/interpreter/SymbolicStatefulStmtInterpreter.java

+6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package execution.interpreter;
22

33
import ast.AST;
4+
import ast.stmt.FunctionDeclAST;
45
import execution.ExecutionPayload;
56
import execution.ExecutionResult;
67
import execution.exhaustive.SplitMapper;
@@ -84,6 +85,11 @@ public ExecutionState interpretForEach(AST ast, ExecutionPayload payload)
8485
@Override
8586
public ExecutionState interpretFunctionDecl(AST ast, ExecutionPayload payload)
8687
{
88+
if (ast instanceof FunctionDeclAST && ((FunctionDeclAST) ast).getEnsures().isEmpty())
89+
{
90+
return baseDelegate.interpretFunctionDecl(ast, payload);
91+
}
92+
8793
return new ExecutionState(ast, payload)
8894
{
8995
@Override

src/main/java/execution/state/expression/IterableWithFilterSpecState.java

+1
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ public ExecutionState makeStep()
6666
if (step == source.size())
6767
{
6868
setResult(new ExecutionResult(iterableValue));
69+
getExec().deregisterEnv(env);
6970
return null;
7071
}
7172

src/main/java/execution/state/expression/IterableWithMapSpecState.java

+1
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ public ExecutionState makeStep()
6464
if (step == source.size())
6565
{
6666
setResult(new ExecutionResult(iterableValue));
67+
getExec().deregisterEnv(env);
6768
return null;
6869
}
6970

src/main/java/execution/state/function/DefinedFunctionCallState.java

+1
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ public ExecutionState makeStep()
8989
return request(function.getBody(), env);
9090
}
9191

92+
getExec().deregisterEnv(env);
9293
return null;
9394
}
9495

0 commit comments

Comments
 (0)