package bigstep.rules;
import common.ProofRuleException;
import expressions.Expression;
import expressions.Tuple;
import bigstep.BigStepProofContext;
import bigstep.BigStepProofNode;
import bigstep.BigStepProofResult;
import bigstep.BigStepProofRule;
/**
* This class represents the big step rule <b>(TUPLE)</b>.
*
* @author Benedikt Meurer
* @version $Id$
*/
public final class TupleRule extends BigStepProofRule {
//
// Constructor
//
/**
* Allocates a new <code>TupleRule</code> instance.
*/
public TupleRule() {
super(false, "TUPLE");
}
//
// Primitives
//
/**
* {@inheritDoc}
*
* @see bigstep.BigStepProofRule#apply(bigstep.BigStepProofContext, bigstep.BigStepProofNode)
*/
@Override
public void apply(BigStepProofContext context, BigStepProofNode node) throws ProofRuleException, ClassCastException {
// can only be applied to Tuples
Tuple tuple = (Tuple)node.getExpression();
// check if memory is enabled
if (context.isMemoryEnabled()) {
// add a child node for the first sub expression
context.addProofNode(node, tuple.getExpressions(0));
}
else {
// add all child nodes at once
for (Expression e : tuple.getExpressions()) {
context.addProofNode(node, e);
}
}
}
/**
* {@inheritDoc}
*
* @see bigstep.BigStepProofRule#update(bigstep.BigStepProofContext, bigstep.BigStepProofNode)
*/
@Override
public void update(BigStepProofContext context, BigStepProofNode node) {
// determine the expression at this node
Tuple tuple = (Tuple)node.getExpression();
// check if all child nodes were created
if (node.getChildCount() < tuple.getArity()) {
// verify that the last child node is proven
if (node.getLastChild().isProven()) {
// add the next child node
context.addProofNode(node, tuple.getExpressions(node.getChildCount()));
}
}
else {
// check if all child nodes are proven
Expression[] values = new Expression[node.getChildCount()];
for (int n = 0; n < values.length; ++n) {
BigStepProofResult result = node.getChildAt(n).getResult();
if (result == null) {
// atleast one is not yet proven
return;
}
values[n] = result.getValue();
}
// all child nodes are proven, we're done
context.setProofNodeResult(node, new Tuple(values));
}
}
}