summaryrefslogtreecommitdiff
path: root/Jennisys/examples
diff options
context:
space:
mode:
authorGravatar Rustan Leino <leino@microsoft.com>2011-07-11 19:09:41 -0700
committerGravatar Rustan Leino <leino@microsoft.com>2011-07-11 19:09:41 -0700
commit1dd0047d2bb46b64a4d04259ba7803fc09898194 (patch)
tree554bf9b30251a62c258a221343936f25e17cd51a /Jennisys/examples
parenteacaf0b44276f0a61d6cc4204bb4d48d02fc0548 (diff)
parent61acaf623c5acf36b57d958e788f10f3c23bd309 (diff)
Merge
Diffstat (limited to 'Jennisys/examples')
-rw-r--r--Jennisys/examples/List.jen6
-rw-r--r--Jennisys/examples/List3.jen2
-rw-r--r--Jennisys/examples/Set.jen52
3 files changed, 59 insertions, 1 deletions
diff --git a/Jennisys/examples/List.jen b/Jennisys/examples/List.jen
index 184f4947..e7f42ddc 100644
--- a/Jennisys/examples/List.jen
+++ b/Jennisys/examples/List.jen
@@ -6,6 +6,9 @@ class List[T] {
constructor Singleton(t: T)
ensures list = [t]
+
+ constructor Double(p: T, q: T)
+ ensures list = [p q]
}
model List[T] {
@@ -27,6 +30,9 @@ class Node[T] {
constructor Init(t: T)
ensures list = [t]
+
+ constructor Double(p: T, q: T)
+ ensures list = [p q]
}
model Node[T] {
diff --git a/Jennisys/examples/List3.jen b/Jennisys/examples/List3.jen
index 6bb49eb8..acb10ad5 100644
--- a/Jennisys/examples/List3.jen
+++ b/Jennisys/examples/List3.jen
@@ -33,7 +33,7 @@ model IntList {
root = null ==> |list| = 0
root != null ==> (|list| = |root.succ| + 1 &&
list[0] = root.data &&
- (forall i:int :: (0 <= i && i < |root.succ|) ==> (root.succ[i] != null && list[i+1] = root.succ[i].data)))
+ (forall i:int :: (0 < i && i <= |root.succ|) ==> (root.succ[i-1] != null && list[i] = root.succ[i-1].data)))
}
class IntNode {
diff --git a/Jennisys/examples/Set.jen b/Jennisys/examples/Set.jen
new file mode 100644
index 00000000..6404bfd6
--- /dev/null
+++ b/Jennisys/examples/Set.jen
@@ -0,0 +1,52 @@
+class Set {
+ var elems: set[int]
+
+ constructor Empty()
+ ensures elems = {}
+
+ constructor Singleton(t: int)
+ ensures elems = {t}
+
+ constructor Sum(p: int, q: int)
+ ensures elems = {p + q}
+
+ constructor Double(p: int, q: int)
+ requires p != q
+ ensures elems = {p q}
+}
+
+model Set {
+ var root: SetNode
+
+ frame
+ root * root.elems[*]
+
+ invariant
+ root = null ==> elems = {}
+ root != null ==> elems = root.elems
+}
+
+class SetNode {
+ var elems: set[int]
+
+ constructor Init(t: int)
+ ensures elems = {t}
+
+ constructor Double(p: int, q: int)
+ requires p != q
+ ensures elems = {p q}
+}
+
+model SetNode {
+ var data: int
+ var left: SetNode
+ var right: SetNode
+
+ frame
+ data * left * right
+
+ invariant
+ elems = {data} + (left != null ? left.elems : {}) + (right != null ? right.elems : {})
+ left != null ==> forall e :: e in left.elems ==> e < data
+ right != null ==> forall e :: e in right.elems ==> e > data
+}