:- use_module(library(lists)). precond(pickup(X),[ontable(X),clear(X),handempty]). del(pickup(X),[ontable(X),clear(X),handempty]). add(pickup(X),[holding(X)]). precond(putdown(X),[holding(X)]). del(putdown(X),[holding(X)]). add(putdown(X),[ontable(X),clear(X),handempty]). precond(stack(X,Y),[holding(X),clear(Y)]). del(stack(X,Y),[holding(X),clear(Y)]). add(stack(X,Y),[on(X,Y),clear(X),handempty]). precond(unstack(X,Y),[on(X,Y),clear(X),handempty]). del(unstack(X,Y),[on(X,Y),clear(X),handempty]). add(unstack(X,Y),[holding(X),clear(Y)]). applicabile(OP,S):- precond(OP,Prec), holds(Prec,S). holds([],S). holds([G|RG],S):- member(G,S), holds(RG,S). trasforma(A,S1,S2):- del(A,DL), deleteall(S1,DL,S), add(A,AL), append(AL,S,S2). deleteall(S,[],S). deleteall(S1,[H|T],S2):- delete(S1,H,SS), deleteall(SS,T,S2). uguale([],[]). uguale([X|R],S):- member(X,S), delete(S,X,SS), uguale(R,SS). iniziale([on(a,b),on(b,c),ontable(c),clear(a),on(d,e),on(e,f),ontable(f),clear(d),handempty]). goal([on(a,b),on(d,e),on(c,f)]). finale(S):- goal(G), holds(G,S).