(defrule move-train :forward
:context train
(train ?train position ?train-pos)
(signal ?signal position ?signal-pos
colour green)
(test (= ?signal-pos (1+ ?train-pos)))
-->
((format t "~%Train moving to position ~s"
?signal-pos))
(assert (signal ?signal colour red))
(assert (train ?train position ?signal-pos)))
specifies that if there is a train with a green signal directly in front then the train may move on and the signal changes to red.
KnowledgeWorks and Prolog User Guide (Unix version) - 6 Dec 2011