Первый код CLIPS не работает

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

Это мой код и ошибки, которые я получаю:

(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.")
             )
    ))

Ошибки:

[ARGACCES5] Функция ‹ ожидается, что аргумент №1 будет иметь тип integer или float

[PRCCODE3] Неопределенный размер переменной, указанный в правой части деруля.

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

[CSTRCPSR1] ПРЕДУПРЕЖДЕНИЕ. Переопределение дефруле: заключение «день-к-закрытию» +j+j


person Yatiac    schedule 12.02.2015    source источник


Ответы (1)


Некоторые предлагают исправления:

(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> 
person Gary Riley    schedule 12.02.2015
comment
Спасибо за помощь! Можете ли вы сказать мне, что я делал неправильно. Я очень хочу выучить этот язык CLIPS - person Yatiac; 12.02.2015
comment
1) Синтаксис, используемый для связывания переменных, был неправильным. - person Gary Riley; 12.02.2015
comment
2) В правиле определения-субботы-закрытия шаблон пятница-загрузка должен был проверять наличие загрузки менее 1000000, а не отсутствие факта с загрузкой менее 1000000. 3) День-до Правило закрытого заключения должно иметь меньшую значимость, чем другие правила, чтобы оно выполнялось только после применения всех остальных правил. Если вы уберете выделение и запустите программу с размером счета и оплаченными счетами на 3 000 000, вы поймете, почему. - person Gary Riley; 12.02.2015
comment
Еще раз спасибо. Я запускаю программу и работает как шарм. Еще одна вещь. Если размер биллинга ‹, чем 1000000, мне нужно сделать вывод, что закрытие может быть MtTh, потому что неоплаченный номер не может быть больше, чем размер биллинга. - person Yatiac; 12.02.2015
comment
Я меняю determine-unpaid-invoices-number на запрос (and (not (day-to-close ?)) (not (unpaid-invoices-number ?)) ), но это не работает. Может быть, что-то, связанное с заметностью, может помочь. - person Yatiac; 12.02.2015
comment
Обертывание и вокруг этой группы шаблонов не должно изменить ее поведение. Не работает довольно расплывчато. - person Gary Riley; 13.02.2015
comment
Когда я сказал, что не работает, я имел в виду, что даже когда размер счета составляет ‹ 1000000, программа спрашивает у меня неоплаченный номер, но я хочу, чтобы, когда размеры счета не превышают или равны 1000000, он автоматически делал вывод, что вы можете закрыть его в понедельник до четверга - person Yatiac; 13.02.2015