% Dispatch Work Station Logical Specification % move is the responsibility; find_transport, ... are obligations move(Material) :- % Response+ find_transport(Material,Transport), find_operator(Transport,Operator), make_assignment(Operator,Transport,Material),!. move(Material) :- % Response- decline_request(Material). find_transport(Material,Transport) :- % Response+ move_by(Material,Transport), equipment(Transport,available). find_operator(Transport,Operator) :- % Response+ operator(Operator,available), operator_skills(Operator,Skills), have_skill(Transport,Skills). make_assignment(Operator,Transport,Material) :- % Response+ assign_operator(Operator), assign_transport(Transport), issue_work_order(Operator,Transport,Material). decline_request(Material) :- print('resources are not available to move ',Material). assign_operator(Operator) :- retract(operator(Operator,available)), assert(operator(Operator,busy)). assign_transport(Transport) :- retract(equipment(Transport,available)), assert(equipment(Transport,busy)). issue_work_order(Operator,Transport,Material) :- assert(assignment(Operator,Transport,Material)), print(Operator,' has been assigned to move ',Material). move_completed(Operator) :- assignment(Operator,Transport,_), release_transport(Transport), release_operator(Operator), assignment_completed(Operator),!. release_operator(Operator) :- retract(operator(Operator,busy)), assert(operator(Operator,available)). release_transport(Transport) :- retract(equipment(Transport,busy)), assert(equipment(Transport,available)). assignment_completed(Operator) :- retract(assignment(Operator,_,_)), print(Operator,' has completed move assignment'). % Sample Dispatch Work Station knowledge base facts % transportation needs (capabilities) move_by(tank,crane). move_by(casting,truck). move_by(parts,cart). % operator availability status operator(carl,available). operator(jill,available). operator(tom,available). % operator skills (capabilities) operator_skills(carl,[truck,cart]). operator_skills(jill,[crane,cart]). operator_skills(tom,[truck,cart]). %equipment availability status equipment(crane,available). equipment(truck,available). equipment(cart,available). %auxiliary logic (used to find if an operator has the needed skill) have_skill(X, [X|_]). have_skill(X, [_|Y]) :- have_skill(X,Y). % a sample behaviour test test:- move(tank), move(parts), move(casting), move_completed(jill), move(parts). test?