open Decider.Csp.Integer open Decider.Csp.BaseTypes let solve rolls rollers = let (==) left right = ExpressionInteger.(=)(left, right) let expr i = ExpressionInteger(i) let kickboards = VariableInteger("kickboards", 0, rollers) let cityrollers = VariableInteger("cityrollers", 0, rollers) let constraints: IConstraint list = [ ConstraintInteger(kickboards + cityrollers == expr rollers) ConstraintInteger(kickboards * expr 3 + cityrollers * expr 2 == expr rolls) ] let variables: IVariable list = [ kickboards cityrollers ] let state = StateInteger(variables, constraints) match state.Search() with | StateOperationResult.Solved -> Some {| Kickboards = kickboards.Value Cityrollers = cityrollers.Value |} | _ -> None solve 37 15 // val it : {| Cityrollers: int; Kickboards: int |} option = // Some { Cityrollers = 8 // Kickboards = 7 }