From 4d1ce245c0426d3c04b94b9d7ca9804bf32988e9 Mon Sep 17 00:00:00 2001 From: Etienne Kneuss <etienne.kneuss@epfl.ch> Date: Tue, 16 Dec 2014 11:05:47 +0100 Subject: [PATCH] Improve EquivalentInputs, use foo' to represent new function. No BUTEGIS --- src/main/scala/leon/repair/Repairman.scala | 2 +- src/main/scala/leon/synthesis/Rules.scala | 2 +- .../scala/leon/synthesis/rules/EquivalentInputs.scala | 9 ++++++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/scala/leon/repair/Repairman.scala b/src/main/scala/leon/repair/Repairman.scala index e5b257f07..72b20588b 100644 --- a/src/main/scala/leon/repair/Repairman.scala +++ b/src/main/scala/leon/repair/Repairman.scala @@ -95,7 +95,7 @@ class Repairman(ctx: LeonContext, initProgram: Program, fd: FunDef, verifTimeout def getSynthesizer(passingTests: List[Example], failingTests: List[Example]): Synthesizer = { // Create a fresh function - val nid = FreshIdentifier(fd.id.name+"_repair").copiedFrom(fd.id) + val nid = FreshIdentifier(fd.id.name+"'").copiedFrom(fd.id) val nfd = new FunDef(nid, fd.tparams, fd.returnType, fd.params, fd.defType) nfd.copyContentFrom(fd) nfd.copiedFrom(fd) diff --git a/src/main/scala/leon/synthesis/Rules.scala b/src/main/scala/leon/synthesis/Rules.scala index e93aa7089..d616c3b93 100644 --- a/src/main/scala/leon/synthesis/Rules.scala +++ b/src/main/scala/leon/synthesis/Rules.scala @@ -27,7 +27,7 @@ object Rules { InequalitySplit, CEGIS, TEGIS, - BottomUpTEGIS, + //BottomUpTEGIS, rules.Assert, DetupleOutput, DetupleInput, diff --git a/src/main/scala/leon/synthesis/rules/EquivalentInputs.scala b/src/main/scala/leon/synthesis/rules/EquivalentInputs.scala index 3a0847389..6b936d66b 100644 --- a/src/main/scala/leon/synthesis/rules/EquivalentInputs.scala +++ b/src/main/scala/leon/synthesis/rules/EquivalentInputs.scala @@ -50,8 +50,15 @@ case object EquivalentInputs extends NormalizingRule("EquivalentInputs") { } - val substs = discoverEquivalences(clauses) + // We could discover one equivalence, which could allow us to discover + // other equivalences: We do a fixpoint with limit 5. + val substs = fixpoint({ (substs: Set[(Expr, Expr)]) => + val newClauses = substs.map{ case(e,v) => Equals(v, e) } // clauses are directed: foo = obj.f + substs ++ discoverEquivalences(clauses ++ newClauses) + }, 5)(Set()).toSeq + + // We are replacing foo(a) with b. We inject postcondition(foo)(a, b). val postsToInject = substs.collect { case (FunctionInvocation(tfd, args), e) if tfd.hasPostcondition => val Some((id, post)) = tfd.postcondition -- GitLab