надо реализовать десвия, вот пример на вижул прологе, его надо перевести на gnu prolog
код на вижул прологе
DOMAINS
Name= coffee; coffeegrinder;ground(Name);water;coffeemachine;dresser; shop;home;
man;range; have(Name); nohave(Name);near(Name); far(Name);in(Name,Name); noin(Name,Name);
on(Name,Name); noon(Name,Name)
State=state(Name, Name, Name, Name);state2(Name,Name)
Action=put; take; buy; go
PREDICATES
act(State,Action,State)
st(State)
canweld(State)
CLAUSES
act(state(on(man,home), nohave(coffee), in(coffeegrinder,dresser), noon(coffeemachine,range)),
go,state(on(man,shop),nohave(coffee), in(coffeegrinder,dresser), noon(coffeemachine,range))).
act(state(on(man,shop),nohave(coffee), in(coffeegrinder,dresser), noon(coffeemachine,range)),
buy,state(on(man,home),have(coffee), in(coffeegrinder,dresser), noon(coffeemachine,range))).
act(state(on(man,home),have(coffee), in(coffeegrinder,dresser), noon(coffeemachine,range)),
go,state(near(dresser),have(coffee), in(coffeegrinder,dresser), noon(coffeemachine,range))).
act(state(near(dresser),_,in(coffeegrinder,dresser),_), take,state(near(dresser),_,have(coffeegrinder),_)).
act(state(_,have(ground(coffee)),_,_),go,state(near(range),have(ground(coffee)),_,_)).
act(state2(noin(water,coffeemachine), noin(ground(coffee), coffeemachine)),put,
state2(in(water,coffeemachine), in(ground(coffee), coffeemachine))).
st(state(_,_,_,on(coffeemachine,range))):-st(state(near(range),_,_,_)),st(state2(in(water,coffeemachine),
in(ground(coffee), coffeemachine))).
st(state(_,have(ground(coffee)),_,_)):-st(state(_,_,have(coffeegrinder),_)).
canweld(state(_,_,_,on(coffeemachine,range))).
canweld(State1):-act(State1,_,State2),canweld(State2).
GOAL
/*canweld(state(on(man,home), nohave(coffee), in(coffeegrinder,dresser), noon(coffeemachine,range))).*/
/*canweld(state(on(man,home), nohave(coffee), noin(coffeegrinder,dresser), noon(coffeemachine,range))).*/
canweld(state(_, nohave(coffee), noin(coffeegrinder,dresser), noon(coffeemachine,range))).