static ghost predicate bitfunc(f: map<seq<bool>, bool>, n: nat)
forall i:seq<bool> :: i in f <==> |i| == n
ghost var Contents: map<seq<bool>, bool>
ghost var Repr: set<object>
var f: BDDNode?, t: BDDNode?
(0 == n ==> (b <==> Contents[[]])) &&
f != null && t != null && t in Repr && f in Repr &&
t.Repr <= Repr && f.Repr <= Repr &&
this !in f.Repr && this !in t.Repr &&
t.valid() && f.valid() &&
(forall s | s in t.Contents :: Contents[[true] + s] <==> t.Contents[s]) &&
(forall s | s in f.Contents :: Contents[[false] + s] <==> f.Contents[s]))
root in Repr && root.Repr <= Repr && root.valid() &&
n == root.n && Contents == root.Contents
ghost var Contents: map<seq<bool>, bool>
ghost var Repr: set<object>
method Eval(s: seq<bool>) returns(b: bool)
requires valid() && |s| == n
var node: BDDNode := root;
invariant 0 <= i == node.n <= n
invariant Contents[s] == node.Contents[s[n-i..]]
assert s[n-i..] == [s[n-i]] + s[n-i+1..];
node := if s[n-i] then node.t else node.f;