@Override public IProofObligationList caseAStateDefinition(AStateDefinition node, IPOContextStack question) throws AnalysisException { try { IProofObligationList list = new ProofObligationList(); if (node.getInvdef() != null) { list.addAll(node.getInvdef().apply(mainVisitor, question)); list.add(new SatisfiabilityObligation(node, question, assistantFactory)); } return list; } catch (Exception e) { throw new POException(node, e.getMessage()); } }
@Override public LexNameSet caseAStateDefinition(AStateDefinition node, FreeVarInfo info) throws AnalysisException { FreeVarInfo local = info.set(new FlatEnvironment(af, new Vector<PDefinition>(), info.env)); LexNameSet names = new LexNameSet(); if (node.getInvdef() != null) { names.addAll(node.getInvdef().apply(this, local)); } if (node.getInitdef() != null) { names.addAll(node.getInitdef().apply(this, local)); } return names; }
private PExp makeInvApplyExp(AAtomicStm atom) { AStateDefinition stateDef = atom.getAssignments().get(0).getStateDefinition(); if (stateDef == null) { return extractInv(atom); } String stateName = getStateName(stateDef); List<PExp> arglist = new Vector<PExp>(); for (AFieldField f : stateDef.getFields()) { arglist.add(getVarExp(f.getTagname().clone(), stateDef.clone(),f.getType())); } PExp mkExp = AstExpressionFactory.newAMkTypeExp(new LexNameToken("", stateName, null), stateDef.getRecordType().clone(), arglist); AApplyExp invApplyExp = getApplyExp(getVarExp(stateDef.getInvdef().getName().clone(), stateDef.getInvdef().clone(), stateDef.getInvdef().getType().clone()), new ABooleanBasicType(), mkExp); invApplyExp.getRoot().setType(stateDef.getInvdef().getType().clone()); return invApplyExp; }
private PExp invDefs(PDefinition def) { if (def instanceof AStateDefinition) { return ((AStateDefinition) def).getInvdef().getBody(); } else { PExp root = null; for (PDefinition d : assistantFactory.createSClassDefinitionAssistant().getInvDefs((SClassDefinition) def)) { AClassInvariantDefinition cid = (AClassInvariantDefinition) d; root = makeAnd(root, cid.getExpression().clone()); } return root; } }
PDefinition invdef = node.getInvdef();
public void initState(AStateDefinition sdef, StateContext initialContext) { StateDefinitionRuntimeState state = new StateDefinitionRuntimeState(); VdmRuntime.setNodeState(sdef, state); if (sdef.getInvdef() != null) { state.invfunc = new FunctionValue(sdef.getInvdef(), null, null, initialContext); initialContext.put(sdef.getName().getInvName(sdef.getLocation()), state.invfunc); } if (sdef.getInitdef() != null) { state.initfunc = new FunctionValue(sdef.getInitdef(), null, null, initialContext); initialContext.put(sdef.getName().getInitName(sdef.getLocation()), state.initfunc); } state.moduleState = new State(sdef); state.moduleState.initialize(initialContext); }
@Override public void caseAStateDefinition(AStateDefinition node, NewQuestion question) throws AnalysisException { for (AFieldField f : node.getFields()) { try { f.apply(THIS, new NewQuestion(question.rootVisitor, question.question)); } catch (TypeCheckException e) { question.question.assistantFactory.createPTypeAssistant().unResolve(f.getType()); throw e; } } node.setRecordType(af.createPTypeAssistant().typeResolve(node.getRecordType(), null, question.rootVisitor, question.question)); if (node.getInvPattern() != null) { node.getInvdef().apply(this, question); ARecordInvariantType rtype = (ARecordInvariantType) node.getRecordType(); rtype.setInvDef(node.getInvdef()); } if (node.getInitPattern() != null) { node.getInitdef().apply(this, question); } }
@Override public PType caseAStateDefinition(AStateDefinition node, TypeCheckInfo question) throws AnalysisException { Environment base = question.env; if (base.findStateDefinition() != node) { TypeCheckerErrors.report(3047, "Only one state definition allowed per module", node.getLocation(), node); return null; } for (PDefinition def : node.getStateDefs()) { if (!def.getName().getOld()) // Don't check old names { question.assistantFactory.getTypeComparator().checkComposeTypes(def.getType(), question.env, false); } } question.assistantFactory.createPDefinitionListAssistant().typeCheck(node.getStateDefs(), THIS, question); if (node.getInvdef() != null) { node.getInvdef().apply(THIS, question); question.assistantFactory.createPPatternAssistant().typeResolve(node.getInvPattern(), THIS, question); } if (node.getInitdef() != null) { node.getInitdef().apply(THIS, question); question.assistantFactory.createPPatternAssistant().typeResolve(node.getInitPattern(), THIS, question); } return null; }
PExp initExp = node.getInitExpression(); PPattern initPattern = node.getInitPattern(); AExplicitFunctionDefinition invdef = node.getInvdef(); PExp invExp = node.getInvExpression(); PPattern invPattern = node.getInvPattern();