feldman@eldir.cs.cornell.edu (Ronen Feldman) (06/08/90)
I faced the following problem. I have a planner that achives goals in the block world. The code follows, when I issue the goal "holding(a)" I get an infinite loop here is the output : unstack(e,d)stack(e,d)stack(e,d)stack(e,d)stack(e,d)stack(e,d)stack(e,d)stack(e,d)stack(e,d)stack(e,d)stack(e,d)stack(e,d)stack(e,d)stack(e,d)stack(e,d)stack(e,d)stack(e,d)stack(.... The problem is that the order of the clauses for empty_arm is empty_arm :- stack(X,Y),write(stack(X,Y)). empty_arm :- putdown(X),write(putdown(X)). unstack which calls empty_arm checks then (via bretract) that X is clear but after stacking Y on X it is no longer clear. So the infinite loop is in unstack(X,Y) between empty_arm and bretract(clear(X)). Note that the bassert and bretract are needed to cope correctly with the backtracking. Besides changing the order of the clauses in empty_arm. Does any one has another solution (like writing some kind of meta-interpreter)? The nmain problem is that the depth does'nt increase so depth limit won't help here. Any comments will be appreciated. Ronen Feldman (feldman@cs.cornell.edu) preds([pickup/1,unstack/2,putdown/1,stack/2,holding/1,clear/1,empty_arm/0, ontable/1,on/2]). facts([fact/1]). fname('planner.dom'). pickup(X) :- clear(X),empty_arm,fact(ontable(X)), bassert(fact(holding(X))),bretract(fact(ontable(X))), bretract(fact(clear(X))),bretract(fact(empty_arm)). unstack(X,Y) :- fact(on(X,Y)),clear(X),empty_arm, bassert(fact(clear(Y))),bassert(fact(holding(X))), bretract(fact(on(X,Y))),bretract(fact(clear(X))), bretract(fact(empty_arm)). putdown(X) :- fact(holding(X)), bassert(fact(empty_arm)),bassert(fact(ontable(X))),bassert(fact(clear(X))), bretract(fact(holding(X))). stack(X,Y) :- holding(X),clear(Y), bassert(fact(on(X,Y))),bassert(fact(empty_arm)),bassert(fact(clear(X))), bretract(fact(holding(X))),bretract(fact(clear(Y))). holding(X) :- fact(holding(X)). holding(X) :- pickup(X),write(pickup(X)). holding(x) :- unstack(X,Y),write(unstack(X,Y)). clear(X) :- fact(clear(X)). clear(Y) :- unstack(X,Y),write(unstack(X,Y)). clear(X) :- putdown(X),write(putdown(X)). clear(X) :- stack(X,Y),write(stack(X,Y)). empty_arm :- fact(empty_arm). empty_arm :- stack(X,Y),write(stack(X,Y)). empty_arm :- putdown(X),write(putdown(X)). ontable(X) :- fact(ontable(X)). ontable(X) :- putdown(X),write(putdown(X,Y)). on(X,Y) :- fact(on(X,Y)). on(X,Y) :- stack(X,Y),write(stack(X,Y)). bassert(X) :- assert(X). bassert(X) :- retract(X),fail. bretract(X) :- not(X),!,fail. bretract(X) :- retract(X). bretract(X) :- assert(X),fail. fact(empty_arm). fact(on(b,a)). fact(on(c,b)). fact(on(d,c)). fact(on(e,d)). fact(ontable(a)). fact(clear(e)).