Blocks world axiom/query examples from lecture
Allikas: Lambda
First, a simple version.
%set(auto). set(factor). set(binary_res). %clear(print_kept). set(prolog_style_variables). list(sos). %formulas(sos). % ----- initial situation ------ holds(on(a,table),s0). holds(on(b,table),s0). holds(on(c,d),s0). holds(on(d,table),s0). holds(clear(a),s0). holds(clear(b),s0). holds(clear(c),s0). holds(empty,s0). holds(clear(table),State). % ---- difference of objects ----- differ(X,Y) | -differ(Y,X). differ(a,b). differ(a,c). differ(a,d). differ(a,table). differ(b,c). differ(b,d). differ(b,table). differ(c,d). differ(c,table). differ(d,table). % ---- rules ----- %holds(and(X,Y),State) % | -holds(X,State) % | -holds(Y,State). % pickup rules holds(holding(X),do(pickup(X),State)) | -holds(empty,State) | -holds(clear(X),State) | -differ(X,table). holds(clear(Y),do(pickup(X),State)) | -holds(on(X,Y),State) | -holds(clear(X),State) | -holds(empty,State). % frame axioms for pickup holds(on(X,Y),do(pickup(Z),State)) | -holds(on(X,Y),State) | -differ(X,Z). holds(clear(X),do(pickup(Z),State)) | -holds(clear(X),State) | -differ(X,Z). % putdown rules holds(empty,do(putdown(X,Y),State)) | -holds(holding(X),State) | -holds(clear(Y),State). holds(on(X,Y),do(putdown(X,Y),State)) | -holds(holding(X),State) | -holds(clear(Y),State). holds(clear(X),do(putdown(X,Y),State)) | -holds(holding(X),State) | -holds(clear(Y),State). % frame axioms for putdown holds(on(X,Y),do(putdown(Z,W),State)) | -holds(on(X,Y),State). holds(clear(Z),do(putdown(X,Y),State)) | -holds(clear(Z),State) | -differ(Z,Y). % ----- query ------- end_of_list. list(usable). -holds(on(b,a),State) | -holds(on(c,b),State). %-holds(and(on(c,b),on(b,a)),State). end_of_list.
Second, a lot more complex version (not necessarily better!)
% this is the way comments start %set(hyper_res). % another alternative is set(binary_res) %set(factor). % probably comes automatically %set(para_from). %set(para_into). set(auto). clear(print_kept). % this will print out ALL derived and kept stuff %formula_list(sos). % use list(sos) if not formula syntax formulas(sos). on(b,table,s0). on(a,table,s0). on(c,table,s0). empty(s0). all x hasspace(table,x). -on(b,a,s0). -on(a,b,s0). -on(c,b,s0). -on(c,a,s0). -on(a,c,s0). -on(b,c,s0). all x all y -on(table,x,y). block(a). block(b). block(c). -block(table). % being clear: closed world all z ((-on(b,a,z) & -on(c,a,z)) -> clear(a,z)). all z ((-on(a,b,z) & -on(c,b,z)) -> clear(b,z)). all z ((-on(a,c,z) & -on(b,c,z)) -> clear(c,z)). % general world rules all x all y (clear(x,y) -> hasspace(x,y)). all x all y all z ((on(x,y,z) & block(y)) -> -on(x,table,z)). all x all z ( -(exists y on(y,x,z)) -> clear(x,z)). % closed world %all x (x=a | x=b | x=c | x=table). %a!=b. %a!=c. %a!=table. %b!=c. %b!=table. %c!=table. all x (sameas(x,a) | sameas(x,b) | sameas(x,c) | sameas(x,table)). -sameas(a,b). -sameas(a,c). -sameas(a,table). -sameas(b,c). -sameas(b,table). -sameas(c,table). all x sameas(x,x). all x all y (sameas(x,y) -> sameas(y,x)). %all x all y all z (sameas(x,y) & sameas(y,z) -> sameas(x,z)). % actions all x all y all z ((holds(x,z) & hasspace(y,z) & -sameas(x,y) ) -> (on(x,y,puton(x,y,z)) & -clear(y,puton(x,y,z)) & clear(x,puton(x,y,z)) & hasspace(x,puton(x,y,z)) & empty(puton(x,y,z))) ). all x all y all z ((on(x,y,z) & empty(z) & clear(x,z)) -> (-on(x,y,lift(x,z)) & clear(y,lift(x,z)) & hasspace(y,lift(x,z)) & holds(x,lift(x,z))) ). % frame axioms all x all y all z (-on(x,y,z) -> -on(x,y,lift(x,z)) ). all x all y all z all u ((on(x,y,z) & -sameas(u,x)) -> on(x,y,lift(u,z)) ). all x all y all z ((clear(x,z) & -sameas(x,y)) -> clear(x,lift(y,z)) ). all x all y all z ((-clear(x,z) & -on(y,x)) -> -clear(x,lift(y,z)) ). % all x all y all z all u (-on(x,y,z) -> -on(x,y,puton(x,z)) ). all x all y all z all u ((on(x,y,z) & -sameas(u,x)) -> on(x,y,lift(u,z)) ). all x all y all z all u ((clear(x,z) & -sameas(x,y)) -> clear(x,puton(u,y,z)) ). all x all y all z all u ((-clear(x,z) & -sameas(u,x)) -> -clear(x,puton(u,y,z)) ). % queries all z ((on(c,a,z) & on(b,c,z)) -> $answer(z)). %all z (on(b,c,z) -> $answer(z)). %all z (on(c,a,z) -> $answer(z)). %all z (clear(a,z) -> $answer(z)). end_of_list.