;******************************************* ; MAIN MODULE ;******************************************* (defmodule MAIN (export deftemplate moves) (export deftemplate edge) (export deftemplate taken) (export deftemplate taken2) (export deftemplate group) (export deftemplate box) (export deftemplate box-has-four-edge) (export deftemplate common-edge) (export deftemplate counter) (export deftemplate left-total-box) (export deftemplate group-counter) (export deftemplate groups) (export deftemplate aline) (export deftemplate my-groups)) ;record the next move (computer or human) (deftemplate MAIN::moves (multislot next-move)) (deftemplate MAIN::taken(slot human )) (deftemplate MAIN::taken2(slot computer)) (deftemplate MAIN::group(slot decide-divide-group)) (deftemplate MAIN::go(slot go-group)) (deftemplate MAIN::group-counter(slot counter)) (deftemplate MAIN::my-groups(slot state)) (deftemplate MAIN::edge(slot nbr-edge)(slot edge-taken)(slot shared)(slot selected)) (deftemplate MAIN::aline(slot num)(slot x1)(slot y1)(slot x2)(slot y2)) (deftemplate MAIN::box(slot nbr-box)) (deftemplate MAIN::box-has-four-edge(slot box)(slot up)(slot left)(slot right)(slot down)(slot total-taken)(slot total-selected)) (deftemplate MAIN::common-edge(slot box1)(slot box2)(slot co-edge)) (deftemplate MAIN::groups(slot nbr-group)(multislot member)(slot total)) (deftemplate MAIN::counter(slot human-taken)(slot computer-taken)) (deftemplate MAIN::left-total-box(slot number)) ;************************************************ ; ; UGI ;************************************************* (defglobal ?*main-frame* = 0) (defglobal ?*canvas* = 0) (defglobal ?*panel* = 0) (defglobal ?*text-win* = 0) (defglobal ?*big-font* = 0) (defglobal ?*blue-pen* = 0) (defglobal ?*black-dot* = 0) (defglobal ?*red-pen* = 0 ) (defglobal ?*draw-pen* = 0) ;My constants (defglobal ?*block-size* = 50) (defglobal ?*min-x* = 0) (defglobal ?*min-y* = 0) (defglobal ?*max-x* = (* 7 ?*block-size*)) (defglobal ?*max-y* = (* 5 ?*block-size*)) (defglobal ?*choi* = 0) (deffunction on-close (?frame) (format t "Closing frame.%n") 1) ;sizing callback (deffunction on-size (?id ?w ?h) (if (and (neq ?id 0) (neq ?*panel* 0) (neq ?*text-win* 0)) then (bind ?client-width (window-get-client-width ?id)) (bind ?client-height (window-get-client-height ?id)) (window-set-size ?*panel* 0 0 ?client-width (* ?client-height 0.666)) (window-set-size ?*text-win* 0 (* ?client-height 0.666) ?client-width (/ ?client-height 3)) ) ) ;draw the game board (deffunction draw-grid (?canvas) (bind ?dc (canvas-get-dc ?canvas)) (dc-set-pen ?dc ?*black-dot*) (bind ?row ?*min-y*) (dc-draw-line ?dc ?*min-x* ?row ?*max-x* ?row) (bind ?row (+ ?row ?*block-size*)) (dc-draw-line ?dc ?*min-x* ?row ?*max-x* ?row) (bind ?row (+ ?row ?*block-size*)) (dc-draw-line ?dc ?*min-x* ?row ?*max-x* ?row) (bind ?row (+ ?row ?*block-size*)) (dc-draw-line ?dc ?*min-x* ?row ?*max-x* ?row) (bind ?row (+ ?row ?*block-size*)) (dc-draw-line ?dc ?*min-x* ?row ?*max-x* ?row) (bind ?row (+ ?row ?*block-size*)) (dc-draw-line ?dc ?*min-x* ?row ?*max-x* ?row) (bind ?col ?*min-x*) (dc-draw-line ?dc ?col ?*min-y* ?col ?*max-y* ) (bind ?col (+ ?col ?*block-size*)) (dc-draw-line ?dc ?col ?*min-y* ?col ?*max-y* ) (bind ?col (+ ?col ?*block-size*)) (dc-draw-line ?dc ?col ?*min-y* ?col ?*max-y* ) (bind ?col (+ ?col ?*block-size*)) (dc-draw-line ?dc ?col ?*min-y* ?col ?*max-y* ) (bind ?col (+ ?col ?*block-size*)) (dc-draw-line ?dc ?col ?*min-y* ?col ?*max-y* ) (bind ?col (+ ?col ?*block-size*)) (dc-draw-line ?dc ?col ?*min-y* ?col ?*max-y* ) (bind ?col (+ ?col ?*block-size*)) (dc-draw-line ?dc ?col ?*min-y* ?col ?*max-y* ) (bind ?col (+ ?col ?*block-size*)) (dc-draw-line ?dc ?col ?*min-y* ?col ?*max-y* ) ) ; button callback (deffunction frame-button-proc (?id) (bind ?parent (window-get-parent ?id)) (bind ?grandparent (window-get-parent ?parent)) (draw-grid ?*canvas*) ) ;choice callback (deffunction choice-proc (?choiceid) (bind ?item (choice-get-selection ?choiceid)) (if (eq ?item 1) then (assert (player c)) (printout t "player c" crlf) (run) ) ) ;;on-event only for human draws. draw a line where mouse clicks. (deffunction on-event (?canvas ?event) (bind ?dc (canvas-get-dc ?canvas)) (bind ?*draw-pen* ?*blue-pen*) (dc-set-pen ?dc ?*draw-pen*) (bind ?x (mouse-event-position-x ?event)) (bind ?y (mouse-event-position-y ?event)) (if (and (>= ?x ?*min-x*) (< ?x ?*max-x*) (>= ?y ?*min-y*) (< ?y ?*max-y*)) then (if (eq 1 (mouse-event-left-down ?event)) then ;left click,draw horizontal line (bind ?x (* (integer (/ ?x 50)) 50)) (bind ?y (* (integer (+ (/ ?y 50) 0.5)) 50)) (dc-draw-line ?dc ?x ?y (+ ?x 50) ?y) (bind ?*choi* (integer (+ (/ ?x 50) 1 (* 15 (integer (/ ?y 50)))))) (assert (player h)) (run) ) (if (eq 1 (mouse-event-right-down ?event)) then ;right click, draw vertical line (bind ?x (* (integer (+ (/ ?x 50) 0.5)) 50)) (bind ?y (* (integer (/ ?y 50)) 50)) (dc-draw-line ?dc ?x ?y ?x (+ ?y 50)) (bind ?*choi* (integer (+ (/ ?x 50) 8 (* 15 (integer (/ ?y 50)))))) (assert (player h)) (run) ) ) ) ;create a frame and canvas (deffunction app-on-init() (unwatch all) ;(reset) ;(run) (bind ?*big-font* (font-create 16 wxSWISS wxNORMAL wxNORMAL 0)) (bind ?*blue-pen* (pen-create BLUE 6 wxSOLID)) (bind ?*black-dot* (pen-create BLACK 1 wxDOT)) (bind ?*red-pen* (pen-create RED 6 wxSOLID)) (bind ?*main-frame* (frame-create 0 "Dots and Boxes!" -1 -1 (+ 10 (* 7 ?*block-size*)) (* 7 ?*block-size*))) (bind ?*canvas* (canvas-create ?*main-frame* 0 0 (* 7 ?*block-size*) (* 5 ?*block-size*))) (window-add-callback ?*canvas* OnEvent on-event) (window-add-callback ?*main-frame* OnSize on-size) (window-add-callback ?*main-frame* OnClose on-close) ;make a panel and panel items (bind ?*panel* (panel-create ?*main-frame* 0 (* 5 ?*block-size*) (* 7 ?*block-size*))) (bind ?choice (choice-create ?*panel* choice-proc " Who goes first?")) (choice-append ?choice "Human") (choice-append ?choice "Computer") (choice-append ?choice "Just fucking pick one!") (choice-set-selection ?choice 0) (bind ?button (button-create ?*panel* frame-button-proc "Start")) (window-centre ?*main-frame* wxBOTH) (window-show ?*main-frame* 1) ?*main-frame* );end app-on-init (deffunction draw-C(?canvas ?boxnum) (bind ?dc (canvas-get-dc ?canvas)) (dc-set-pen ?dc ?*draw-pen*) (bind ?x (integer (* 50 (mod (- ?boxnum 1) 7)))) (bind ?y (integer (* 50 (integer (/ (- ?boxnum 1) 7))))) (dc-draw-line ?dc (+ ?x 15) (+ ?y 15) (+ ?x 35) (+ ?y 15)) (dc-draw-line ?dc (+ ?x 15) (+ ?y 15) (+ ?x 15) (+ ?y 35)) (dc-draw-line ?dc (+ ?x 15) (+ ?y 35) (+ ?x 35) (+ ?y 35)) ) (deffunction draw-H(?canvas ?boxnum) (bind ?dc (canvas-get-dc ?canvas)) (dc-set-pen ?dc ?*draw-pen*) (bind ?x (integer (* 50 (mod (- ?boxnum 1) 7)))) (bind ?y (integer (* 50 (integer (/ (- ?boxnum 1) 7))))) (dc-draw-line ?dc (+ ?x 15) (+ ?y 15) (+ ?x 15) (+ ?y 35)) (dc-draw-line ?dc (+ ?x 15) (+ ?y 25) (+ ?x 35) (+ ?y 25)) (dc-draw-line ?dc (+ ?x 35) (+ ?y 15) (+ ?x 35) (+ ?y 35)) ) (deffunction draw-cross(?canvas ?boxnum) (bind ?dc (canvas-get-dc ?canvas)) (dc-set-pen ?dc ?*draw-pen*) (bind ?x (integer (* 50 (mod (- ?boxnum 1) 7)))) (bind ?y (integer (* 50 (integer (/ (- ?boxnum 1) 7))))) (dc-draw-line ?dc ?x ?y (+ ?x 50) (+ ?y 50)) (dc-draw-line ?dc (+ ?x 50) ?y ?x (+ ?y 50)) ) ;******************************************************** ; FACTS ;******************************************************** (deffacts box-number (left-total-box(number 35)) ;(moves(next-move)) (counter(human-taken 0)(computer-taken 0)) ; (go(go-group yes)) (group-counter(counter 0))) (deffacts alines (aline (num 1)(x1 0)(y1 0)(x2 50)(y2 0)) (aline (num 2)(x1 50)(y1 0)(x2 100)(y2 0)) (aline (num 3)(x1 100)(y1 0)(x2 150)(y2 0)) (aline (num 4)(x1 150)(y1 0)(x2 200)(y2 0)) (aline (num 5)(x1 200)(y1 0)(x2 250)(y2 0)) (aline (num 6)(x1 250)(y1 0)(x2 300)(y2 0)) (aline (num 7)(x1 300)(y1 0)(x2 350)(y2 0)) (aline (num 8)(x1 0)(y1 0)(x2 0)(y2 50)) (aline (num 9)(x1 50)(y1 0)(x2 50)(y2 50)) (aline (num 10)(x1 100)(y1 0)(x2 100)(y2 50)) (aline (num 11)(x1 150)(y1 0)(x2 150)(y2 50)) (aline (num 12)(x1 200)(y1 0)(x2 200)(y2 50)) (aline (num 13)(x1 250)(y1 0)(x2 250)(y2 50)) (aline (num 14)(x1 300)(y1 0)(x2 300)(y2 50)) (aline (num 15)(x1 350)(y1 0)(x2 350)(y2 50)) (aline (num 16)(x1 0)(y1 50)(x2 50)(y2 50)) (aline (num 17)(x1 50)(y1 50)(x2 100)(y2 50)) (aline (num 18)(x1 100)(y1 50)(x2 150)(y2 50)) (aline (num 19)(x1 150)(y1 50)(x2 200)(y2 50)) (aline (num 20)(x1 200)(y1 50)(x2 250)(y2 50)) (aline (num 21)(x1 250)(y1 50)(x2 300)(y2 50)) (aline (num 22)(x1 300)(y1 50)(x2 350)(y2 50)) (aline (num 23)(x1 0)(y1 50)(x2 0)(y2 100)) (aline (num 24)(x1 50)(y1 50)(x2 50)(y2 100)) (aline (num 25)(x1 100)(y1 50)(x2 100)(y2 100)) (aline (num 26)(x1 150)(y1 50)(x2 150)(y2 100)) (aline (num 27)(x1 200)(y1 50)(x2 200)(y2 100)) (aline (num 28)(x1 250)(y1 50)(x2 250)(y2 100)) (aline (num 29)(x1 300)(y1 50)(x2 300)(y2 100)) (aline (num 30)(x1 350)(y1 50)(x2 350)(y2 100)) (aline (num 31)(x1 0)(y1 100)(x2 50)(y2 100)) (aline (num 32)(x1 50)(y1 100)(x2 100)(y2 100)) (aline (num 33)(x1 100)(y1 100)(x2 150)(y2 100)) (aline (num 34)(x1 150)(y1 100)(x2 200)(y2 100)) (aline (num 35)(x1 200)(y1 100)(x2 250)(y2 100)) (aline (num 36)(x1 250)(y1 100)(x2 300)(y2 100)) (aline (num 37)(x1 300)(y1 100)(x2 350)(y2 100)) (aline (num 38)(x1 0)(y1 100)(x2 0)(y2 150)) (aline (num 39)(x1 50)(y1 100)(x2 50)(y2 150)) (aline (num 40)(x1 100)(y1 100)(x2 100)(y2 150)) (aline (num 41)(x1 150)(y1 100)(x2 150)(y2 150)) (aline (num 42)(x1 200)(y1 100)(x2 200)(y2 150)) (aline (num 43)(x1 250)(y1 100)(x2 250)(y2 150)) (aline (num 44)(x1 300)(y1 100)(x2 300)(y2 150)) (aline (num 45)(x1 350)(y1 100)(x2 350)(y2 150)) (aline (num 46)(x1 0)(y1 150)(x2 50)(y2 150)) (aline (num 47)(x1 50)(y1 150)(x2 100)(y2 150)) (aline (num 48)(x1 100)(y1 150)(x2 150)(y2 150)) (aline (num 49)(x1 150)(y1 150)(x2 200)(y2 150)) (aline (num 50)(x1 200)(y1 150)(x2 250)(y2 150)) (aline (num 51)(x1 250)(y1 150)(x2 300)(y2 150)) (aline (num 52)(x1 300)(y1 150)(x2 350)(y2 150)) (aline (num 53)(x1 0)(y1 150)(x2 0)(y2 200)) (aline (num 54)(x1 50)(y1 150)(x2 50)(y2 200)) (aline (num 55)(x1 100)(y1 150)(x2 100)(y2 200)) (aline (num 56)(x1 150)(y1 150)(x2 150)(y2 200)) (aline (num 57)(x1 200)(y1 150)(x2 200)(y2 200)) (aline (num 58)(x1 250)(y1 150)(x2 250)(y2 200)) (aline (num 59)(x1 300)(y1 150)(x2 300)(y2 200)) (aline (num 60)(x1 350)(y1 150)(x2 350)(y2 200)) (aline (num 61)(x1 0)(y1 200)(x2 50)(y2 200)) (aline (num 62)(x1 50)(y1 200)(x2 100)(y2 200)) (aline (num 63)(x1 100)(y1 200)(x2 150)(y2 200)) (aline (num 64)(x1 150)(y1 200)(x2 200)(y2 200)) (aline (num 65)(x1 200)(y1 200)(x2 250)(y2 200)) (aline (num 66)(x1 250)(y1 200)(x2 300)(y2 200)) (aline (num 67)(x1 300)(y1 200)(x2 350)(y2 200)) (aline (num 68)(x1 0)(y1 200)(x2 0)(y2 250)) (aline (num 69)(x1 50)(y1 200)(x2 50)(y2 250)) (aline (num 70)(x1 100)(y1 200)(x2 100)(y2 250)) (aline (num 71)(x1 150)(y1 200)(x2 150)(y2 250)) (aline (num 72)(x1 200)(y1 200)(x2 200)(y2 250)) (aline (num 73)(x1 250)(y1 200)(x2 250)(y2 250)) (aline (num 74)(x1 300)(y1 200)(x2 300)(y2 250)) (aline (num 75)(x1 350)(y1 200)(x2 350)(y2 250)) (aline (num 76)(x1 0)(y1 250)(x2 50)(y2 250)) (aline (num 77)(x1 50)(y1 250)(x2 100)(y2 250)) (aline (num 78)(x1 100)(y1 250)(x2 150)(y2 250)) (aline (num 79)(x1 150)(y1 250)(x2 200)(y2 250)) (aline (num 80)(x1 200)(y1 250)(x2 250)(y2 250)) (aline (num 81)(x1 250)(y1 250)(x2 300)(y2 250)) (aline (num 82)(x1 300)(y1 250)(x2 350)(y2 250)) ) ;define the edge (defrule MAIN::my-game-board-edge1 => (bind ?x 1) (while (<= ?x 82) do (assert (edge (nbr-edge ?x)(edge-taken f)(shared t)(selected f))) (bind ?x(+ 1 ?x)) )) ;change some edges to (shared f) (defrule MAIN::my-game-board-edge2 ?f1<-(edge(nbr-edge ?edge&1|2|3|4|5|6|7|8|15|23|30|38|45|53|60|68| 75|76|77|78|79|80|81|82)(edge-taken f)(shared t)) => (modify ?f1 (shared f))) ;define the box (defrule MAIN::my-game-board-box => (bind ?y 1) (while (<= ?y 35) do (assert (box(nbr-box ?y))) (bind ?y (+ 1 ?y)) )) ;define the box and its four edges (defrule MAIN::box-four-edge => (bind ?x 1) (bind ?col 1) (bind ?row 0) (while (<= ?x 35) do (assert(box-has-four-edge(box ?x)(up (+ ?x (* 8 ?row))) (left (+ ?x (+ 7 (* 8 ?row)))) (right (+ ?x (+ 8 (* 8 ?row)))) (down (+ ?x (+ 15(* 8 ?row)))) (total-taken 0) (total-selected 0))) (bind ?col (+ 1 ?col)) (bind ?x (+ 1 ?x)) (while (= ?col 8) do (bind ?row (+ ?row 1)) (bind ?col 1)) )) ;define the two box and its adjcant edge (defrule MAIN::box-common-edge-left-and-right (box-has-four-edge(box ?box1)(right ?right)) (box-has-four-edge(box ?box2)(left ?right)) => (assert(common-edge(box1 ?box1)(box2 ?box2)(co-edge ?right)))) (defrule MAIN::box-common-edge-up-and-down (box-has-four-edge(box ?box1)(down ?down)) (box-has-four-edge(box ?box2)(up ?down)) => (assert(common-edge(box1 ?box1)(box2 ?box2)(co-edge ?down)))) ;************************************** ; HUMAN ;************************************** (defrule human-step1 ?f1<- (player h) => (retract ?f1) (assert(taken(human take-human)))) ;record the human move (defrule get-human-move ?f1<-(taken(human take-human)) => (retract ?f1) (bind ?human-taken ?*choi*) (assert (human-taken ?human-taken)) (printout t "Human take edge " ?human-taken crlf)) ;the bad human-taken (defrule bad-human-move ?f1<-(human-taken ?human-taken) (edge (nbr-edge ?human-taken)(edge-taken t)) => (format t "%-s%n" "This edge has been taken. So you have to take another edge.") (retract ?f1)) ; (reset)) ;check the edge if it is the fouth edge in a box (defrule take-shared-fouth-edge1A ?f1<-(human-taken ?human-taken) ?f3<-(edge(nbr-edge ?human-taken)(edge-taken f)(shared t)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?human-taken)) ?f2<-(box-has-four-edge(box ?box1)(total-taken ?number1&3)) ?f6<-(box-has-four-edge(box ?box2)(total-taken ?number2&0|1|2)) ?f4<-(counter(human-taken ?human)(computer-taken ?computer)) ?f5<-(left-total-box(number ?number)) => (retract ?f1) (modify ?f2 (total-taken 4)(total-selected 4)) (modify ?f6(total-taken =(+ ?number2 1))(total-selected =(+ ?number2 1))) (modify ?f3 (edge-taken t)) (modify ?f4 (human-taken =(+ ?human 1))) (modify ?f5 (number =(- ?number 1))) (assert(phase test-human-box1)) (bind ?*draw-pen* ?*blue-pen*) (draw-H ?*canvas* ?box1)) ; (printout t "I finished take-the-fouth-edge1A" crlf)) (defrule take-shared-fouth-edge2A ?f1<-(human-taken ?human-taken) ?f3<-(edge(nbr-edge ?human-taken)(edge-taken f)(shared t)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?human-taken)) ?f6<-(box-has-four-edge(box ?box1)(total-taken ?number1&0|1|2)) ?f2<-(box-has-four-edge(box ?box2)(total-taken ?number2&3)) ?f4<-(counter(human-taken ?human)(computer-taken ?computer)) ?f5<-(left-total-box(number ?number)) => (retract ?f1) (modify ?f2 (total-taken 4)(total-selected 4)) (modify ?f6 (total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f3 (edge-taken t)) (modify ?f4 (human-taken =(+ ?human 1))) (modify ?f5 (number =(- ?number 1))) (assert(phase test-human-box1)) (bind ?*draw-pen* ?*blue-pen*) (draw-H ?*canvas* ?box2)) ; (printout t "I finished take-the-fouth-edge2A" crlf)) (defrule take-shared-fouth-edge3A ?f1<-(human-taken ?human-taken) ?f3<-(edge(nbr-edge ?human-taken)(edge-taken f)(shared t)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?human-taken)) ?f6<-(box-has-four-edge(box ?box1)(total-taken ?number1&3)) ?f2<-(box-has-four-edge(box ?box2)(total-taken ?number2&3)) ?f4<-(counter(human-taken ?human)(computer-taken ?computer)) ?f5<-(left-total-box(number ?number)) => (retract ?f1) (modify ?f2 (total-taken 4)(total-selected 4)) (modify ?f6 (total-taken 4)(total-selected 4)) (modify ?f3 (edge-taken t)) (modify ?f4 (human-taken =(+ ?human 2))) (modify ?f5 (number =(- ?number 2))) (assert(phase test-human-box1)) (bind ?*draw-pen* ?*blue-pen*) (draw-H ?*canvas* ?box1) (draw-H ?*canvas* ?box2)) ; (printout t "I finished take-the-fouth-edge3A" crlf)) (defrule take-shared-no-fouth-edge1B ?f1<-(human-taken ?human-taken) ?f3<-(edge(nbr-edge ?human-taken)(edge-taken f)(shared t)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?human-taken)) ?f6<-(box-has-four-edge(box ?box1)(total-taken ?number1&0|1|2)) ?f2<-(box-has-four-edge(box ?box2)(total-taken ?number2&0|1|2)) => (retract ?f1) (modify ?f2 (total-taken =(+ ?number2 1))(total-selected =(+ ?number2 1))) (modify ?f6 (total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f3 (edge-taken t)) ; (printout t "I finished take-the-fouth-edge1B" crlf) (bind ?*draw-pen* ?*blue-pen*) (assert(player c))) (defrule take-no-shared-up-edge2A ?f1<-(human-taken ?human-taken) ?f2<-(edge(nbr-edge ?human-taken)(edge-taken f)(shared f)) ?f3<-(box-has-four-edge(box ?box)(up ?human-taken)(total-taken ?number1&3)) ?f4<-(counter(human-taken ?human)(computer-taken ?computer)) ?f5<-(left-total-box(number ?number2)) => (retract ?f1) (modify ?f2(edge-taken t)) (modify ?f3(total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f4(human-taken =(+ ?human 1))) (modify ?f5(number =(- ?number2 1))) (assert (phase test-human-box1)) (bind ?*draw-pen* ?*blue-pen*) (draw-H ?*canvas* ?box)) ; (printout t "I finished take-no-shared-up-edge2A" crlf)) (defrule take-no-shared-up-edge2B ?f1<-(human-taken ?human-taken) ?f2<-(edge(nbr-edge ?human-taken)(edge-taken f)(shared f)) ?f3<-(box-has-four-edge(box ?box)(up ?human-taken)(total-taken ?number1&0|1|2)) => (retract ?f1) (modify ?f2(edge-taken t)) (modify ?f3(total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) ; (printout t "I finished take-no-shared-up-edge2B" crlf) (bind ?*draw-pen* ?*blue-pen*) (assert(player c))) (defrule take-no-shared-left-edge2A ?f1<-(human-taken ?human-taken) ?f2<-(edge(nbr-edge ?human-taken)(edge-taken f)(shared f)) ?f3<-(box-has-four-edge(box ?box)(left ?human-taken)(total-taken ?number1&3)) ?f4<-(counter(human-taken ?human)(computer-taken ?computer)) ?f5<-(left-total-box(number ?number2)) => (retract ?f1) (modify ?f2(edge-taken t)) (modify ?f3(total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f4(human-taken =(+ ?human 1))) (modify ?f5(number =(- ?number2 1))) (assert (phase test-human-box1)) (bind ?*draw-pen* ?*blue-pen*) (draw-H ?*canvas* ?box)) ; (printout t "I finished take-no-shared-left-edge2A" crlf)) (defrule take-no-shared-left-edge2B ?f1<-(human-taken ?human-taken) ?f2<-(edge(nbr-edge ?human-taken)(edge-taken f)(shared f)) ?f3<-(box-has-four-edge(box ?box)(left ?human-taken)(total-taken ?number1&0|1|2)) => (retract ?f1) (modify ?f2(edge-taken t)) (modify ?f3(total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) ; (printout t "I finished take-no-shared-left-edge2B" crlf) (bind ?*draw-pen* ?*blue-pen*) (assert(player c))) (defrule take-no-shared-right-edge2A ?f1<-(human-taken ?human-taken) ?f2<-(edge(nbr-edge ?human-taken)(edge-taken f)(shared f)) ?f3<-(box-has-four-edge(box ?box)(right ?human-taken)(total-taken ?number1&3)) ?f4<-(counter(human-taken ?human)(computer-taken ?computer)) ?f5<-(left-total-box(number ?number2)) => (retract ?f1) (modify ?f2(edge-taken t)) (modify ?f3(total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f4(human-taken =(+ ?human 1))) (modify ?f5(number =(- ?number2 1))) (assert (phase test-human-box1)) (bind ?*draw-pen* ?*blue-pen*) (draw-H ?*canvas* ?box)) ; (printout t "I finished take-no-shared-right-edge2A" crlf)) (defrule take-no-shared-right-edge2B ?f1<-(human-taken ?human-taken) ?f2<-(edge(nbr-edge ?human-taken)(edge-taken f)(shared f)) ?f3<-(box-has-four-edge(box ?box)(right ?human-taken)(total-taken ?number1&0|1|2)) => (retract ?f1) (modify ?f2(edge-taken t)) (modify ?f3(total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) ; (printout t "I finished take-no-shared-right-edge2B" crlf) (bind ?*draw-pen* ?*blue-pen*) (assert(player c))) (defrule take-no-shared-down-edge2A ?f1<-(human-taken ?human-taken) ?f2<-(edge(nbr-edge ?human-taken)(edge-taken f)(shared f)) ?f3<-(box-has-four-edge(box ?box)(down ?human-taken)(total-taken ?number1&3)) ?f4<-(counter(human-taken ?human)(computer-taken ?computer)) ?f5<-(left-total-box(number ?number2)) => (retract ?f1) (modify ?f2(edge-taken t)) (modify ?f3(total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f4(human-taken =(+ ?human 1))) (modify ?f5(number =(- ?number2 1))) (assert (phase test-human-box1)) (bind ?*draw-pen* ?*blue-pen*) (draw-H ?*canvas* ?box)) ; (printout t "I finished take-no-shared-down-edge2A" crlf)) (defrule take-no-shared-down-edge2B ?f1<-(human-taken ?human-taken) ?f2<-(edge(nbr-edge ?human-taken)(edge-taken f)(shared f)) ?f3<-(box-has-four-edge(box ?box)(down ?human-taken)(total-taken ?number1&0|1|2)) => (retract ?f1) (modify ?f2(edge-taken t)) (modify ?f3(total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) ; (printout t "I finished take-no-shared-down-edge2B" crlf) (bind ?*draw-pen* ?*blue-pen*) (assert(player c))) (defrule take-box-test1 ?f1<-(phase test-human-box1) (counter(human-taken ?human)(computer-taken ?computer)) (test(> ?human 17)) => (retract ?f1) (printout t "game finished. Human take " ?human " boxes and computer take " ?computer " boxes. Human win." crlf) (bind ?word (message-box "Human win.")) (halt)) (defrule take-box-test2 ?f1<-(phase test-human-box1) (counter(human-taken ?human)(computer-taken ?computer)) (test(<= ?human 17)) ?f2<- (human-taken ?human-taken) => (retract ?f1 ?f2) (printout t "Human take " ?human " boxes and computer take " ?computer " boxes." crlf) (printout t "Human can take again." crlf)) ;************************************* ; COMPUTER ;************************************* (deffunction draw-line (?canvas ?x1 ?y1 ?x2 ?y2); only computer draws (bind ?dc (canvas-get-dc ?canvas)) (bind ?*draw-pen* ?*red-pen*) (dc-set-pen ?dc ?*draw-pen*) (dc-draw-line ?dc ?x1 ?y1 ?x2 ?y2) ) (deffacts counters (counter-divide-group 0)) (defrule computer-step1 ?f1<-(player c) => (retract ?f1) (assert(taken2(computer take-computer)))) (defrule first-step ?f2<-(taken2(computer take-computer)) (not(edge(edge-taken t))) ?f1<-(edge(nbr-edge 1)(edge-taken f)) ?f3<-(box-has-four-edge(box 1)(total-taken 0)) (aline(num 1)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (retract ?f1 ?f2 ) (assert(edge(nbr-edge 1)(edge-taken t)(shared f)(selected f))) (modify ?f3 (total-taken 1)(total-selected 1)) (printout t "computer take first step, that is edge 1." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule check-three-edge (declare(salience 100)) (box-has-four-edge(total-taken ?number&3)) (taken2(computer take-computer)) => (assert(phase add-fouth-edge))) (defrule take-shared-the-fouth-edge1A ; (declare(salience 30)) ?f7<-(phase add-fouth-edge) ?f6<-(taken2(computer take-computer)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?co-edge)) ?f1<-(edge (nbr-edge ?co-edge)(edge-taken f)(shared t)) ?f2<-(box-has-four-edge(box ?box1)(total-taken ?number1&3)) ?f3<-(box-has-four-edge(box ?box2)(total-taken ?number2&3)) ?f4<-(counter(human-taken ?human)(computer-taken ?computer)) ?f5<-(left-total-box(number ?number)) (not(phase check-delete)) (aline(num ?co-edge)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (retract ?f6 ?f7) (modify ?f1 (edge-taken t)) (modify ?f2 (total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f3 (total-taken =(+ ?number2 1))(total-selected =(+ ?number2 1))) (modify ?f4 (computer-taken =(+ ?computer 2))) (modify ?f5 (number =(- ?number 2))) (assert (phase test-computer-box2)) ; (printout t "computer finish take-shared-the-fouth-edge1A." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2) (draw-C ?*canvas* ?box1) (draw-C ?*canvas* ?box2) (printout t "computer take " ?co-edge "." crlf)) (defrule take-shared-the-fouth-edge1B1 ; (declare(salience 20)) ?f7<-(phase add-fouth-edge) ?f6<-(taken2(computer take-computer)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?co-edge)) ?f1<-(edge (nbr-edge ?co-edge)(edge-taken f)(shared t)) ?f2<-(box-has-four-edge(box ?box1)(total-taken ?number1&3)) ?f3<-(box-has-four-edge(box ?box2)(total-taken ?number2&1)) ?f4<-(counter(human-taken ?human)(computer-taken ?computer)) ?f5<-(left-total-box(number ?number)) (not(phase check-delete)) (aline(num ?co-edge)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (retract ?f6 ?f7) (modify ?f1 (edge-taken t)) (modify ?f2 (total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f3 (total-taken =(+ ?number2 1))(total-selected =(+ ?number2 1))) (modify ?f4 (computer-taken =(+ ?computer 1))) (modify ?f5 (number =(- ?number 1))) (assert (phase test-computer-box2)) ; (printout t "computer finish take-shared-the-fouth-edge1B1." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2) (draw-C ?*canvas* ?box1) (printout t "computer take " ?co-edge "." crlf)) (defrule take-shared-the-fouth-edge1C1 ; (declare(salience 20)) ?f7<-(phase add-fouth-edge) ?f6<-(taken2(computer take-computer)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?co-edge)) ?f1<-(edge (nbr-edge ?co-edge)(edge-taken f)(shared t)) ?f2<-(box-has-four-edge(box ?box1)(total-taken ?number1&1)) ?f3<-(box-has-four-edge(box ?box2)(total-taken ?number2&3)) ?f4<-(counter(human-taken ?human)(computer-taken ?computer)) ?f5<-(left-total-box(number ?number)) (not(phase check-delete)) (aline(num ?co-edge)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (retract ?f6 ?f7) (modify ?f1 (edge-taken t)) (modify ?f2 (total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f3 (total-taken =(+ ?number2 1))(total-selected =(+ ?number2 1))) (modify ?f4 (computer-taken =(+ ?computer 1))) (modify ?f5 (number =(- ?number 1))) (assert (phase test-computer-box2)) ; (printout t "computer finish take-shared-the-fouth-edge1C1." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2) (draw-C ?*canvas* ?box2) (printout t "computer take " ?co-edge "." crlf)) (defrule take-no-shared-edge3A ;(declare(salience 10)) ?f7<-(phase add-fouth-edge) ?f6<-(taken2(computer take-computer)) ?f1<-(box-has-four-edge(box ?box)(up ?up)(total-taken ?number1&3)) ?f2<-(edge(nbr-edge ?up)(edge-taken f)(shared f)) ?f3<-(counter(human-taken ?human)(computer-taken ?computer)) ?f4<-(left-total-box (number ?number)) (not(phase check-delete)) (aline(num ?up)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (retract ?f6 ?f7) (modify ?f1(total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f2(edge-taken t)) (modify ?f3(computer-taken =(+ ?computer 1))) (modify ?f4(number =(- ?number 1))) (assert (phase test-computer-box2)) ; (printout t "computer finish take-no-shared-edge3A" crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2) (draw-C ?*canvas* ?box) (printout t "computer take " ?up "." crlf)) (defrule take-no-shared-edge3B ; (declare(salience 10)) ?f7<-(phase add-fouth-edge) ?f6<-(taken2(computer take-computer)) ?f1<-(box-has-four-edge(box ?box)(left ?left)(total-taken ?number1&3)) ?f2<-(edge(nbr-edge ?left)(edge-taken f)(shared f)) ?f3<-(counter(human-taken ?human)(computer-taken ?computer)) ?f4<-(left-total-box (number ?number)) (not(phase check-delete)) (aline(num ?left)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (retract ?f6 ?f7) (modify ?f1(total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f2(edge-taken t)) (modify ?f3(computer-taken =(+ ?computer 1))) (modify ?f4(number =(- ?number 1))) (assert (phase test-computer-box2)) ; (printout t "computer finish take-no-shared-edge3B" crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2) (draw-C ?*canvas* ?box) (printout t "computer take " ?left "." crlf)) (defrule take-no-shared-edge3C ; (declare(salience 10)) ?f7<-(phase add-fouth-edge) ?f6<-(taken2(computer take-computer)) ?f1<-(box-has-four-edge(box ?box)(right ?right)(total-taken ?number1&3)) ?f2<-(edge(nbr-edge ?right)(edge-taken f)(shared f)) ?f3<-(counter(human-taken ?human)(computer-taken ?computer)) ?f4<-(left-total-box (number ?number)) (not(phase check-delete)) (aline(num ?right)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (retract ?f6 ?f7) (modify ?f1(total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f2(edge-taken t)) (modify ?f3(computer-taken =(+ ?computer 1))) (modify ?f4(number =(- ?number 1))) (assert (phase test-computer-box2)) ; (printout t "computer finish take-no-shared-edge3C" crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2) (draw-C ?*canvas* ?box) (printout t "computer take " ?right "." crlf)) (defrule take-no-shared-edge3D ; (declare(salience 10)) ?f7<-(phase add-fouth-edge) ?f6<-(taken2(computer take-computer)) ?f1<-(box-has-four-edge(box ?box)(down ?down)(total-taken ?number1&3)) ?f2<-(edge(nbr-edge ?down)(edge-taken f)(shared f)) ?f3<-(counter(human-taken ?human)(computer-taken ?computer)) ?f4<-(left-total-box (number ?number)) (not(phase check-delete)) (aline(num ?down)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (retract ?f6 ?f7) (modify ?f1(total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f2(edge-taken t)) (modify ?f3(computer-taken =(+ ?computer 1))) (modify ?f4(number =(- ?number 1))) (assert (phase test-computer-box2)) ; (printout t "computer finish take-no-shared-edge3D" crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2) (draw-C ?*canvas* ?box) (printout t "computer take " ?down "." crlf)) (defrule take-shared-the-fouth-edge1B0 ?f7<-(phase add-fouth-edge) ?f6<-(taken2(computer take-computer)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?co-edge)) ?f1<-(edge (nbr-edge ?co-edge)(edge-taken f)(shared t)) ?f2<-(box-has-four-edge(box ?box1)(total-taken ?number1&3)) ?f3<-(box-has-four-edge(box ?box2)(total-taken ?number2&0)) ?f4<-(counter(human-taken ?human)(computer-taken ?computer)) ?f5<-(left-total-box(number ?number)) (not(phase check-delete)) (aline(num ?co-edge)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (retract ?f6 ?f7) (modify ?f1 (edge-taken t)) (modify ?f2 (total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f3 (total-taken =(+ ?number2 1))(total-selected =(+ ?number2 1))) (modify ?f4 (computer-taken =(+ ?computer 1))) (modify ?f5 (number =(- ?number 1))) (assert (phase test-computer-box2)) ; (printout t "computer finish take-shared-the-fouth-edge1B0." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2) (draw-C ?*canvas* ?box1) (printout t "computer take " ?co-edge "." crlf)) (defrule take-shared-the-fouth-edge1C0 ?f7<-(phase add-fouth-edge) ?f6<-(taken2(computer take-computer)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?co-edge)) ?f1<-(edge (nbr-edge ?co-edge)(edge-taken f)(shared t)) ?f2<-(box-has-four-edge(box ?box1)(total-taken ?number1&0)) ?f3<-(box-has-four-edge(box ?box2)(total-taken ?number2&3)) ?f4<-(counter(human-taken ?human)(computer-taken ?computer)) ?f5<-(left-total-box(number ?number)) (not(phase check-delete)) (aline(num ?co-edge)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (retract ?f6 ?f7) (modify ?f1 (edge-taken t)) (modify ?f2 (total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f3 (total-taken =(+ ?number2 1))(total-selected =(+ ?number2 1))) (modify ?f4 (computer-taken =(+ ?computer 1))) (modify ?f5 (number =(- ?number 1))) (assert (phase test-computer-box2)) ; (printout t "computer finish take-shared-the-fouth-edge1C0." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2) (draw-C ?*canvas* ?box2) (printout t "computer take " ?co-edge "." crlf)) (defrule take-shared-the-fouth-edge1B2 ?f7<-(phase add-fouth-edge) ?f6<-(taken2(computer take-computer)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?co-edge)) ?f1<-(edge (nbr-edge ?co-edge)(edge-taken f)(shared t)) ?f2<-(box-has-four-edge(box ?box1)(total-taken ?number1&3)) ?f3<-(box-has-four-edge(box ?box2)(total-taken ?number2&2)) ?f4<-(counter(human-taken ?human)(computer-taken ?computer)) ?f5<-(left-total-box(number ?number)) (not(phase check-delete)) (aline(num ?co-edge)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (retract ?f6 ?f7) (modify ?f1 (edge-taken t)) (modify ?f2 (total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f3 (total-taken =(+ ?number2 1))(total-selected =(+ ?number2 1))) (modify ?f4 (computer-taken =(+ ?computer 1))) (modify ?f5 (number =(- ?number 1))) (assert (phase test-computer-box2)) ; (printout t "computer finish take-shared-the-fouth-edge1B0." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2) (draw-C ?*canvas* ?box1) (printout t "computer take " ?co-edge "." crlf)) (defrule take-shared-the-fouth-edge1C2 ?f7<-(phase add-fouth-edge) ?f6<-(taken2(computer take-computer)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?co-edge)) ?f1<-(edge (nbr-edge ?co-edge)(edge-taken f)(shared t)) ?f2<-(box-has-four-edge(box ?box1)(total-taken ?number1&2)) ?f3<-(box-has-four-edge(box ?box2)(total-taken ?number2&3)) ?f4<-(counter(human-taken ?human)(computer-taken ?computer)) ?f5<-(left-total-box(number ?number)) (not(phase check-delete)) (aline(num ?co-edge)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (retract ?f6 ?f7) (modify ?f1 (edge-taken t)) (modify ?f2 (total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f3 (total-taken =(+ ?number2 1))(total-selected =(+ ?number2 1))) (modify ?f4 (computer-taken =(+ ?computer 1))) (modify ?f5 (number =(- ?number 1))) (assert (phase test-computer-box2)) ; (printout t "computer finish take-shared-the-fouth-edge1C0." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2) (draw-C ?*canvas* ?box2) (printout t "computer take " ?co-edge "." crlf)) (defrule take-box-test1 ?f1<-(phase test-computer-box2) (counter(human-taken ?human)(computer-taken ?computer)) (test(> ?computer 17)) => (retract ?f1) (printout t "The game finished. Human take " ?human " boxes and computer take " ?computer " boxes. Computer win." crlf) (bind ?word(message-box "The computer won because you are a dumb ass.")) (halt)) (defrule take-box-test2 ?f1<-(phase test-computer-box2) (counter(human-taken ?human)(computer-taken ?computer)) (test(<= ?computer 17)) => (printout t "Human take " ?human " boxes and computer take " ?computer " boxes." crlf) (printout t "Computer can take again." crlf) (assert (taken2(computer take-computer))) (assert (phase add-fouth-edge)) (retract ?f1)) (defrule take-shared-no-fouth-edge2A (declare(salience -20)) ?f6<-(taken2(computer take-computer)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?co-edge)) ?f1<-(edge (nbr-edge ?co-edge)(edge-taken f)(shared t)) ?f2<-(box-has-four-edge(box ?box1)(total-taken ?number1&1)) ?f3<-(box-has-four-edge(box ?box2)(total-taken ?number2&1)) (not(phase check-delete)) (aline(num ?co-edge)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (retract ?f6) (modify ?f1 (edge-taken t)) (modify ?f2 (total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f3 (total-taken =(+ ?number2 1))(total-selected =(+ ?number2 1))) ; (printout t "computer finish take-shared-the-fouth-edge2A." crlf) (printout t "computer take " ?co-edge "." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule take-no-shared-edge4A (declare(salience -60)) ?f6<-(taken2(computer take-computer)) ?f1<-(box-has-four-edge(box ?box)(up ?up)(total-taken ?number1&1)) ?f2<-(edge(nbr-edge ?up)(edge-taken f)(shared f)) (not(phase check-delete)) (aline(num ?up)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (retract ?f6) (modify ?f1(total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f2(edge-taken t)) ; (printout t "computer finish take-no-shared-edge4A" crlf) (bind ?*draw-pen* ?*red-pen*) (printout t "computer take " ?up "." crlf) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule take-no-shared-edge4B (declare(salience -60)) ?f6<-(taken2(computer take-computer)) ?f1<-(box-has-four-edge(box ?box)(left ?left)(total-taken ?number1&1)) ?f2<-(edge(nbr-edge ?left)(edge-taken f)(shared f)) (not(phase check-delete)) (aline(num ?left)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (retract ?f6) (modify ?f1(total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f2(edge-taken t)) ; (printout t "computer finish take-no-shared-edge4B" crlf) (printout t "computer take " ?left "." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule take-no-shared-edge4C (declare(salience -60)) ?f6<-(taken2(computer take-computer)) ?f1<-(box-has-four-edge(box ?box)(right ?right)(total-taken ?number1&1)) ?f2<-(edge(nbr-edge ?right)(edge-taken f)(shared f)) (not(phase check-delete)) (aline(num ?right)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (retract ?f6) (modify ?f1(total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f2(edge-taken t)) ; (printout t "computer finish take-no-shared-edge4C" crlf) (printout t "computer take " ?right "." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule take-no-shared-edge4D (declare(salience -60)) ?f6<-(taken2(computer take-computer)) ?f1<-(box-has-four-edge(box ?box)(down ?down)(total-taken ?number1&1)) ?f2<-(edge(nbr-edge ?down)(edge-taken f)(shared f)) (not(phase check-delete)) (aline(num ?down)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (retract ?f6) (modify ?f1(total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f2(edge-taken t)) ; (printout t "computer finish take-no-shared-edge4D" crlf) (printout t "computer take " ?down "." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule take-shared-no-fouth-edge2B (declare(salience -50)) ?f6<-(taken2(computer take-computer)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?co-edge)) ?f1<-(edge (nbr-edge ?co-edge)(edge-taken f)(shared t)) ?f2<-(box-has-four-edge(box ?box1)(total-taken ?number1&1)) ?f3<-(box-has-four-edge(box ?box2)(total-taken ?number2&0)) (not(phase check-delete)) (aline(num ?co-edge)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (retract ?f6) (modify ?f1 (edge-taken t)) (modify ?f2 (total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f3 (total-taken =(+ ?number2 1))(total-selected =(+ ?number2 1))) ; (printout t "computer finish take-shared-the-fouth-edge2B." crlf) (printout t "computer take " ?co-edge "." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule take-shared-no-fouth-edge2C (declare(salience -50)) ?f6<-(taken2(computer take-computer)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?co-edge)) ?f1<-(edge (nbr-edge ?co-edge)(edge-taken f)(shared t)) ?f2<-(box-has-four-edge(box ?box1)(total-taken ?number1&0)) ?f3<-(box-has-four-edge(box ?box2)(total-taken ?number2&1)) (not(phase check-delete)) (aline(num ?co-edge)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (retract ?f6) (modify ?f1 (edge-taken t)) (modify ?f2 (total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f3 (total-taken =(+ ?number2 1))(total-selected =(+ ?number2 1))) ; (printout t "computer finish take-shared-the-fouth-edge2C." crlf) (printout t "computer take " ?co-edge "." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule take-no-shared-edge5A (declare(salience -40)) ?f6<-(taken2(computer take-computer)) ?f1<-(box-has-four-edge(box ?box)(up ?up)(total-taken ?number1&0)) ?f2<-(edge(nbr-edge ?up)(edge-taken f)(shared f)) (not(phase check-delete)) (aline(num ?up)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (retract ?f6) (modify ?f1(total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f2(edge-taken t)) ; (printout t "computer finish take-no-shared-edge5A" crlf) (printout t "computer take " ?up "." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule take-no-shared-edge5B (declare(salience -40)) ?f6<-(taken2(computer take-computer)) ?f1<-(box-has-four-edge(box ?box)(left ?left)(total-taken ?number1&0)) ?f2<-(edge(nbr-edge ?left)(edge-taken f)(shared f)) (not(phase check-delete)) (aline(num ?left)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (retract ?f6) (modify ?f1(total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f2(edge-taken t)) ; (printout t "computer finish take-no-shared-edge5B" crlf) (printout t "computer take " ?left "." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule take-no-shared-edge5C (declare(salience -40)) ?f6<-(taken2(computer take-computer)) ?f1<-(box-has-four-edge(box ?box)(right ?right)(total-taken ?number1&0)) ?f2<-(edge(nbr-edge ?right)(edge-taken f)(shared f)) (not(phase check-delete)) (aline(num ?right)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (retract ?f6) (modify ?f1(total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f2(edge-taken t)) ; (printout t "computer finish take-no-shared-edge5C" crlf) (printout t "computer take " ?right "." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule take-no-shared-edge5D (declare(salience -40)) ?f6<-(taken2(computer take-computer)) ?f1<-(box-has-four-edge(box ?box)(down ?down)(total-taken ?number1&0)) ?f2<-(edge(nbr-edge ?down)(edge-taken f)(shared f)) (not(phase check-delete)) (aline(num ?down)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (retract ?f6) (modify ?f1(total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f2(edge-taken t)) ; (printout t "computer finish take-no-shared-edge5D" crlf) (printout t "computer take " ?down "." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule take-shared-no-fouth-edge2D (declare(salience -10)) ?f6<-(taken2(computer take-computer)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?co-edge)) ?f1<-(edge (nbr-edge ?co-edge)(edge-taken f)(shared t)) ?f2<-(box-has-four-edge(box ?box1)(total-taken ?number1&0)) ?f3<-(box-has-four-edge(box ?box2)(total-taken ?number2&0)) (not(phase check-delete)) (aline(num ?co-edge)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (retract ?f6) (modify ?f1 (edge-taken t)) (modify ?f2 (total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f3 (total-taken =(+ ?number2 1))(total-selected =(+ ?number2 1))) ; (printout t "computer finish take-shared-the-fouth-edge2D." crlf) (printout t "computer take " ?co-edge "." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule check-group1 (declare(salience -80)) (taken2 (computer take-computer)) (not(phase add-fouth-edge)) (not(box-has-four-edge(total-taken ?number&3))) (forall(edge(nbr-edge ?co-edge)(edge-taken f)(shared t)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?co-edge)) (or(box-has-four-edge(box ?box1)(total-taken ?number1&2)) (box-has-four-edge(box ?box2)(total-taken ?number2&2)))) (forall(box(nbr-box ?nbr-box&1|2|3|4|5|6|7|8|15|22|29|30|31|32|33|34|35|28|21|14)) (box-has-four-edge(box ?nbr-box)(total-taken ?number3&2|4|3|1))) ?f1<- (counter-divide-group ?counter) => ; (retract ?f2) (modify ?f1 (counter-divide-group =(+ ?counter 1))) (assert(group(decide-divide-group yes))) (assert(my-groups(state divide-group))) (focus GROUP) (printout t "(group(decide-divide-group yes)) has been asserted(1). " crlf)) (defrule check-group2 (declare(salience -80)) (taken2 (computer take-computer)) (phase add-fouth-edge) (not(box-has-four-edge(total-taken ?number&3))) (forall(edge(nbr-edge ?co-edge)(edge-taken f)(shared t)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?co-edge)) (or(box-has-four-edge(box ?box1)(total-taken ?number1&2)) (box-has-four-edge(box ?box2)(total-taken ?number2&2)))) (forall(box(nbr-box ?nbr-box&1|2|3|4|5|6|7|8|15|22|29|30|31|32|33|34|35|28|21|14)) (box-has-four-edge(box ?nbr-box)(total-taken ?number3&2|4|3|1))) ?f1<-(counter-divide-group ?counter) => ; (retract ?f2) (modify ?f1 (counter-divide-group =(+ ?counter 1))) (assert(group(decide-divide-group yes))) (assert(my-groups(state divide-group))) (focus GROUP) (printout t "(group(decide-divide-group yes)) has been asserted(2). " crlf)) (defrule specific-condition-up1 (declare(salience 40)) (group(decide-divide-group yes)) (not(phase check-delete)) ?f2<- (box-has-four-edge(box ?box1&1|2|3|4|5|6)(up ?up)(left ?left)(right ?right)(down ?down)(total-taken ?number1&2)) (edge(nbr-edge ?up)(edge-taken f)) (edge(nbr-edge ?left)(edge-taken t)) (edge(nbr-edge ?down)(edge-taken t)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?right)) ?f3<- (box-has-four-edge(box ?box2)(left ?right)(total-taken ?number2&0|1)) ?f1<- (edge(nbr-edge ?right)(edge-taken f)) (aline(num ?right)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (modify ?f1 (edge-taken t)) (modify ?f2 (total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f3(total-taken =(+ ?number2 1))(total-selected =(+ ?number2 1))) (assert(phase check-delete)) (printout t "computer take edge " ?right "." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule specific-condition-up2 (declare(salience 40)) (group(decide-divide-group yes)) (not(phase check-delete)) ?f2<- (box-has-four-edge(box ?box2&2|3|4|5|6|7)(up ?up)(left ?left)(right ?right)(down ?down)(total-taken ?number1&2)) (edge(nbr-edge ?up)(edge-taken f)) (edge(nbr-edge ?right)(edge-taken t)) (edge(nbr-edge ?down)(edge-taken t)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?left)) ?f3<- (box-has-four-edge(box ?box1)(right ?left)(total-taken ?number2&0|1)) ?f1<- (edge(nbr-edge ?left)(edge-taken f)) (aline(num ?left)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => ( modify ?f1 (edge-taken t)) (modify ?f2 (total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f3(total-taken =(+ ?number2 1))(total-selected =(+ ?number2 1))) (assert(phase check-delete)) (printout t "computer take edge " ?left "." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule specific-condition-up3 (declare(salience 40)) (group(decide-divide-group yes)) (not(phase check-delete)) ?f2<- (box-has-four-edge(box ?box1&1|2|3|4|5|6|7)(up ?up)(left ?left)(right ?right)(down ?down)(total-taken ?number1&2)) (edge(nbr-edge ?up)(edge-taken f)) (edge(nbr-edge ?right)(edge-taken t)) (edge(nbr-edge ?left)(edge-taken t)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?down)) ?f3<- (box-has-four-edge(box ?box2)(up ?down)(total-taken ?number2&0|1)) ?f1<- (edge(nbr-edge ?down)(edge-taken f)) (aline(num ?down)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (modify ?f1 (edge-taken t)) (modify ?f2 (total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f3(total-taken =(+ ?number2 1))(total-selected =(+ ?number2 1))) (assert(phase check-delete)) (printout t "computer take edge " ?down "." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule specific-condition-down1 (declare(salience 40)) (group(decide-divide-group yes)) (not(phase check-delete)) ?f2<- (box-has-four-edge(box ?box2&35|30|31|32|33|34)(up ?up)(left ?left)(right ?right)(down ?down)(total-taken ?number1&2)) (edge(nbr-edge ?down)(edge-taken f)) (edge(nbr-edge ?right)(edge-taken t)) (edge(nbr-edge ?up)(edge-taken t)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?left)) ?f3<- (box-has-four-edge(box ?box1)(right ?left)(total-taken ?number2&0|1)) ?f1<- (edge(nbr-edge ?left)(edge-taken f)) (aline(num ?left)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => ( modify ?f1 (edge-taken t)) (modify ?f2 (total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f3(total-taken =(+ ?number2 1))(total-selected =(+ ?number2 1))) (assert(phase check-delete)) (printout t "computer take edge " ?left "." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule specific-condition-down2 (declare(salience 40)) (group(decide-divide-group yes)) (not(phase check-delete)) ?f2<- (box-has-four-edge(box ?box1&29|30|31|32|33|34)(up ?up)(left ?left)(right ?right)(down ?down)(total-taken ?number1&2)) (edge(nbr-edge ?down)(edge-taken f)) (edge(nbr-edge ?left)(edge-taken t)) (edge(nbr-edge ?up)(edge-taken t)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?right)) ?f3<- (box-has-four-edge(box ?box2)(left ?right)(total-taken ?number2&0|1)) ?f1<- (edge(nbr-edge ?right)(edge-taken f)) (aline(num ?right)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (modify ?f1 (edge-taken t)) (modify ?f2 (total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f3(total-taken =(+ ?number2 1))(total-selected =(+ ?number2 1))) (assert(phase check-delete)) (printout t "computer take edge " ?right "." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule specific-condition-down3 (declare(salience 40)) (group(decide-divide-group yes)) (not(phase check-delete)) ?f2<- (box-has-four-edge(box ?box2&35|29|30|31|32|33|34)(up ?up)(left ?left)(right ?right)(down ?down)(total-taken ?number1&2)) (edge(nbr-edge ?down)(edge-taken f)) (edge(nbr-edge ?right)(edge-taken t)) (edge(nbr-edge ?left)(edge-taken t)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?up)) ?f3<- (box-has-four-edge(box ?box1)(down ?up)(total-taken ?number2&0|1)) ?f1<- (edge(nbr-edge ?up)(edge-taken f)) (aline(num ?up)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (modify ?f1 (edge-taken t)) (modify ?f2 (total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f3(total-taken =(+ ?number2 1))(total-selected =(+ ?number2 1))) (assert(phase check-delete)) (printout t "computer take edge " ?up "." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule specific-condition-left1 (declare(salience 40)) (group(decide-divide-group yes)) (not(phase check-delete)) ?f2<- (box-has-four-edge(box ?box2&29|8|15|22)(up ?up)(left ?left)(right ?right)(down ?down)(total-taken ?number1&2)) (edge(nbr-edge ?left)(edge-taken f)) (edge(nbr-edge ?right)(edge-taken t)) (edge(nbr-edge ?down)(edge-taken t)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?up)) ?f3<- (box-has-four-edge(box ?box1)(down ?up)(total-taken ?number2&0|1)) ?f1<- (edge(nbr-edge ?up)(edge-taken f)) (aline(num ?up)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (modify ?f1 (edge-taken t)) (modify ?f2 (total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f3(total-taken =(+ ?number2 1))(total-selected =(+ ?number2 1))) (assert(phase check-delete)) (printout t "computer take edge " ?up "." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule specific-condition-left2 (declare(salience 40)) (group(decide-divide-group yes)) (not(phase check-delete)) ?f2<- (box-has-four-edge(box ?box1&1|8|15|22)(up ?up)(left ?left)(right ?right)(down ?down)(total-taken ?number1&2)) (edge(nbr-edge ?left)(edge-taken f)) (edge(nbr-edge ?right)(edge-taken t)) (edge(nbr-edge ?up)(edge-taken t)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?down)) ?f3<- (box-has-four-edge(box ?box2)(up ?down)(total-taken ?number2&0|1)) ?f1<- (edge(nbr-edge ?down)(edge-taken f)) (aline(num ?down)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => ( modify ?f1 (edge-taken t)) (modify ?f2 (total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f3(total-taken =(+ ?number2 1))(total-selected =(+ ?number2 1))) (assert(phase check-delete)) (printout t "computer take edge " ?down "." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule specific-condition-left3 (declare(salience 40)) (group(decide-divide-group yes)) (not(phase check-delete)) ?f2<- (box-has-four-edge(box ?box1&1|8|15|22|29)(up ?up)(left ?left)(right ?right)(down ?down)(total-taken ?number1&2)) (edge(nbr-edge ?left)(edge-taken f)) (edge(nbr-edge ?up)(edge-taken t)) (edge(nbr-edge ?down)(edge-taken t)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?right)) ?f3<- (box-has-four-edge(box ?box2)(left ?right)(total-taken ?number2&0|1)) ?f1<- (edge(nbr-edge ?right)(edge-taken f)) (aline(num ?right)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (modify ?f1 (edge-taken t)) (modify ?f2 (total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f3(total-taken =(+ ?number2 1))(total-selected =(+ ?number2 1))) (assert(phase check-delete)) (printout t "computer take edge " ?right "." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule specific-condition-right1 (declare(salience 40)) (group(decide-divide-group yes)) (not(phase check-delete)) ?f2<- (box-has-four-edge(box ?box1&7|14|21|28)(up ?up)(left ?left)(right ?right)(down ?down)(total-taken ?number1&2)) (edge(nbr-edge ?right)(edge-taken f)) (edge(nbr-edge ?up)(edge-taken t)) (edge(nbr-edge ?left)(edge-taken t)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?down)) ?f3<- (box-has-four-edge(box ?box2)(up ?down)(total-taken ?number2&0|1)) ?f1<- (edge(nbr-edge ?down)(edge-taken f)) (aline(num ?down)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => ( modify ?f1 (edge-taken t)) (modify ?f2 (total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f3(total-taken =(+ ?number2 1))(total-selected =(+ ?number2 1))) (assert(phase check-delete)) (printout t "computer take edge " ?down "." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule specific-condition-right2 (declare(salience 40)) (group(decide-divide-group yes)) (not(phase check-delete)) ?f2<- (box-has-four-edge(box ?box2&35|14|21|28)(up ?up)(left ?left)(right ?right)(down ?down)(total-taken ?number1&2)) (edge(nbr-edge ?right)(edge-taken f)) (edge(nbr-edge ?left)(edge-taken t)) (edge(nbr-edge ?down)(edge-taken t)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?up)) ?f3<- (box-has-four-edge(box ?box1)(down ?up)(total-taken ?number2&0|1)) ?f1<- (edge(nbr-edge ?up)(edge-taken f)) (aline(num ?up)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (modify ?f1 (edge-taken t)) (modify ?f2 (total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f3(total-taken =(+ ?number2 1))(total-selected =(+ ?number2 1))) (assert(phase check-delete)) (printout t "computer take edge " ?up "." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule specific-condition-right3 (declare(salience 40)) (group(decide-divide-group yes)) (not(phase check-delete)) ?f2<- (box-has-four-edge(box ?box2&7|35|14|21|28)(up ?up)(left ?left)(right ?right)(down ?down)(total-taken ?number1&2)) (edge(nbr-edge ?right)(edge-taken f)) (edge(nbr-edge ?up)(edge-taken t)) (edge(nbr-edge ?down)(edge-taken t)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?left)) ?f3<- (box-has-four-edge(box ?box1)(right ?left)(total-taken ?number2&0|1)) ?f1<- (edge(nbr-edge ?left)(edge-taken f)) (aline(num ?left)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (modify ?f1 (edge-taken t)) (modify ?f2 (total-taken =(+ ?number1 1))(total-selected =(+ ?number1 1))) (modify ?f3(total-taken =(+ ?number2 1))(total-selected =(+ ?number2 1))) (assert(phase check-delete)) (printout t "computer take edge " ?left "." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule specific-condition-angle1 (declare(salience 40)) (group(decide-divide-group yes)) (not(phase check-delete)) ?f2<- (box-has-four-edge(box 1)(up ?up)(left ?left)(total-taken ?number&2)) ?f1<- (edge(nbr-edge ?up)(edge-taken f)) (edge(nbr-edge ?left)(edge-taken f)) (aline(num ?up)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (modify ?f1(edge-taken t)) (modify ?f2(total-taken =(+ ?number 1))(total-selected =(+ ?number 1))) (assert(phase check-delete)) (printout t "computer take edge " ?up "." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule specific-condition-angle2 (declare(salience 40)) (group(decide-divide-group yes)) (not(phase check-delete)) ?f2<- (box-has-four-edge(box 7)(up ?up)(right ?right)(total-taken ?number&2)) ?f1<- (edge(nbr-edge ?up)(edge-taken f)) (edge(nbr-edge ?right)(edge-taken f)) (aline(num ?up)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (modify ?f1(edge-taken t)) (modify ?f2(total-taken =(+ ?number 1))(total-selected =(+ ?number 1))) (assert(phase check-delete)) (printout t "computer take edge " ?up "." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule specific-condition-angle3 (declare(salience 40)) (group(decide-divide-group yes)) (not(phase check-delete)) ?f2<- (box-has-four-edge(box 29)(left ?left)(down ?down)(total-taken ?number&2)) ?f1<- (edge(nbr-edge ?left)(edge-taken f)) (edge(nbr-edge ?down)(edge-taken f)) (aline(num ?left)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (modify ?f1(edge-taken t)) (modify ?f2(total-taken =(+ ?number 1))(total-selected =(+ ?number 1))) (assert(phase check-delete)) (printout t "computer take edge " ?left "." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule specific-condition-angle4 (declare(salience 40)) (group(decide-divide-group yes)) (not(phase check-delete)) ?f2<- (box-has-four-edge(box 35)(right ?right)(down ?down)(total-taken ?number&2)) ?f1<- (edge(nbr-edge ?right)(edge-taken f)) (edge(nbr-edge ?down)(edge-taken f)) (aline(num ?right)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (modify ?f1(edge-taken t)) (modify ?f2(total-taken =(+ ?number 1))(total-selected =(+ ?number 1))) (assert(phase check-delete)) (printout t "computer take edge " ?right "." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule specific-condition-two-box-up (declare(salience 20)) (group(decide-divide-group yes)) (not(phase check-delete)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?co-edge)) ?f2<- (box-has-four-edge(box ?box1)(up ?up1)(left ?left1)(right ?right1)(down ?down1)(total-taken 2)(total-selected 2)) ?f3<- (box-has-four-edge(box ?box2)(up ?up2)(left ?right1)(right ?right2)(down ?down2)(total-taken 2)(total-selected 2)) (edge(nbr-edge ?left1)(edge-taken t)) (edge(nbr-edge ?down1)(edge-taken t)) (edge(nbr-edge ?right2)(edge-taken t)) (edge(nbr-edge ?down2)(edge-taken t)) ?f1<- (edge(nbr-edge ?right1)(edge-taken f)) (aline(num right1)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (modify ?f1(edge-taken t)) (modify ?f2(total-taken 3)(total-selected 3)) (modify ?f3(total-taken 3)(total-selected 3)) (assert(phase check-delete)) (printout t "computer take edge " ?right1 "." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule specific-condition-two-box-left (declare(salience 20)) (group(decide-divide-group yes)) (not(phase check-delete)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?co-edge)) ?f2<- (box-has-four-edge(box ?box1)(up ?up1)(left ?left1)(right ?right1)(down ?down1)(total-taken 2)(total-selected 2)) ?f3<- (box-has-four-edge(box ?box2)(up ?down1)(left ?left2)(right ?right2)(down ?down2)(total-taken 2)(total-selected 2)) (edge(nbr-edge ?up1)(edge-taken t)) (edge(nbr-edge ?right1)(edge-taken t)) (edge(nbr-edge ?right2)(edge-taken t)) (edge(nbr-edge ?down2)(edge-taken t)) ?f1<- (edge(nbr-edge ?down1)(edge-taken f)) (aline(num down1)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (modify ?f1(edge-taken t)) (modify ?f2(total-taken 3)(total-selected 3)) (modify ?f3(total-taken 3)(total-selected 3)) (assert(phase check-delete)) (printout t "computer take edge " ?down1 "." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule specific-condition-two-box-down (declare(salience 20)) (group(decide-divide-group yes)) (not(phase check-delete)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?co-edge)) ?f2<- (box-has-four-edge(box ?box1)(up ?up1)(left ?left1)(right ?right1)(down ?down1)(total-taken 2)(total-selected 2)) ?f3<- (box-has-four-edge(box ?box2)(up ?up2)(left ?right1)(right ?right2)(down ?down2)(total-taken 2)(total-selected 2)) (edge(nbr-edge ?up1)(edge-taken t)) (edge(nbr-edge ?left1)(edge-taken t)) (edge(nbr-edge ?up2)(edge-taken t)) (edge(nbr-edge ?right2)(edge-taken t)) ?f1<- (edge(nbr-edge ?right1)(edge-taken f)) (aline(num right1)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (modify ?f1(edge-taken t)) (modify ?f2(total-taken 3)(total-selected 3)) (modify ?f3(total-taken 3)(total-selected 3)) (assert(phase check-delete)) (printout t "computer take edge " ?right1 "." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule specific-condition-two-box-right (declare(salience 20)) (group(decide-divide-group yes)) (not(phase check-delete)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?co-edge)) ?f2<- (box-has-four-edge(box ?box1)(up ?up1)(left ?left1)(right ?right1)(down ?down1)(total-taken 2)(total-selected 2)) ?f3<- (box-has-four-edge(box ?box2)(up ?down1)(left ?left2)(right ?right2)(down ?down2)(total-taken 2)(total-selected 2)) (edge(nbr-edge ?up1)(edge-taken t)) (edge(nbr-edge ?left1)(edge-taken t)) (edge(nbr-edge ?left2)(edge-taken t)) (edge(nbr-edge ?down2)(edge-taken t)) ?f1<- (edge(nbr-edge ?down1)(edge-taken f)) (aline(num down1)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (modify ?f1(edge-taken t)) (modify ?f2(total-taken 3)(total-selected 3)) (modify ?f3(total-taken 3)(total-selected 3)) (assert(phase check-delete)) (printout t "computer take edge " ?down1 "." crlf) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule decide-take-which-group1 (declare(salience 10)) (not(phase add-fouth-edge)) (group(decide-divide-group yes)) (not(phase check-delete)) (groups(total ?x)) (not(groups(total ?y&: (< ?y ?x)))) => (assert (smallest-remember ?x)) (printout t ?x " is the smallest number of the group(1)" crlf)) (defrule decide-take-which-group2 (declare(salience 10)) (phase add-fouth-edge) (group(decide-divide-group yes)) (not(phase check-delete)) (groups(total ?x)) (not(groups(total ?y&: (< ?y ?x)))) => (assert (smallest-remember ?x)) (printout t ?x " is the smallest number of the group(2)" crlf)) (defrule choice-edge1 ?f3<-(smallest-remember ?x) ?f2<-(groups(nbr-group ?nbr-group1)(member ?box1 $?box )(total ?x)) ?f4<-(box-has-four-edge(box ?box1)(down ?edge)(total-taken ?number1)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?edge)) ?f5<-(box-has-four-edge(box ?box2)(up ?edge)(total-taken ?number2)) ?f1<-(edge(nbr-edge ?edge)(edge-taken f)(selected t)) (aline(num ?edge)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (retract ?f3 ?f2) (modify ?f1 (edge-taken t)) (modify ?f4 (total-taken =(+ ?number1 1))) (modify ?f5 (total-taken =(+ ?number2 1))) (printout t "computer take " ?edge " edge after dividing group." crlf) (assert(phase check-delete)) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule choice-edge2 ?f3<-(smallest-remember ?x) ?f2<-(groups(nbr-group ?nbr-group1)(member ?box1 $?box )(total ?x)) ?f4<-(box-has-four-edge(box ?box1)(right ?edge)(total-taken ?number1)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?edge)) ?f5<-(box-has-four-edge(box ?box2)(left ?edge)(total-taken ?number2)) ?f1<- (edge(nbr-edge ?edge)(edge-taken f)(selected t)) (aline(num ?edge)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (retract ?f3 ?f2) (modify ?f1 (edge-taken t)) (modify ?f4 (total-taken =(+ ?number1 1))) (modify ?f5 (total-taken =(+ ?number2 1))) (printout t "computer take " ?edge " edge after dividing group." crlf) (assert(phase check-delete)) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule choice-edge3 ?f3<-(smallest-remember ?x) ?f2<-(groups(nbr-group ?nbr-group1)(member ?box2 $?box )(total ?x)) ?f4<-(box-has-four-edge(box ?box2)(left ?edge)(total-taken ?number1)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?edge)) ?f5<-(box-has-four-edge(box ?box1)(right ?edge)(total-taken ?number2)) ?f1<-(edge(nbr-edge ?edge)(edge-taken f)(selected t)) (aline(num ?edge)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (retract ?f3 ?f2) (modify ?f1 (edge-taken t)) (modify ?f4 (total-taken =(+ ?number1 1))) (modify ?f5 (total-taken =(+ ?number2 1))) (printout t "computer take " ?edge " edge after dividing group." crlf) (assert(phase check-delete)) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule choice-edge4 ?f3<-(smallest-remember ?x) ?f2<-(groups(nbr-group ?nbr-group1)(member ?box2 $?box )(total ?x)) ?f4<-(box-has-four-edge(box ?box2)(up ?edge)(total-taken ?number1)(total-selected 4)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?edge)) ?f5<-(box-has-four-edge(box ?box1)(down ?edge)(total-taken ?number2)) ?f1<- (edge(nbr-edge ?edge)(edge-taken f)(selected t)) (aline(num ?edge)(x1 ?x1)(y1 ?y1)(x2 ?x2)(y2 ?y2)) => (retract ?f3 ?f2) (modify ?f1 (edge-taken t)) (modify ?f4 (total-taken =(+ ?number1 1))) (modify ?f5 (total-taken =(+ ?number2 1))) (printout t "computer take " ?edge " edge after dividing group." crlf) (assert(phase check-delete)) (bind ?*draw-pen* ?*red-pen*) (draw-line ?*canvas* ?x1 ?y1 ?x2 ?y2)) (defrule delete-edges1 (phase check-delete) ?f1<-(box-has-four-edge(box ?box)(total-taken ?number1)(total-selected ?number2)) (test (neq ?number1 ?number2)) => (modify ?f1(total-selected ?number1))) ; (printout t "finish delete-edges1" crlf)) (defrule delete-edges2 (phase check-delete) ?f1<-(edge(nbr-edge ?nbr-edge)(edge-taken f)(selected t)) => (modify ?f1 (selected f))) ; (printout t "finish delete-edges2" crlf)) (defrule delete-groups1 (phase check-delete) ?f1<- (group-counter(counter ~0)) => (modify ?f1(counter 0) )) ; (printout t "group-counter became 0" crlf)) (defrule delete-groups (phase check-delete) ?f1<- (groups(nbr-group ?nbr)) => (retract ?f1)) (defrule go-to-group-after-first1 ?f2<-(phase check-delete) ?f1<-(group(decide-divide-group yes)) (not(groups(nbr-group ?nbr))) ?f3<-(taken2(computer take-computer)) (not(phase add-fouth-edge)) => (retract ?f1 ?f2 ?f3) (printout t "group(decide-divide-group yes) has been deleted(1)." crlf)) (defrule go-to-group-after-first2 ?f2<-(phase check-delete) ?f1<-(group(decide-divide-group yes)) (not(groups(nbr-group ?nbr))) ?f3<-(taken2(computer take-computer)) (not(phase add-fouth-edge)) (not(my-groups(state divide-group))) => (retract ?f1 ?f2 ?f3) (printout t "group(decide-divide-group yes) has been deleted(2)." crlf)) (defrule go-to-group-after-first3 ?f2<-(phase check-delete) ?f1<-(group(decide-divide-group yes)) (not(groups(nbr-group ?nbr))) ?f3<-(taken2(computer take-computer)) (not(phase add-fouth-edge)) ?f4<-(my-groups(state divide-group)) => (retract ?f1 ?f2 ?f3 ?f4) (printout t "group(decide-divide-group yes) has been deleted(3)." crlf)) (defrule go-to-group-after-first4 ?f2<-(phase check-delete) ?f1<-(group(decide-divide-group yes)) (not(groups(nbr-group ?nbr))) ?f3<-(taken2(computer take-computer)) ?f4<- (phase add-fouth-edge) => (retract ?f1 ?f2 ?f3 ?f4) (printout t "group(decide-divide-group yes) has been deleted(4)." crlf)) (defrule go-to-group-after-first5 ?f2<-(phase check-delete) ?f1<-(group(decide-divide-group yes)) (not(groups(nbr-group ?nbr))) ?f3<-(taken2(computer take-computer)) (phase add-fouth-edge) (not(my-groups(state divide-group))) => (retract ?f1 ?f2 ?f3) (printout t "group(decide-divide-group yes) has been deleted(5)." crlf)) (defrule go-to-group-after-first6 ?f2<-(phase check-delete) ?f1<-(group(decide-divide-group yes)) (not(groups(nbr-group ?nbr))) ?f3<-(taken2(computer take-computer)) (phase add-fouth-edge) ?f4<-(my-groups(state divide-group)) => (retract ?f1 ?f2 ?f3 ?f4) (printout t "group(decide-divide-group yes) has been deleted(6)." crlf)) ;************************************* ; GROUP MODULE ;************************************* (defmodule GROUP (import MAIN deftemplate group-counter) (import MAIN deftemplate groups) (import MAIN deftemplate group) (import MAIN deftemplate edge) (import MAIN deftemplate box-has-four-edge) (import MAIN deftemplate common-edge) (import MAIN deftemplate counter) (import MAIN deftemplate left-total-box) (import MAIN deftemplate box) (import MAIN deftemplate my-groups)) (defrule GROUP::divide-group1 (declare(salience 20)) ?f1<-(my-groups(state divide-group)) ?f3<-(group-counter(counter ?counter)) ?f2<-(edge(nbr-edge ?co-edge)(edge-taken f)(shared t)(selected f)) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?co-edge)) ?f4<-(box-has-four-edge(box ?box1)(total-taken ?number1&2)(total-selected ?number1&2)) ?f5<-(box-has-four-edge(box ?box2)(total-taken ?number2&2)(total-selected ?number2&2)) => (retract ?f1 ?f3) (assert(groups(nbr-group =(+ ?counter 1))(member)(total 0))) (assert(group-counter(counter =(+ ?counter 1)))) (assert(phase group2)) (modify ?f2 (selected t)) (modify ?f4 (total-selected =(+ ?number1 1))) (modify ?f5 (total-selected =(+ ?number2 1)))) ;(printout t ?box1 " box and " ?box2 " box and " ?co-edge " edge start to be selected." crlf)) (defrule GROUP::check-three-edge2 ?f1<-(phase group2) (box-has-four-edge(total-selected ?number&3)) => (retract ?f1) (assert(phase add-fouth-edge-group))) (defrule GROUP::take-shared-the-fouth-edge1A ; (declare(salience 30)) ?f7<-(phase add-fouth-edge-group) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?co-edge)) ?f1<-(edge (nbr-edge ?co-edge)(edge-taken f)(shared t)(selected f)) ?f2<-(box-has-four-edge(box ?box1)(total-taken ~4)(total-selected ?number1&3)) ?f3<-(box-has-four-edge(box ?box2)(total-taken ~4)(total-selected ?number2&3)) (group-counter (counter ?counter)) ?f4<-(groups(nbr-group ?counter)(member $?box )(total ?total)) => (retract ?f7) (modify ?f1 (selected t)) (modify ?f2 (total-selected =(+ ?number1 1))) (modify ?f3 (total-selected =(+ ?number2 1))) (modify ?f4 (member $?box ?box1 ?box2)(total =(+ ?total 2))) (assert(phase continue))) ;(printout t "group take " ?box1 " box and " ?box2 " box." crlf)) (defrule GROUP::take-shared-the-fouth-edge1B2 ; (declare(salience 30)) ?f7<-(phase add-fouth-edge-group) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?co-edge)) ?f1<-(edge (nbr-edge ?co-edge)(edge-taken f)(shared t)(selected f)) ?f2<-(box-has-four-edge(box ?box1) (total-taken ~4) (total-selected ?number1&3)) ?f3<-(box-has-four-edge(box ?box2) (total-taken ~4) (total-selected ?number2&2)) (group-counter (counter ?counter)) ?f4<-(groups(nbr-group ?counter)(member $?box )(total ?total)) => (retract ?f7) (modify ?f1 (selected t)) (modify ?f2 (total-selected =(+ ?number1 1))) (modify ?f3 (total-selected =(+ ?number2 1))) (modify ?f4 (member $?box ?box1 )(total =(+ ?total 1))) (assert(phase continue))) ;(printout t "group take " ?box1 " box ." crlf)) (defrule GROUP::take-shared-the-fouth-edge1C2 ; (declare(salience 30)) ?f7<-(phase add-fouth-edge-group) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?co-edge)) ?f1<-(edge (nbr-edge ?co-edge)(edge-taken f)(shared t)(selected f)) ?f2<-(box-has-four-edge(box ?box1) (total-taken ~4) (total-selected ?number1&2)) ?f3<-(box-has-four-edge(box ?box2) (total-taken ~4) (total-selected ?number2&3)) (group-counter (counter ?counter)) ?f4<-(groups(nbr-group ?counter)(member $?box )(total ?total)) => (retract ?f7) (modify ?f1 (selected t)) (modify ?f2 (total-selected =(+ ?number1 1))) (modify ?f3 (total-selected =(+ ?number2 1))) (modify ?f4 (member $?box ?box2 )(total =(+ ?total 1))) (assert(phase continue))) ;(printout t "group take " ?box2 " box ." crlf)) (defrule GROUP::take-shared-the-fouth-edge1B1 ; (declare(salience 30)) ?f7<-(phase add-fouth-edge-group) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?co-edge)) ?f1<-(edge (nbr-edge ?co-edge)(edge-taken f)(shared t)(selected f)) ?f2<-(box-has-four-edge(box ?box1) (total-taken ~4) (total-selected ?number1&1)) ?f3<-(box-has-four-edge(box ?box2) (total-taken ~4) (total-selected ?number2&3)) (group-counter (counter ?counter)) ?f4<-(groups(nbr-group ?counter)(member $?box )(total ?total)) => (retract ?f7) (modify ?f1 (selected t)) (modify ?f2 (total-selected =(+ ?number1 1))) (modify ?f3 (total-selected =(+ ?number2 1))) (modify ?f4 (member $?box ?box2 )(total =(+ ?total 1))) (assert(phase continue))) ;(printout t "group take " ?box2 " box ." crlf)) (defrule GROUP::take-shared-the-fouth-edge1C1 ; (declare(salience 30)) ?f7<-(phase add-fouth-edge-group) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?co-edge)) ?f1<-(edge (nbr-edge ?co-edge)(edge-taken f)(shared t)(selected f)) ?f2<-(box-has-four-edge(box ?box1) (total-taken ~4) (total-selected ?number1&3)) ?f3<-(box-has-four-edge(box ?box2) (total-taken ~4) (total-selected ?number2&1)) (group-counter (counter ?counter)) ?f4<-(groups(nbr-group ?counter)(member $?box )(total ?total)) => (retract ?f7) (modify ?f1 (selected t)) (modify ?f2 (total-selected =(+ ?number1 1))) (modify ?f3 (total-selected =(+ ?number2 1))) (modify ?f4 (member $?box ?box1 )(total =(+ ?total 1))) (assert(phase continue))) ;(printout t "group take " ?box1 " box ." crlf)) (defrule GROUP::take-shared-the-fouth-edge1B0 ; (declare(salience 30)) ?f7<-(phase add-fouth-edge-group) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?co-edge)) ?f1<-(edge (nbr-edge ?co-edge)(edge-taken f)(shared t)(selected f)) ?f2<-(box-has-four-edge(box ?box1) (total-taken ~4) (total-selected ?number1&3)) ?f3<-(box-has-four-edge(box ?box2) (total-taken ~4) (total-selected ?number2&0)) (group-counter (counter ?counter)) ?f4<-(groups(nbr-group ?counter)(member $?box )(total ?total)) => (retract ?f7) (modify ?f1 (selected t)) (modify ?f2 (total-selected =(+ ?number1 1))) (modify ?f3 (total-selected =(+ ?number2 1))) (modify ?f4 (member $?box ?box1 )(total =(+ ?total 1))) (assert(phase continue))) ;(printout t "group take " ?box1 " box ." crlf)) (defrule GROUP::take-shared-the-fouth-edge1C0 ; (declare(salience 30)) ?f7<-(phase add-fouth-edge-group) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?co-edge)) ?f1<-(edge (nbr-edge ?co-edge)(edge-taken f)(shared t)(selected f)) ?f2<-(box-has-four-edge(box ?box1) (total-taken ~4) (total-selected ?number1&0)) ?f3<-(box-has-four-edge(box ?box2) (total-taken ~4) (total-selected ?number2&3)) (group-counter(counter ?counter)) ?f4<-(groups(nbr-group ?counter)(member $?box )(total ?total)) => (retract ?f7) (modify ?f1 (selected t)) (modify ?f2 (total-selected =(+ ?number1 1))) (modify ?f3 (total-selected =(+ ?number2 1))) (modify ?f4 (member $?box ?box2 )(total =(+ ?total 1))) (assert(phase continue))) ;(printout t "group take " ?box2 " box ." crlf)) (defrule GROUP::take-no-shared-edge3A ;(declare(salience 10)) ?f7<-(phase add-fouth-edge-group) ?f1<-(box-has-four-edge(box ?box1)(up ?up) (total-taken ~4) (total-selected ?number1&3)) ?f2<-(edge(nbr-edge ?up)(edge-taken f)(shared f)(selected f)) (group-counter(counter ?counter)) ?f3<-(groups(nbr-group ?counter)(member $?box )(total ?total)) => (retract ?f7) (modify ?f1(total-selected =(+ ?number1 1))) (modify ?f2(selected t)) (modify ?f3 (member $?box ?box1)(total =(+ ?total 1))) (assert(phase continue))) ;(printout t "group take " ?box1 " box ." crlf)) (defrule GROUP::take-no-shared-edge3B ;(declare(salience 10)) ?f7<-(phase add-fouth-edge-group) ?f1<-(box-has-four-edge(box ?box1)(left ?left) (total-taken ~4) (total-selected ?number1&3)) ?f2<-(edge(nbr-edge ?left)(edge-taken f)(shared f)(selected f)) (group-counter (counter ?counter)) ?f3<-(groups(nbr-group ?counter)(member $?box )(total ?total)) => (retract ?f7) (modify ?f1(total-selected =(+ ?number1 1))) (modify ?f2(selected t)) (modify ?f3 (member $?box ?box1)(total =(+ ?total 1))) (assert(phase continue))) ;(printout t "group take " ?box1 " box ." crlf)) (defrule GROUP::take-no-shared-edge3C ;(declare(salience 10)) ?f7<-(phase add-fouth-edge-group) ?f1<-(box-has-four-edge(box ?box1)(right ?right) (total-taken ~4) (total-selected ?number1&3)) ?f2<-(edge(nbr-edge ?right)(edge-taken f)(shared f)(selected f)) (group-counter (counter ?counter)) ?f3<-(groups(nbr-group ?counter)(member $?box)(total ?total)) => (retract ?f7) (modify ?f1(total-selected =(+ ?number1 1))) (modify ?f2(selected t)) (modify ?f3 (member $?box ?box1)(total =(+ ?total 1))) (assert(phase continue))) ;(printout t "group take " ?box1 " box ." crlf)) (defrule GROUP::take-no-shared-edge3D ;(declare(salience 10)) ?f7<-(phase add-fouth-edge-group) ?f1<-(box-has-four-edge(box ?box1)(down ?down) (total-taken ~4) (total-selected ?number1&3)) ?f2<-(edge(nbr-edge ?down)(edge-taken f)(shared f)(selected f)) (group-counter (counter ?counter)) ?f3<-(groups(nbr-group ?counter)(member $?box )(total ?total)) => (retract ?f7) (modify ?f1(total-selected =(+ ?number1 1))) (modify ?f2(selected t)) (modify ?f3 (member $?box ?box1)(total =(+ ?total 1))) (assert(phase continue))) ;(printout t "group take " ?box1 " box ." crlf)) (defrule GROUP::take-box-test1 ?f1<-(phase continue) (box-has-four-edge(total-taken ?number1&~4)(total-selected ?number&3)) => (retract ?f1) (assert (phase add-fouth-edge-group))) (defrule GROUP::delete ?f1<-(phase continue) (not(box-has-four-edge(total-taken 2)(total-selected 3))) => (retract ?f1) (assert(phase delete-edge))) (defrule GROUP::delete-some-selected-edge1 (phase delete-edge) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?edge)) ?f2<-(box-has-four-edge(box ?box1)(down ?edge)(total-taken 0|1)(total-selected ?number1&~0)) (box-has-four-edge(box ?box2)(up ?edge)(total-selected ?number2&4)) ?f1<- (edge(nbr-edge ?edge)(edge-taken f)(selected t)) => (modify ?f1 (selected f)) (modify ?f2 (total-selected =(- ?number1 1)))) ;(modify ?f3(total-selected =(- ?number2 1))) ;(printout t "computer delete box " ?box1 " edge " ?edge "." crlf)) (defrule GROUP::delete-some-selected-edge11 (phase delete-edge) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?edge)) (box-has-four-edge(box ?box1)(down ?edge)(total-selected ?number2&4)) ?f3<-(box-has-four-edge(box ?box2)(up ?edge)(total-taken 0|1)(total-selected ?number1&~0)) ?f1<- (edge(nbr-edge ?edge)(edge-taken f)(selected t)) => (modify ?f1 (selected f)) (modify ?f3 (total-selected =(- ?number1 1)))) ;(modify ?f3(total-selected =(- ?number2 1))) ;(printout t "computer delete box " ?box2 " edge " ?edge "." crlf)) (defrule GROUP::delete-some-selected-edge2 (phase delete-edge) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?edge)) ?f2<-(box-has-four-edge(box ?box1)(right ?edge)(total-taken 0|1)(total-selected ?number1&~0)) (box-has-four-edge(box ?box2)(left ?edge)(total-selected ?number2&4)) ?f1<- (edge(nbr-edge ?edge)(edge-taken f)(selected t)) => (modify ?f1 (selected f)) (modify ?f2 (total-selected =(- ?number1 1)))) ;(modify ?f3(total-selected =(- ?number2 1))) ;(printout t "computer delete box " ?box1 " edge " ?edge "." crlf)) (defrule GROUP::delete-some-selected-edge22 (phase delete-edge) (common-edge(box1 ?box1)(box2 ?box2)(co-edge ?edge)) (box-has-four-edge(box ?box1)(right ?edge)(total-selected ?number2&4)) ?f3<-(box-has-four-edge(box ?box2)(left ?edge)(total-taken 0|1)(total-selected ?number1&~0)) ?f1<- (edge(nbr-edge ?edge)(edge-taken f)(selected t)) => (modify ?f1 (selected f)) (modify ?f3 (total-selected =(- ?number1 1)))) ;(modify ?f3(total-selected =(- ?number2 1))) ;(printout t "computer delete box " ?box2 " edge " ?edge "." crlf)) (defrule GROUP::next-group (declare(salience -10)) ?f1<-(phase delete-edge) => (retract ?f1) (assert (my-groups(state divide-group))))