Exemplo n.º 1
0
        STbRule <T> MkSTbRule(IEnumerable <Move <Pair <BDD, T> > > moves, Func <int, int> getState, Func <int, Sequence <T> > getYield, Func <int, T, T> getUpdate)
        {
            List <Tuple <T, BaseRule <T> > > cases = new List <Tuple <T, BaseRule <T> > >();
            var allGuards = solver.CharSetProvider.False;

            foreach (var m in moves)
            {
                cases.Add(new Tuple <T, BaseRule <T> >(ConvertToPredicate(m.Label.First),
                                                       new BaseRule <T>(getYield(m.TargetState), getUpdate(m.TargetState, m.Label.Second), getState(m.TargetState))));
                allGuards = solver.CharSetProvider.MkOr(allGuards, m.Label.First);
            }
            STbRule <T> r = UndefRule <T> .Default;

            if (cases.Count > 0)
            {
                if (allGuards.IsFull)
                {
                    r = cases[0].Item2;
                }
                else
                {
                    r = new IteRule <T>(cases[0].Item1, cases[0].Item2, UndefRule <T> .Default);
                }
                for (int i = 1; i < cases.Count; i++)
                {
                    r = new IteRule <T>(cases[i].Item1, cases[i].Item2, r);
                }
            }
            return(r);
        }
Exemplo n.º 2
0
        internal BranchingRule <TERM> ToIte(Func <TERM, TERM, TERM> mkEq)
        {
            var res = defaultcase;

            for (int i = cases.Length - 1; i >= 0; i--)
            {
                res = new IteRule <TERM>(mkEq(input, cases[i].Key), cases[i].Value, res);
            }
            return(res);
        }
Exemplo n.º 3
0
        internal BranchingRule <TERM> ToIteForVisualization()
        {
            var res = defaultcase;

            for (int i = cases.Length - 1; i >= 0; i--)
            {
                res = new IteRule <TERM>(cases[i].Key, cases[i].Value, res);
            }
            return(res);
        }
Exemplo n.º 4
0
        internal STbRule <TERM> ToIteForVisualization()
        {
            var res = defaultcase;

            for (int i = 0; i < cases.Length; i++)
            {
                res = new IteRule <TERM>(cases[i].Key, cases[i].Value, res);
            }
            return(res);
        }
Exemplo n.º 5
0
        internal override BranchingRule <TERM> Concretize1(TERM path, IContextCore <TERM> solver,
                                                           Func <TERM, TERM> fBP, Func <TERM, TERM> fNBP,
                                                           Func <int, TERM, int> stateMap, TERM newReg, TERM inputVar)
        {
            ConsList <TERM> abstr_vals = null; //all possible values for a_tmp
            var             regAbstr   = fBP(register);

            #region collect all possible distinct solutions into abstr_vals
            solver.MainSolver.Push();
            var a = solver.MkFreshConst("a", regAbstr);
            var c = solver.MkFreshConst("c", inputVar);
            var r = solver.MkFreshConst("r", newReg);

            var assertion = solver.ApplySubstitution(solver.MkAnd(path, solver.MkEq(a, regAbstr)), newReg, r, inputVar, c);
            //string tmp = ((IPrettyPrinter<TERM>)solver).PrettyPrint(assertion);
            solver.MainSolver.Assert(assertion);
            var model = solver.MainSolver.GetModel(solver.True, a);
            while (model != null)
            {
                var aVal = model[a].Value;
                abstr_vals = new ConsList <TERM>(aVal, abstr_vals);
                solver.MainSolver.Assert(solver.MkNeq(a, aVal));
                model = solver.MainSolver.GetModel(solver.True, a);
            }
            solver.MainSolver.Pop();
            #endregion

            if (abstr_vals == null) //list cannot be empty because the path is feasible
            {
                throw new AutomataException(AutomataExceptionKind.InternalError);
            }

            //now create corresponding concrete outputs for the cases
            //note that, in case of a boolean abstraction, we need to add additional cases
            //according to the output values that were obtained

            var newRegister           = fNBP(register);
            var newState              = stateMap(state, abstr_vals.First);
            BranchingRule <TERM> rule = new BaseRule <TERM>(yields, newRegister, newState);

            abstr_vals = abstr_vals.Rest;
            while (abstr_vals != null)
            {
                newRegister = fNBP(register);
                newState    = stateMap(state, abstr_vals.First);
                var  brule = new BaseRule <TERM>(yields, newRegister, newState);
                TERM cond  = solver.Simplify(solver.MkEq(abstr_vals.First, regAbstr));
                rule       = new IteRule <TERM>(cond, brule, rule);
                abstr_vals = abstr_vals.Rest;
            }

            return(rule);
        }
Exemplo n.º 6
0
        BranchingRule <TERM> Comp(TERM pathCond, BranchingRule <TERM> ruleA, int qB, Func <int, int, int> stateComposer, bool isFinal)
        {
            if (ruleA is SwitchRule <TERM> )
            {
                throw new NotImplementedException(ruleA.ToString());
            }

            var ite = ruleA as IteRule <TERM>;

            if (ite != null)
            {
                var iteCondLifted = solver.ApplySubstitution(ite.Condition, A.RegVar, regVar_1);
                var pathCond_T    = (pathCond.Equals(solver.True) ? iteCondLifted : solver.MkAnd(pathCond, iteCondLifted));
                var pathCond_F    = (pathCond.Equals(solver.True) ? solver.MkNot(iteCondLifted) : solver.MkAnd(pathCond, solver.MkNot(iteCondLifted)));
                var res_T         = Comp(pathCond_T, ite.TrueCase, qB, stateComposer, isFinal);
                var res_F         = Comp(pathCond_F, ite.FalseCase, qB, stateComposer, isFinal);
                if (res_T is UndefRule <TERM> && res_F is UndefRule <TERM> )
                {
                    return(UndefRule <TERM> .Default);
                }
                var res = new IteRule <TERM>(iteCondLifted, res_T, res_F);
                return(res);
            }
            else
            {
                var br = ruleA as BaseRule <TERM>;
                if (br != null)
                {
                    var yieldsFromALifted = br.Yields.ConvertAll(t => solver.ApplySubstitution(t, A.RegVar, regVar_1));
                    var inputsToB         = ConsList <TERM> .Create(yieldsFromALifted);

                    var regALifted = solver.ApplySubstitution(br.Register, A.RegVar, regVar_1);
                    var res        = this.EvalB(inputsToB, br.State, regALifted, pathCond, qB, regVar_2, stateComposer, Sequence <TERM> .Empty, isFinal);
                    return(res);
                }
                else
                {
                    return(UndefRule <TERM> .Default);
                }
            }
        }