Skip to content

Commit 9c115ca

Browse files
daejunparkdwightguth
authored andcommitted
* correct in_keys 92606afa52040f93691a55d93ef1402bc4b2795c * for better debugging: add original name when renaming variable * add hook KREFLECTION.isConcrete * Cache function/anywhere symbol evaluation * fix top constraint * context.setTopConstraint after constraint.orientSubstitution in buildResult * add #isConcrete to domains.k * add isConcrete hook to prelude.ml, simply returning true * fix hook_isConcrete in prelude.ml * DefinitionParsing.java: fix auto-generated $SYNTAX module loading * fix compile error in prelude.ml
1 parent be4d67d commit 9c115ca

13 files changed

Lines changed: 59 additions & 9 deletions

File tree

java-backend/src/main/java/org/kframework/backend/java/builtins/BuiltinMapOperations.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,17 @@ public static BuiltinSet keys(BuiltinMap map, TermContext context) {
174174
}
175175

176176
public static BoolToken in_keys(Term key, BuiltinMap map, TermContext context) {
177-
return BoolToken.of(map.getEntries().containsKey(key));
177+
boolean in = map.getEntries().containsKey(key);
178+
BoolToken r = BoolToken.of(in);
179+
if (in) {
180+
return r;
181+
} else if (key.isGround() && map.isConcreteCollection() && map.hasOnlyGroundKeys()) {
182+
return r;
183+
} else if (map.isEmpty()) {
184+
return r;
185+
} else {
186+
return null;
187+
}
178188
}
179189

180190
public static Term values(BuiltinMap map, TermContext context) {

java-backend/src/main/java/org/kframework/backend/java/builtins/MetaK.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,4 +202,8 @@ public static Term configuration(TermContext context) {
202202
//return KLabelInjection.injectionOf(context.getTopTerm(), context.global());
203203
return context.getTopTerm();
204204
}
205+
206+
public static BoolToken isConcrete(Term term, TermContext context) {
207+
return BoolToken.of(term.isConcrete());
208+
}
205209
}

java-backend/src/main/java/org/kframework/backend/java/kil/ConstrainedTerm.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ public ConjunctiveFormula matchImplies(ConstrainedTerm constrainedTerm, boolean
163163
return null;
164164
}
165165

166+
context.setTopConstraint(null);
166167
return data.constraint.addAndSimplify(constraint, context);
167168
}
168169

@@ -221,7 +222,10 @@ public static List<Triple<ConjunctiveFormula, Boolean, Map<scala.collection.immu
221222
Pair<Map<scala.collection.immutable.List<Pair<Integer, Integer>>, Term>, ConjunctiveFormula> pair = ConstrainedTerm.splitRewrites(candidate);
222223
ConjunctiveFormula candidateConstraint = pair.getRight();
223224

225+
context.setTopConstraint(null);
224226
ConjunctiveFormula solution = candidateConstraint.addAndSimplify(subjectConstraint, context);
227+
context.setTopConstraint(subjectConstraint);
228+
225229
if (solution.isFalse()) {
226230
continue;
227231
}
@@ -248,10 +252,12 @@ public static List<Triple<ConjunctiveFormula, Boolean, Map<scala.collection.immu
248252
if (candidate.substitution().keySet().equals(variables)
249253
&& !candidate.isSubstitution()
250254
&& subjectConstraint.implies(ConjunctiveFormula.of(context.global()).addAll(candidateConstraint.equalities()), Sets.newHashSet())) {
255+
context.setTopConstraint(null);
251256
solutions.add(Triple.of(
252257
subjectConstraint.addAndSimplify(candidateConstraint.substitution(), context),
253258
true,
254259
pair.getLeft()));
260+
context.setTopConstraint(subjectConstraint);
255261
} else {
256262
solutions.add(Triple.of(solution, isMatching, pair.getLeft()));
257263
}

java-backend/src/main/java/org/kframework/backend/java/kil/JavaSymbolicObject.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
package org.kframework.backend.java.kil;
44

5+
import com.google.common.collect.Sets;
56
import org.kframework.attributes.Att;
67
import org.kframework.attributes.Location;
78
import org.kframework.attributes.Source;
89
import org.kframework.backend.java.symbolic.BinderSubstitutionTransformer;
10+
import org.kframework.backend.java.symbolic.ConjunctiveFormula;
911
import org.kframework.backend.java.symbolic.IncrementalCollector;
1012
import org.kframework.backend.java.symbolic.LocalVisitor;
1113
import org.kframework.backend.java.symbolic.SubstitutionTransformer;
@@ -46,6 +48,7 @@ public abstract class JavaSymbolicObject<T extends JavaSymbolicObject<T>>
4648
volatile transient PSet<Variable> variableSet = null;
4749
volatile transient Boolean isGround = null;
4850
volatile transient Boolean isNormal = null;
51+
volatile transient Set<ConjunctiveFormula> isEvaluated = Sets.newHashSet();
4952
volatile transient Set<Term> userVariableSet = null;
5053

