// RUN: %dafny "%s" > "%t" // RUN: %diff "%s.expect" "%t" function method MkId() : A -> A { x => x } function method IntId() : int -> int { y => y } function method DivZero() : int -> int { z => 5 / z // div by zero } function method DivZeroWithReq() : int -> int { (z) requires z != 0 => 5 / z } function method DivZero2() : (int, int) -> int { (x, y) requires y != 0 => x / y } function method DivZero3() : int -> int { z => z / 0 // div by zero } function method Shadow() : int -> real -> real { x => x => x } method Reqs() { var fn := (u) requires u => u; print fn(true); print fn(false); // precond violation } method Main() { var id := IntId(); print id(5); var polyid : int -> int := MkId(); print polyid(5); assert id(2) == polyid(2); assert id(3) != 4 && 5 != polyid(6); var divvy := DivZero2(); print divvy(2,5); print divvy(2,0); // precond violation } function method succ(x : int) : int requires x > 0; { x + 1 } method Main2() { var suc := succ; assert suc(3) == succ(3); assert suc(-1) == 0; // precond violation } function method Id(x : A) : A { x } method Main3() { var id := Id; assert id(3) == 3; assert forall x :: (Id(id))(x) == (y => y)(x); assert forall x :: (Id(id))(x) == (y => y)(2); // should fail } function P(f: A -> B, x : A): B reads (f.reads)(x); requires (f.requires)(x); { f(x) } function Q(f: U -> V, x : U): V reads P.reads(f,x); requires f.requires(x); // would be nice to be able to write P.requires(f,x) { P(f,x) } function QQ(f: U -> V, x : U): V reads ((() => ((()=>f)()).reads)())((()=>x)()); requires ((() => ((()=>f)()).requires)())((()=>x)()); { ((() => P)())((()=>f)(),(()=>x)()) }