It is difficult to describe in advance all changes which are caused by an action, because the kind of changes that are brought about depends on the situation in which the action occurs. This problem is known as the ramification problem. As a solution to the problem, we introduce an idea of "causal chains of primitive changes", and formalize the changes caused by an action as the union of the primitive changes in a causal chain. Our final goal is to program an autonomous agent. Thus, we assume here that the initial primitive change in a causal chain is an internal change, such as attempting to step ahead, of the autonomous agent. Causality is defined as a set of causal relations, and each causal relation represents that when a certain pattern of change emerges in a situation of a certain type, another pattern of change also emerges at the moment. Therefore, the causal history of primitive changes does not affect what primitive changes are caused next. As a result, less definitions of causal relations are necessary to deal with many phenomena in our framework. Moreover, as a solution to the qualification problem - the difficulty in describing the condition of each action which makes it succeed - we extend our formalism by introducing non-monotonicity to the definition of causal relations using the hierarchy of situation types. That is, the definitions of causality in a common situation do not require any rigid specifications of their pre-situation type. On the other hand, the definitions of causality in an exceptional situation must specify how the situation is exceptional. Then, the former definitions are effective in the common situation, while the latter inhibit the former in the exceptional situation.