CLIPS пример программы - допрос автоугонщиков

[другие примеры программ на CLIPS ]

;программа на логику высказываний.
;Следователь допрашивает четырех гангстеров по делу о похищении автомобиля и получает следующие показания:
; Джек: Если Том не угонял автомобиль, то его угнал Боб
; Боб: Если Джек не угонял автомобиль, то его угнал Том
; Фред: Если Том не угонял автомобиль, то его угнал Джек
; Том: Если Боб не угонял автомобиль, то его угнал я.
;Выяснилось, что Боб солгал, а том сказал правду. Кто угнал автомобиль? Правдивы ли показания Джека и Фреда?
;
(deftemplate gangster
  (slot name (type SYMBOL))
  (slot guilty (type SYMBOL) (default Unk))
  (slot truthful (type SYMBOL) (default Unk))
)

(deffacts content
  (gangster (name Jack))
  (gangster (name Bob)(truthful No))
  (gangster (name Fred)(guilty No))
  (gangster (name Tom)(truthful Yes))
)

(defrule stop
  (gangster (name Jack) (guilty ~Unk) (truthful ~Unk))
  (gangster (name Bob) (guilty ~Unk) (truthful ~Unk))
  (gangster (name Fred) (guilty ~Unk) (truthful ~Unk))
  (gangster (name Tom) (guilty ~Unk) (truthful ~Unk))
=>
  (halt)
)

;;в соответствии с показаниями Джека и Тома

(defrule Jack_Tom_truthful_1
  (gangster (name Jack|Tom) (truthful Yes))
  (gangster (name Tom) (guilty No))
  ?Bob<-(gangster(name Bob) (guilty Unk))
=>
  (modify ?Bob(guilty Yes))
) 

(defrule Jack_Tom_truthful_2
  (gangster (name Jack|Tom) (truthful Yes))
  (gangster (name Bob) (guilty No))
  ?Tom<-(gangster(name Tom) (guilty Unk))
=>
  (modify ?Tom(guilty Yes))
)

(defrule Jack_Tom_not_truthful
  (gangster (name Jack|Tom) (truthful No))
  ?X<-(gangster (name Bob|Tom) (guilty Unk))
=>
  (modify ?X(guilty No))
)


;;в соответствии с показаниями Боба и Фреда

(defrule Bob_Fred_truthful_1
  (gangster (name Bob|Fred) (truthful Yes))
  (gangster (name Jack) (guilty No))
  ?Tom<-(gangster(name Tom) (guilty Unk))
=>
  (modify ?Tom(guilty Yes))
) 

(defrule Bob_Fred_truthful_2
  (gangster (name Bob|Fred) (truthful Yes))
  (gangster (name Tom) (guilty No))
  ?Jack<-(gangster(name Jack) (guilty Unk))
=>
  (modify ?Jack(guilty Yes))
)

(defrule Bob_Fred_not_truthful
  (gangster (name Bob|Fred) (truthful No))
  ?X<-(gangster (name Jack|Tom) (guilty Unk))
=>
  (modify ?X(guilty No))
)

;;Выясняем кто говорит правду, а кто нет

(defrule Jack_Tom_is_truthful
  ?X<-(gangster(name Jack|Tom) (truthful Unk))
  (gangster(name Tom|Bob) (guilty Yes))
=>
  (modify ?X(truthful Yes))
) 

(defrule Jack_Tom_is_not_truthful
  ?X<-(gangster(name Jack|Tom) (truthful Unk))
  (gangster(name Tom) (guilty No))
  (gangster(name Bob) (guilty No))
=>
  (modify ?X(truthful No))
) 

(defrule Bob_Fred_is_truthful
  ?X<-(gangster(name Bob|Fred) (truthful Unk))
  (gangster(name Tom|Jack) (guilty Yes))
=>
  (modify ?X(truthful Yes))
) 

(defrule Bob_Fred_is_not_truthful
  ?X<-(gangster(name Bob|Fred) (truthful Unk))
  (gangster(name Tom) (guilty No))
  (gangster(name Jack) (guilty No))
=>
  (modify ?X(truthful No))
)