Example #1
0
        private BranchingRule <TERM> CreateFinalComposedRule(TERM pathCond, int qAB, Sequence <TERM> outputFromB, BranchingRule <TERM> ruleB, TERM regB)
        {
            if (ruleB is SwitchRule <TERM> )
            {
                throw new NotImplementedException(ruleB.ToString());
            }

            var br = ruleB as BaseRule <TERM>;

            if (br != null)
            {
                var yields = br.Yields.ConvertAll(z => Simpl(Subst(z, B.RegVar, regB)));
                var outp   = outputFromB.Append(yields);
                var res    = new BaseRule <TERM>(outp, regVar, qAB);
                return(res);
            }
            else
            {
                var ite = ruleB as IteRule <TERM>;
                if (ite != null)
                {
                    var condLifted          = Subst(ite.Condition, B.RegVar, regB);
                    var path_and_condLifted = solver.MkAnd(pathCond, condLifted);
                    if (!solver.IsSatisfiable(path_and_condLifted))
                    {
                        //path ==> !condLifted, the true-branch is unreachable
                        var res = CreateFinalComposedRule(pathCond, qAB, outputFromB, ite.FalseCase, regB);
                        return(res);
                    }
                    else
                    {
                        var path_and_not_condLifted = solver.MkAnd(pathCond, solver.MkNot(condLifted));
                        if (!solver.IsSatisfiable(path_and_not_condLifted))
                        {
                            //path ==> condLifted, the false-branch is unreachable
                            var res = CreateFinalComposedRule(pathCond, qAB, outputFromB, ite.TrueCase, regB);
                            return(res);
                        }
                        else
                        {
                            var f = CreateFinalComposedRule(path_and_not_condLifted, qAB, outputFromB, ite.FalseCase, regB);
                            var t = CreateFinalComposedRule(path_and_condLifted, qAB, outputFromB, ite.TrueCase, regB);
                            if (t is UndefRule <TERM> && f is UndefRule <TERM> )
                            {
                                return(UndefRule <TERM> .Default);
                            }

                            return(new IteRule <TERM>(condLifted, t, f));
                        }
                    }
                }
                else
                {
                    return(UndefRule <TERM> .Default);
                }
            }
        }
Example #2
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);
                }
            }
        }