예제 #1
0
        public ParameterVar AssignParameterVar(List <Element> actions, ScopeGroup scopeGroup, bool isGlobal, string name, Range range)
        {
            ParameterVar var = new ParameterVar(actions, scopeGroup, name, isGlobal, UseVar, Assign(isGlobal), range);

            AllVars.Add(var);
            return(var);
        }
예제 #2
0
        public Var AssignVar(string name, bool isGlobal)
        {
            Var var = new Var("INTERNAL : " + name, isGlobal, UseVar, Assign(isGlobal));

            AllVars.Add(var);
            return(var);
        }
예제 #3
0
        public DefinedVar AssignDefinedVar(ScopeGroup scopeGroup, bool isGlobal, string name, Range range)
        {
            DefinedVar var = new DefinedVar(scopeGroup, name, isGlobal, UseVar, Assign(isGlobal), range);

            AllVars.Add(var);
            return(var);
        }
예제 #4
0
        /// <summary>
        /// Adds a variable to the collection of variables of the given type
        /// </summary>
        /// <typeparam name="T">The type matching the target collection of variables</typeparam>
        /// <param name="v">The variable to add to the collection of matching type</param>
        /// <returns>Returns true if the variable was successfully added</returns>
        public bool AddVariable <T>(T v)
        {
            Type varType = typeof(T);

            if (varType == typeof(IndependentVariable))
            {
                IndependentVariable iv = (IndependentVariable)Convert.ChangeType(v, typeof(IndependentVariable));
                if (!IndVars.ContainsKey(iv.Name))
                {
                    IndVars.Add(iv.Name, iv);
                }
                if (!AllVars.ContainsKey(iv.Name))
                {
                    AllVars.Add(iv.Name, iv);
                }
            }
            else
            {
                DependentVariable dv = (DependentVariable)Convert.ChangeType(v, typeof(DependentVariable));

                if (!DepVars.ContainsKey(dv.Name))
                {
                    DepVars.Add(dv.Name, dv);
                }
                if (!AllVars.ContainsKey(dv.Name))
                {
                    AllVars.Add(dv.Name, dv);
                }
            }
            return(true);
        }
예제 #5
0
        /// <summary>
        /// Fetches a variable from the collection of variables matching the given type
        /// </summary>
        /// <typeparam name="T">The type of the collection of variables to search</typeparam>
        /// <param name="name">The string representation of the given variable to search for</param>
        /// <returns>Returns the variable if it was found, else returns null</returns>
        public Variable TryGetVariable <T>(string name) where T : Variable
        {
            Type varType = typeof(T);

            if (varType == typeof(IndependentVariable))
            {
                if (IndVars.ContainsKey(name))
                {
                    return(IndVars[name]);
                }
            }
            else if (varType == typeof(DependentVariable))
            {
                if (DepVars.ContainsKey(name))
                {
                    return(DepVars[name]);
                }
            }
            else if (varType == typeof(Variable))
            {
                if (AllVars.ContainsKey(name))
                {
                    return(AllVars[name]);
                }
            }
            return(null);
        }
예제 #6
0
 public string Replace(string line)
 {
     if (line.Contains('{') && line.Contains('}'))
     {
         if (line.IndexOf('{') > line.IndexOf('}'))
         {
             p.ExceptionHandler(7, LineN, Line);
         }
         else
         {
             do
             {
                 string var = line.Remove(line.IndexOf('}'));
                 var = var.Substring(var.IndexOf('{') + 1);
                 if (AllVars.ContainsKey(var))
                 {
                     if (AllVars[var] == null)
                     {
                         p.ExceptionHandler(9, LineN, Line);
                     }
                     else
                     {
                         line = line.Replace($"{{{var}}}", AllVars[var][var]);
                     }
                 }
                 else
                 {
                     break;
                 }
             }while (line.Contains('{'));
         }
     }
     return(line);
 }
예제 #7
0
 public void Pog(string output)
 {
     if (output.Contains('{') && output.Contains('}'))
     {
         if (output.IndexOf('{') > output.IndexOf('}'))
         {
             p.ExceptionHandler(7, LineN, Line);
         }
         else
         {
             string var = output.Remove(output.IndexOf('}'));
             var = var.Substring(var.IndexOf('{') + 1);
             if (AllVars.ContainsKey(var))
             {
                 if (AllVars[var] == null)
                 {
                     p.ExceptionHandler(9, LineN, Line);
                 }
                 else
                 {
                     output = output.Replace($"{{{var}}}", AllVars[var][var]);
                 }
             }
         }
     }
     try
     {
         Console.Write(output.Trim());
     }
     catch
     {
         p.ExceptionHandler(8, LineN, Line);
     }
 }
예제 #8
0
        public void WeirdChamp(string varName, string type)
        {
            bool contains = false;
            Dictionary <string, string> table = new Dictionary <string, string>();

            if (Variables.ContainsKey(varName) || VariablesInt.ContainsKey(varName) || VariablesFloat.ContainsKey(varName))
            {
                contains = true;
            }
            switch (type)
            {
            case "string":
                table = Variables;
                break;

            case "int":
                table = VariablesInt;
                break;

            case "float":
                table = VariablesFloat;
                break;

            default:
                p.ExceptionHandler(11, LineN, Line);
                break;
            }
            if (contains)
            {
                if (!table.ContainsKey(varName))
                {
                    p.ExceptionHandler(6, LineN, Line);
                }
                else
                {
                    try
                    {
                        table[varName] = Console.ReadLine();
                    }
                    catch
                    {
                        p.ExceptionHandler(10, LineN, Line);
                    }
                }
            }
            else
            {
                try
                {
                    table.Add(varName, Console.ReadLine());
                    AllVars.Add(varName, table);
                }
                catch
                {
                    p.ExceptionHandler(10, LineN, Line);
                }
            }
        }
예제 #9
0
        /// <summary>
        /// Converts an independent variable to a dependent variable.
        /// </summary>
        /// <param name="name">Variable to convert</param>
        public void MakeDependent(string name)
        {
            // Get the value of the variable
            bool value = IndVars[name].Value;

            // Remove variable from independent variables dictionary
            IndVars.Remove(name);
            // Remove variable from variables dictionary
            AllVars.Remove(name);
            // Add new dependent variable to the dictionaries
            AddVariable(new DependentVariable(name, value));
        }
예제 #10
0
        public void PogU(string varName, string type, string value)
        {
            bool contains = false;
            Dictionary <string, string> table = new Dictionary <string, string>();

            if (Variables.ContainsKey(varName) || VariablesInt.ContainsKey(varName) || VariablesFloat.ContainsKey(varName))
            {
                contains = true;
            }
            switch (type)
            {
            case "string":
                table = Variables;
                break;

            case "int":
                table = VariablesInt;
                break;

            case "float":
                table = VariablesFloat;
                break;

            case "default":
                p.ExceptionHandler(11, LineN, Line);
                break;
            }
            if (contains)
            {
                if (!table.ContainsKey(varName))
                {
                    p.ExceptionHandler(6, LineN, Line);
                }
                else
                {
                    table[varName] = value;
                }
            }
            else
            {
                table.Add(varName, value);
                AllVars.Add(varName, table);
            }
        }
예제 #11
0
 public static void Reset()
 {
     AllVars.Clear();
     AllInequalities.Clear();
 }
예제 #12
0
        public override IEnumerable <ProofState> EvalInit(Statement statement, ProofState state)
        {
            Contract.Assume(statement != null);
            Contract.Assume(statement is TacticForallStmt);

            _stmt = statement as TacticForallStmt;

            Contract.Assert(_stmt != null);

            // do basic simplification
            // maybe do a check and throw an error instead?
            // fixme: error returns null!
            //var e = (ForallExpr) SimpTacticExpr.SimpTacExpr(state0, _stmt.Spec);
            var e = (ForallExpr)SimpExpr.SimpTacticExpr(state, _stmt.Spec);

            // var e = _stmt.Spec as ForallExpr;
            // to rename expressions
            RenameVar rn = new RenameVar();
            // to rename in the body of statement
            RenameVar     rnBody   = new RenameVar();
            List <String> usedVars = state.GetAllDafnyVars().Keys.ToList();

            usedVars.AddRange(state.GetAllTVars().Keys.ToList());

            //List<String> tmp = new List<string>();
            AllVars.DeclaredVars(_stmt.Body.Body[0], ref usedVars);



            if (_stmt.Attributes != null && _stmt.Attributes.Name.Equals("vars"))
            {
                var attrs = _stmt.Attributes.Args;
                for (int i = 0; i < attrs.Count; i++)
                {
                    // todo: should really report an errors if first condition does not hold
                    var segment = attrs[i] as NameSegment;
                    if (segment != null && i < e.BoundVars.Count)
                    {
                        NameSegment ns = segment;
                        String      fv;
                        if (GenFreeVar(ns.Name, usedVars, out fv))
                        {
                            rnBody.AddRename(ns.Name, fv);
                        }
                        rn.AddRename(e.BoundVars[i].Name, fv);
                    } // else we should have an error
                    _vars = new List <BoundVar>();
                    foreach (BoundVar bv in e.BoundVars)
                    {
                        _vars.Add(rn.CloneBoundVar(bv));
                    }
                }
            }
            else
            {
                _vars = e.BoundVars;
            }

            foreach (var tmp in _vars)
            {
                state.AddDafnyVar(tmp.Name, new ProofState.VariableData {
                    Variable = tmp, Type = tmp.Type
                });
            }


            // we could even break  _ens into a set of all conjunctions?
            // what about forall x (forall y) x
            var expr = e.Term as BinaryExpr;

            if (expr != null && (expr.Op.Equals(BinaryExpr.Opcode.Imp)))
            {
                var be = expr;
                _range = rn.CloneExpr(be.E0);
                var t = new MaybeFreeExpression(rn.CloneExpr(be.E1));
                var l = new List <MaybeFreeExpression> {
                    t
                };
                _ens = l;
            }
            else
            {
                _range = new LiteralExpr(_stmt.Tok, true);
                var t = new MaybeFreeExpression(rn.CloneExpr(e.Term));
                var l = new List <MaybeFreeExpression> {
                    t
                };
                _ens = l;
            }

            // Note that we do not need to rename variables in the body (unless the variables in vars is changed)
            InitBasicFrameCtrl(new List <Statement>(), state.IsCurFramePartial(), null, VerifyN);

            state.AddNewFrame(this);

            var bodyFrame = new DefaultTacticFrameCtrl();

            var newBody = rnBody.CloneBlockStmt(_stmt.Body);

            bodyFrame.InitBasicFrameCtrl(newBody.Body, state.IsCurFramePartial(), null, VerifyN);
            bodyFrame.IsPartial = IsPartial;
            state.AddNewFrame(bodyFrame);

            yield return(state);
        }