Я работаю над программой, которая расскажет мне, какие шаги нужно делать в игре с точками и коробками. Я пытаюсь реализовать defrule
, который будет проверять, есть ли в ящике 2
возможных удаленных сторон 4
. Если это так, то я не хочу брать одну из оставшихся двух строк, так как это даст оппоненту свободный бал.CLIPS defrule проверка, если приняты несколько сторон коробки
(defrule Player_Move_No_Box_1_1
(next_turn p)
(turn_num ?t_num)
(test(> ?t_num 3))
(line ?l1&~1)
(not(line 1))
=>
(if
(not(or(and(any-factp ((?l line)) (member$ (+ ?l1 3) ?l:implied))(any-factp ((?l line)) (member$ (+ ?l1 4) ?l:implied)))
(and(any-factp ((?l line)) (member$ (+ ?l1 3) ?l:implied))(any-factp ((?l line)) (member$ (+ ?l1 7) ?l:implied)))
(and(any-factp ((?l line)) (member$ (+ ?l1 4) ?l:implied))(any-factp ((?l line)) (member$ (+ ?l1 7) ?l:implied)))))
then
(printout t "Take line #1" crlf)
(assert(line 1))
(assert(next_turn c))))
Я пробовал много разных вещей, но это последний код, который я пытался использовать, но безуспешно. Для этого фрагмента кода я смотрю line 1
(по часовой стрелке, начиная с верхней части коробки пронумерованы: x
, x+4
, x+7
, x+3
). Есть ли более простой способ сделать эту проверку, или так будет работать, и я только что испортил код?