// Examples 4, 6, 7 and 8 (I&C)

const double epsilon = 1e-6;

// Example 4

// Should be this but can't do it (strict bounds)
!multi(P<0.98 [ G !"err_G" ], P>=0.8 [ G !("err_A")])

// So do this instead
// Result should be true (there is no satisfying adversary)
"triple": !multi(P<=(0.98-epsilon) [ G !"err_G" ], P>=0.8 [ G !("err_A")])

// But fails for a higher p_G
"triple_fail": !multi(P<=(0.99-epsilon) [ G !"err_G" ], P>=0.8 [ G !("err_A")])

// Example 6

// Numerical version: gives 0.98
"numerical": multi(Pmin=? [ G !"err_G" ], P>=0.8 [ G !("err_A")])

// Or equivalently:
1 - multi(Pmax=? [ F "err_G" ], P<=0.2 [F "err_A"])

// Example 7

// Parameterised version: gives 0.7
"param": multi(Pmax=? [ G !"err_A" ], P<=0.97-epsilon [ G !("err_G")])

// Example 8

// Pareto version
"pareto": multi(Pmin=? [ G !"err_G" ], Pmax=? [ G !("err_A")])