Search code examples
javadroolsrulesexpert-system

Drools: more than one rule are fired and I want the conclusion to be printed (then part), is it possible? if not what do you suggest?


I'm trying to make an intelligent tutoring system using drools, and the purpose of the system is to provide personalized exercises for each student based on his assessment test. After completing the test, the system gets the assessment scores, and based on that prints out a list of the suitable exercises.


The rules are divided into two purposes, one for selecting the student level. The other for determining what exercises to include in the study plan, which is based on the students level.

The problem that each level includes different exercises, and that would that more than one rule are going to be fired. and I want to the program to print a list exercises that match the student level.

package com.binod.DroolsDemo;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;

import org.drools.compiler.compiler.DroolsParserException;
import org.drools.compiler.compiler.PackageBuilder;
import org.drools.core.RuleBase;
import org.drools.core.RuleBaseFactory;
import org.drools.core.WorkingMemory;

public class DemoTest {

    public static void main(String[] args) throws DroolsParserException, IOException {
        DemoTest client = new DemoTest();
        client.execteRule();
    }

    public void execteRule() throws DroolsParserException, IOException{
           PackageBuilder builder = new PackageBuilder();
           String ruleFile = "/offers.drl";
           InputStream resourceAsStream = getClass().getResourceAsStream(ruleFile);

           Reader ruleReader = new InputStreamReader(resourceAsStream);
           builder.addPackageFromDrl(ruleReader);
           org.drools.core.rule.Package rulePackage = builder.getPackage();
           RuleBase ruleBase = RuleBaseFactory.newRuleBase();
           ruleBase.addPackage(rulePackage);

           WorkingMemory workingMemory = ruleBase.newStatefulSession();

           AssessmentLevel assessemntLevel = new AssessmentLevel();
           assessemntLevel.setAssessment("Null");
           workingMemory.insert(assessemntLevel);
           workingMemory.fireAllRules();

           System.out.println("The level for this student assessment "+assessemntLevel.getAssessment()+" is "+assessemntLevel.getLevel()+" And the excercises include "+assessemntLevel.getPersonalizedexercises());

       } 
}
package com.binod.DroolsDemo;

public class AssessmentLevel {

    private String assessment;
    private String level;
    private String personalizedexercises;

    public String getAssessment() {
        return assessment;
    }
    public void setAssessment(String assessment) {
        this.assessment = assessment;
    }
    public String getLevel() {
        return level;
    }
    public void setLevel(String level) {
        this.level = level;
    }
    public String getPersonalizedexercises() {
        return personalizedexercises;
    }
    public void setPersonalizedexercises(String personalizedexercises) {
        this.personalizedexercises = personalizedexercises;
    }

}

my Updated rules file

import com.binod.DroolsDemo.AssessmentLevel

rule "Offer for A1"
    when 
        offerObject: AssessmentLevel(assessment=="Null")
    then
        offerObject.setLevel("A1");
    end
rule "Offer for A2"
    when 
        offerObject: AssessmentLevel(assessment=="[1-10]")
    then
        offerObject.setLevel("A2");
    end
rule "Offer for B1"
    when 
        offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15]")
    then
        offerObject.setLevel("B1");
    end
rule "Offer for B2"
    when 
        offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20]")
    then
        offerObject.setLevel("B2");
    end
rule "Offer for C1 "
    when 
        offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20] AND [21-25]")
    then
        offerObject.setLevel("C1");
    end
rule "Offer for C2"
    when 
        offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20] AND [21-25] AND [26-30]")
    then
        offerObject.setLevel("C2");
    end
rule "Offer for recommend"
    when 
        offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20] AND [21-25] AND [26-30] AND [31-35]")
    then
        offerObject.setLevel("Advanced");
    end
rule "Personalized Exercises  Intro to Computers and Programming"
    when 
         offerObject: AssessmentLevel(assessment=="Null")
    then
        offerObject.setPersonalizedexercises("Intro Computers and Programming");
    end
