% plug_on_wire example assemble1_wire_switch :- % level 1 fabricate_plug_on_wire, assemble2_wire_switch, print('job completed'),!. fabricate_plug_on_wire :- % level 2 consume([wire,plug]), use(inject_mold), produce(plug_on_wire), release(inject_mold), print('fabrication complete'),!. assemble2_wire_switch :- % level 2 use(assembly_area), consume([plug_on_wire]), produce(wire_switch), release(assembly_area), print('assembly complete'),!. % use and release apply to reusable resources use(What) :- reusable(What,available), retract(reusable(What,available)), assert(reusable(What,in_use)). release(What) :- reusable(What,in_use), retract(reusable(What,in_use)), assert(reusable(What,available)). % consume and produce apply to consumable resources consume([]) :- !. consume([What|Rest]) :- consumable(What,Qty), Qty > 0, % need at least one unit retract(consumable(What,Qty)), NewQty is Qty - 1, assert(consumable(What,NewQty)), consume(Rest). produce(What) :- consumable(What,Qty), retract(consumable(What,Qty)), NewQty is Qty + 1, assert(consumable(What,NewQty)). % resource database (specifies initial conditions on resources) % reusable resources (facilities, tooling, etc.) -- reusable(What,Status) reusable(assembly_area, available). reusable(inject_mold,available). % consumables (parts, supplies, etc.) -- consumable(What,Qty) consumable(wire,5). consumable(plug,4). consumable(plug_on_wire,0). consumable(wire_switch,0). % test test :- assemble1_wire_switch. % if your prolog interpreter does not support print, then uncomment next line % print(X) :- write(X),nl.