public static Solution CreateSolution(Atomic atomic, MatchStmt ms) { Atomic ac = atomic.Copy(); ac.AddUpdated(ms, ms); return(new Solution(ac, true, null)); }
public static IEnumerable <Solution> SearchBlockStmt(BlockStmt body, Atomic atomic) { Atomic ac = atomic.Copy(); ac.DynamicContext.tacticBody = body.Body; ac.DynamicContext.ResetCounter(); Stack <IEnumerator <Solution> > solutionStack = new Stack <IEnumerator <Solution> >(); solutionStack.Push(Atomic.ResolveStatement(new Solution(ac)).GetEnumerator()); while (true) { if (solutionStack.Count == 0) { yield break; } var solutionEnum = solutionStack.Pop(); // if the solution is fully resolved skip resolution if (!solutionEnum.MoveNext()) { continue; } var solution = solutionEnum.Current; solutionStack.Push(solutionEnum); if (solution.State.DynamicContext.isPartialyResolved) { solutionStack.Push(Atomic.ResolveStatement(solution).GetEnumerator()); yield return(solution); } else if (solution.State.DynamicContext.GetCurrentStatement() == null) { yield return(solution); } else { solutionStack.Push(Atomic.ResolveStatement(solution).GetEnumerator()); } } }
public static IEnumerable <Solution> SearchBlockStmt(BlockStmt body, Atomic atomic) { Atomic ac = atomic.Copy(); ac.DynamicContext.tacticBody = body.Body; ac.DynamicContext.ResetCounter(); List <Solution> result = new List <Solution> { new Solution(ac) }; // search strategy for body goes here while (true) { List <Solution> interm = new List <Solution>(); if (result.Count == 0) { break; } foreach (var solution in result) { foreach (var item in Atomic.ResolveStatement(solution)) { if (item.State.DynamicContext.isPartialyResolved) { { interm.Add(item); } yield return(item); } else if (item.State.DynamicContext.GetCurrentStatement() == null) { yield return(item); } else { interm.Add(item); } } } result.Clear(); result.AddRange(interm); } }
public string GenerateProgram(ref Program prog, bool isFinal = false) { Debug.WriteLine("Generating Dafny program"); var ac = State.Copy(); MemberDecl newMemberDecl; ac.Fin(); if (!ac.IsFunction) { var method = Tacny.Program.FindMember(prog, ac.DynamicContext.md.Name) as Method; if (method == null) { throw new Exception("Method not found"); } UpdateStmt tacCall = ac.GetTacticCall(); List <Statement> body = method.Body.Body; body = InsertSolution(body, tacCall, ac.GetResolved()); if (body == null) { return(null); } if (!isFinal) { for (int i = 0; i < body.Count; i++) { var us = body[i] as UpdateStmt; if (us == null) { continue; } if (State.StaticContext.program.IsTacticCall(us)) { body.RemoveAt(i); } } } newMemberDecl = GenerateMethod(method, body, ac.DynamicContext.newTarget as Method); } else { newMemberDecl = ac.GetNewTarget(); } for (int i = 0; i < prog.DefaultModuleDef.TopLevelDecls.Count; i++) { var curDecl = prog.DefaultModuleDef.TopLevelDecls[i] as ClassDecl; if (curDecl != null) { // scan each member for tactic calls and resolve if found for (int j = 0; j < curDecl.Members.Count; j++) { if (curDecl.Members[j].Name == newMemberDecl.Name) { curDecl.Members[j] = newMemberDecl; } } prog.DefaultModuleDef.TopLevelDecls[i] = Tacny.Program.RemoveTactics(curDecl); } } Debug.WriteLine("Dafny program generated"); return(null); }
public static IEnumerable<Solution> SearchBlockStmt(BlockStmt body, Atomic atomic) { Atomic ac = atomic.Copy(); ac.DynamicContext.tacticBody = body.Body; ac.DynamicContext.ResetCounter(); Stack<IEnumerator<Solution>> solutionStack = new Stack<IEnumerator<Solution>>(); solutionStack.Push(Atomic.ResolveStatement(new Solution(ac)).GetEnumerator()); while (true) { if (solutionStack.Count == 0) { yield break; } var solutionEnum = solutionStack.Pop(); // if the solution is fully resolved skip resolution if (!solutionEnum.MoveNext()) continue; var solution = solutionEnum.Current; solutionStack.Push(solutionEnum); if (solution.State.DynamicContext.isPartialyResolved) { solutionStack.Push(Atomic.ResolveStatement(solution).GetEnumerator()); yield return solution; } else if (solution.State.DynamicContext.GetCurrentStatement() == null) { yield return solution; } else { solutionStack.Push(Atomic.ResolveStatement(solution).GetEnumerator()); } } }
public static IEnumerable<Solution> SearchBlockStmt(BlockStmt body, Atomic atomic) { Atomic ac = atomic.Copy(); ac.DynamicContext.tacticBody = body.Body; ac.DynamicContext.ResetCounter(); List<Solution> result = new List<Solution> { new Solution(ac) }; // search strategy for body goes here while (true) { List<Solution> interm = new List<Solution>(); if (result.Count == 0) break; foreach (var solution in result) { foreach (var item in Atomic.ResolveStatement(solution)) { if (item.State.DynamicContext.isPartialyResolved) { { interm.Add(item); } yield return item; } else if (item.State.DynamicContext.GetCurrentStatement() == null) { yield return item; } else { interm.Add(item); } } } result.Clear(); result.AddRange(interm); } }