Я пытался решить фермерскую дилемму.
"Смысл в том, чтобы переправить фермера, лису, капусту и козла через ручей. Но лодка вмещает только 2 предмета. Если оставить ее наедине с козой, ее съест лиса. Если оставить ее наедине с капуста, козел ее съест "
и для этого я в основном должен использовать только шаблоны функций и правила для ее решения
предположим, что фермер, лиса, козел и капуста все были на стороне -1 и хотят перейти на сторону 1
во-первых, я делаю государственный шаблон
(deftemplate state
(slot farmer)
(slot fox)
(slot goat)
(slot cab))
Я определяю функцию для выполнения движения
(deffunction move(?f ?x ?g ?c)
(if (and (neq ?f 1) (or (and (eq ?f ?g)
(and(neq ?f ?x) (neq ?f ?c)))
(or (and (neq ?f ?c) (and(eq ?f ?x) (eq ?f ?g)))
(and (eq ?f ?c) (and(eq ?f ?x) (eq ?f ?g))))))
then
(bind ?f (* -1 ?f))
(bind ?g (* -1 ?g))
(printout t "farmer become on side" ?f "fox on side " ?x
"goat on side " ?g "cabbage on side " ?c crlf)
else
(if (or (and (neq ?f ?c) (and(eq ?c ?x) (eq ?f ?g)))
(and (neq ?f ?g) (and(eq ?f ?x) (eq ?f ?c))))
then
(bind ?f (* -1 ?f))
(printout t "farmer become on side" ?f "fox on side " ?x
"goat on side " ?g "cabbage on side " ?c crlf)
else
(if (and (neq ?f ?g) (and(eq ?f ?x) (eq ?f ?c)))
then
(bind ?f (* -1 ?f))
(bind ?x (* -1 ?x))
(printout t "farmer become on side" ?f "fox on side " ?x
"goat on side " ?g "cabbage on side " ?c crlf)
else
(if (and (neq ?f ?x) (and(eq ?f ?c) (eq ?f ?g)))
then
(bind ?f (* -1 ?f))
(bind ?c (* -1 ?c))
(printout t "farmer become on side" ?f "fox on side " ?x
"goat on side " ?g "cabbage on side " ?c crlf)
))))))
Я также определяю правило
(defrule move-to-opp
(state (farmer ?f) (fox ?x) (goat ?g) (cab ?c))
(or (or (neq ?f 1) (neq ?g 1)) (or (neq ?x 1) (neq ?c 1)))
=>
(printout t "firstly farmer on side" ?f "fox on side " ?x
"goat on side " ?g "cabbage on side " ?c crlf)
(move ?f ?x ?g ?c))
Тогда я определил факты внутри шаблона, чтобы они были на первой стороне -1
(deffacts initial-state
(state (farmer -1)
(fox -1)
(goat -1)
(cab -1)))
после выполнения правил вывод не появляется, но он делает первый шаг для меня, когда я удаляю условие цикла из правила
(or (or (neq ?f 1) (neq ?g 1)) (or (neq ?x 1) (neq ?c 1)))