Skip to content

Commit 980be94

Browse files
committed
add data type dataflow and minor fixes
1 parent f2af63e commit 980be94

32 files changed

+707
-173
lines changed

.idea/codeStyles/Project.xml

+22-12
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/java-semantics.iml

+3-33
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bin/alk.jar

11.9 KB
Binary file not shown.

bin/liblibz3.dylib

-22 MB
Binary file not shown.

bin/liblibz3java.dylib

-190 KB
Binary file not shown.

bin/libz3.dylib

-22 MB
Binary file not shown.

bin/libz3java.dylib

-190 KB
Binary file not shown.

input/test.alk

+39-36
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,43 @@
1-
vertex_cover(e)
2-
@requires e : array< array<int> >
3-
@ensures \result : array<boolean>
4-
@ensures forall i : int :: 0 <= i && i < e.size() && !\result[i] ==> (forall j : int :: 0 <= j && j < e[i].size() ==> \result[e[i][j]])
1+
partition(out a, l, r)
2+
@requires a: array<int>
3+
@requires l: int
4+
@requires r: int
5+
@requires 0 <= l && l+2 <= r && r <= a.size()
6+
@ensures \result: int
7+
@ensures l <= \result && \result < r
58
{
6-
@havoc S : array<boolean>;
7-
@assume S.size() == e.size();
8-
9-
for (i = 0; i < e.size(); i++)
10-
@invariant 0 <= i && i <= e.size()
11-
@modifies i, S
9+
pv = a[l];
10+
i = l;
11+
j = r-1;
12+
tmp = a[l];
13+
a[l] = a[j];
14+
a[j] = tmp;
15+
print(a);
16+
while (i < j)
17+
@invariant l <= i && i <= j && j < r
1218
{
13-
choose b from {true, false};
14-
S[i] = b;
15-
}
16-
17-
@assert S.size() == e.size();
18-
19-
for (i = 0; i < e.size(); i++)
20-
@invariant 0 <= i && i <= e.size()
21-
@invariant forall k : int :: 0 <= k && k < i && !S[k] ==> (forall l : int :: 0 <= l && l < e[k].size() ==> S[e[k][l]])
22-
@modifies i
23-
{
24-
if (!S[i])
25-
{
26-
for (j = 0; j < e[i].size(); j++)
27-
@invariant 0 <= j && j <= e[i].size()
28-
@invariant forall l : int :: 0 <= l && l < j ==> S[e[i][l]]
29-
@modifies j
30-
{
31-
if (!S[e[i][j]])
32-
{
33-
failure;
34-
}
35-
}
19+
if (a[i] <= pv) {
20+
i = i+1;
21+
}
22+
else if (pv <= a[j-1]) {
23+
j = j-1;
24+
}
25+
else {
26+
tmp = a[i];
27+
a[i] = a[j-1];
28+
a[j-1] = tmp;
29+
i = i+1;
30+
j = j-1;
3631
}
37-
}
32+
print(a);
33+
}
34+
tmp = a[i];
35+
a[i] = a[r-1];
36+
a[r-1] = tmp;
37+
return i;
38+
}
3839

39-
return S;
40-
}
40+
/*
41+
a = [5,3,7,2,6,4];
42+
k = partition(a, 1, 6);
43+
*/

input/test5.alk

