2016-07-21 21 views
0

Ich bin ein Neuling in JESS und moderate in Java.Wie schreibe JESS defrule "wenn ein Wert nicht in einer Liste existiert, dann eine Warnung ausdrucken"

I ‚clist‘ als Liste spezieller Rohstoffe (einschließlich ‚wesentlich‘ und ‚regional‘ Commodities) habe, und ‚xList‘ als Liste aller Waren (einschließlich ‚wesentlich‘ und ‚nicht wesentlich‘ Commodities) Ich möchte eine Regel machen: wenn 'x' von 'xList' mit dem Status 'essential' nicht in 'cList' existiert, dann drucke 'Missing essential commodity' x '. "

Um klar zu sein, ist mein System das gleiche Muster wie Pricing_engine Beispiel in Jess71p2.

  • clist genauso wie CatalogItems
  • xList genauso wie Order

Ich erkläre deftemplate von Java-Klassen. hier ist die deftemplate;

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

Hier ist die 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 
    } 

Hier ist die 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 

Hier ist warning.java;

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

     public String getDescription() { 
     return description; 
     } 
    } 

Hier ist die Defrule;

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

Ich versuche, einige Informationen zur Datenbank für xList und clist zu setzen:

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

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

Von diesem, wenn ich meine Regel-Engine laufen, sollte das Ergebnis

"Missing essential commodity 100002" 

sein Aber mein aktuelles Ergebnis ist:

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

Wie schreibe ich das reparieren?

bearbeitet: 2016.07.22 hinzugefügt xList.java und cList.java

+0

Vielleicht machen Sie beim Erstellen und Einfügen der Fakten einen Fehler. Kann nicht ohne den Code dafür sagen. – laune

Antwort

0

Die genaue Syntax hängt natürlich davon ab, auf die genaue Art der Tatsachen Sie entsprechen. Die folgende Regel wird unter der Annahme geschrieben, dass es viele "xList" -Tatsachen gibt, die jeweils den Namen einer Ware und ihre Wesentlichkeit in den Slots "Ware" und "Wesentlichkeit" auflisten, und dass es nur eine cList-Tatsache gibt, die eine Liste enthält von allen wesentlichen Waren. Die leeren Mehrfachfelder ("$?") Stimmen mit einer beliebigen Anzahl von Listenelementen vor und nach der wesentlichen Ware überein.

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

Tatsächlich gibt es viele wichtige Fakten. Alle deftemplate werden aus Java-Klassen deklariert, also ist 'warning' eine Klasse. Ich bekomme immer noch Fehler. – Zsy

+0

Ich habe meinen Beitrag für weitere Details bearbeitet – Zsy

0

Ernest war es fast geschafft:

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

Hinweis: Aufruf Klassen „-Liste“, die keine Listen sind und nicht einmal enthalten ist befremdlich (und es sicher verwirrt Ernest). Klassen sollten als somethingCommodity bezeichnet werden, und Feldnamen sind möglicherweise auf "id", "name" usw. beschränkt.

+0

Es tut mir leid für mein verwirrendes Beispiel. Eigentlich habe ich Kurse und Methoden in nicht-englischer Sprache geschrieben, deshalb habe ich sie ersetzt, um dich verständlich zu machen, aber vergiss diese Dinge zu berücksichtigen. Das Muster meines Systems ist das selbe mit dem Pricing_engine Beispiel in Jess71p2. Ich habe deinen Code ausprobiert und das Ergebnis auf meinen Post gesetzt. Aber immer noch, es löst mein Problem nicht. – Zsy

+0

Ich habe ein fehlendes Klammerpaar hinzugefügt! @Zsy, ohne die spezifischen Fehlermeldungen, können wir nicht erraten, was für Sie nicht funktioniert. –

+0

@ ErnestFriedman-Hill Ah, es ist gut, dass du dir meinen Code ansiehst. Ich fange an, meine Berührung zu verlieren. : -] – laune