2016-03-22 18 views
0

JESS için yeni ve işlevselliğini biraz biliyorum. Öğrencinin id numarası isteyen ve programın gittiği ve öğrencinin konularını alan bir programım var.Kurallar etkinleşiyor, ancak ateş etmiyor JESS

Buradaki bir şey prosedürün bitiminde program, kullanıcıya başka bir öğrencinin konularını almak isteyip istemediğini sorar. Kullanıcı başka bir öğrenciyi girmek isterse, ateş eden ilk kurala geri döner, fakat bunu denediğimde, kural sadece aktiftir ve ateş etmemiştir.

Sorun ne olabilir? Tabii ki (koş) olduğundan emin oldum.

İşte kodum.

(defrule check-subject 
    ?a <- (phase check-back) 
    ?stud <- (lookupID (id ?id)) 
    (student-information (id-number ?id) 
         (course ?course) 
         (subjects-taken $?taken) 
         (year ?year) 
         (semester ?sem)) 
    (prospectus-information (curriculum-name ?course) 
          (1st-year-1st-sem-subjects $?subjects1)) 
    => 
    (printout t "Student took: " (intersection$ $?taken $?subjects1) crlf) 
    (printout t "Student flunked: " (complement$ $?taken $?subjects1) crlf) 
    (assert (back-subject (complement$ $?taken $?subjects1))) 
    (retract ?a ?stud) 
    (ask)) 

Ve faz seçim-öğrenci,

(defrule student-select 
    (phase choose-student) 
    => 
    (printout t "Input Student ID: ") 
    (assert (lookupID (id (read))))) 

öğrenci seçme kuralı

iddia aktive ama asla yangınlar olduğunda işlev

(deffunction ask() 
    (printout t "Consult another? (y/n) ") 
    (if (eq (read) y) 
    then (assert (phase choose-student)))) 

Ve defrule sormak var. Programım orada durur.

+0

Sorun Jess kodunda bir hatadır. Bu, ilgili koda bakabilecek insanlar tarafından keşfedilebilir ve tespit edilebilir. – laune

+0

Gönderiyi düzenledim. Lütfen bana yardım et. Teşekkür ederim. –

+0

Herhangi bir kullanımda olup olmadıklarını * kabul ettiğinizden emin olun. "Teşekkür ederim" yazmaları gerekli değil. – laune

cevap

0

Bir uygulamanın denetim bölümünü kurallardan ayrı yazmak daha iyidir. Bir süre fonksiyonunda

(deffunction ask() 
    (printout t "Consult another? (y/n) ") 
    (if (eq (read) y) then 
    (printout t "Input Student ID: ") 
    (assert (lookupID (id (read)))) 
    (return TRUE) 
    else 
    (return FALSE))) 

bunu kullanın:

(while (ask) do (run)) 

Ve artık (phase choose-student) gerekmez.

+0

Kodları jess 'sample programından sticks.clp'ye göre hazırlarım, ancak yeniden başlatmak isteyip istemediğini kullanıcı için sorar. Benim problemim gerçekten benim kurallarımın harekete geçmesi ve asla ateş etmemesi. Orada durur. –

+0

Önerilen kodunuzu kullanmayı denedim, ancak öğrenci kimliğini girdiğimde veri tabanımda mevcut olup olmadığını kontrol etmeme izin vermedi, ancak kodunuz beni aydınlattı. Ask-fonksiyonu ve öğrenci seçme kuralı yerine bir (koş) yerleştirdim. Teşekkür ederim! –

+0

Önerilerime tam olarak uyursanız, "kontrol etmenize izin verir". Şüpheliyim ki, kuraldan (faz kontrolünü) ihmal etmediniz. – laune

İlgili konular