On Jun 14, 2010, at 4:40 PM, Luke Palmer wrote:

So hang on, what is the problem?  You have described something like a
vague model, but what information are you trying to get?  Say,
perhaps, a set of possible output lists from a given input list?

I think he's trying to construct a production possibility curve for a given set of inputs, and (probably) the most efficient production plan given the costs of his inputs.  This is a problem I am going to have to solve programmatically, too.  I intend on solving it by finding the input in a given category of necessary inputs with the lowest average cost per unit.  I'm not concerned about "hard" cost allocation limits -- i.e. it's okay for the firm to buy more of an input than might be necessary for another output as long as the average unit cost is the lowest (since all the inputs will be used eventually anyway).  Hard allocation complicates the problem, since you have an upper bound on what you can spend, and you want to spend it most effectively, presumably with as little "waste" of available cash as possibile.  Bin packing.

Martin:  You need to find a nice "normal form" for inputs and outputs.  If there aren't going to be many different types  of inputs, you can deal with interchangeability by making a type for each type of input.  (For example, if you were a jeweler, you could make:)


type Price = Integer  -- In cents, or a suitable denomination
type Quantity = Integer
data Mint   = Perth | CreditSuisse | Sunshine | Kitco deriving (Eq, Show)
data Gold   = Gold Mint Quantity Price deriving (Eq, Show)
data Silver = Silver Mint Quantity Price deriving (Eq, Show)

class AverageCost commodity where average_cost_per_unit :: commodity -> Price
instance (AverageCost commodity) => Ord commodity where -- I hope this isn't an undecidable instance
left <= right = (average_cost_per_unit left) <= (average_cost_per_unit right)

data UnitOutput = UnitOutput { product :: Product,  requires :: Requirement }
data Requirement = Requirement { gold :: Gold, silver :: Silver } 
data Product = GoldWatch { style :: ... } | GoldChain { style :: ... } | SilverWatch { style :: ... }

etc.  How you encode the style/product/output relationship is up to you (maybe products should know their necessary inputs.  Maybe not).  If you have hard allocation limits, you can use a bin packing strategy.