Пример #1
0
        public void nonMatchingAntecedentsAddsNoConsequents()
        {
            TripleStore store = new MemoryTripleStore();

            SimpleRuleProcessor ruleProcessor = new SimpleRuleProcessor();

            Rule rule = new Rule();

            rule.AddAntecedent(new Pattern(new UriRef("http://example.com/subj"), new UriRef("http://example.com/pred"), new UriRef("http://example.com/obj")));
            rule.AddConsequent(new Pattern(new UriRef("http://example.com/subj"), new UriRef("http://example.com/pred"), new UriRef("http://example.com/other")));

            ruleProcessor.Process(rule, store);
            Assert.IsTrue(store.IsEmpty(), "Store is still empty");
        }
Пример #2
0
        private static RuleInferenceEngine GetInferenceEngine()
        {
            var rie = new RuleInferenceEngine();

            //Put rules here
            var positiveRule = new Rule("Positief");

            positiveRule.AddAntecedent(new GEClause("gewogen_gemiddelde", "16"));
            positiveRule.AddAntecedent(new GEClause("competenties", "6"));
            positiveRule.AddAntecedent(new GEClause("capaciteiten", "6"));
            positiveRule.AddAntecedent(new GEClause("intr. Motivatie", "7"));
            positiveRule.AddAntecedent(new GEClause("extr. Motivatie", "7"));
            positiveRule.AddAntecedent(new IsClause("is_mbo_deficient", "Nee"));
            positiveRule.AddAntecedent(new IsClause("Persoonlijk 'bijspijker'-advies", "0"));
            positiveRule.AddAntecedent(new IsClause("reden_stoppen", ""));
            positiveRule.setConsequent(new IsClause("advies", "Positief"));
            rie.AddRule(positiveRule);

            var doubtRule = new Rule("Twijfel");

            doubtRule.AddAntecedent(new GEClause("gewogen_gemiddelde", "12"));
            doubtRule.AddAntecedent(new LEClause("gewogen_gemiddelde", "15"));
            doubtRule.AddAntecedent(new IsClause("competenties", "5"));
            doubtRule.AddAntecedent(new IsClause("capaciteiten", "5"));
            doubtRule.AddAntecedent(new IsClause("intr. Motivatie", "5"));
            doubtRule.AddAntecedent(new IsClause("extr. Motivatie", "5"));
            doubtRule.AddAntecedent(new IsClause("Persoonlijk 'bijspijker'-advies", "1"));
            doubtRule.AddAntecedent(new IsClause("reden_stoppen", "Uitgeschreven voor opleiding."));
            doubtRule.setConsequent(new IsClause("advies", "Twijfel"));
            rie.AddRule(doubtRule);

            var negativeRule = new Rule("Negatief");

            negativeRule.AddAntecedent(new LEClause("gewogen_gemiddelde", "11"));
            negativeRule.AddAntecedent(new LEClause("competenties", "4"));
            negativeRule.AddAntecedent(new LEClause("capaciteiten", "4"));
            negativeRule.AddAntecedent(new LEClause("intr. Motivatie", "4"));
            negativeRule.AddAntecedent(new LEClause("extr. Motivatie", "4"));
            negativeRule.AddAntecedent(new IsClause("Persoonlijk 'bijspijker'-advies", "0"));
            negativeRule.AddAntecedent(new IsClause("reden_stoppen", "Uitgeschreven voor opleiding."));
            negativeRule.setConsequent(new IsClause("advies", "Negatief"));
            rie.AddRule(negativeRule);

            return(rie);
        }
Пример #3
0
        public void matchingAntecedentsAddsConsequents()
        {
            TripleStore store = new MemoryTripleStore();

            SimpleRuleProcessor ruleProcessor = new SimpleRuleProcessor();

            store.Add(new Statement(new UriRef("http://example.com/subj"), new UriRef("http://example.com/pred"), new UriRef("http://example.com/obj")));

            Rule rule = new Rule();

            rule.AddAntecedent(new Pattern(new UriRef("http://example.com/subj"), new UriRef("http://example.com/pred"), new UriRef("http://example.com/obj")));
            rule.AddConsequent(new Pattern(new UriRef("http://example.com/subj"), new UriRef("http://example.com/pred"), new UriRef("http://example.com/other")));

            ruleProcessor.Process(rule, store);

            Assert.IsFalse(store.IsEmpty(), "Store is non-empty");

            Assert.IsTrue(store.Contains(new Statement(new UriRef("http://example.com/subj"), new UriRef("http://example.com/pred"), new UriRef("http://example.com/other"))), "Destination contains consequent");
        }
