Built upon Microsoft SolverFoundation's ODSL and F# 3.0's custom keywords
letpetrochem()= opt {let!sa= var<Barrel/Day>()let!vz= var<_>()
assume (0.3* sa +0.4* vz >=2000.<_>)
assume (0.4* sa +0.2* vz >=1500.<_>)
assume (0.2* sa +0.3* vz >=500.<_>)
assume (sa <=9000.<_>&& sa >=0.<_>)
assume (vz <=6000.<_>&& vz >=0.<_>) minimise (20.0<Dollar/Barrel>* sa +15.0<_>* vz)}The language implemented in this sample has the following grammar:
LinearProgram :=(Variables, LinearConstraints, ObjectiveFunction)
Variables := Variable := Variable \n Variables
Variable :=letidentifier= var <UnitAnnotation>():=letidentifier= vararray1 <UnitAnnotation>(range):=letidentifier= vararray2 <UnitAnnotation>(range,range) ObjectiveFunction := minimise LinearFunction
:= maximise LinearFunction
LinearFunction := RealConstant * RealVariable
:= LinearFunction + LinearFunction
:= sum range (fun identifier -> LinearFunction) LinearConstraints := LinearConstraint
:= LinearConstraint \n LinearConstraints LinearConstraint := assume Constraint
Constraint := LinearFunction <= RealConstant
:= LinearFunction >= RealConstant
:= LinearFunction = RealConstant
:= integral identifier
:= foreach range (fun identifier -> Constraint)
RealConstant := float_literal_constant
:= identifier
:= identifier.[Integer]:= identifier.[Integer, Integer] RealVariable := identifier
:= identifier.[Integer]:= identifier.[Integer, Integer]
Integer := integer_literal_constant
:= identifierMore details will be added later.