{ import: Object } { import: John } " This is an example of a object using the JOHN Planner to handle its constraints " Formula : ObjectPlus (x y) Formula1 : ObjectPlus (x) Formula2 : ObjectPlus (x y z) Formula3 : ObjectPlus (x y z r) Formula4 : ObjectPlus (p q r s) Formula5 : ObjectPlus (x y) Formula6 : ObjectPlus (x y) Point : ObjectPlus (x y) Circle : ObjectPlus (c r) " intializes classes, making a collection to keep track of instanciated objects of each type: " [ Formula inits ] [ Formula1 inits ] [ Formula2 inits ] [ Formula3 inits ] [ Formula4 inits ] [ Formula5 inits ] [ Formula6 inits ] [ Point inits ] [ Circle inits ] Formula x: aX [ x := aX ] Formula y: aY [ y := aY ] Formula x [ ^x ] Formula y [ ^y ] [ Formula addConstraint: #c1 selfOnly: true dependency: #(x y) ] Formula c1_constraint [ ^( x + y = 5 ) ] Formula c1_vars [ ^Array with: x with: y ] Formula c1_unitResolution: var [ " self assign: ( self anyNilVars: #c1 ) value: ( 5 - ( self nonNilVarVals: #c1 ) sum )." ( y isNil ) ifTrue: [ self assign: #y value: ( 5 - x ) ] ifFalse: [ self assign: #x value: ( 5 - y ) ]. ^true ] Formula println [ 'x=' put. x print. ' y=' put. y println ] Formula1 x: aX [ x := aX ] Formula1 x [ ^x ] [ Formula1 addConstraint: #c1 selfOnly: true dependency: #(x) ] Formula1 c1_constraint [ ^( x \\ 2 = 1 ) ] Formula1 c1_vars [ ^Array with: x ] Formula1 println [ 'x=' put. x println ] Formula2 x: aX [ x := aX ] Formula2 y: aY [ y := aY ] Formula2 z: aZ [ z := aZ ] Formula2 x [ ^x ] Formula2 y [ ^y ] Formula2 z [ ^z ] [ Formula2 addConstraint: #c1 selfOnly: true dependency: #(x) ] [ Formula2 addConstraint: #c2 selfOnly: true dependency: #(x y z) ] Formula2 c1_constraint [ ^( x < 5 ) ] Formula2 c2_constraint [ ^( x + y + z = 10 ) ] Formula2 c1_vars [ ^Array with: x ] Formula2 c2_vars [ ^Array with: x with: y with: z ] Formula2 c2_unitResolution: var [ " self assign: ( self anyNilVars: #c2 ) value: ( 10 - ( self nonNilVarVals: #c2 ) sum )." ( x isNil ) ifTrue: [ self assign: #x value: ( 10 - y - z ). ^true ]. ( y isNil ) ifTrue: [ self assign: #y value: ( 10 - x - z ). ^true ]. ( z isNil ) ifTrue: [ self assign: #z value: ( 10 - x - y ). ^true ]. ] Formula2 println [ 'x=' put. x print. ' y=' put. y print. ' z=' put. z println ] Formula3 x: aX [ x := aX ] Formula3 y: aY [ y := aY ] Formula3 z: aZ [ z := aZ ] Formula3 r: aR [ r := aR ] Formula3 x [ ^x ] Formula3 y [ ^y ] Formula3 z [ ^z ] Formula3 r [ ^r ] [ Formula3 addConstraint: #c1 selfOnly: true dependency: #(x) ] [ Formula3 addConstraint: #c2 selfOnly: true dependency: #(x y z) ] [ Formula3 addConstraint: #c3 selfOnly: true dependency: #(y r) ] [ Formula3 addConstraint: #c4 selfOnly: true dependency: #(x r) ] Formula3 c1_constraint [ ^( z > 0 ) ] Formula3 c2_constraint [ ^( x + y + z = 5 ) ] Formula3 c3_constraint [ ^( y + r = 10 ) ] Formula3 c4_constraint [ ^( x + r = 7 ) ] Formula3 c1_vars [ ^Array with: z ] Formula3 c2_vars [ ^Array with: x with: y with: z ] Formula3 c3_vars [ ^Array with: y with: r ] Formula3 c4_vars [ ^Array with: x with: r ] Formula3 c2_unitResolution: var [ " self assign: ( self anyNilVars: #c2 ) value: ( 5 - ( self nonNilVarVals: #c2 ) sum )." ( x isNil ) ifTrue: [ self assign: #x value: ( 5 - y - z ). ^true ]. ( y isNil ) ifTrue: [ self assign: #y value: ( 5 - x - z ). ^true ]. ( z isNil ) ifTrue: [ self assign: #z value: ( 5 - x - y ). ^true ]. ] Formula3 c3_unitResolution: var [ " self assign: ( self anyNilVars: #c3 ) value: ( 10 - ( self nonNilVarVals: #c3 ) sum )." ( y isNil ) ifTrue: [ self assign: #y value: ( 10 - r ). ^true ]. ( r isNil ) ifTrue: [ self assign: #r value: ( 10 - y ). ^true ]. ] Formula3 c4_unitResolution: var [ " self assign: ( self anyNilVars: #c4 ) value: ( 7 - ( self nonNilVarVals: #c4 ) sum )." ( x isNil ) ifTrue: [ self assign: #x value: ( 7 - r ). ^true ]. ( r isNil ) ifTrue: [ self assign: #r value: ( 7 - x ). ^true ]. ] Formula3 println [ 'x=' put. x print. ' y=' put. y print. ' z=' put. z print. ' r=' put. r println ] Formula4 new: aName [ self := self new: aName type: Formula4. p := Boolean new. q := Boolean new. r := Boolean new. s := Boolean new ] Formula4 p: aP [ p value: aP ] Formula4 q: aQ [ q value: aQ ] Formula4 r: aR [ r value: aR ] Formula4 s: aS [ s value: aS ] Formula4 p [ ^p value ] Formula4 q [ ^q value ] Formula4 r [ ^r value ] Formula4 s [ ^s value ] [ Formula4 addConstraint: #c1 selfOnly: true dependency: #(p q) ] [ Formula4 addConstraint: #c2 selfOnly: true dependency: #(q r) ] [ Formula4 addConstraint: #c3 selfOnly: true dependency: #(r s) ] Formula4 c1_constraint [ ^( p isTrue or: [ q isTrue ] ) ] Formula4 c2_constraint [ ^( ( q isFalse ) or: [ r isTrue ] ) ] Formula4 c3_constraint [ ^( ( r isFalse ) or: [ s isFalse ] ) ] Formula4 c1_vars [ ^Array with: p value with: q value ] Formula4 c2_vars [ ^Array with: q value with: r value ] Formula4 c3_vars [ ^Array with: r value with: s value ] Formula4 c1_unitResolution: var [ ( p isTrue or: [ q isTrue ] ) ifTrue: [ ^false ]. p isFalse ifTrue: [ self q: #true ]. q isFalse ifTrue: [ self p: #true ]. ^true ] Formula4 c2_unitResolution: var [ ( q isFalse or: [ r isTrue ] ) ifTrue: [ ^false ]. q isTrue ifTrue: [ self r: #true ]. r isFalse ifTrue: [ self q: #false ]. ^true ] Formula4 c3_unitResolution: var [ ( r isFalse or: [ s isFalse ] ) ifTrue: [ ^false ]. r isTrue ifTrue: [ self s: #false ]. s isTrue ifTrue: [ self r: #false ]. ^true ] Formula4 println [ 'p=' put. p print. ' q=' put. q print. ' r=' put. r print. ' s=' put. s print. '' putln ] Formula5 x: aX [ x := aX ] Formula5 y: aY [ y := aY ] Formula5 x [ ^x ] Formula5 y [ ^y ] Formula5 c1_constraint [ ^( x + y = 5 ) ] Formula5 c1_vars [ ^Array with: x with: y ] Formula5 c1_unitResolution: var [ " self assign: ( self anyNilVars: #c1 ) value: ( 5 - ( self nonNilVarVals: #c1 ) sum )." ( x isNil ) ifTrue: [ self assign: #x value: ( 5 - y ). ^true ]. ( y isNil ) ifTrue: [ self assign: #y value: ( 5 - x ). ^true ]. ] Formula5 println [ 'x=' put. x print. ' y=' put. y println ] Formula6 x: aX [ x := aX ] Formula6 y: aY [ y := aY ] Formula6 x [ ^x ] Formula6 y [ ^y ] [ Formula6 addConstraint: #c1 selfOnly: true dependency: #(x y) ] Formula6 c1_constraint [ ^( x + y = 5 ) ] Formula6 c2_constraint [ ^( x > 0 ) ] Formula6 c1_vars [ ^Array with: x with: y ] Formula6 c2_vars [ ^Array with: x ] Formula6 c1_unitResolution: var [ ( x isNil ) ifTrue: [ self assign: #x value: ( 5 - y ). ^true ]. ( y isNil ) ifTrue: [ self assign: #y value: ( 5 - x ). ^true ]. ] Formula6 println [ 'x=' put. x print. ' y=' put. y println ] Point new: aName x: aX y: aY [ self := self new: aName type: Point. x := aX. y := aY ] Point x: aX [ x := aX ] Point y: aY [ y := aY ] Point x [ ^x ] Point y [ ^y ] Point println [ self print. '' putln ] Point print [ name print. '(' put. x print. ',' put. y print. ')' put ] Point c1_constraint: aPoint [ John forObj: self assign: #y value: (aPoint y - 100) ] Circle new: aName c: aC r: aR [ self := self new: aName type: Circle. c := aC. r := aR ] Circle c: aC [ c := aC ] Circle r: aR [ r := aR ] Circle c [ ^c ] Circle r [ ^r ] Circle c1_constraint: aPoint [ John forObj: c assign: #x value: (aPoint x + 200) ] Circle println [ 'circle(' put. name print. ',' put. c print. ',' put. r print. ')' putln ] " Main Program " [ | F0 F1 F2 F3 F4 F5a F5b F6a F6b P1 P2 Crcl | F0 := Formula new: #F0 type: Formula. John forObj: F0 assign: #x value: 2. F0 println. John forObj: F0 assign: #y value: 5. F0 println. F1 := Formula1 new: #F1 type: Formula1. John forObj: F1 assign: #x value: 2. F1 println. John forObj: F1 assign: #x value: 3. F1 println. F2 := Formula2 new: #F2 type: Formula2. John forObj: F2 assign: #x value: 3. F2 println. John forObj: F2 assign: #z value: 5. F2 println. John forObj: F2 assign: #x value: 5. F2 println. John forObj: F2 assign: #x value: 4. F2 println. F3 := Formula3 new: #F3 type: Formula3. John forObj: F3 assign: #x value: 1. F3 println. John forObj: F3 assign: #x value: 0. F3 println. John forObj: F3 assign: #r value: 8. F3 println. F4 := Formula4 new: #F4. John forObj: F4 assign: #p value: #true. F4 println. John forObj: F4 assign: #p value: #false. F4 println. John forObj: F4 assign: #q value: #false. F4 println. John forObj: F4 assign: #s value: #true. F4 println. F5a := Formula5 new: #F5a type: Formula5. F5b := Formula5 new: #F5b type: Formula5. F5a addConstraint: #c1 selfOnly: true dependency: #(x y). John forObj: F5a assign: #x value: 2. F5a println. John forObj: F5a assign: #y value: 5. F5a println. John forObj: F5b assign: #x value: 2. F5b println. John forObj: F5b assign: #y value: 5. F5b println. F6a := Formula6 new: #F6a type: Formula6. F6b := Formula6 new: #F6b type: Formula6. F6b addConstraint: #c2 selfOnly: true dependency: #(x). John forObj: F6a assign: #y value: 9. F6a println. John forObj: F6a assign: #x value: 8. F6a println. John forObj: F6b assign: #y value: 9. F6b println. John forObj: F6b assign: #x value: 8. F6b println. P1 := Point new: #P1 x: 100 y: 200. P2 := Point new: #P2 x: 300 y: 300. Crcl := Circle new: #Crcl c: P2 r: 50. " Point c1_constraint: aPoint [ John forObj: self assign: #y value: (aPoint y - 100) ] Circle c1_constraint: aPoint [ John forObj: c assign: #x value: (aPoint x + 200) ] " Crcl addConstraint: #c1 selfOnly: false dependency: (Array with: (Array with: P1 with: #x)). P1 addConstraint: #c1 selfOnly: false dependency: (Array with: (Array with: (Crcl c) with: #y)). '' putln. P1 println. Crcl println. John forObj: P1 assign: #x value: 150. '' putln. P1 println. Crcl println. John forObj: P2 assign: #y value: 400. '' putln. P1 println. Crcl println. ] " Sample Output: "