summaryrefslogtreecommitdiff
path: root/Test/hofs/Fold.dfy
diff options
context:
space:
mode:
authorGravatar Dan Rosén <danr@chalmers.se>2014-08-18 13:24:57 -0700
committerGravatar Dan Rosén <danr@chalmers.se>2014-08-18 13:24:57 -0700
commit5e7d03fba113642aa1d6b181a854c684c740979e (patch)
tree11043399075689c198e6c44dcafb868445c0dc48 /Test/hofs/Fold.dfy
parent2ead070c052fb5f506f188571e0e1bef900af9d4 (diff)
Consider lambdas literals + create literal axioms when an argument is a function
Diffstat (limited to 'Test/hofs/Fold.dfy')
-rw-r--r--Test/hofs/Fold.dfy30
1 files changed, 30 insertions, 0 deletions
diff --git a/Test/hofs/Fold.dfy b/Test/hofs/Fold.dfy
new file mode 100644
index 00000000..df7d0126
--- /dev/null
+++ b/Test/hofs/Fold.dfy
@@ -0,0 +1,30 @@
+// RUN: %dafny /compile:3 "%s" > "%t"
+// RUN: %diff "%s.expect" "%t"
+
+datatype List = Nil | Cons(A,List<A>);
+
+datatype Expr = Add(List<Expr>) | Mul(List<Expr>) | Lit(int);
+
+function method Eval(e : Expr): int
+{
+ match e
+ case Add(es) => Fold(es,0,(e,v) requires e < es => Eval(e) + v)
+ case Mul(es) => Fold(es,1,(e,v) requires e < es => Eval(e) * v)
+ case Lit(i) => i
+}
+
+function method Fold(xs : List<A>, unit : B, f : (A,B) -> B): B
+ reads f.reads;
+ requires forall x : A, y: B :: x < xs ==> f.requires(x,y);
+{
+ match xs
+ case Nil => unit
+ case Cons(x,xs) => f(x,Fold(xs,unit,f))
+}
+
+method Main() {
+ var two := Lit(2);
+ var add := (x,y) => Add(Cons(x,Cons(y,Nil)));
+ assert Eval(add(two,two)) == 4;
+ print "3 = ", Eval(add(Lit(1),two)), "\n";
+}