if (cur.getKind() == APPLY_UF)
{
Node op = cur.getOperator();
- if (std::find(free_functions.begin(), free_functions.end(), op)
- == free_functions.end())
- {
- free_functions.push_back(op);
- }
+ // visit the operator, which might not be a variable
+ visit.push_back(op);
}
else if (cur.isVar() && cur.getKind() != BOUND_VARIABLE)
{
- // a free variable is a 0-argument function to synthesize
+ // We are either in the case of a free first-order constant or a
+ // function in a higher-order context. We add to free_functions
+ // in either case. Note that a free constant that is not in a
+ // higher-order context is a 0-argument function-to-synthesize.
+ // We should not have traversed here before due to our visited cache.
Assert(std::find(free_functions.begin(), free_functions.end(), cur)
== free_functions.end());
free_functions.push_back(cur);
regress1/sygus/issue3320-quant.sy
regress1/sygus/issue3461.sy
regress1/sygus/issue3498.smt2
+ regress1/sygus/issue3507.smt2
regress1/sygus/large-const-simp.sy
regress1/sygus/let-bug-simp.sy
regress1/sygus/list-head-x.sy
--- /dev/null
+; EXPECT: sat
+; COMMAND-LINE: --sygus-inference --uf-ho
+(set-logic ALL)
+(declare-fun f (Int) Bool)
+(declare-fun g (Int) Bool)
+(assert (and (distinct f g) (g 0)))
+(assert (exists ((x Int)) (f x)))
+(check-sat)