public IFormula visit(ExistentialFormula f) { if (f.f is Or) { var c = f.f as Or; var i1 = c.f1.ffreeVariables.Contains(f.var); var i2 = c.f2.ffreeVariables.Contains(f.var); if (i1 && i2) { var newVar = srs.getFreshVariable(f.var); var ns = new Substitution(f.var, new Variable(newVar)); return(new Or( new ExistentialFormula(f.var, c.f1, f.attributes, f.triggers).visit(this), new ExistentialFormula(newVar, c.f2.substitute(ns), f.attributes, from ts in f.triggers select from t in ts select t.substitute(ns)).visit( this) )); } else if (i1) { return(new Or(new ExistentialFormula(f.var, c.f1, f.attributes, f.triggers).visit(this), c.f2.visit(this))); } else if (i2) { return(new Or(c.f1.visit(this), new ExistentialFormula(f.var, c.f2, f.attributes, f.triggers).visit(this))); } else { return(c.visit(this)); } } else if (f.f is And) { var c = f.f as And; var i1 = c.f1.ffreeVariables.Contains(f.var); var i2 = c.f2.ffreeVariables.Contains(f.var); if (i1 && i2) { return(new ExistentialFormula(f.var, f.f.visit(this), f.attributes, f.triggers)); } else if (i1) { return(new And(new ExistentialFormula(f.var, c.f1, f.attributes, f.triggers).visit(this), c.f2.visit(this))); } else if (i2) { return(new And(c.f1.visit(this), new ExistentialFormula(f.var, c.f2, f.attributes, f.triggers).visit(this))); } else { return(c.visit(this)); } } else { return(new ExistentialFormula(f.var, f.f.visit(this), f.attributes, f.triggers)); } }
public IFormula visit(ExistentialFormula f) { var fvs = (from fv in f.f.ffreeVariables where fv != f.var select fv).ToArray(); var fvts = TypeTuple.make(from fv in fvs select fv.type); var newF = srs.getFreshFunction("@sk", fvts, f.var.type); var fvTerms = (from fv in fvs select new Variable(fv)).ToArray <ITerm>(); return(f.f.substitute(new Substitution(f.var, new FunctionApplicationFormula(newF, fvTerms))).visit(this)); }
public IFormula visit(ExistentialFormula f) { return(new UniversalFormula(f.var, f.f.visit(n), f.attributes, f.triggers)); }
public IFormula visit(ExistentialFormula f) { var nf = f.f.visit(this); return(!nf.ffreeVariables.Contains(f.var) ? nf : new ExistentialFormula(f.var, nf, f.attributes, f.triggers)); }