logicfactorysupport.java

来自「Mandarax是一个规则引擎的纯Java实现。它支持多类型的事实和基于反映的规」· Java 代码 · 共 879 行 · 第 1/3 页

JAVA
879
字号
     * @param conclusion the concusion of the rule
     * @deprecated use Prerequisite instead of Fact to build rules
     */
    public Rule rule(Fact prerequisite, Fact conclusion) {
        Vector body = new Vector ();
        body.add (fact2prereq(prerequisite));
        return lfactory.createRule (body, conclusion);
    }

    /**
     * Create a rule with two prerequisites.
     * @return the rule created
     * @param prerequisite1 a prerequisite
     * @param prerequisite2 a prerequisite
     * @param conclusion the concusion of the rule
     * @deprecated use Prerequisite instead of Fact to build rules
     */
    public Rule rule(Fact prerequisite1, Fact prerequisite2,Fact conclusion) {
        Vector body = new Vector ();
        body.add (fact2prereq(prerequisite1));
        body.add (fact2prereq(prerequisite2));
        return lfactory.createRule (body, conclusion);
    }

    /**
     * Create a rule with three prerequisites.
     * @return the rule created
     * @param prerequisite1 a prerequisite
     * @param prerequisite2 a prerequisite
     * @param prerequisite3 a prerequisite
     * @param conclusion the concusion of the rule
     * @deprecated use Prerequisite instead of Fact to build rules
     */
    public Rule rule(Fact prerequisite1, Fact prerequisite2,Fact prerequisite3, Fact conclusion) {
        Vector body = new Vector ();
        body.add (fact2prereq(prerequisite1));
        body.add (fact2prereq(prerequisite2));
        body.add (fact2prereq(prerequisite3));
        return lfactory.createRule (body, conclusion);
    }

    /**
     * Create a rule with four prerequisites.
     * @return the rule created
     * @param prerequisite1 a prerequisite
     * @param prerequisite2 a prerequisite
     * @param prerequisite3 a prerequisite
     * @param prerequisite4 a prerequisite
     * @param conclusion the concusion of the rule
     * @deprecated use Prerequisite instead of Fact to build rules
     */
    public Rule rule(Fact prerequisite1, Fact prerequisite2,Fact prerequisite3, Fact prerequisite4,Fact conclusion) {
        Vector body = new Vector ();
        body.add (fact2prereq(prerequisite1));
        body.add (fact2prereq(prerequisite2));
        body.add (fact2prereq(prerequisite3));
        body.add (fact2prereq(prerequisite4));
        return lfactory.createRule (body, conclusion);
    }


    /**
     * Create a rule with two prerequisites.
     * The prerequisites are connected by OR.
     * @return the rule created
     * @param prerequisite1 a prerequisite
     * @param prerequisite2 a prerequisite
     * @param conclusion the concusion of the rule
     */
    public Rule orRule(Prerequisite prerequisite1, Prerequisite prerequisite2,Fact conclusion) {
        Vector body = new Vector ();
        body.add (prerequisite1);
        body.add (prerequisite2);
        return lfactory.createRule (body, conclusion, true);
    }

    /**
     * Create a rule with three prerequisites.
     * The prerequisites are connected by OR.
     * @return the rule created
     * @param prerequisite1 a prerequisite
     * @param prerequisite2 a prerequisite
     * @param prerequisite3 a prerequisite
     * @param conclusion the concusion of the rule
     */
    public Rule orRule(Prerequisite prerequisite1, Prerequisite prerequisite2,Prerequisite prerequisite3, Fact conclusion) {
        Vector body = new Vector ();
        body.add (prerequisite1);
        body.add (prerequisite2);
        body.add (prerequisite3);
        return lfactory.createRule (body, conclusion, true);
    }

    /**
     * Create a rule with four prerequisites.
     * The prerequisites are connected by OR.
     * @return the rule created
     * @param prerequisite1 a prerequisite
     * @param prerequisite2 a prerequisite
     * @param prerequisite3 a prerequisite
     * @param prerequisite4 a prerequisite
     * @param conclusion the concusion of the rule
     */
    public Rule orRule(Prerequisite prerequisite1, Prerequisite prerequisite2,Prerequisite prerequisite3, Prerequisite prerequisite4,Fact conclusion) {
        Vector body = new Vector ();
        body.add (prerequisite1);
        body.add (prerequisite2);
        body.add (prerequisite3);
        body.add (prerequisite4);
        return lfactory.createRule (body, conclusion, true);
    }

    /**
     * Create a rule with one prerequisite.
     * @return the rule created
     * @param prerequisite a prerequisite
     * @param conclusion the concusion of the rule
     */
    public Rule rule(Prerequisite prerequisite, Fact conclusion) {
        Vector body = new Vector ();
        body.add (prerequisite);
        return lfactory.createRule (body, conclusion);
    }

    /**
     * Create a rule with two prerequisites.
     * @return the rule created
     * @param prerequisite1 a prerequisite
     * @param prerequisite2 a prerequisite
     * @param conclusion the concusion of the rule
     */
    public Rule rule(Prerequisite prerequisite1, Prerequisite prerequisite2,Fact conclusion) {
        Vector body = new Vector ();
        body.add (prerequisite1);
        body.add (prerequisite2);
        return lfactory.createRule (body, conclusion);
    }

    /**
     * Create a rule with three prerequisites.
     * @return the rule created
     * @param prerequisite1 a prerequisite
     * @param prerequisite2 a prerequisite
     * @param prerequisite3 a prerequisite
     * @param conclusion the concusion of the rule
     */
    public Rule rule(Prerequisite prerequisite1, Prerequisite prerequisite2,Prerequisite prerequisite3, Fact conclusion) {
        Vector body = new Vector ();
        body.add (prerequisite1);
        body.add (prerequisite2);
        body.add (prerequisite3);
        return lfactory.createRule (body, conclusion);
    }

    /**
     * Create a rule with four prerequisites.
     * @return the rule created
     * @param prerequisite1 a prerequisite
     * @param prerequisite2 a prerequisite
     * @param prerequisite3 a prerequisite
     * @param prerequisite4 a prerequisite
     * @param conclusion the concusion of the rule
     */
    public Rule rule(Prerequisite prerequisite1, Prerequisite prerequisite2,Prerequisite prerequisite3, Prerequisite prerequisite4,Fact conclusion) {
        Vector body = new Vector ();
        body.add (prerequisite1);
        body.add (prerequisite2);
        body.add (prerequisite3);
        body.add (prerequisite4);
        return lfactory.createRule (body, conclusion);
    }
    
    
    /**
     * Convenient method to interprete objects as terms.
     * The following rules apply:
     * <ol>
     * <li> if the object is a term, keep it as it is
     * <li> if the object is an instance of clazz, create a constant term wrapping the object
     * <li> if the object is a string (an the previous does not apply), create a variable using the object as a name
     * <li> otherwise throw an illegal argument exception;
     * </ol>
     * @return a term
     * @param obj the object to be interpreted as a term
     * @param clazz the type of the term
     */
    private Term toTerm(Object obj, Class clazz) {
        if(obj == null) {
            throw new IllegalArgumentException (
                "Cannot build term from null");
        }

        if(obj instanceof Term) {
            return(Term) obj;
        }
		// remark: this was a bug in 1.6 : if (clazz==obj.getClass())
        if(clazz.isAssignableFrom(obj.getClass())) {
            return lfactory.createConstantTerm (obj);
        }

        if(obj instanceof String) {
            return lfactory.createVariableTerm ((String) obj, clazz);
        }

        throw new IllegalArgumentException ("Cannot build term from " + obj);
    }

    /**
     * Convenient method to create a variable.
     * @return a term
     * @param name a var name
     * @param clazz a type
     */
    public Term variable(String name, Class clazz) {
        return lfactory.createVariableTerm (name, clazz);
    }

    /**
     * Convenient method to create a string type variable.
     * @return a term
     * @param name a var name
     */
    public Term variable(String name) {
        return variable (name, String.class);
    }
    
    /**
     * Create a query with one fact.
     * @return the query created
     * @param fact a fact
     * @param name the name of the query
     */
    public Query query(Fact fact,String name) {
    	Fact[] facts = {fact};
    	return query(facts,name);
    }
    
    /**
     * Create a query with two facts.
     * @return the query created
     * @param fact1 a fact
     * @param fact2 a fact
     * @param name the name of the query
     */
    public Query query(Fact fact1,Fact fact2,String name) {
    	Fact[] facts = {fact1,fact2};
    	return query(facts,name);
    }
    
    /**
     * Create a query with three facts.
     * @return the query created
     * @param fact1 a fact
     * @param fact2 a fact
     * @param fact3 a fact
     * @param name the name of the query
     */
    public Query query(Fact fact1,Fact fact2,Fact fact3,String name) {
    	Fact[] facts = {fact1,fact2,fact3};
    	return query(facts,name);
    }
    
    /**
     * Create a query with N facts.
     * @return the query created
     * @param fact1 a fact
     * @param fact2 a fact
     * @param name the name of the query
     */
    public Query query(Fact[] facts,String name) {
    	return lfactory.createQuery(facts,name);
    }            
    
    /** 
     * Convert a fact to a prerequisite.
     * @param fact a fact
     * @return a prerequisite
     */ 
    public Prerequisite fact2prereq(Fact fact) {
    	Predicate p = fact.getPredicate();
    	Term[] terms = fact.getTerms();
    	return this.prereq(p,terms);
    }
    /**
     * Create a prerequiste using the cut predicate.
     * @return a prerequisite
     */
    public Prerequisite cut() {
    	return lfactory.createCut();
    }
    
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?