When an object is created, it will inherit from its parents their dynamic behavior. Methods that are declared dynamic in a parent, will be copied into the object, and its dynamic behavior preserved.
a:: { super(object) & dynamic p/1 & p(1) & p(2) } b :: { super(a) } | ?- b::p(X). X = 1 ? ; X = 2 ? ; no | ?- b::asserta(p(3)). yes | ?- b::p(X). X = 3 ? ; X = 1 ? ; X = 2 ? ; no
Notice that by redeclaring a method to be dynamic in a sub-object, amounts to redefining the method, and overriding of the parent definition will take effect.
c :: { super(a) & dynamic p/1 } | ?- c::p(X). no