We need to know when a tap is off, and this must be primitive:
off(t3,init). off(t2,init). off(t1,init). off(T,do(turnoff(T),S)) <- poss(turnoff(T),S). off(T,do(A,S)) <- poss(A,S) & off(T,S) & A \= turnon(T).We can then axiomatize how flows work:
noflow(sink,S) <- off(t3,S). noflow(sink,S) <- unpressurised(p3,S). unpressurised(p3,S) <- off(t1,S). unpressurised(p3,S) <- unpressurised(p1,S). noflow(shower,S) <- off(t2,S). noflow(shower,S) <- unpressurised(p2,S). unpressurised(p2,S) <- off(t1,S). unpressurised(p2,S) <- unpressurised(p1,S).