/* this example has a vee in the concept refinement */ concept Eq { fun eq(T x, T y) -> bool@; }; concept MultMonoid { refines Eq; fun mult(M x, M y) -> M@; fun unit() -> M@; }; concept AddMonoid { refines Eq; fun add(M x, M y) -> M@; fun unit() -> M@; }; concept AdditiveGroup { refines AddMonoid; fun add_inv(G x) -> G@; }; concept MultGroup { refines MultMonoid; fun inv(G x) -> G@; }; concept AddGroup { refines AddMonoid; fun inv(G x) -> G@; }; concept Ring { refines AdditiveGroup; refines MultGroup; }; concept Module { refines AddGroup; require Ring; fun scale_r(M v, R s) -> M@; fun scale_l(R s, M v) -> M@; }; model Eq { fun eq(double x, double y) -> bool@ { return x == y; } }; model MultMonoid { fun mult(double x, double y) -> double@ { return x * y; } fun unit() -> double@ { return 1.0; } }; model AddMonoid { fun add(double x, double y) -> double@ { return x + y; } fun unit() -> double@ { return 0.0; } }; model AdditiveGroup { fun add_inv(double x) -> double@ { return -x; } }; model MultGroup { fun inv(double x) -> double@ { return 1.0/x; } }; model AddGroup { fun inv(double x) -> double@ { return -x; } }; model Ring { }; model Module { fun scale_r(double x, double y) -> double@ { return x * y; } fun scale_l(double x, double y) -> double@ { return x * y; } }; fun main() -> int@ { return 0; }