Как утверждать значение, противоположное значению сопоставления?

У меня есть правило, в котором есть слот, который выполняет сопоставление двух цветов, и не имеет значения, какой из них будет соответствовать, если после сопоставления он изменится на противоположный цвет. Однако, когда я пишу это, я получаю синтаксическую ошибку:

(defrule colour
?col <- (colorTemp(color ?color&white|black))
=>
(modify ?col (color ?colorOpposite&~?color))
)

Спасибо


person user47    schedule 07.01.2021    source источник
comment
Какая у вас ошибка? Пожалуйста, включите его в вопрос. Что вы имеете в виду под противоположным цветом? Как определить, что цвет противоположен другому?   -  person noxdafox    schedule 07.01.2021
comment
Спасибо за ответ, я получаю синтаксическую ошибку в части изменения, поэтому, если, например, он совпадает с черным, я хочу изменить его на белый и наоборот.   -  person user47    schedule 07.01.2021
comment
Пожалуйста, скопируйте и вставьте все сообщение об ошибке в вопрос. См. как спросить справочник SO. Как система узнает, что черное противоположно белому? У вас это где-то определено как правило?   -  person noxdafox    schedule 07.01.2021


Ответы (1)


Синтаксис ?colorOpposite&~?color недействителен в действиях правила, а переменная ?colorOpposite нигде в правиле не привязана, поэтому обе эти проблемы приведут к ошибкам. Вам также нужно добавить некоторый код, который определяет цветовые противоположности. Чтобы предотвратить зацикливание от одного противоположного к другому, вам нужно будет каким-то образом указать, что цвет был изменен.

         CLIPS (6.31 6/12/19)
CLIPS> 
(deftemplate colorTemp
   (slot color)
   (slot changed (default no)))
CLIPS>    
(deffacts opposites
   (opposite white black))
CLIPS> 
(defrule colour
   ?col <- (colorTemp (color ?color&white|black)
                      (changed no))
   (or (opposite ?color ?opposite)
       (opposite ?opposite ?color))
   =>
   (modify ?col (color ?opposite)
                (changed yes)))
CLIPS> (reset)
CLIPS> (assert (colorTemp (color white)))
<Fact-2>
CLIPS> (facts)
f-0     (initial-fact)
f-1     (opposite white black)
f-2     (colorTemp (color white) (changed no))
For a total of 3 facts.
CLIPS> (agenda)
0      colour: f-2,f-1
For a total of 1 activation.
CLIPS> (run)
CLIPS> (facts)
f-0     (initial-fact)
f-1     (opposite white black)
f-3     (colorTemp (color black) (changed yes))
For a total of 3 facts.
CLIPS> 
person Gary Riley    schedule 07.01.2021