Пример #4
0
        public void consequentsAreAddedUsingAntecedentSolutionBindings()
        {
            TripleStore store = new MemoryTripleStore();

            SimpleRuleProcessor ruleProcessor = new SimpleRuleProcessor();

            store.Add(new Statement(new UriRef("http://example.com/subj"), new UriRef("http://example.com/pred"), new UriRef("http://example.com/obj")));

            Rule rule = new Rule();

            rule.AddAntecedent(new Pattern(new Variable("var1"), new UriRef("http://example.com/pred"), new Variable("var2")));
            rule.AddConsequent(new Pattern(new Variable("var1"), new UriRef("http://example.com/newPred"), new Variable("var2")));

            ruleProcessor.Process(rule, store);

            Assert.IsFalse(store.IsEmpty(), "Destination is non-empty");

            Assert.IsTrue(store.Contains(new Statement(new UriRef("http://example.com/subj"), new UriRef("http://example.com/newPred"), new UriRef("http://example.com/obj"))), "Destination contains consequent");
        }
Пример #5
0
        public void allAntecedentMatchesAreProcessed()
        {
            TripleStore store = new MemoryTripleStore();

            SimpleRuleProcessor ruleProcessor = new SimpleRuleProcessor();

            store.Add(new Statement(new UriRef("http://example.com/subj1"), new UriRef("http://example.com/pred"), new UriRef("http://example.com/obj1")));
            store.Add(new Statement(new UriRef("http://example.com/subj2"), new UriRef("http://example.com/pred"), new UriRef("http://example.com/obj2")));

            Rule rule = new Rule();

            rule.AddAntecedent(new Pattern(new Variable("var1"), new UriRef("http://example.com/pred"), new Variable("var2")));
            rule.AddConsequent(new Pattern(new Variable("var1"), new UriRef("http://example.com/newPred"), new Variable("var2")));

            ruleProcessor.Process(rule, store);

            Assert.IsFalse(store.IsEmpty(), "Destination is non-empty");

            Assert.IsTrue(store.Contains(new Statement(new UriRef("http://example.com/subj1"), new UriRef("http://example.com/newPred"), new UriRef("http://example.com/obj1"))), "Destination contains first match onsequent");
            Assert.IsTrue(store.Contains(new Statement(new UriRef("http://example.com/subj2"), new UriRef("http://example.com/newPred"), new UriRef("http://example.com/obj2"))), "Destination contains second match consequent");
        }
Пример #6
0
        static private RuleInferenceEngine getInferenceEngine()
        {
            RuleInferenceEngine rie = new RuleInferenceEngine();

            Rule rule = new Rule(Bicycle);

            rule.AddAntecedent(new ClauseIs("vehicleType", "cycle"));
            rule.AddAntecedent(new ClauseIs("num_wheels", "2"));
            rule.AddAntecedent(new ClauseIs("motor", "no"));
            rule.Consequent = new ClauseIs("vehicle", Bicycle);
            rie.AddRule(rule);

            rule = new Rule(Tricycle);
            rule.AddAntecedent(new ClauseIs("vehicleType", "cycle"));
            rule.AddAntecedent(new ClauseIs("num_wheels", "3"));
            rule.AddAntecedent(new ClauseIs("motor", "no"));
            rule.Consequent = new ClauseIs("vehicle", Tricycle);
            rie.AddRule(rule);

            rule = new Rule(Motorcycle);
            rule.AddAntecedent(new ClauseIs("vehicleType", "cycle"));
            rule.AddAntecedent(new ClauseIs("num_wheels", "2"));
            rule.AddAntecedent(new ClauseIs("motor", "yes"));
            rule.Consequent = new ClauseIs("vehicle", Motorcycle);
            rie.AddRule(rule);

            rule = new Rule(SportsCar);
            rule.AddAntecedent(new ClauseIs("vehicleType", "automobile"));
            rule.AddAntecedent(new ClauseIs("size", "medium"));
            rule.AddAntecedent(new ClauseIs("num_doors", "2"));
            rule.Consequent = new ClauseIs("vehicle", SportsCar);
            rie.AddRule(rule);

            rule = new Rule(Sedan);
            rule.AddAntecedent(new ClauseIs("vehicleType", "automobile"));
            rule.AddAntecedent(new ClauseIs("size", "medium"));
            rule.AddAntecedent(new ClauseIs("num_doors", "4"));
            rule.Consequent = new ClauseIs("vehicle", Sedan);
            rie.AddRule(rule);

            rule = new Rule(MiniVan);
            rule.AddAntecedent(new ClauseIs("vehicleType", "automobile"));
            rule.AddAntecedent(new ClauseIs("size", "medium"));
            rule.AddAntecedent(new ClauseIs("num_doors", "3"));
            rule.Consequent = new ClauseIs("vehicle", MiniVan);
            rie.AddRule(rule);

            rule = new Rule(SUV);
            rule.AddAntecedent(new ClauseIs("vehicleType", "automobile"));
            rule.AddAntecedent(new ClauseIs("size", "large"));
            rule.AddAntecedent(new ClauseIs("num_doors", "4"));
            rule.Consequent = new ClauseIs("vehicle", SUV);
            rie.AddRule(rule);

            rule = new Rule(Cycle);
            rule.AddAntecedent(new ClauseLt("num_wheels", "4"));
            rule.Consequent = new ClauseIs("vehicleType", "cycle");
            rie.AddRule(rule);

            rule = new Rule(Automobile);
            rule.AddAntecedent(new ClauseIs("num_wheels", "4"));
            rule.AddAntecedent(new ClauseIs("motor", "yes"));
            rule.Consequent = new ClauseIs("vehicleType", "automobile");
            rie.AddRule(rule);

            return(rie);
        }
