% hydraulic1.pl, uses table modes as supported by B-Prolog version 7.3 % by Neng-Fa Zhou, April 7, 2009 % http://www.cs.kuleuven.be/~dtai/events/ASP-competition/Benchmarks/Hydraulic1.shtml :-include(base). :-set_prolog_flag(unknown,fail). :-dynamic link/3,stuck/1,full/1,goal/1. solve(As):- assert_facts(As), goal(J), % jet J needs to be pressurized pressurize(J,Plan,Len),!, Len1 is Len-1, output(Plan,Len1), abolish_all. solve(_):- format("UNSATISFIABLE~n"), abolish_all. :-table pressurize(+,-,min). pressurize(Node,Plan,Len):- full(Node),!, Plan=[],Len=0. pressurize(Node,[Valve|Plan],Len):- link(AnotherNode,Node,Valve), \+ stuck(Valve), pressurize(AnotherNode,Plan,Len1), Len is Len1+1. output([],_). output([Valve|Plan],Len):- format("switchon(~w,~w). ",[Valve,Len]), Len1 is Len-1, output(Plan,Len1). test:- solve([numValves(11), tank(t011), tank(t012), jet(j), junction(p1), junction(p2), junction(p3), junction(p4), junction(p5), junction(p6), junction(p7), valve(v1), valve(v2), valve(v3), valve(v4), valve(v5), valve(v6), valve(v7), valve(v8), valve(v9), valve(v10), valve(v11), link(t011, p1, v1), link(p1, p2, v2), link(p2, p3, v3), link(p3, p4, v4), link(p1, p5, v5), link(p5, p1, v5), link(p2, p6, v6), link(p6, p2, v6), link(p3, p7, v7), link(p4, j, v8), link(t012, p5, v11), link(p5, p6, v9), link(p7, j, v10), full(t011), full(t012), goal(j)]).