public bool IsSubsetOf(Transition t) { if(!PreStateIndexes.Any(s => !t.PreStateIndexes.Contains(s))) { if (!NewStateIndexes.Any(s => !t.NewStateIndexes.Contains(s))) { return true; } } return false; }
private TransitionSet BuildTransitionSet(IEnumerable<IGate> terms, IEnumerable<IVariableCondition> rvclist) { var tset = new TransitionSet(); var result = Gate.Constant(false); var staticvariables = new HashSet<int>(); foreach (var term in terms) { // populate a dictionary per variable factor var dict = new Dictionary<int, ConditionPair>(); // right sides first foreach (var right in rvclist) { dict.Add(right.Variable.Index, new ConditionPair { Right = right }); } foreach (var left in term.GetVariableConditions()) { ConditionPair cp; if(dict.TryGetValue(left.Variable.Index, out cp)) { // right side exists cp.Left = left; } else { dict.Add(left.Variable.Index, new ConditionPair { Left = left }); } } // evaluate new term var newterm = Gate.Constant(true); foreach(var p in dict.Values) { if(null == p.Left) { // right side factor not present on left side, move static condition newterm = Gate.ComposeAND(newterm, p.Right.Decompose()); } else if(null == p.Right) { // static condition newterm = Gate.ComposeAND(newterm, p.Left.Decompose()); } else if(p.Left.StateIndex == p.Right.StateIndex) { // no state change: static condition //newterm = Gate.ComposeAND(newterm, p.Left.Decompose()); throw new CompilerException(ErrorCode.BadCondition, "variable consition " + p.Left + " used on both sides of a transition."); } else { newterm = Gate.ComposeAND(newterm, p.Left.Decompose()); // add transition var x = new Transition(p.Left) { PreStateIndexes = new[] { p.Left.StateIndex }, NewStateIndexes = new[] { p.Right.StateIndex } }; tset.Add(x); } } result = Gate.ComposeOR(result, newterm); } _lgate = result; return tset; }