package com.sri.ai.grinder.sgdpllt.interpreter;
import static com.sri.ai.util.Util.in;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.sri.ai.expresso.api.Expression;
import com.sri.ai.expresso.core.ExtensionalIndexExpressionsSet;
import com.sri.ai.grinder.sgdpllt.api.Context;
import com.sri.ai.grinder.sgdpllt.core.solver.AbstractMultiIndexQuantifierEliminator;
import com.sri.ai.grinder.sgdpllt.group.AssociativeCommutativeGroup;
import com.sri.ai.grinder.sgdpllt.library.indexexpression.IndexExpressions;
import com.sri.ai.grinder.sgdpllt.rewriter.api.Rewriter;
import com.sri.ai.grinder.sgdpllt.rewriter.api.TopRewriter;
import com.sri.ai.grinder.sgdpllt.rewriter.core.Exhaustive;
import com.sri.ai.grinder.sgdpllt.rewriter.core.Recursive;
import com.sri.ai.util.collect.StackedHashMap;
/**
* An abstract class for quantifier eliminators using a simple (total or sampled)
* iteration over the domain of the eliminated variables.
*
* The current assignment to the eliminated variables is kept in the {@link Context}'s
* global object with key {@link #ASSIGNMENTS_GLOBAL_OBJECTS_KEY},
* which can be extended with {@link #extendAssignments(Map, Context)}.
* This same assignment is also used by top rewriters in implementations of
* {@link AbstractInterpreter} to simplify variables.
*
*
* @author braz
*
*/
public abstract class AbstractIterativeMultiIndexQuantifierEliminator extends AbstractMultiIndexQuantifierEliminator {
protected TopRewriterUsingContextAssignments topRewriterUsingContextAssignments;
/**
* Make the term to be summed for all assignments provided by assignments iterator.
* @param group
* @param indices
* @param indicesCondition
* @param body
* @param context
* @return
*/
public abstract Expression makeSummand(AssociativeCommutativeGroup group, List indices, Expression indicesCondition, Expression body, Context context);
/**
* Makes an iterator (ranging assignments from indices to their values)
* that will be used to generate all the terms to be added.
* @param indices
* @param indicesCondition
* @param context
* @return
*/
public abstract Iterator