Pergunta

Como você testa a existência de fato no RHS das regras em Clipes? Estou tentando projetar uma regra que "marcará" o estado atual, contando quantos fatos de meta existem. É óbvio como testar fatos no LHS, mas não consigo encontrar como fazer o equivalente no RHS.

Eu quero fazer algo assim, embora este não seja um código de clipes válidos:

(defrule score-state ""
    ?score <- (score (value ?value))
    =>
    (modify ?score (value (+ (exists (goal-1)) (exists (goal-2)) (exists (goal-3))))))

Para que, se nenhum dos estados da meta existir, existiria o fato (pontuação (valor 0)). Por outro lado, se todos os estados do objetivo existissem, existiria o fato (pontuação (valor 3)).

O manual de referência menciona o existente de fatos da função, mas isso parece exigir que tenha passado um endereço de fato. Tentei usá-lo como (existp de fatos (Objetivo-1), mas os clipes me dão um erro de sintaxe.

Foi útil?

Solução

(deftemplate score
   (slot value))

(deftemplate goal-1)

(deftemplate goal-2)

(deftemplate goal-3)

(deffacts start
   (score (value undefined))
   (goal-1)
   (goal-3))

(deffunction ecount (?g)
   (if (any-factp ((?f ?g)) TRUE)
      then (return 1)
      else (return 0)))

(defrule score-state ""
    ?score <- (score (value undefined))
    =>
    (modify ?score (value (+ (ecount goal-1) (ecount goal-2) (ecount goal-3)))))
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top