Клипы блокирует мир - PullRequest
       6

Клипы блокирует мир

0 голосов
/ 07 октября 2018

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

(assert (стек ABC) (стек DEF) (стек ворот цели) (стек ворот A) (стек ворот FE))

Это мой код:

(defrule move-direct
;(declare (salience 10000))
?stack1 <- (stack ?block1 $?bottom1)
?stack2 <- (stack ?block2 $?bottom2)
(goal-stack ?block1 ?block2 $?goalbottom)
=>
(retract ?stack1 ?stack2)
(assert (stack ?block1 ?block2 ?bottom2))
 (assert (stack $?bottom1))
 (printout t ?block1 " moved on top of " ?block2 crlf))

(defrule move-on-floor
; (declare (salience 10000))
 ?stack1 <- (stack ?top $?blocks ?movethisblock $?bottom1)
;(goal-stack ?movethisblock $?bottom1)
 (goal-stack $?blocks ?movethisblock $?bottom2)
 =>
 (retract ?stack1)
 (assert (stack ?top))
 (assert (stack $?blocks ?movethisblock $?bottom1))
 (printout t ?top " moved on to the floor" crlf))

1 Ответ

0 голосов
/ 08 октября 2018

Отладка кода обычно включает в себя сомнение ваших ожиданий.Вы ожидаете, что правила прямого движения и перемещения по полу что-то сделают, но почему?Для правила прямого движения и сделанных вами утверждений единственными возможными значениями? Block1 и? Block2 в первых двух шаблонах являются либо A, либо D. Таким образом, третий шаблон должен соответствовать целевому стеку, который начинается с AA, AD, DA или D D. Такого стека ворот не существует, поэтому этому правилу нет равных.

Для правила перемещения по этажу рассмотрим каждый случай.Если (целевой стек A) совпадает с шаблоном целевого стека, где? Move-this-block - это A, а $? Blocks - (), то должен быть стек, который имеет блок сверху A (переменная? Top).Поскольку A находится на вершине стека, правило не будет соответствовать этому целевому стеку.

, если (FE целевого стека) соответствует шаблону целевого стека, последовательность ($? Blocks?move-this-block) - либо (FE), либо F. Нет стека с любой из этих последовательностей, где есть только один блок сверху, поэтому правило не будет соответствовать этой последовательности.

Если (DCB стека ворот) соответствует шаблону стека ворот, последовательность из стека ворот, которая должна соответствовать стеку, является (DCB), (DC) или (D).Опять же, нет стека, который содержит эту последовательность с одним блоком в верхней части последовательности.

В логике для правила move-direct вы хотите напрямую перемещать блок только тогда, когда существующий стек соответствует днучасть стека ворот.Для правила перемещения по полу вы также должны убедиться, что вы не перемещаете блоки из частично заполненного стека.

              CLIPS (6.31 2/3/18)
    CLIPS> 
(defrule move-direct
   (declare (salience 10))
   ?stack1 <- (stack ?block1 $?bottom)
   ?stack2 <- (stack ?block2 $?goalbottom)
   (goal-stack $? ?block1 ?block2 $?goalbottom)
   =>
   (retract ?stack1 ?stack2)
   (assert (stack ?block1 ?block2 ?goalbottom))
   (assert (stack $?bottom))
   (printout t ?block1 " moved on top of " ?block2 crlf))
CLIPS> 
(defrule move-on-floor
   (goal-stack $? ?next $?goalbottom)
   (not (stack $? ?next $?goalbottom))
   ?stack <- (stack $?top ?bottom)
   (test (member$ ?next ?top))
   =>
   (retract ?stack)
   (assert (stack (nth$ 1 ?top)))
   (assert (stack (rest$ ?top) ?bottom))
   (printout t (nth$ 1 ?top) " moved on to the floor" crlf))
CLIPS> 
(assert (stack A B C)
        (stack D E F)
        (goal-stack D C B)
        (goal-stack A)
        (goal-stack F E))
<Fact-5>
CLIPS> (run)
D moved on to the floor
E moved on to the floor
F moved on top of E
A moved on to the floor
B moved on to the floor
C moved on top of B
D moved on top of C
CLIPS> (facts)
f-0     (initial-fact)
f-3     (goal-stack D C B)
f-4     (goal-stack A)
f-5     (goal-stack F E)
f-10    (stack F E)
f-11    (stack)
f-12    (stack A)
f-17    (stack D C B)
For a total of 8 facts.
CLIPS> (reset)
CLIPS> 
(assert (stack A B C)
        (goal-stack A B)
        (goal-stack C))
<Fact-3>
CLIPS> (run)
A moved on to the floor
B moved on to the floor
A moved on top of B
CLIPS> (facts)
f-0     (initial-fact)
f-2     (goal-stack A B)
f-3     (goal-stack C)
f-7     (stack C)
f-8     (stack A B)
f-9     (stack)
For a total of 6 facts.
CLIPS>
...