blob: f9298e1143b8af1bb2c1ea305c2708076c6238da (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
using System;
using System.Numerics;
using System.Collections.Generic;
using System.Diagnostics.Contracts;
namespace Microsoft.Boogie.AbstractInterpretation
{
class TrivialDomain : NativeLattice
{
class E : NativeLattice.Element
{
public readonly bool IsTop;
public E(bool isTop) {
IsTop = isTop;
}
public override Expr ToExpr() {
return Expr.Literal(IsTop);
}
}
private E top = new E(true);
private E bottom = new E(false);
public override Element Top { get { return top; } }
public override Element Bottom { get { return bottom; } }
public override bool IsTop(Element element) {
var e = (E)element;
return e.IsTop;
}
public override bool IsBottom(Element element) {
var e = (E)element;
return !e.IsTop;
}
public override bool Below(Element a, Element b) {
return IsBottom(a) || IsTop(b);
}
public override Element Meet(Element a, Element b) {
if (IsBottom(b)) {
return b;
} else {
return a;
}
}
public override Element Join(Element a, Element b) {
if (IsTop(b)) {
return b;
} else {
return a;
}
}
public override Element Widen(Element a, Element b) {
return Join(a, b); // it's a finite domain, after all
}
public override Element Constrain(Element element, Expr expr) {
var e = (E)element;
var lit = expr as LiteralExpr;
if (lit != null && lit.isBool && !(bool)lit.Val) {
return bottom;
} else {
return e;
}
}
public override Element Update(Element element, AssignCmd cmd) {
return element;
}
public override Element Eliminate(Element element, Variable v) {
return element;
}
}
}
|