ActConstraint subclass: #ActEquals instanceVariableNames: 'x y' classVariableNames: '' poolDictionaries: ''! !ActEquals class methods ! x: var1 y: var2 ^super new x: var1 y: var2. !ActEquals methods ! x: var1 y: var2 x := var1 . y := var2. self post; init. init | m s | m := x min max: y min. s := x max min: y max. x min: m; max: s. y min: m; max: s post x when: #min send: #xmin to: self. x when: #max send: #xmax to: self. y when: #min send: #ymin to: self. y when: #max send: #ymax to: self xmax y max: x max xmin y min: x min ymax x max: y max ymin x min: y min ====================== ActConstraint subclass: #ActAdd instanceVariableNames: 'x y r' classVariableNames: '' poolDictionaries: '' ! !ActAdd class methods ! x: var1 y: var2 ^super new x: var1 y: var2 !ActAdd methods ! x: aVar1 y: aVar2 x := aVar1 y := aVar2. r := ConstrainedVariable from: (x min + y min) to: (x max + y max). self post post x when: #min send: #xmin to: self. x when: #max send: #xmax to: self. y when: #min send: #ymin to: self. y when: #max send: #ymax to: self. r when: #min send: #rmin to: self. r when: #max send: #rmax to: self. rmax x max: (r max - y min). y max: (r max - x min).! rmin x min: r min - y max. y min: r min - x max! xmax r max: x max + y max. y min: r min - x max xmin y max: r max - x min. r min: y min + x min ymax r max: x max + y max. x min: r min - y max ymin x max: r max - y min. r min: x min + y min ========= ActConstraint subclass: #ActTimes instanceVariableNames: 'x y r' classVariableNames: '' poolDictionaries: '' ! !ActTimes class methods ! ! x: var1 y: anInteger ^super new x: var1 y: anInteger !ActTimes methods ! x: aVar1 y: anInteger x := var1. y := anInteger. anInteger >= 0 ifTrue: [r := ConstrainedVariable from: anInteger * x min to: anInteger * x max] ifFalse: [r := ConstrainedVariable from: anInteger * x max to: anInteger * x min]. self post. post x when: #min send: #xmin to: self. x when: #max send: #xmax to: self. r when: #min send: #rmin to: self. r when: #max send: #rmax to: self. rmax y >= 0 ifTrue: [x max: ( r max / y) floor] ifFalse: [x min: (r max / y) ceiling ] rmin y >= 0 ifTrue: [x min: (r min / y) ceiling] ifFalse: [x max: ( r min / y) floor] xmax y >= 0 ifTrue: [r max: y * x max] ifFalse: [r min: y * x min] xmin y >= 0 ifTrue: [r min: y * x min] ifFalse: [r max: y * x min] ================= Example The simple example is to test the code, and show how some partial solving can be achieved. It defines the domains of the variables, and sets the only constraint : x + 3y + 4z = 2t +c. ConstrainedVariable class>>example "ConstrainedVariable example" | x y z t c | x := ConstrainedVariable from: 0 to: 3. x name: 'x'. y := ConstrainedVariable from: 0 to: 1. y name: 'y'. z := ConstrainedVariable from: 2 to: 5. z name: 'z'. t := ConstrainedVariable from: 0 to: 3. t name: 't'. c := ConstrainedVariable on: #(5). c name: 'c'. ((x + (y * 3 ))+ (z * 4) )@=( (t * 2)+ c). x printOn: Transcript. y printOn: Transcript. z printOn: Transcript. t printOn: Transcript. Transcript cr.