Пример #7
0
        private RuleInferenceEngine getInferenceEngine()
        {
            RuleInferenceEngine rie = new RuleInferenceEngine();

            Rule rule = new Rule("Bicycle");

            rule.AddAntecedent(new IsClause("vehicleType", "cycle"));
            rule.AddAntecedent(new IsClause("num_wheels", "2"));
            rule.AddAntecedent(new IsClause("motor", "no"));
            rule.setConsequent(new IsClause("vehicle", "Bicycle"));
            rie.AddRule(rule);

            rule = new Rule("Tricycle");
            rule.AddAntecedent(new IsClause("vehicleType", "cycle"));
            rule.AddAntecedent(new IsClause("num_wheels", "3"));
            rule.AddAntecedent(new IsClause("motor", "no"));
            rule.setConsequent(new IsClause("vehicle", "Tricycle"));
            rie.AddRule(rule);

            rule = new Rule("Motorcycle");
            rule.AddAntecedent(new IsClause("vehicleType", "cycle"));
            rule.AddAntecedent(new IsClause("num_wheels", "2"));
            rule.AddAntecedent(new IsClause("motor", "yes"));
            rule.setConsequent(new IsClause("vehicle", "Motorcycle"));
            rie.AddRule(rule);

            rule = new Rule("SportsCar");
            rule.AddAntecedent(new IsClause("vehicleType", "automobile"));
            rule.AddAntecedent(new IsClause("size", "medium"));
            rule.AddAntecedent(new IsClause("num_doors", "2"));
            rule.setConsequent(new IsClause("vehicle", "Sports_Car"));
            rie.AddRule(rule);

            rule = new Rule("Sedan");
            rule.AddAntecedent(new IsClause("vehicleType", "automobile"));
            rule.AddAntecedent(new IsClause("size", "medium"));
            rule.AddAntecedent(new IsClause("num_doors", "4"));
            rule.setConsequent(new IsClause("vehicle", "Sedan"));
            rie.AddRule(rule);

            rule = new Rule("MiniVan");
            rule.AddAntecedent(new IsClause("vehicleType", "automobile"));
            rule.AddAntecedent(new IsClause("size", "medium"));
            rule.AddAntecedent(new IsClause("num_doors", "3"));
            rule.setConsequent(new IsClause("vehicle", "MiniVan"));
            rie.AddRule(rule);

            rule = new Rule("SUV");
            rule.AddAntecedent(new IsClause("vehicleType", "automobile"));
            rule.AddAntecedent(new IsClause("size", "large"));
            rule.AddAntecedent(new IsClause("num_doors", "4"));
            rule.setConsequent(new IsClause("vehicle", "SUV"));
            rie.AddRule(rule);

            rule = new Rule("Cycle");
            rule.AddAntecedent(new LessClause("num_wheels", "4"));
            rule.setConsequent(new IsClause("vehicleType", "cycle"));
            rie.AddRule(rule);

            rule = new Rule("Automobile");
            rule.AddAntecedent(new IsClause("num_wheels", "4"));
            rule.AddAntecedent(new IsClause("motor", "yes"));
            rule.setConsequent(new IsClause("vehicleType", "automobile"));
            rie.AddRule(rule);

            return(rie);
        }
Пример #8
0
        /// <summary>Applies inference rules to assertions in the KnowledgeBase.</summary>
        public virtual void Think()
        {
            // Implementation of this method has not been optimised for efficiency. Focus is on correctness for now

            itsInferences = (TripleStore)itsAssertions.Clone();
            itsInferences.Add(itsSchemas);


            Rule axioms = MakeAxioms();

            itsInferences.Evaluate(axioms);

            int previousStatementCount = 0;

            ArrayList rules = new ArrayList();

            Rule rdf1 = new Rule();

            rdf1.AddAntecedent(new Pattern(new Variable("uuu"), new Variable("aaa"), new Variable("yyy")));
            rdf1.AddConsequent(new Pattern(new Variable("aaa"), Schema.rdf.type, Schema.rdf.Property));
            rules.Add(rdf1);

            Rule rdfs2 = new Rule();

            rdfs2.AddAntecedent(new Pattern(new Variable("aaa"), Schema.rdfs.domain, new Variable("xxx")));
            rdfs2.AddAntecedent(new Pattern(new Variable("uuu"), new Variable("aaa"), new Variable("yyy")));
            rdfs2.AddConsequent(new Pattern(new Variable("uuu"), Schema.rdf.type, new Variable("xxx")));
            rules.Add(rdfs2);

            Rule rdfs3 = new Rule();

            rdfs3.AddAntecedent(new Pattern(new Variable("aaa"), Schema.rdfs.range, new Variable("xxx")));
            rdfs3.AddAntecedent(new Pattern(new Variable("uuu"), new Variable("aaa"), new Variable("vvv")));
            rdfs3.AddConsequent(new Pattern(new Variable("vvv"), Schema.rdf.type, new Variable("xxx")));
            rules.Add(rdfs3);


            Rule rdfs4 = new Rule();

            rdfs4.AddAntecedent(new Pattern(new Variable("uuu"), new Variable("aaa"), new Variable("xxx")));
            rdfs4.AddConsequent(new Pattern(new Variable("uuu"), Schema.rdf.type, Schema.rdfs.Resource));
            rdfs4.AddConsequent(new Pattern(new Variable("xxx"), Schema.rdf.type, Schema.rdfs.Resource));
            rules.Add(rdfs4);

            Rule rdfs5 = new Rule();

            rdfs5.AddAntecedent(new Pattern(new Variable("uuu"), Schema.rdf.type, Schema.rdf.Property));
            rdfs5.AddConsequent(new Pattern(new Variable("uuu"), Schema.rdfs.subPropertyOf, new Variable("uuu")));
            rules.Add(rdfs5);


            Rule rdfs6 = new Rule();

            rdfs6.AddAntecedent(new Pattern(new Variable("uuu"), Schema.rdfs.subPropertyOf, new Variable("vvv")));
            rdfs6.AddAntecedent(new Pattern(new Variable("vvv"), Schema.rdfs.subPropertyOf, new Variable("xxx")));
            rdfs6.AddConsequent(new Pattern(new Variable("uuu"), Schema.rdfs.subPropertyOf, new Variable("xxx")));
            rules.Add(rdfs6);

            Rule rdfs7 = new Rule();

            rdfs7.AddAntecedent(new Pattern(new Variable("aaa"), Schema.rdfs.subPropertyOf, new Variable("bbb")));
            rdfs7.AddAntecedent(new Pattern(new Variable("uuu"), new Variable("aaa"), new Variable("yyy")));
            rdfs7.AddConsequent(new Pattern(new Variable("uuu"), new Variable("bbb"), new Variable("yyy")));
            rules.Add(rdfs7);

            Rule rdfs8and10 = new Rule();

            rdfs8and10.AddAntecedent(new Pattern(new Variable("uuu"), Schema.rdf.type, Schema.rdfs.Class));
            rdfs8and10.AddConsequent(new Pattern(new Variable("uuu"), Schema.rdfs.subClassOf, Schema.rdfs.Resource));
            rdfs8and10.AddConsequent(new Pattern(new Variable("uuu"), Schema.rdfs.subClassOf, new Variable("uuu")));
            rules.Add(rdfs8and10);


            Rule rdfs9 = new Rule();

            rdfs9.AddAntecedent(new Pattern(new Variable("uuu"), Schema.rdfs.subClassOf, new Variable("xxx")));
            rdfs9.AddAntecedent(new Pattern(new Variable("vvv"), Schema.rdf.type, new Variable("uuu")));
            rdfs9.AddConsequent(new Pattern(new Variable("vvv"), Schema.rdf.type, new Variable("xxx")));
            rules.Add(rdfs9);

            Rule rdfs11 = new Rule();

            rdfs11.AddAntecedent(new Pattern(new Variable("uuu"), Schema.rdfs.subClassOf, new Variable("vvv")));
            rdfs11.AddAntecedent(new Pattern(new Variable("vvv"), Schema.rdfs.subClassOf, new Variable("xxx")));
            rdfs11.AddConsequent(new Pattern(new Variable("uuu"), Schema.rdfs.subClassOf, new Variable("xxx")));
            rules.Add(rdfs11);

            Rule rdfs12 = new Rule();

            rdfs12.AddAntecedent(new Pattern(new Variable("uuu"), Schema.rdf.type, Schema.rdfs.ContainerMembershipProperty));
            rdfs12.AddConsequent(new Pattern(new Variable("uuu"), Schema.rdfs.subPropertyOf, Schema.rdfs.member));
            rules.Add(rdfs12);

            Rule rdfs13 = new Rule();

            rdfs13.AddAntecedent(new Pattern(new Variable("uuu"), Schema.rdf.type, Schema.rdfs.Datatype));
            rdfs13.AddConsequent(new Pattern(new Variable("uuu"), Schema.rdfs.subClassOf, Schema.rdfs.Literal));
            rules.Add(rdfs13);

/*
 * Can also add following OWL entailment rules
 * (after Herman J. ter Horst, Extending the RDFS Entailment Lemma, Proceedings of 3rd International Semantic Web Conference)
 *
 * rdfp1: (?p rdf:type owl:FunctionalProperty) (?u ?p ?v) (?u ?p ?w) where v is URI or BlankNode then add (?v owl:sameAs ?w)
 * rdfp2: (?p rdf:type owl:InverseFunctionalProperty) (?u ?p ?w) (?v ?p ?w) then add (?u owl:sameAs ?v)
 * rdfp3: (?p rdf:type owl:SymmetricProperty) (?v ?p ?w) where w is URI or BlankNode then add (?w ?p ?v)
 * rdfp4: (?p rdf:type owl:TransitiveProperty) (?u ?p ?v) (?v ?p ?w) then add (?u ?p ?w)
 * rdfp5a: (?v ?p ?w) then add (?v owl:sameAs ?v)
 * rdfp5b: (?v ?p ?w) where w is URI or BlankNode then add (?w owl:sameAs ?w)
 * rdfp6: (?v owl:sameAs ?w) where w is URI or BlankNode then add (?w owl:sameAs ?v)
 * rdfp7: (?u owl:sameAs ?v) (?v owl:sameAs ?w) then add (?u owl:sameAs ?w)
 * rdfp8a: (?p owl:inverseOf ?q) (?v ?p ?w) where w is URI or BlankNode and q is URI then add (?w ?q ?v)
 * rdfp8b: (?p owl:inverseOf ?q) (?v ?q ?w) where w is URI or BlankNode and q is URI then add (?w ?p ?v)
 * rdfp9: (?v rdf:type rdfs:Class) (?v owl:sameAs ?w) then add (?v rdfs:subClassOf ?w)
 * rdfp10: (?p rdf:type rdf:Property) (?p owl:sameAs ?q) then add (?p rdfs:subPropertyOf ?q)
 *
 *
 */
            while (previousStatementCount != itsInferences.StatementCount)
            {
                previousStatementCount = itsInferences.StatementCount;
                foreach (Rule rule in rules)
                {
                    itsInferences.Evaluate(rule);
                }
            }
        }
