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).