int process_main(OpenSMTContext & ctx, config const & config) { // Enode * tmp = ctx.mkDiv(ctx.mkCons(ctx.mkVar("x"),ctx.mkCons(ctx.mkVar("y")))); // inv_barrier = ctx.mkDeriv(tmp,ctx.mkVar("x")); // Enode * tmp = ctx.mkDeriv(inv_barrier,ctx.mkVar("x")); // tmp -> print_infix(cout,l_True); Enode * pre = ctx.mkEq(ctx.mkCons(inv_barrier, ctx.mkCons(ctx.mkNum("0")))); Enode * inv_bd = ctx.mkNum("0"); //compute the time derivative of barrier for (auto const item : inv_var_map) { Enode * var = item.second; Enode * lie_part = ctx.mkDeriv(inv_barrier,var); // cout<<"d(barrier)/d"<<var<<": "<<lie_part<<endl; auto it = inv_plant.find(var); Enode * flow = it->second; // cout<<"corresponding flow: "<<flow<<endl; Enode * newterm = ctx.mkTimes(ctx.mkCons(flow,ctx.mkCons(lie_part))); // cout<<"new term: "<<newterm<<endl; inv_bd = ctx.mkPlus(ctx.mkCons(inv_bd,ctx.mkCons(newterm))); // cout<<"--\n"; } // cout<<"derivative of barrier: "<<inv_bd<<endl; double eps = inv_epsilon; Enode * post = ctx.mkLeq(ctx.mkCons(inv_bd, ctx.mkCons(ctx.mkNum(eps)))); Enode * formula = ctx.mkNot(ctx.mkCons(ctx.mkImplies(ctx.mkCons(pre,ctx.mkCons(post))))); //begin tests // Enode * tmp = ctx.mkTimes(ctx.mkCons(ctx.mkVar("x"),ctx.mkCons(ctx.mkVar("y")))); // Enode * invD = ctx.mkDeriv(tmp,ctx.mkVar("x")); // invD = ctx.mkEq(ctx.mkCons(invD,ctx.mkCons(ctx.mkNum("1")))); // Enode * formula = ctx.mkNot(ctx.mkCons(ctx.mkImplies(ctx.mkCons(invD,ctx.mkCons(post))))); //end tests ctx.Assert(formula); auto result = ctx.CheckSAT(); cout << "Result: "; if (result == l_True) { cout << "Not a valid epsilon-barrier, where epsilon is " <<eps<<" and delta is "<<ctx.getPrecision()<<". Try a smaller epsilon or delta. "<< endl; } else { cout << "Yes, it is a valid barrier." << endl; } return 0; }