rule "Personalized Exercises Logic"
    when 
         offerObject: AssessmentLevel(assessment=="Null")
    then
        offerObject.setPersonalizedexercises("Logic");
    end
rule "Personalized Exercises Flowcharts and Algorithms"
    when 
         offerObject: AssessmentLevel(assessment=="Null")
    then
        offerObject.setPersonalizedexercises("Flowcharts and Algorithms");
    end
rule "Personalized Exercises Pseudo Code"
    when 
         offerObject: AssessmentLevel(assessment=="Null")
    then
        offerObject.setPersonalizedexercises("Pseudo Code");
    end
rule "Personalized Exercises Syntax"
    when 
         offerObject: AssessmentLevel(assessment=="[1-10]")
    then
        offerObject.setPersonalizedexercises("Syntax");
    end
rule "Personalized Exercises Data Structure"
    when 
         offerObject: AssessmentLevel(assessment=="[1-10]")
    then
        offerObject.setPersonalizedexercises("Data Structure");
    end
rule "Personalized Exercises Variables "
    when 
         offerObject: AssessmentLevel(assessment=="[1-10]")
    then
        offerObject.setPersonalizedexercises("Variables");
    end
rule "Personalized Exercises Data Types"
    when 
         offerObject: AssessmentLevel(assessment=="[1-10]")
    then
        offerObject.setPersonalizedexercises("Data Types");
    end
rule "Personalized Exercises Numbers"
    when 
         offerObject: AssessmentLevel(assessment=="[1-10]")
    then
        offerObject.setPersonalizedexercises("Numbers");
    end
rule "Personalized Exercises Casting"
    when 
         offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15]")
    then
        offerObject.setPersonalizedexercises("Casting");
    end
rule "Personalized Exercises Strings"
    when 
         offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15]")
    then
        offerObject.setPersonalizedexercises("Strings");
    end
rule "Personalized Exercises Boolean"
    when 
         offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15]")
    then
        offerObject.setPersonalizedexercises("Boolean");
    end
rule "Personalized Exercises Operators"
    when 
         offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15]")
    then
        offerObject.setPersonalizedexercises("Operators");
    end
rule "Personalized Exercises Lists"
    when 
         offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15]")
    then
        offerObject.setPersonalizedexercises("Lists");
    end
rule "Personalized Exercises  If Else"
    when 
         offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20]")
    then
        offerObject.setPersonalizedexercises("If Else");
    end
rule "Personalized Exercises While Loops"
    when 
         offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20]")
    then
        offerObject.setPersonalizedexercises("While Loops");
    end
rule "Personalized Exercises Functions"
    when 
         offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20]")
    then
        offerObject.setPersonalizedexercises("Functions");
    end
rule "Personalized Exercises Arrays"
    when 
         offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20]")
    then
        offerObject.setPersonalizedexercises("Arrays");
    end
rule "Personalized Exercises Classes/Objects"
    when 
         offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20] AND [21-25]")
    then
        offerObject.setPersonalizedexercises("Classes/Objects");
    end
rule "Personalized Exercises Dates"
    when 
         offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20] AND [21-25]")
    then
        offerObject.setPersonalizedexercises("Dates");
    end
rule "Personalized Exercises Modules"
    when 
         offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20] AND [21-25]")
    then
        offerObject.setPersonalizedexercises("Modules");
    end 
rule "Personalized Exercises Try Accept"
    when 
         offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20] AND [21-25]")
    then
        offerObject.setPersonalizedexercises("Try Accept");
    end
rule "Personalized Exercises  User Input"
    when 
         offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20] AND [21-25] AND [26-30]")
    then
        offerObject.setPersonalizedexercises(" User Input");
    end 
rule "Personalized Exercises String Formating "
    when 
         offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20] AND [21-25] AND [26-30]")
    then
        offerObject.setPersonalizedexercises("String Formating ");
    end 
rule "Personalized Exercises Database Basics "
    when 
         offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20] AND [21-25] AND [26-30]")
    then
        offerObject.setPersonalizedexercises("Database Basics ");
    end 
