CLIPS LHS переменные привязки

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

В следующем коде ?s переменная, которая представляет уровень дерева; Я хотел бы использовать одно правило для разных проверок. Вот что я пытался сделать:

(defrule EXPAND::action
(declare (salience ?*load*))
(or
    (and ?f1_a <- (status ?s transport ?c1&:(> ?c1 0) ?id1)
         ?f1_b <- (status ?s city      ?q1&:(> ?q1 0) ))

    (and ?f2_a <- (status ?s transport ?c2 ?id2)
         ?f2_b <- (status ?s city      ?q2_a  ?obj2)
         ?f2_c <- (status ?s carries   ?id2 ?q2_b ?obj2))

    (and ?f3_a <- (status ?s transport    ?c3 ?id3)
         ?f3_b <- (status ?s city         ?l3_a $?x3)
         ?f3_c <- (status ?s city         ?l3_b $?y3)
         ?f3_d <- (distance  ?l3_a ?d3    ?l3_b ?t3))
         (test (neq (str-compare ?l3_a ?l3_b) 0))
)

=>

(if  (and (fact-existp ?f1_a) (fact-existp ?f1_b))
then (assert bla1))

(if (and ?f2_a ?f2_b ?f2_c)
then (assert bla2))

(if (and ?f3_a ?f3_b ?f3_c ?f3_d)
then (assert bla3)
))

Очевидно, это не работает. Я хотел бы использовать логические значения сингла andв LHS, чтобы утверждать некоторые факты в RHS правила.

Как я могу это сделать? Есть идеи?

1 ответ

Решение

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

Другие вопросы по тегам