% hydraulic2.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/Hydraulic2.shtml :-include(base). :-set_prolog_flag(unknown,fail). :-dynamic link/3,stuck/1,full/1,goal/1,link/3,leaking/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). % find a shortest plan among those using the least number of leaking valves. :-table pressurize(+,-,min). pressurize(Node,Plan,(Leaks,Len)):- full(Node),!,Plan=[],Leaks=0,Len=0. pressurize(Node,[Valve|Plan],(Leaks,Len)):- link(AnotherNode,Node,Valve), \+ stuck(Valve), pressurize(AnotherNode,Plan,(Leaks1,Len1)), Len is Len1+1, (leaking(Valve)->Leaks is Leaks1+1;Leaks is Leaks1). output([],_). output([Valve|Plan],Len):- format("switchon(~w,~w). ",[Valve,Len]), Len1 is Len-1, output(Plan,Len1). test:- solve([numValves(11), tank(t021), tank(t022), 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(t021, 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(t022, p5, v11), link(p5, p6, v9), link(p7, j, v10), full(t021), full(t022), leaking(v1), leaking(v2), leaking(v6), leaking(v4), leaking(v7), goal(j)]).