Class InverseTraceRelation `{State : Type} `{Event : Type} (step : step_relation State Event) :=
  {
    init : State;
    T : (list Event) -> Prop;
    R : State -> Prop;
    R_dec : forall s, {R s} + {~ R s};
    T_monotonic : forall tr o, T tr -> T (tr ++ o);
    R_false_init : ~ R init;
    R_implies_T : forall s s' o tr,
                    refl_trans_1n_trace step init s tr ->
                    ~ R s ->
                    step s s' o ->
                    R s' ->
                    T (tr ++ o)
  }.Class InverseTraceRelation `{State : Type} `{Event : Type} (step : step_relation State Event) :=
  {
    init : State;
    T : (list Event) -> Prop;
    R : State -> Prop;
    R_dec : forall s, {R s} + {~ R s};
    T_monotonic : forall tr o, T tr -> T (tr ++ o);
    R_false_init : ~ R init;
    R_implies_T : forall s s' o tr,
                    refl_trans_1n_trace step init s tr ->
                    ~ R s ->
                    step s s' o ->
                    R s' ->
                    T (tr ++ o)
  }.Class InverseTraceRelation `{State : Type} `{Event : Type} (step : step_relation State Event) :=
  {
    init : State;
    T : (list Event) -> Prop;
    R : State -> Prop;
    R_dec : forall s, {R s} + {~ R s};
    T_monotonic : forall tr o, T tr -> T (tr ++ o);
    R_false_init : ~ R init;
    R_implies_T : forall s s' o tr,
                    refl_trans_1n_trace step init s tr ->
                    ~ R s ->
                    step s s' o ->
                    R s' ->
                    T (tr ++ o)
  }.Class InverseTraceRelation `{State : Type} `{Event : Type} (step : step_relation State Event) :=
  {
    init : State;
    T : (list Event) -> Prop;
    R : State -> Prop;
    R_dec : forall s, {R s} + {~ R s};
    T_monotonic : forall tr o, T tr -> T (tr ++ o);
    R_false_init : ~ R init;
    R_implies_T : forall s s' o tr,
                    refl_trans_1n_trace step init s tr ->
                    ~ R s ->
                    step s s' o ->
                    R s' ->
                    T (tr ++ o)
  }.Class InverseTraceRelation `{State : Type} `{Event : Type} (step : step_relation State Event) :=
  {
    init : State;
    T : (list Event) -> Prop;
    R : State -> Prop;
    R_dec : forall s, {R s} + {~ R s};
    T_monotonic : forall tr o, T tr -> T (tr ++ o);
    R_false_init : ~ R init;
    R_implies_T : forall s s' o tr,
                    refl_trans_1n_trace step init s tr ->
                    ~ R s ->
                    step s s' o ->
                    R s' ->
                    T (tr ++ o)
  }.Class InverseTraceRelation `{State : Type} `{Event : Type} (step : step_relation State Event) :=
  {
    init : State;
    T : (list Event) -> Prop;
    R : State -> Prop;
    R_dec : forall s, {R s} + {~ R s};
    T_monotonic : forall tr o, T tr -> T (tr ++ o);
    R_false_init : ~ R init;
    R_implies_T : forall s s' o tr,
                    refl_trans_1n_trace step init s tr ->
                    ~ R s ->
                    step s s' o ->
                    R s' ->
                    T (tr ++ o)
  }.Class InverseTraceRelation `{State : Type} `{Event : Type} (step : step_relation State Event) :=
  {
    init : State;
    T : (list Event) -> Prop;
    R : State -> Prop;
    R_dec : forall s, {R s} + {~ R s};
    T_monotonic : forall tr o, T tr -> T (tr ++ o);
    R_false_init : ~ R init;
    R_implies_T : forall s s' o tr,
                    refl_trans_1n_trace step init s tr ->
                    ~ R s ->
                    step s s' o ->
                    R s' ->
                    T (tr ++ o)
  }.Class InverseTraceRelation `{State : Type} `{Event : Type} (step : step_relation State Event) :=
  {
    init : State;
    T : (list Event) -> Prop;
    R : State -> Prop;
    R_dec : forall s, {R s} + {~ R s};
    T_monotonic : forall tr o, T tr -> T (tr ++ o);
    R_false_init : ~ R init;
    R_implies_T : forall s s' o tr,
                    refl_trans_1n_trace step init s tr ->
                    ~ R s ->
                    step s s' o ->
                    R s' ->
                    T (tr ++ o)
  }.

Theorem inverse_trace_relations_work : forall s tr, refl_trans_1n_trace step init s tr -> R s -> T tr.