Exemple #1
0
 public static IEnumerable<ProofState> EvalNextControlFlow(Statement stmt, ProofState state) {
   IEnumerable<ProofState> ret;
   switch(state.GetCurFrameTyp()) {
     case "tmatch":
       ret = new Match().EvalNext(stmt as TacnyCasesBlockStmt, state);
       break;
     default:
       ret = null;
       break;
   }
   return ret;
 }
Exemple #2
0
    public static IEnumerable<ProofState> EvalStep(ProofState state) {
      Contract.Requires<ArgumentNullException>(state != null, "state");

      IEnumerable<ProofState> enumerable = null;
      var stmt = state.GetStmt();

      //if the current frame is a control flow, e.g. match, no need to get stmt
      if(FlowControlMng.IsFlowControlFrame(state)) {
        enumerable = FlowControlMng.EvalNextControlFlow(stmt, state);
      } else {
        if(stmt is TacticVarDeclStmt) {
          enumerable = RegisterVariable(stmt as TacticVarDeclStmt, state);
        } else if(stmt is UpdateStmt) {
          var us = stmt as UpdateStmt;
          if(state.IsLocalAssignment(us)) {
            enumerable = UpdateLocalValue(us, state);
          } else if(state.IsArgumentApplication(us)) {
            //TODO: argument application ??
          } else if(state.IsTacticCall(us)){
            enumerable = EvalTacApp(us, state);
          } else {
            // apply atomic
            string sig = Util.GetSignature(us);
            //Firstly, check if this is a projection function
            var types =
              Assembly.GetAssembly(typeof(Atomic.Atomic))
                .GetTypes()
                .Where(t => t.IsSubclassOf(typeof(Atomic.Atomic)));
            foreach(var fType in types) {
              var porjInst = Activator.CreateInstance(fType) as Atomic.Atomic;
              if(sig == porjInst?.Signature) {
                //TODO: validate input countx
                enumerable = porjInst?.Generate(us, state);
              }
            }
          }
        } else if(stmt is AssignSuchThatStmt) {
          enumerable = EvalSuchThatStmt((AssignSuchThatStmt)stmt, state);
        } else if(stmt is PredicateStmt) {
          enumerable = EvalPredicateStmt((PredicateStmt)stmt, state);
        } else if(FlowControlMng.IsFlowControl(stmt)) {
          if(stmt is TacnyCasesBlockStmt) {
            enumerable = new Match().EvalInit(stmt, state);
          }
          //TODO: to implement if and while control flow
        } else {
          enumerable = DefaultAction(stmt, state);
        }
      }
      foreach(var item in enumerable)
        yield return item.Copy();
    }