+18-26
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,19 @@
1-
@havoc n : int;
2-
@havoc a : array<int>, b : array<int>, c : array<int>, cb : array<int>;
3-
@assume 1 <= n;
4-
5-
@assume a.size() == n;
6-
@assume forall i : int :: 0 <= i && i < n ==> a[i] == 0;
7-
@assume b.size() == 2 * n;
8-
@assume forall i : int :: 0 <= i && i < 2 * n ==> b[i] == 0;
9-
@assume c.size() == 2 * n;
10-
@assume forall i : int :: 0 <= i && i < 2 * n ==> c[i] == 0;
11-
@assume cb.size() == 0;
12-
13-
for (col = 0; col < n; col++)
14-
@invariant 0 <= col && col <= n
15-
@invariant cb.size() == col;
16-
@invariant forall i : int :: 0 <= i && i < n ==> a[i] <= 1
17-
@invariant forall i : int :: 0 <= i && i < 2 * n ==> b[i] <= 1
18-
@invariant forall i : int :: 0 <= i && i < 2 * n ==> c[i] <= 1
19-
@invariant forall i : int, j : int :: 0 <= i && i < j && j < col ==> cb[i] != cb[j]
20-
@modifies col, a, b, c, cb
1+
swap(out a, i, j)
2+
@requires a: array<int>
3+
@requires i: int
4+
@requires j: int
5+
@requires 0 <= i && i < a.size()
6+
@requires 0 <= j && j < a.size()
7+
@ensures a[i] == \old(a)[j]
8+
@ensures a[j] == \old(a)[i]
219
{
22-
choose row from {0 .. n-1} s.t. a[row] == 0 && b[row + col] == 0 && c[n + (row-col)] == 0;
23-
a[row]++;
24-
b[row + col]++;
25-
c[n + (row-col)]++;
26-
cb[col] = row;
27-
}
10+
temp = a[i];
11+
a[i] = a[j];
12+
a[j] = temp;
13+
}
14+
15+
@havoc a : array<int>;
16+
@assume a.size() == 2;
17+
b = a;
18+
swap(a, 0, 1);
19+
@assert a[1] == b[0] && a[0] == b[1];

input/test6.alk

+10-23
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,15 @@
1-
queens(n)
2-
@requires n : int
3-
@requires 1 <= n
4-
@ensures \result : array<int>
5-
@ensures \result.size() == n
6-
@ensures forall i : int :: 0 <= i && i < n ==> a[i] <= 1
1+
f(a)
72
{
8-
@havoc a : array<int>, b : array<int>, c : array<int>, cb : array<int>;
3+
return f(a);
4+
}
95

10-
@assume a.size() == n;
11-
@assume forall i : int :: 0 <= i && i < n ==> a[i] == 0;
12-
@assume cb.size() == 0;
13-
14-
for (col = 0; col < n; col++)
15-
@invariant 0 <= col && col <= n
16-
@invariant cb.size() == col;
17-
@invariant forall i : int :: 0 <= i && i < n ==> a[i] <= 1
18-
@modifies col, a, cb, cb.size
6+
g(a)
7+
{
8+
if (a == 0)
199
{
20-
choose row from {0 .. n-1} s.t. a[row] == 0 && b[row + col] == 0 && c[n + (row-col)] == 0;
21-
a[row]++;
22-
b[row + col]++;
23-
c[n + (row-col)]++;
24-
cb[col] = row;
10+
\result = 1;
11+
return;
2512
}
26-
27-
return cb;
13+
\result = f(a - 1);
14+
return;
2815
}

src/main/java/ast/expr/RefIDAST.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public <T> T accept(VisitorIface<T> visitor)
5353
@Override
5454
public DataTypeAST getDataType(DataTypeProvider dtp)
5555
{
56-
throw new InternalException("Can't detect data type for id: " + getId());
56+
return dtp.getDataType(text != null ? text : getAttribute(IdASTAttr.class).getId());
57+
// throw new InternalException("Can't detect data type for id: " + getId());
5758
}
5859
}

src/main/java/ast/type/DataTypeAST.java

+7-2
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,16 @@ public DataTypeAST(ParserRuleContext ctx)
2323
@Override
2424
public boolean equals(Object o)
2525
{
26-
if (!(o instanceof DataTypeAST))
27-
return false;
26+
if (!(o instanceof DataTypeAST)) return false;
2827
return this.toString().equals(o.toString());
2928
}
3029

30+
@Override
31+
public int hashCode()
32+
{
33+
return this.toString().hashCode();
34+
}
35+
3136
@Override
3237
public <T> T accept(VisitorIface<T> visitor)
3338
{

0 commit comments

Comments
 (0)