Как создать правила делимости в клипах?

Я новичок в системе Clips Expert, и хотел бы знать, могут ли некоторые из вас помочь реализовать правила делимости для чисел 7, 11 и 13.

Это то, что я использовал для делимости 2, но я не могу сделать то же самое для 7, 11 и 13

;Facts for divisibility of 2
(deffacts lastnumbers 
(firstnum 0)
(secondnum 2)
(thirdnum 4)
(fourthnum 6)
(fifth 8))

Я пытаюсь получить вот так:

Number 886782 is divisible by 13

Заранее спасибо.


person Andres    schedule 08.12.2020    source источник


Ответы (1)


В общем, вы не можете определить, делится ли одно число без остатка на другое, просто глядя на последнюю цифру делимого. Вместо этого посмотрите на остаток от целочисленного деления, и если он равен нулю, то дивиденд делится на делитель без остатка.

         CLIPS (6.31 6/12/19)
CLIPS>    
(defrule get-dividend
   (not (dividend ?))
   =>
   (printout t "Dividend? ")
   (assert (dividend (read))))
CLIPS> 
(defrule get-divisor
   (dividend ?dividend&:(integerp ?dividend))
   (not (divisor ?))
   =>
   (printout t "Divisor? ")
   (assert (divisor (read))))
CLIPS> 
(defrule bad-response
   (or ?f <- (dividend ?d)
       ?f <- (divisor ?d))
   (test (not (integerp ?d)))
   =>
   (retract ?f))
CLIPS>    
(defrule is-divisible
   (dividend ?dividend&:(integerp ?dividend))
   (divisor ?divisor&:(integerp ?divisor))
   =>
   (printout t "Dividend " ?dividend " is"
               (if (= (mod ?dividend ?divisor) 0)
                  then " "
                  else " not ")
               "divisible by " ?divisor crlf)) 
CLIPS> (reset)
CLIPS> (run)
Dividend? 17
Divisor? 3
Dividend 17 is not divisible by 3
CLIPS> (reset)
CLIPS> (run)
Dividend? 886782
Divisor? 13
Dividend 886782 is divisible by 13
CLIPS> 
person Gary Riley    schedule 08.12.2020
comment
Я понимаю вашу точку зрения, спасибо! - person Andres; 08.12.2020