5154
private Att att;
@@ -102,8 +105,8 @@ public T renameVariables() {
102105
/**
103106
* Returns true if a call to {@link org.kframework.backend.java.kil.Term#substituteAndEvaluate(java.util.Map, TermContext)} may simplify this term.
104107
*/
105-
public boolean canSubstituteAndEvaluate(Map<Variable, ? extends Term> substitution) {
106-
return (!substitution.isEmpty() && !isGround()) || !isNormal();
108+
public boolean canSubstituteAndEvaluate(Map<Variable, ? extends Term> substitution, ConjunctiveFormula constraint) {
109+
return !Sets.intersection(substitution.keySet(), variableSet()).isEmpty() || !isEvaluated(constraint);
107110
}
108111

109112
/**
@@ -146,6 +149,19 @@ public boolean isNormal() {
146149
return isNormal;
147150
}
148151

152+
public boolean isConcrete() {
153+
return isGround() && isNormal();
154+
}
155+
156+
/**
157+
* Returns true if the function and anywhere symbols in this
158+
* {@code JavaSymbolicObject} have been evaluated under the given
159+
* {@code ConjunctiveFormula}, false otherwise.
160+
*/
161+
public boolean isEvaluated(ConjunctiveFormula constraint) {
162+
return isEvaluated.contains(constraint);
163+
}
164+
149165
/**
150166
* Returns a {@code Set} view of the user variables (ie terms of sort Variable) in this
151167
* {@code JavaSymbolicObject}.

java-backend/src/main/java/org/kframework/backend/java/kil/KItem.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -271,11 +271,15 @@ public boolean isEvaluable() {
271271
}
272272

273273
public Term evaluateFunction(TermContext context) {
274-
return global.kItemOps.evaluateFunction(this, context);
274+
Term result = global.kItemOps.evaluateFunction(this, context);
275+
result.isEvaluated.add(context.getTopConstraint());
276+
return result;
275277
}
276278

277279
public Term resolveFunctionAndAnywhere(TermContext context) {
278-
return global.kItemOps.resolveFunctionAndAnywhere(this, context);
280+
Term result = global.kItemOps.resolveFunctionAndAnywhere(this, context);
281+
result.isEvaluated.add(context.getTopConstraint());
282+
return result;
279283
}
280284

281285
@Override

java-backend/src/main/java/org/kframework/backend/java/kil/Term.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ public Term evaluate(TermContext context) {
7777
* {@code evaluate} method instead.
7878
*/
7979
public Term substituteAndEvaluate(Map<Variable, ? extends Term> substitution, TermContext context) {
80-
return canSubstituteAndEvaluate(substitution) ?
80+
return canSubstituteAndEvaluate(substitution, context.getTopConstraint()) ?
8181
(Term) this.accept(new SubstituteAndEvaluateTransformer(substitution, context)) :
8282
this;
8383
}

java-backend/src/main/java/org/kframework/backend/java/kil/Variable.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public static Variable getAnonVariable(Sort sort) {
6262
}
6363

6464
/* TODO(AndreiS): cache the variables */
65+
private String originalName = "";
6566
private final String name;
6667
private final Sort sort;
6768
private final boolean anonymous;
@@ -109,6 +110,7 @@ public Variable(MetaVariable metaVariable) {
109110
public Variable getFreshCopy() {
110111
Variable var = Variable.getAnonVariable(sort);
111112
var.copyAttributesFrom(this);
113+
var.originalName = this.name;
112114
return var;
113115
}
114116

@@ -172,7 +174,7 @@ protected final int computeHash() {
172174

173175
@Override
174176
public String toString() {
175-
return name + ":" + sort;
177+
return originalName + name + ":" + sort;
176178
}
177179

178180
@Override

java-backend/src/main/java/org/kframework/backend/java/symbolic/SubstituteAndEvaluateTransformer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public SubstituteAndEvaluateTransformer(Map<Variable, ? extends Term> substituti
3737
}
3838

3939
protected boolean proceed(JavaSymbolicObject object) {
40-
return object.canSubstituteAndEvaluate(substitution);
40+
return object.canSubstituteAndEvaluate(substitution, context.getTopConstraint());
4141
}
4242

4343
@Override

java-backend/src/main/java/org/kframework/backend/java/symbolic/SymbolicRewriter.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,8 @@ public List<ConstrainedTerm> fastComputeRewriteStep(ConstrainedTerm subject, boo
186186
theNew = theNew.substituteAndEvaluate(substitution, subject.termContext());
187187
}
188188

189+
subject.termContext().setTopConstraint(null);
190+
189191
theNew = restoreConfigurationIfNecessary(subject, rule, theNew);
190192

191193
/* eliminate bindings of the substituted variables */
@@ -369,10 +371,11 @@ public static ConstrainedTerm buildResult(
369371

370372

371373
/* apply the constraints substitution on the rule RHS */
372-
context.setTopConstraint(constraint);
373374
Set<Variable> substitutedVars = Sets.union(rule.freshConstants(), rule.matchingVariables());
374375
constraint = constraint.orientSubstitution(substitutedVars);
376+
context.setTopConstraint(constraint);
375377
Term term = rule.rightHandSide().substituteAndEvaluate(constraint.substitution(), context);
378+
context.setTopConstraint(null);
376379

377380
/* eliminate bindings of the substituted variables */
378381
constraint = constraint.removeBindings(substitutedVars);

java-backend/src/main/resources/org/kframework/backend/java/symbolic/hooks.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ UNIFICATION.freezeVariables : org.kframework.backend.java.builtins.MetaK.freezeV
172172
UNIFICATION.unifiable : org.kframework.backend.java.builtins.MetaK.unifiable
173173
KREFLECTION.getKLabel : org.kframework.backend.java.builtins.MetaK.getKLabel
174174
KREFLECTION.configuration : org.kframework.backend.java.builtins.MetaK.configuration
175+
KREFLECTION.isConcrete : org.kframework.backend.java.builtins.MetaK.isConcrete
175176

176177
# unification hooks
177178
# TODO: unimplemented

0 commit comments

Comments
 (0)