2015-02-12 5 views
0

Я написал свой первый код CLIPS для школьного проекта, но я не знаком с CLIPS (я использую C# и python в качестве основных языков).Первый код CLIPS не работает

Это мой код и ошибки я собирающий:

(defrule determine-closing-date 
    (not (day-to-close ?)) 
    (billing-size ?) 
    (unpaid-invoices-number ?) 
    => 
    (if 
     (or 
      (< billing-size 1000000) 
      (< unpaid-invoices-number 1000000) 
     ) 
     then (assert (day-to-close MtTh)) 
     else (assert (day-to-close friday)) 
    ) 

(defrule determine-billing-size "" 
    (not (billing-size ?)) 
    (not (day-to-close ?)) 
    => 
    (printout t "¿Cuál es el tamaño de la facturacion?") 
    (assert (billing-size ?size (read)))) 

(defrule determine-unpaid-invoices-number "" 
    (not (unpaid-invoices-number ?)) 
    (not (day-to-close ?)) 
    => 
    (printout t "¿Cuál es la cantidad de facturas no pagadas") 
    (assert (unpaid-invoices-number ?size (read)))) 

(defrule determine-friday-load "" 
    (day-to-close friday) 
    (not (friday-load ?)) 
    => 
    (printout t "¿Cuál es la carga de cierres para el viernes?") 
    (assert (friday-load ?load (read)))) 

(defrule determine-saturday-closing "" 
    (day-to-close friday) 
    (not(< friday-load 1000000)) 
    => 
    (assert (day-to-close saturday))) 

(defrule day-to-close-conclulssion "" 
    (day-to-close ?) 
    => 
    (if (eq day-to-close MtTh) 
     then (printout t "Se puede cerrar de Lunes a Jueves") 
     else (
      if (eq day-to-close friday) 
       then (printout t "Se debe cerrar viernes.") 
       else (printout t "Se debe cerrar sabado.") 
      ) 
    )) 

В errores являются:

[ARGACCES5] Функция < ожидается аргумент # 1, чтобы быть целочисленного типа или плавать

[PRCCODE3] Неопределенный размер переменной, указанный в RHS дефлектора.

[CSTRCPSR1] ПРЕДУПРЕЖДЕНИЕ: Переопределение defrule: определить,-субботу-закрытие + J + J + J

[CSTRCPSR1] ПРЕДУПРЕЖДЕНИЕ: Переопределение defrule: изо дня в близком conclulssion + J + J

ответ

2

Некоторые предложить изменения:

(defrule determine-closing-date 
    (not (day-to-close ?)) 
    (billing-size ?billing-size) 
    (unpaid-invoices-number ?unpaid-invoices-number) 
    => 
    (if (or (< ?billing-size 1000000) 
      (< ?unpaid-invoices-number 1000000)) 
     then (assert (day-to-close MtTh)) 
     else (assert (day-to-close friday)))) 

(defrule determine-billing-size "" 
    (not (billing-size ?)) 
    (not (day-to-close ?)) 
    => 
    ; What is the size of the billing? 
    (printout t "¿Cuál es el tamaño de la facturacion? ") 
    (bind ?size (read)) 
    (assert (billing-size ?size))) 

(defrule determine-unpaid-invoices-number "" 
    (not (unpaid-invoices-number ?)) 
    (not (day-to-close ?)) 
    => 
    ; What is the amount of unpaid bills? 
    (printout t "¿Cuál es la cantidad de facturas no pagadas? ") 
    (bind ?size (read)) 
    (assert (unpaid-invoices-number ?size))) 

(defrule determine-friday-load "" 
    (day-to-close friday) 
    (not (friday-load ?)) 
    => 
    ; What is the burden of closures for Friday? 
    (printout t "¿Cuál es la carga de cierres para el viernes? ") 
    (bind ?load (read)) 
    (assert (friday-load ?load))) 

(defrule determine-saturday-closing "" 
    ?dtc <- (day-to-close friday) 
    (friday-load ?load&:(< ?load 1000000)) 
    => 
    (retract ?dtc) 
    (assert (day-to-close saturday))) 

(defrule day-to-close-conclusion "" 
    (declare (salience -10)) 
    (day-to-close ?day-to-close) 
    => 
    (switch ?day-to-close 
     (case MtTh 
      ; Can be closed from Monday to Thursday. 
      then (printout t "Se puede cerrar de Lunes a Jueves." crlf)) 
     (case friday 
      ; Must be closed Fridays. 
      then (printout t "Se debe cerrar viernes." crlf)) 
     (default 
      ; Must be closed Saturday. 
      then (printout t "Se debe cerrar sabado." crlf)))) 

И выход он производит:

CLIPS> Loading Buffer... 
****** 
CLIPS> (reset) 
CLIPS> (run) 
¿Cuál es el tamaño de la facturacion? 10 
¿Cuál es la cantidad de facturas no pagadas? 10 
Se puede cerrar de Lunes a Jueves. 
CLIPS> (reset) 
CLIPS> (run) 
¿Cuál es el tamaño de la facturacion? 3000000 
¿Cuál es la cantidad de facturas no pagadas? 3000000 
¿Cuál es la carga de cierres para el viernes? 10 
Se debe cerrar sabado. 
CLIPS> (reset) 
CLIPS> (run) 
¿Cuál es el tamaño de la facturacion? 3000000 
¿Cuál es la cantidad de facturas no pagadas? 3000000 
¿Cuál es la carga de cierres para el viernes? 3000000 
Se debe cerrar viernes. 
CLIPS> 
+0

Спасибо за вашу помощь! Можете ли вы сказать, что я делаю неправильно. Я действительно хочу изучить этот CLIPS languague – Yatiac

+1

1) Синтаксис, используемый для привязки переменных, был неправильным. –

+1

2) В правиле определения-субботы-закрытия шаблон пятнистой нагрузки необходимо проверить на наличие нагрузки менее 1000000, а не на отсутствие факта с нагрузкой менее 1000000. 3) День чтобы закрыть правило вывода, чтобы иметь более низкую значимость, чем другие правила, чтобы он выполнялся только после применения всех других правил. Если вы удалите значимость и запустите программу с размером платежа и оплаченными счетами 3000000, вы поймете, почему. –