import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
import org.simantics.scl.compiler.elaboration.expressions.EVariable;
import org.simantics.scl.compiler.elaboration.expressions.Variable;
-import org.simantics.scl.compiler.elaboration.expressions.VariableProcedure;
import org.simantics.scl.compiler.elaboration.expressions.printing.ExpressionToStringVisitor;
import org.simantics.scl.compiler.errors.Locations;
import org.simantics.scl.compiler.internal.parsing.Symbol;
import org.simantics.scl.compiler.types.kinds.Kinds;
import gnu.trove.map.hash.TObjectIntHashMap;
-import gnu.trove.set.hash.THashSet;
import gnu.trove.set.hash.TIntHashSet;
public class CHRRule extends Symbol {
+ public CHRRuleset parentRuleset;
public int priority;
public CHRQuery head;
public CHRQuery body;
public Variable[] existentialVariables;
// Analysis
- public int firstPriorityExecuted;
+ //public int firstPriorityExecuted;
public int lastPriorityExecuted;
// Plans
this.body = body;
this.existentialVariables = existentialVariables;
}
+
+ public CHRRule(long location, CHRQuery head, CHRQuery body) {
+ this(location, head, body, null);
+ }
public void resolve(TranslationContext context) {
context.pushExistentialFrame();
head.resolve(context);
+ context.disallowNewExistentials();
body.resolve(context);
existentialVariables = context.popExistentialFrame();
}
- public void collectRefs(TObjectIntHashMap<Object> allRefs, TIntHashSet refs) {
- head.collectRefs(allRefs, refs);
- body.collectRefs(allRefs, refs);
- }
-
public void checkType(TypingContext context) {
for(Variable variable : existentialVariables)
variable.setType(Types.metaVar(Kinds.STAR));
body.collectVars(allVars, vars);
}
- public void forVariables(VariableProcedure procedure) {
- head.forVariables(procedure);
- body.forVariables(procedure);
- }
-
- public void collectFreeVariables(THashSet<Variable> vars) {
- head.collectFreeVariables(vars);
- body.collectFreeVariables(vars);
- }
-
public void setLocationDeep(long loc) {
if(location == Locations.NO_LOCATION) {
this.location = loc;
}
public void compile(CompilationContext compilationContext, CHRConstraint initConstraint) {
- boolean hasActiveLiteral = false;
+ boolean hasLocalActiveLiteral = false;
for(int i=0;i<head.literals.length;++i) {
CHRLiteral literal = head.literals[i];
if(literal.passive)
Variable activeFact = new Variable("activeFact", constraint.factType);
QueryPlanningContext context = new QueryPlanningContext(compilationContext, existentialVariables);
- if(!head.createQueryPlan(context, new EVariable(activeFact), i))
+ if(!head.createQueryPlan(context, new EVariable(activeFact), i, initConstraint))
return;
body.createEnforcePlan(context, priority);
addPlan(new CHRSearchPlan(constraint, activeFact, context.getPlanOps()));
- hasActiveLiteral = true;
+ if(constraint.parentRuleset == parentRuleset)
+ hasLocalActiveLiteral = true;
}
- if(!hasActiveLiteral) {
+ if(!hasLocalActiveLiteral) {
Variable activeFact = new Variable("activeFact", initConstraint.factType);
QueryPlanningContext context = new QueryPlanningContext(compilationContext, existentialVariables);
- if(!head.createQueryPlan(context, null, -1))
+ if(!head.createQueryPlan(context, new EVariable(activeFact), -1, initConstraint))
return;
body.createEnforcePlan(context, priority);
/*System.out.println(this);
private void addPlan(CHRSearchPlan plan) {
plans.add(plan);
- plan.constraint.minimumPriority = Math.min(plan.constraint.minimumPriority, priority);
}
public String toString() {