// Service discovery: Simple and more complex goals %% A taxonomy of cities; europe means European Cities, france - French cities germany::europe. austria::europe. france::europe. tyrol::austria. innsbruck:tyrol. lienz:tyrol. vienna:austria. bonn:germany. frankfurt:germany. paris:france. nancy:france. %% Available services serv1[ precondition(go(_From,_To)) -> ${(_From:germany, _To:austria)}, postcondition(go(_From,_To))-> ${t1[start->_From,destination->_To]} ]. serv2[ precondition(go(_From,_To)) -> ${(_From:france, _To:austria)}, postcondition(go(_From,_To))-> ${t3[start->_From,destination->_To]} ]. serv3[ precondition(go(_From,_To)) -> ${(_From:germany, _To:europe)}, postcondition(go(_From,_To))-> ${t2[start->_From,destination->_To]} ]. %% What we want goal[ desire-> ${_Ticket[start->bonn, destination->innsbruck]} /* %% complex goals are also fine desire-> ${_Ticket[start->bonn, (destination->innsbruck ; destination->lienz) ]} desire-> ${_Ticket[start->bonn, (destination->vienna ; (destination->_X:tyrol, not destination->lienz)) ]} */ ]. %% The discovery query %% Note: This query is general -- doesn't depend on a particular %% discovery problem ?- _In = go(bonn,innsbruck), Serv[precondition(_In)->_Precond, postcondition(_In) -> _Post], goal[desire->_Desire], _Precond, insert{_Post}, % hypothetically assert postcondition _Desire, write('\n\nService ')@prolog(), write(Serv)@prolog(), writeln(' matches!')@prolog(), delete{_Post}.