Trace equivalence: two traces are equivalent if one can be obtained from the other by swapping adjacent concurrent events.
- refl {es : EventStructure} (t : List es.Event) : TraceEquiv es t t
- swap {es : EventStructure} {e₁ e₂ : es.Event} {t₁ t₂ t₃ : List es.Event} (ind : es.concurrent e₁ e₂) : TraceEquiv es (t₁ ++ e₁ :: e₂ :: t₂) t₃ → TraceEquiv es (t₁ ++ e₂ :: e₁ :: t₂) t₃
Instances For
Trace equivalence is reflexive.
Trace equivalence is transitive.
Trace equivalence is symmetric.
Trans instance for calc proofs.
Equations
- Trace.instTransListEventTraceEquiv es = { trans := ⋯ }
Trace equivalence is a left congruence for append.
Trace equivalence is a right congruence for append.
Trace equivalence is a congruence for append.
Setoid instance for trace equivalence.
Equations
- Trace.traceEquivSetoid es = { r := TraceEquiv es, iseqv := ⋯ }
The trace monoid: lists of events quotiented by trace equivalence.
Equations
Instances For
Lift a list to the trace monoid.
Equations
- Trace.Monoid.mk es t = Quotient.mk (Trace.traceEquivSetoid es) t
Instances For
Multiplication in the trace monoid (concatenation of traces).
Equations
- Trace.Monoid.instMulTraceMonoid es = { mul := Quotient.lift₂ (fun (t₁ t₂ : List es.Event) => Trace.Monoid.mk es (t₁ ++ t₂)) ⋯ }
Identity element in the trace monoid (empty trace).
Equations
- Trace.Monoid.instOneTraceMonoid es = { one := Trace.Monoid.mk es [] }
Left identity law for trace monoid.
Right identity law for trace monoid.
Associativity law for trace monoid.
The trace monoid is a monoid.
Equations
- One or more equations did not get rendered due to their size.
If the concurrency relation is full, the head of the list can be moved to the end
If the concurrency relation is full, the monoid is commutative.
If the concurrency relation is empty, trace equivalence is just list equality.