Pregunta

Quiero hacer un programa en clips que genera todas las particiones de un número. En primer lugar de empezar con el número como su partición básica: (1 1 1 1 1) si es el número 5, etc.

(deftemplate partition (multislot p) )
(deffacts facts (p 1 1 1 1 1) )
(defrule adds
    (p $?a ?b ?c $?d)
    (not (p $?a (+ ?b ?c) $?d))
    (not (p (+ ?b ?c) $?a $?d))
    (not (p $?a $?d (+ ?b ?c)))
=>  (assert (p $?a (+ ?b ?c) $?d)) 
)

El problema es que aunque el código parece estar bien, tiene errores en las líneas con el "no" - donde puedo especificar que la nueva partición creada no debe existir ya en los hechos. No sé cuál es el problema, cualquier idea es bienvenida. Gracias

¿Fue útil?

Solución

En la parte condicional de una regla, es necesario utilizar el operador = para evaluar una expresión y determinar que coincide con un valor en el hecho de:

(defrule adds
   (p $?a ?b ?c $?d)

   (not (p $?a =(+ ?b ?c) $?d))

   (not (p =(+ ?b ?c) $?a $?d))

   (not (p $?a $?d =(+ ?b ?c)))

   => 

   (assert (p $?a (+ ?b ?c) $?d)))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top