Question
Je veux faire un programme dans les clips qui génère toutes les partitions d'un certain nombre. Tout d'abord je commence par le numéro comme sa partition de base: (1 1 1 1 1) si elle est le numéro 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))
)
Le problème est que bien que le code semble bien, il a des erreurs sur les lignes avec « non » - où je précise que la nouvelle partition créée ne devrait pas exister déjà dans les faits. Je ne sais pas quel est le problème, toute idée est la bienvenue. Merci
La solution
Dans la partie de l'état d'une règle, vous devez utiliser l'opérateur = pour évaluer une expression et déterminer si elle correspond à une valeur dans le fait:
(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)))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow