(deftemplate binary-# (multislot name) (multislot digits)) (deftemplate add-binary-#s (multislot name-1) (multislot name-2)) (defrule add-binary-0 "Add the facts for the carry (temp) and the sum" (binary-# (name ?A) (digits $?)) (binary-# (name ?B) (digits $?)) (add-binary-#s (name-1 ?A) (name-2 ?B)) => (assert (temp 0)) (assert (binary-# (name { ?A + ?B }) (digits ))) ) (defrule add-binary-1 "The case that temp==0, first-A==1, and first-B==1" ?old-temp <- (temp 0) ?old-A <- (binary-# (name ?A) (digits $?rest-A ?first-A&1)) ?old-B <- (binary-# (name ?B) (digits $?rest-B ?first-B&1)) (add-binary-#s (name-1 ?A) (name-2 ?B)) ?old-sum <- (binary-# (name { ?A + ?B }) (digits $?sum)) => (retract ?old-temp ?old-A ?old-B ?old-sum) (assert (temp 1)) ;re-assert temp (assert (binary-# (name ?A) (digits $?rest-A))) ;re-assert old-A (assert (binary-# (name ?B) (digits $?rest-B))) ;re-assert old-B (assert (binary-# (name { ?A + ?B }) (digits 0 $?sum))) ) (defrule add-binary-2 "The case that temp==1, first-A==1, and first-B==1" (temp 1) ?old-A <- (binary-# (name ?A) (digits $?rest-A ?first-A&1)) ?old-B <- (binary-# (name ?B) (digits $?rest-B ?first-B&1)) (add-binary-#s (name-1 ?A) (name-2 ?B)) ?old-sum <- (binary-# (name { ?A + ?B }) (digits $?sum)) => (retract ?old-A ?old-B ?old-sum) (assert (binary-# (name ?A) (digits $?rest-A))) ;re-assert old-A (assert (binary-# (name ?B) (digits $?rest-B))) ;re-assert old-B (assert (binary-# (name { ?A + ?B }) (digits 1 $?sum))) ) (defrule add-binary-3 "The case that temp==0, first-A==1, and first-B==0" (temp 0) ?old-A <- (binary-# (name ?A) (digits $?rest-A ?first-A&1)) ?old-B <- (binary-# (name ?B) (digits $?rest-B ?first-B&0)) (add-binary-#s (name-1 ?A) (name-2 ?B)) ?old-sum <- (binary-# (name { ?A + ?B }) (digits $?sum)) => (retract ?old-A ?old-B ?old-sum) (assert (binary-# (name ?A) (digits $?rest-A))) ;re-assert old-A (assert (binary-# (name ?B) (digits $?rest-B))) ;re-assert old-B (assert (binary-# (name { ?A + ?B }) (digits 1 $?sum))) ) (defrule add-binary-4 "The case that temp==1, first-A==1, and first-B==0" (temp 1) ?old-A <- (binary-# (name ?A) (digits $?rest-A ?first-A&1)) ?old-B <- (binary-# (name ?B) (digits $?rest-B ?first-B&0)) (add-binary-#s (name-1 ?A) (name-2 ?B)) ?old-sum <- (binary-# (name { ?A + ?B }) (digits $?sum)) => (retract ?old-A ?old-B ?old-sum) (assert (binary-# (name ?A) (digits $?rest-A))) ;re-assert old-A (assert (binary-# (name ?B) (digits $?rest-B))) ;re-assert old-B (assert (binary-# (name { ?A + ?B }) (digits 0 $?sum))) ) (defrule add-binary-5 "The case that temp==0, first-A==0, and first-B==1" (temp 0) ?old-A <- (binary-# (name ?A) (digits $?rest-A ?first-A&0)) ?old-B <- (binary-# (name ?B) (digits $?rest-B ?first-B&1)) (add-binary-#s (name-1 ?A) (name-2 ?B)) ?old-sum <- (binary-# (name { ?A + ?B }) (digits $?sum)) => (retract ?old-A ?old-B ?old-sum) (assert (binary-# (name ?A) (digits $?rest-A))) ;re-assert old-A (assert (binary-# (name ?B) (digits $?rest-B))) ;re-assert old-B (assert (binary-# (name { ?A + ?B }) (digits 1 $?sum))) ) (defrule add-binary-6 "The case that temp==1, first-A==0, and first-B==1" (temp 1) ?old-A <- (binary-# (name ?A) (digits $?rest-A ?first-A&0)) ?old-B <- (binary-# (name ?B) (digits $?rest-B ?first-B&1)) (add-binary-#s (name-1 ?A) (name-2 ?B)) ?old-sum <- (binary-# (name { ?A + ?B }) (digits $?sum)) => (retract ?old-A ?old-B ?old-sum) (assert (binary-# (name ?A) (digits $?rest-A))) ;re-assert old-A (assert (binary-# (name ?B) (digits $?rest-B))) ;re-assert old-B (assert (binary-# (name { ?A + ?B }) (digits 0 $?sum))) ) (defrule add-binary-7 "The case that temp==0, first-A==0, and first-B==0" (temp 0) ?old-A <- (binary-# (name ?A) (digits $?rest-A ?first-A&0)) ?old-B <- (binary-# (name ?B) (digits $?rest-B ?first-B&0)) (add-binary-#s (name-1 ?A) (name-2 ?B)) ?old-sum <- (binary-# (name { ?A + ?B }) (digits $?sum)) => (retract ?old-A ?old-B ?old-sum) (assert (binary-# (name ?A) (digits $?rest-A))) ;re-assert old-A (assert (binary-# (name ?B) (digits $?rest-B))) ;re-assert old-B (assert (binary-# (name { ?A + ?B }) (digits 0 $?sum))) ) (defrule add-binary-8 "The case that temp==1, first-A==0, and first-B==0" ?old-temp <- (temp 1) ?old-A <- (binary-# (name ?A) (digits $?rest-A ?first-A&0)) ?old-B <- (binary-# (name ?B) (digits $?rest-B ?first-B&0)) (add-binary-#s (name-1 ?A) (name-2 ?B)) ?old-sum <- (binary-# (name { ?A + ?B }) (digits $?sum)) => (retract ?old-temp ?old-A ?old-B ?old-sum) (assert (temp 0)) ;re-assert temp (assert (binary-# (name ?A) (digits $?rest-A))) ;re-assert old-A (assert (binary-# (name ?B) (digits $?rest-B))) ;re-assert old-B (assert (binary-# (name { ?A + ?B }) (digits 1 $?sum))) ) (defrule add-binary-9 "The case that temp==0, no more digits in B, and any A" ?old-temp <- (temp 0) ?old-A <- (binary-# (name ?A) (digits $?rest-A ?first-A)) ?old-B <- (binary-# (name ?B) (digits)) ?old-add <- (add-binary-#s (name-1 ?A) (name-2 ?B)) ?old-sum <- (binary-# (name { ?A + ?B }) (digits $?sum)) => (retract ?old-temp ?old-A ?old-B ?old-add ?old-sum) (assert (binary-# (name { ?A + ?B }) (digits $?rest-A ?first-A $?sum))) ) (defrule add-binary-10 "The case that temp==1, no more digits in B, and first-A==0" ?old-temp <- (temp 1) ?old-A <- (binary-# (name ?A) (digits $?rest-A ?first-A&0)) ?old-B <- (binary-# (name ?B) (digits)) ?old-add <- (add-binary-#s (name-1 ?A) (name-2 ?B)) ?old-sum <- (binary-# (name { ?A + ?B }) (digits $?sum)) => (retract ?old-temp ?old-A ?old-B ?old-add ?old-sum) (assert (binary-# (name { ?A + ?B }) (digits $?rest-A 1 $?sum))) ) (defrule add-binary-11 "The case that temp==1, no more digits in B, and first-A==1" (temp 1) ?old-A <- (binary-# (name ?A) (digits $?rest-A ?first-A&1)) (binary-# (name ?B) (digits)) (add-binary-#s (name-1 ?A) (name-2 ?B)) ?old-sum <- (binary-# (name { ?A + ?B }) (digits $?sum)) => (retract ?old-A ?old-sum) (assert (binary-# (name ?A) (digits $?rest-A))) ;re-assert old-A (assert (binary-# (name { ?A + ?B }) (digits 0 $?sum))) ) (defrule add-binary-12 "The case that temp==0, no more digits in A, and any B" ?old-temp <- (temp 0) ?old-A <- (binary-# (name ?A) (digits)) ?old-B <- (binary-# (name ?B) (digits $?rest-B ?first-B)) ?old-add <- (add-binary-#s (name-1 ?A) (name-2 ?B)) ?old-sum <- (binary-# (name { ?A + ?B }) (digits $?sum)) => (retract ?old-temp ?old-A ?old-B ?old-add ?old-sum) (assert (binary-# (name { ?A + ?B }) (digits $?rest-B ?first-B $?sum))) ) (defrule add-binary-13 "The case that temp==1, no more digits in A, and first-B==0" ?old-temp <- (temp 1) ?old-A <- (binary-# (name ?A) (digits)) ?old-B <- (binary-# (name ?B) (digits $?rest-B ?first-B&0)) ?old-add <- (add-binary-#s (name-1 ?A) (name-2 ?B)) ?old-sum <- (binary-# (name { ?A + ?B }) (digits $?sum)) => (retract ?old-temp ?old-A ?old-B ?old-add ?old-sum) (assert (binary-# (name { ?A + ?B }) (digits $?rest-B 1 $?sum))) ) (defrule add-binary-14 "The case that temp==1, no more digits in A, and first-B==1" (temp 1) (binary-# (name ?A) (digits)) ?old-B <- (binary-# (name ?B) (digits $?rest-B ?first-B&1)) (add-binary-#s (name-1 ?A) (name-2 ?B)) ?old-sum <- (binary-# (name { ?A + ?B }) (digits $?sum)) => (retract ?old-B ?old-sum) (assert (binary-# (name ?B) (digits $?rest-B))) ;re-assert old-A (assert (binary-# (name { ?A + ?B }) (digits 0 $?sum))) ) (defrule add-binary-15 "The case that temp==1, no more digits in B, and no more digits in A" ?old-temp <- (temp 1) ?old-A <- (binary-# (name ?A) (digits)) ?old-B <- (binary-# (name ?B) (digits)) ?old-add <- (add-binary-#s (name-1 ?A) (name-2 ?B)) ?old-sum <- (binary-# (name { ?A + ?B }) (digits $?sum)) => (retract ?old-temp ?old-A ?old-B ?old-add ?old-sum) (assert (binary-# (name { ?A + ?B }) (digits 1 $?sum))) ) ;Facts assertion for testing (assert (binary-# (name A) (digits 1 0 1 1 1))) (assert (binary-# (name B) (digits 1 1 1 0))) (assert (add-binary-#s (name-1 A) (name-2 B))) (run) (assert (binary-# (name C) (digits 1))) (assert (binary-# (name D) (digits 1 1 1 0))) (assert (add-binary-#s (name-1 C) (name-2 D))) (run) (assert (binary-# (name E) (digits 1 0 0 0))) (assert (binary-# (name F) (digits 0 1 1 1 0))) (assert (add-binary-#s (name-1 E) (name-2 F))) (run)