rule "Personalized Exercises SQL Basics"
    when 
         offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20] AND [21-25] AND [26-30]")
    then
        offerObject.setPersonalizedexercises("SQL Basics");
    end 
rule "Personalized Exercises Intro to Object Oriented Programming"
    when 
         offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20] AND [21-25] AND [26-30]")
    then
        offerObject.setPersonalizedexercises("Intro to Object Oriented Programming");
    end 
rule "Personalized Exercises Information Systems"
    when 
         offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20] AND [21-25] AND [26-30]")
    then
        offerObject.setPersonalizedexercises("Intro to Information Systems");
    end 
rule "Personalized Exercises Recommend new courses"
    when 
         offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20] AND [21-25] AND [26-30] AND [31-35]")
    then
        offerObject.setPersonalizedexercises("Brief about advanced courses");
    end 



Solution

  • As from your question you want multiple exercises to be assigned to a student based on certain criteria. Try executing below code for that:

    Updated AssessmentLevel:

    import java.util.ArrayList;
    import java.util.List;
    
    public class AssessmentLevel {
    
        private String assessment;
        private String level;
        private List<String> personalizedexercises = new ArrayList<>();
    
        public String getAssessment() {
            return assessment;
        }
    
        public void setAssessment(String assessment) {
            this.assessment = assessment;
        }
    
        public String getLevel() {
            return level;
        }
    
        public void setLevel(String level) {
            this.level = level;
        }
    
        public List<String> getPersonalizedexercises() {
            return personalizedexercises;
        }
    
        public void setPersonalizedexercises(List<String> personalizedexercises) {
            this.personalizedexercises = personalizedexercises;
        }
    
    }
    

    Updated Rule File:

    rule "Offer for A1"
        when
            offerObject: AssessmentLevel(assessment=="Null")
        then
            offerObject.setLevel("A1");
        end
    rule "Offer for A2"
        when
            offerObject: AssessmentLevel(assessment=="[1-10]")
        then
            offerObject.setLevel("A2");
        end
    rule "Offer for B1"
        when
            offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15]")
        then
            offerObject.setLevel("B1");
        end
    rule "Offer for B2"
        when
            offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20]")
        then
            offerObject.setLevel("B2");
        end
    rule "Offer for C1 "
        when
            offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20] AND [21-25]")
        then
            offerObject.setLevel("C1");
        end
    rule "Offer for C2"
        when
            offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20] AND [21-25] AND [26-30]")
        then
            offerObject.setLevel("C2");
        end
    rule "Offer for recommend"
        when
            offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20] AND [21-25] AND [26-30] AND [31-35]")
        then
            offerObject.setLevel("Advanced");
        end
    rule "Personalized Exercises  Intro to Computers and Programming"
        when
             offerObject: AssessmentLevel(assessment=="Null")
        then
            offerObject.getPersonalizedexercises().add("Intro Computers and Programming");
        end
    rule "Personalized Exercises Logic"
        when
             offerObject: AssessmentLevel(assessment=="Null")
        then
            offerObject.getPersonalizedexercises().add("Logic");
        end
    rule "Personalized Exercises Flowcharts and Algorithms"
        when
             offerObject: AssessmentLevel(assessment=="Null")
        then
            offerObject.getPersonalizedexercises().add("Flowcharts and Algorithms");
        end
    rule "Personalized Exercises Pseudo Code"
        when
             offerObject: AssessmentLevel(assessment=="Null")
        then
            offerObject.getPersonalizedexercises().add("Pseudo Code");
        end
    rule "Personalized Exercises Syntax"
        when
             offerObject: AssessmentLevel(assessment=="[1-10]")
        then
            offerObject.getPersonalizedexercises().add("Syntax");
        end
    rule "Personalized Exercises Data Structure"
        when
             offerObject: AssessmentLevel(assessment=="[1-10]")
        then
            offerObject.getPersonalizedexercises().add("Data Structure");
        end
    rule "Personalized Exercises Variables "
        when
             offerObject: AssessmentLevel(assessment=="[1-10]")
        then
            offerObject.getPersonalizedexercises().add("Variables");
        end
    rule "Personalized Exercises Data Types"
        when
             offerObject: AssessmentLevel(assessment=="[1-10]")
        then
            offerObject.getPersonalizedexercises().add("Data Types");
        end
    rule "Personalized Exercises Numbers"
        when
             offerObject: AssessmentLevel(assessment=="[1-10]")
        then
            offerObject.getPersonalizedexercises().add("Numbers");
        end
    rule "Personalized Exercises Casting"
        when
             offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15]")
        then
            offerObject.getPersonalizedexercises().add("Casting");
        end
    rule "Personalized Exercises Strings"
        when
             offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15]")
        then
            offerObject.getPersonalizedexercises().add("Strings");
        end
    rule "Personalized Exercises Boolean"
        when
             offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15]")
        then
            offerObject.getPersonalizedexercises().add("Boolean");
        end
    rule "Personalized Exercises Operators"
        when
             offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15]")
        then
            offerObject.getPersonalizedexercises().add("Operators");
        end
    rule "Personalized Exercises Lists"
        when
             offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15]")
        then
            offerObject.getPersonalizedexercises().add("Lists");
        end
    rule "Personalized Exercises  If Else"
        when
             offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20]")
        then
            offerObject.getPersonalizedexercises().add("If Else");
        end
    rule "Personalized Exercises While Loops"
        when
             offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20]")
        then
            offerObject.getPersonalizedexercises().add("While Loops");
        end
    rule "Personalized Exercises Functions"
        when
             offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20]")
        then
            offerObject.getPersonalizedexercises().add("Functions");
        end
    rule "Personalized Exercises Arrays"
        when
             offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20]")
        then
            offerObject.getPersonalizedexercises().add("Arrays");
        end
    rule "Personalized Exercises Classes/Objects"
        when
             offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20] AND [21-25]")
        then
            offerObject.getPersonalizedexercises().add("Classes/Objects");
        end
    rule "Personalized Exercises Dates"
        when
             offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20] AND [21-25]")
        then
            offerObject.getPersonalizedexercises().add("Dates");
        end
    rule "Personalized Exercises Modules"
        when
             offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20] AND [21-25]")
        then
            offerObject.getPersonalizedexercises().add("Modules");
        end
    rule "Personalized Exercises Try Accept"
        when
             offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20] AND [21-25]")
        then
            offerObject.getPersonalizedexercises().add("Try Accept");
        end
    rule "Personalized Exercises  User Input"
        when
             offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20] AND [21-25] AND [26-30]")
        then
            offerObject.getPersonalizedexercises().add(" User Input");
        end
    rule "Personalized Exercises String Formating "
        when
             offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20] AND [21-25] AND [26-30]")
        then
            offerObject.getPersonalizedexercises().add("String Formating ");
        end
    rule "Personalized Exercises Database Basics "
        when
             offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20] AND [21-25] AND [26-30]")
        then
            offerObject.getPersonalizedexercises().add("Database Basics ");
        end
    rule "Personalized Exercises SQL Basics"
        when
             offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20] AND [21-25] AND [26-30]")
        then
            offerObject.getPersonalizedexercises().add("SQL Basics");
        end
    rule "Personalized Exercises Intro to Object Oriented Programming"
        when
             offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20] AND [21-25] AND [26-30]")
        then
            offerObject.getPersonalizedexercises().add("Intro to Object Oriented Programming");
        end
    rule "Personalized Exercises Information Systems"
        when
             offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20] AND [21-25] AND [26-30]")
        then
            offerObject.getPersonalizedexercises().add("Intro to Information Systems");
        end
    rule "Personalized Exercises Recommend new courses"
        when
             offerObject: AssessmentLevel(assessment=="[1-10] AND [11-15] AND [16-20] AND [21-25] AND [26-30] AND [31-35]")
        then
            offerObject.getPersonalizedexercises().add("Brief about advanced courses");
        end