public void VisitAnd()
        {
            var variable1 = new FuzzyVariable("MyFuzzyVariable1", new NumericVariable("MyNumVariable1"));
            var variable2 = new FuzzyVariable("MyFuzzyVariable2", new NumericVariable("MyNumVariable2"));
            var valueExpr1 =
                new ValueExpression(
                    variable1,
                    new FuzzyTerm("MyTerm1", new MembershipFunction()));
            var valueExpr2 =
                new ValueExpression(
                    variable2,
                    new FuzzyTerm("MyTerm2", new MembershipFunction()));

            var andExpr = new AndExpression(valueExpr1, valueExpr2);

            var sut = new GetInvolvedVariables();

            var result = sut.Visit(andExpr);
            Assert.AreEqual(2, result.Count);
            Assert.IsTrue(result.Contains(variable1));
            Assert.IsTrue(result.Contains(variable2));

            result = andExpr.Accept(sut);
            Assert.AreEqual(2, result.Count);
            Assert.IsTrue(result.Contains(variable1));
            Assert.IsTrue(result.Contains(variable2));
        }
        public void VisitValue()
        {
            var variable = new FuzzyVariable("MyFuzzyVariable", new NumericVariable("MyNumVariable"));
            var valueExpr =
                new ValueExpression(
                    variable,
                    new FuzzyTerm("MyTerm", new MembershipFunction()));

            var sut = new GetInvolvedVariables();

            var result = sut.Visit(valueExpr);
            Assert.AreEqual(1, result.Count);
            Assert.AreEqual(variable, result[0]);

            result = valueExpr.Accept(sut);
            Assert.AreEqual(1, result.Count);
            Assert.AreEqual(variable, result[0]);
        }
        public void ComplexExpression()
        {
            var A = new FuzzyVariable("A", new NumericVariable("a"));
            var B = new FuzzyVariable("B", new NumericVariable("b"));
            var C = new FuzzyVariable("C", new NumericVariable("c"));

            var x = new FuzzyTerm("x", new MembershipFunction());
            var y = new FuzzyTerm("y", new MembershipFunction());
            var z = new FuzzyTerm("z", new MembershipFunction());


            var ruleExpr = new FuzzyImplication(
                new OrExpression(
                    new NotExpression(
                        new AndExpression(
                            new ValueExpression(A, x),
                            new ValueExpression(B, y)
                        )
                    ),
                    new AndExpression(
                        new ValueExpression(A, y),
                        new ValueExpression(B, x)
                    )
                ),
                new ValueExpression(C, z)
            );

            var sut = new GetInvolvedVariables();

            var result = sut.Visit(ruleExpr);
            Assert.AreEqual(3, result.Count);
            Assert.IsTrue(result.Contains(A));
            Assert.IsTrue(result.Contains(B));
            Assert.IsTrue(result.Contains(C));

            result = ruleExpr.Accept(sut);
            Assert.AreEqual(3, result.Count);
            Assert.IsTrue(result.Contains(A));
            Assert.IsTrue(result.Contains(B));
            Assert.IsTrue(result.Contains(C));
        }