No predicates are static.
The derived predicates are: pressurised, flow, noflow, unpressurised.
The primitive predicates are: on, off, plugged, unplugged, empty, halffull, full, overflow and wet.
The obvious solution is:
preconditions: off(t3) (or perhaps true) addlist: [on(t3)] deletelist: [off(t3)] (or perhaps []).However, this isn't quite right, as it doesn't fully specify its effect on empty, halffull, full, etc. There is no simple representation in STRIPs, as whether the floors gets wet depends on other conditions.
We would like something like a conditional addlist: if sink is full and t1 is on then add wet(floor).
Again, the obvious solution is:
preconditions: true addlist: [] deletelist: []But, if there is water flowing in the bath, and the bath is half full, then full(bath) should be added and halffull(bath) should be removed, and full(bath) were true then add wet(floor), etc.
I would say that the situation calculus is more natural as all of the rules are local. The problem with STRIPs is that the effect of actions can propagate to be non local. For example, one effect of turnon(t1) could be to wet the floor (if t2 were on and the bath is full). In the situation calculus this is taken care of, but for STRIPs we need to say directly how it affects each primitive (and wet(floor) needs to be primitive).