Пример #9
0
        private void btnFuzzy_Click(object sender, EventArgs e)
        {
            RuleInferenceEngine rie = new RuleInferenceEngine();

            FuzzySet output = new FuzzySet("Output", -100, 100, 1);

            output.AddMembership("Cooling", new FuzzyReverseGrade(-50, 0));
            output.AddMembership("Zero", new FuzzyTriangle(-50, 0, 50));
            output.AddMembership("Heating", new FuzzyGrade(0, 50));
            rie.AddFuzzySet(output.Name, output);

            FuzzySet tempError = new FuzzySet("Temperature Error", -4, 4, 0.05);

            tempError.AddMembership("Negative", new FuzzyReverseGrade(-2, 0));
            tempError.AddMembership("Zero", new FuzzyTriangle(-2, 0, 2));
            tempError.AddMembership("Positive", new FuzzyGrade(0, 2));
            rie.AddFuzzySet(tempError.Name, tempError);


            FuzzySet tempErrorDot = new FuzzySet("Temperature Error", -10, 10, 0.1);

            tempErrorDot.AddMembership("Negative", new FuzzyReverseGrade(-5, 0));
            tempErrorDot.AddMembership("Zero", new FuzzyTriangle(-5, 0, 5));
            tempErrorDot.AddMembership("Positive", new FuzzyGrade(0, 5));
            rie.AddFuzzySet(tempErrorDot.Name, tempErrorDot);

            /*
             *      1. If (e < 0) AND (er < 0) then Cool 0.5 & 0.0 = 0.0
             *      2. If (e = 0) AND (er < 0) then Heat 0.5 & 0.0 = 0.0
             *      3. If (e > 0) AND (er < 0) then Heat 0.0 & 0.0 = 0.0
             *      4. If (e < 0) AND (er = 0) then Cool 0.5 & 0.5 = 0.5
             *      5. If (e = 0) AND (er = 0) then No_Chng 0.5 & 0.5 = 0.5
             *      6. If (e > 0) AND (er = 0) then Heat 0.0 & 0.5 = 0.0
             *      7. If (e < 0) AND (er > 0) then Cool 0.5 & 0.5 = 0.5
             *      8. If (e = 0) AND (er > 0) then Cool 0.5 & 0.5 = 0.5
             *      9. If (e > 0) AND (er > 0) then Heat 0.0 & 0.5 = 0.0
             */

            Rule rule = new Rule("Rule 1");

            rule.AddAntecedent(new Clause(tempError, "Is", "Negative"));
            rule.AddAntecedent(new Clause(tempErrorDot, "Is", "Negative"));
            rule.Consequent = new Clause(output, "Is", "Cooling");
            rie.AddRule(rule);

            rule = new Rule("Rule 2");
            rule.AddAntecedent(new Clause(tempError, "Is", "Zero"));
            rule.AddAntecedent(new Clause(tempErrorDot, "Is", "Negative"));
            rule.Consequent = new Clause(output, "Is", "Heating");
            rie.AddRule(rule);

            rule = new Fuzzy.Rule("Rule 3");
            rule.AddAntecedent(new Clause(tempError, "Is", "Positive"));
            rule.AddAntecedent(new Clause(tempErrorDot, "Is", "Negative"));
            rule.Consequent = new Clause(output, "Is", "Heating");
            rie.AddRule(rule);

            rule = new Rule("Rule 4");
            rule.AddAntecedent(new Clause(tempError, "Is", "Negative"));
            rule.AddAntecedent(new Clause(tempErrorDot, "Is", "Zero"));
            rule.Consequent = new Clause(output, "Is", "Cooling");
            rie.AddRule(rule);

            rule = new Rule("Rule 5");
            rule.AddAntecedent(new Clause(tempError, "Is", "Zero"));
            rule.AddAntecedent(new Clause(tempErrorDot, "Is", "Zero"));
            rule.Consequent = new Clause(output, "Is", "Zero");
            rie.AddRule(rule);

            rule = new Rule("Rule 6");
            rule.AddAntecedent(new Clause(tempError, "Is", "Positive"));
            rule.AddAntecedent(new Clause(tempErrorDot, "Is", "Zero"));
            rule.Consequent = new Clause(output, "Is", "Heating");
            rie.AddRule(rule);

            rule = new Rule("Rule 7");
            rule.AddAntecedent(new Clause(tempError, "Is", "Negative"));
            rule.AddAntecedent(new Clause(tempErrorDot, "Is", "Positive"));
            rule.Consequent = new Clause(output, "Is", "Cooling");
            rie.AddRule(rule);

            rule = new Rule("Rule 8");
            rule.AddAntecedent(new Clause(tempError, "Is", "Zero"));
            rule.AddAntecedent(new Clause(tempErrorDot, "Is", "Positive"));
            rule.Consequent = new Clause(output, "Is", "Cooling");
            rie.AddRule(rule);

            rule = new Rule("Rule 9");
            rule.AddAntecedent(new Clause(tempError, "Is", "Positive"));
            rule.AddAntecedent(new Clause(tempErrorDot, "Is", "Positive"));
            rule.Consequent = new Clause(output, "Is", "Heating");
            rie.AddRule(rule);

            tempError.X = -1.0;
            Console.WriteLine("For Temperature Error: {0}", tempError.X);
            Console.WriteLine("Negative: " + tempError.GetMembership("Negative").degree(-1.0));
            Console.WriteLine("Zero: " + tempError.GetMembership("Zero").degree(-1.0));
            Console.WriteLine("Positive: " + tempError.GetMembership("Positive").degree(-1.0));

            tempErrorDot.X = 2.5;
            Console.WriteLine("For Temperature Error Dot: {0}", tempErrorDot.X);
            Console.WriteLine("Negative: " + tempErrorDot.GetMembership("Negative").degree(2.5));
            Console.WriteLine("Zero: " + tempErrorDot.GetMembership("Zero").degree(2.5));
            Console.WriteLine("Positive: " + tempErrorDot.GetMembership("Positive").degree(2.5));

            rie.Infer(output);

            Console.WriteLine("output: " + output.X);



            FrmFuzzySet tempCanvas         = new FrmFuzzySet("Output", output);
            FrmFuzzySet tempErrorCanvas    = new FrmFuzzySet("Temp Error", tempError);
            FrmFuzzySet tempErrorDotCanvas = new FrmFuzzySet("Temp Error Dot", tempErrorDot);

            tempCanvas.Show();
            tempErrorCanvas.Show();
            tempErrorDotCanvas.Show();
        }
