2016-07-21 4 views
0

Je suis un débutant dans JESS, et modéré en Java.Comment écrire JESS defrule "si une valeur n'existe pas dans une liste, puis imprimer un avertissement"

je « clist » liste des produits spéciaux (y compris les produits « essentiels » et « régionaux »), et « ListeX » liste de tous les produits (y compris les produits « essentiels » et « non essentiels ») Je veux faire une règle: si 'x' de 'xList' avec le statut 'essential' n'existe pas dans 'cList', alors imprimez 'Missing essential essential' x '. " Pour être clair, le modèle de mon système est le même que celui de l'exemple de pricing_engine dans Jess71p2.

  • clist en même que CatalogItems
  • ListeX en même que OrderItems

Je déclare deftemplate des classes Java. voici le deftemplate;

(import com.aisy.entity.*) 
    (deftemplate oldList(declare (from-class oldList))) 
    (deftemplate xList (declare (from-class xList))) 
    (deftemplate cList (declare (from-class cList))) 

Voici le xList.java

package com.aisy.entity; 
    import java.sql.Timestamp; 
    public class xList { 
      private Long id_commodity; 
      private String commodity; 
      private String essentiality; 
      private Timestamp update; 

     public xList() { 
      super(); 
     } 

     public xList(Long id_commodity, String commodity, String essentiality, Timestamp update) { 
      super(); 
      this.id_commodity = id_commodity; 
      this.commodity = commodity; 
      this.essentiality = essentiality; 
      this.update = update; 
     } 

     public Long getId_commodity() { 
      return this.id_commodity; 
     } 

     public void setId_Commodity(Long id_commodity) { 
      this.id_commodity = id_commodity; 
     } 

     public String getCommodity() { 
      return this.commoditty; 
     } 

     ....getter and setter methods for the rest fields 
    } 

Voici le cList.java;

public class cList { 
     private Long id_commodity; 
     private String commodity; 
     private String price; 
     private Double final_price; 

     public cList(Long id_commodity, String commodity, String price, Double final_price) { 
      super(); 
      this.id_commodity = id_commodity; 
      this.commodity = commodity; 
      this.price = price; 
      this.final_price = final_price; 
     } 

     public cList() { 
      super(); 
     } 

      ...common getter and setter methods for all fields 

Voici warning.java;

public class warning { 
     private final String description; 
     public warning(String aDescription) { 
     description = aDescription; 
     } 

     public String getDescription() { 
     return description; 
     } 
    } 

Voici la defrule;

(defrule 
     (xList (commodity ?essential_commodity) (essentiality /essential/)) 
     (not(cList (commodity ?essential_commodity))) 
     => (add (new warning "Missing essential commodity" ?essential_commodity)) 
    ) 

J'essaie de mettre des informations à la base de données pour ListeX et clist:

xList("100000", "PEANUT", "2.45"); 
    xList("100003", "BREAD", "1.5"); 

    cList("100000", "PEANUT", "ESSENTIAL"); 
    cList("100002", "CAKE", "ESSENTIAL"); 
    cList("100003", "BREAD", "NON ESSENTIAL"); 

De là, si je lance mon moteur de règle, le résultat devrait être

"Missing essential commodity 100002" 

Mais mon le résultat actuel est:

"Missing essential commodity 100000" 
    "Missing essential commodity 100002" 

Comment écrire résoudre ce problème?

modifié: 22/07/2016 ajouté xList.java et cList.java

+0

Peut-être que vous faites une erreur lors de la création et de l'insertion des faits. Ne peut pas dire sans le code pour cela. – laune

Répondre

0

La syntaxe exacte dépend, bien sûr, la nature exacte des faits vous correspondant. La règle ci-dessous est écrite en supposant qu'il y a beaucoup de faits "xList", chacun listant le nom d'un produit et son essentialité dans les slots "commodity" et "essentiality", respectivement, et qu'il y a juste un fait qui contient une liste de tous les produits essentiels. Les multifield vierges ("$?") Correspondent à un nombre arbitraire d'éléments de liste avant et après la marchandise essentielle.

(defrule 
    (xList (commodity ?essential_commodity) (essentiality essential)) 
    (not (cList $? ?essential_commodity $?)) 
    => 
    (assert (warning 
     (str-cat "Missing essential commodity" ?essential_commodity)))) 
+0

En réalité, il y a beaucoup de faits cList. Tous les deftemplate sont déclarés à partir des classes java, donc le 'warning' est une classe. J'ai toujours des erreurs. – Zsy

+0

J'ai édité mon poste pour plus de détails – Zsy

0

Ernest était presque là:

(defrule 
    (xList (commodity ?essential_commodity) (essentiality essential)) 
    (not (cList (commodity ?essential_commodity))) 
=> 
    (assert (warning (description ?essential_commodity))) 
) 

Remarque: L'appel des classes "-Liste" qui ne sont pas des listes et contient même pas est déconcertant (et que confus Ernest). Les classes doivent être appelées quelque choseCommodity, et les noms de champs peuvent être restreints à "id", "name", etc.

+0

Je suis désolé pour mon exemple confus. En fait, j'ai écrit des cours et des méthodes en langue non anglaise, donc je l'ai remplacé pour vous faire comprendre, mais oubliez de considérer ces choses. Le modèle de mon système est le même avec l'exemple de pricing_engine dans Jess71p2. J'ai essayé votre code, et mis le résultat sur mon post. Mais encore, ça ne résout pas mon problème. – Zsy

+0

J'ai ajouté une paire de parenthèses manquante! @Zsy, sans les messages d'erreur spécifiques, il est impossible de deviner ce qui ne fonctionne pas pour vous. –

+0

@ ErnestFriedman-Hill Ah, c'est bon de vous faire regarder mon code. Je commence à perdre mon contact. : -] – laune