Пример #10
0
        public void Run()
        {
            RuleInferenceEngine rie = new RuleInferenceEngine();

            FuzzySet output = new FuzzySet("Output", -100, 100, 1);

            output.AddMembership("Cooling", new FuzzyReverseGrade(-50, 0));
            output.AddMembership("Zero", new FuzzyTriangle(-50, 0, 50));
            output.AddMembership("Heating", new FuzzyGrade(0, 50));
            rie.AddFuzzySet(output.Name, output);

            FuzzySet tempError = new FuzzySet("Temperature Error", -4, 4, 0.05);

            tempError.AddMembership("Negative", new FuzzyReverseGrade(-2, 0));
            tempError.AddMembership("Zero", new FuzzyTriangle(-2, 0, 2));
            tempError.AddMembership("Positive", new FuzzyGrade(0, 2));
            rie.AddFuzzySet(tempError.Name, tempError);


            FuzzySet tempErrorDot = new FuzzySet("Temperature Error", -10, 10, 0.1);

            tempErrorDot.AddMembership("Negative", new FuzzyReverseGrade(-5, 0));
            tempErrorDot.AddMembership("Zero", new FuzzyTriangle(-5, 0, 5));
            tempErrorDot.AddMembership("Positive", new FuzzyGrade(0, 5));
            rie.AddFuzzySet(tempErrorDot.Name, tempErrorDot);

            /*
             *      1. If (e < 0) AND (er < 0) then Cool 0.5 & 0.0 = 0.0
             *      2. If (e = 0) AND (er < 0) then Heat 0.5 & 0.0 = 0.0
             *      3. If (e > 0) AND (er < 0) then Heat 0.0 & 0.0 = 0.0
             *      4. If (e < 0) AND (er = 0) then Cool 0.5 & 0.5 = 0.5
             *      5. If (e = 0) AND (er = 0) then No_Chng 0.5 & 0.5 = 0.5
             *      6. If (e > 0) AND (er = 0) then Heat 0.0 & 0.5 = 0.0
             *      7. If (e < 0) AND (er > 0) then Cool 0.5 & 0.5 = 0.5
             *      8. If (e = 0) AND (er > 0) then Cool 0.5 & 0.5 = 0.5
             *      9. If (e > 0) AND (er > 0) then Heat 0.0 & 0.5 = 0.0
             */

            Rule rule = new Rule("Rule 1");

            rule.AddAntecedent(new Clause(tempError, "Is", "Negative"));
            rule.AddAntecedent(new Clause(tempErrorDot, "Is", "Negative"));
            rule.Consequent = new Clause(output, "Is", "Cooling");
            rie.AddRule(rule);

            rule = new Rule("Rule 2");
            rule.AddAntecedent(new Clause(tempError, "Is", "Zero"));
            rule.AddAntecedent(new Clause(tempErrorDot, "Is", "Negative"));
            rule.Consequent = new Clause(output, "Is", "Heating");
            rie.AddRule(rule);

            rule = new Rule("Rule 3");
            rule.AddAntecedent(new Clause(tempError, "Is", "Positive"));
            rule.AddAntecedent(new Clause(tempErrorDot, "Is", "Negative"));
            rule.Consequent = new Clause(output, "Is", "Heating");
            rie.AddRule(rule);

            rule = new Rule("Rule 4");
            rule.AddAntecedent(new Clause(tempError, "Is", "Negative"));
            rule.AddAntecedent(new Clause(tempErrorDot, "Is", "Zero"));
            rule.Consequent = new Clause(output, "Is", "Cooling");
            rie.AddRule(rule);

            rule = new Rule("Rule 5");
            rule.AddAntecedent(new Clause(tempError, "Is", "Zero"));
            rule.AddAntecedent(new Clause(tempErrorDot, "Is", "Zero"));
            rule.Consequent = new Clause(output, "Is", "Zero");
            rie.AddRule(rule);

            rule = new Rule("Rule 6");
            rule.AddAntecedent(new Clause(tempError, "Is", "Positive"));
            rule.AddAntecedent(new Clause(tempErrorDot, "Is", "Zero"));
            rule.Consequent = new Clause(output, "Is", "Heating");
            rie.AddRule(rule);

            rule = new Rule("Rule 7");
            rule.AddAntecedent(new Clause(tempError, "Is", "Negative"));
            rule.AddAntecedent(new Clause(tempErrorDot, "Is", "Positive"));
            rule.Consequent = new Clause(output, "Is", "Cooling");
            rie.AddRule(rule);

            rule = new Rule("Rule 8");
            rule.AddAntecedent(new Clause(tempError, "Is", "Zero"));
            rule.AddAntecedent(new Clause(tempErrorDot, "Is", "Positive"));
            rule.Consequent = new Clause(output, "Is", "Cooling");
            rie.AddRule(rule);

            rule = new Rule("Rule 9");
            rule.AddAntecedent(new Clause(tempError, "Is", "Positive"));
            rule.AddAntecedent(new Clause(tempErrorDot, "Is", "Positive"));
            rule.Consequent = new Clause(output, "Is", "Heating");
            rie.AddRule(rule);

            tempError.X = -1.0;
            WriteLine("For Temperature Error: {0}", tempError.X);
            WriteLine("Negative: " + tempError.GetMembership("Negative").degree(-1.0));
            WriteLine("Zero: " + tempError.GetMembership("Zero").degree(-1.0));
            WriteLine("Positive: " + tempError.GetMembership("Positive").degree(-1.0));

            tempErrorDot.X = 2.5;
            WriteLine("For Temperature Error Dot: {0}", tempErrorDot.X);
            WriteLine("Negative: " + tempErrorDot.GetMembership("Negative").degree(2.5));
            WriteLine("Zero: " + tempErrorDot.GetMembership("Zero").degree(2.5));
            WriteLine("Positive: " + tempErrorDot.GetMembership("Positive").degree(2.5));

            rie.Infer(output);

            WriteLine("output: " + output.X);


            /*
             * Application.EnableVisualStyles();
             * Application.SetCompatibleTextRenderingDefault(false);
             *
             *
             * FrmFuzzySet tempCanvas = new FrmFuzzySet("Output", output);
             * FrmFuzzySet tempErrorCanvas = new FrmFuzzySet("Temp Error", tempError);
             * FrmFuzzySet tempErrorDotCanvas = new FrmFuzzySet("Temp Error Dot", tempErrorDot);
             *
             * SimpleUI.Instance.Display(tempCanvas);
             * SimpleUI.Instance.Display(tempErrorCanvas);
             * SimpleUI.Instance.Display(tempErrorDotCanvas);
             *
             * Application.Run(SimpleUI.Instance.View);*/
        }