Documentation

LeanPool.EventStructures.Trace

Traces and the trace monoid #

This module defines trace equivalence on lists of events (the congruence generated by swapping adjacent concurrent events), shows it is an equivalence relation and a congruence for concatenation, and builds the trace monoid as the quotient of lists of events by trace equivalence.

Trace equivalence: two traces are equivalent if one can be obtained from the other by swapping adjacent concurrent events.

Instances For

    Trace equivalence is reflexive.

    theorem EventStructures.Trace.traceEquiv_trans (es : EventStructure) t₁ t₂ t₃ : List es.Event :
    TraceEquiv es t₁ t₂TraceEquiv es t₂ t₃TraceEquiv es t₁ t₃

    Trace equivalence is transitive.

    theorem EventStructures.Trace.traceEquiv_symm (es : EventStructure) t₁ t₂ : List es.Event :
    TraceEquiv es t₁ t₂TraceEquiv es t₂ t₁

    Trace equivalence is symmetric.

    Trace equivalence is an equivalence relation.

    @[implicit_reducible]

    Trans instance for calc proofs.

    Equations
    theorem EventStructures.Trace.traceEquiv_append_left (es : EventStructure) {t₁ t₂ : List es.Event} (h : TraceEquiv es t₁ t₂) (t : List es.Event) :
    TraceEquiv es (t ++ t₁) (t ++ t₂)

    Trace equivalence is a left congruence for append.

    theorem EventStructures.Trace.traceEquiv_append_right (es : EventStructure) {t₁ t₂ : List es.Event} (h : TraceEquiv es t₁ t₂) (t : List es.Event) :
    TraceEquiv es (t₁ ++ t) (t₂ ++ t)

    Trace equivalence is a right congruence for append.

    theorem EventStructures.Trace.traceEquiv_append (es : EventStructure) {t₁ t₂ t₃ t₄ : List es.Event} (h₁ : TraceEquiv es t₁ t₂) (h₂ : TraceEquiv es t₃ t₄) :
    TraceEquiv es (t₁ ++ t₃) (t₂ ++ t₄)

    Trace equivalence is a congruence for append.

    @[implicit_reducible]

    Setoid instance for trace equivalence.

    Equations

    The trace monoid: lists of events quotiented by trace equivalence.

    Equations
    Instances For
      @[implicit_reducible]

      Multiplication in the trace monoid (concatenation of traces).

      Equations
      @[implicit_reducible]

      Identity element in the trace monoid (empty trace).

      Equations

      Left identity law for trace monoid.

      Right identity law for trace monoid.

      theorem EventStructures.Trace.Monoid.mul_assoc (es : EventStructure) (x y z : TraceMonoid es) :
      x * y * z = x * (y * z)

      Associativity law for trace monoid.

      @[implicit_reducible]

      The trace monoid is a monoid.

      Equations
      • One or more equations did not get rendered due to their size.
      theorem EventStructures.Trace.Monoid.move_head_full (es : EventStructure) (hfull : ∀ (e₁ e₂ : es.Event), es.concurrent e₁ e₂) (e : es.Event) (t : List es.Event) :
      TraceEquiv es (e :: t) (t ++ [e])

      If the concurrency relation is full, the head of the list can be moved to the end

      theorem EventStructures.Trace.Monoid.mul_comm_full (es : EventStructure) (hfull : ∀ (e₁ e₂ : es.Event), es.concurrent e₁ e₂) (t₁ t₂ : List es.Event) :
      TraceEquiv es (t₁ ++ t₂) (t₂ ++ t₁)

      If the concurrency relation is full, the monoid is commutative.

      theorem EventStructures.Trace.Monoid.traceEquiv_eq_empty (es : EventStructure) (hempty : ∀ (e₁ e₂ : es.Event), ¬es.concurrent e₁ e₂) {t₁ t₂ : List es.Event} (h : TraceEquiv es t₁ t₂) :
      t₁ = t₂

      If the concurrency relation is empty, trace equivalence is just list equality.

      theorem EventStructures.Trace.Monoid.mul_not_comm_empty (es : EventStructure) (hempty : ∀ (e₁ e₂ : es.Event), ¬es.concurrent e₁ e₂) (hdistinct : (e₁ : es.Event), (e₂ : es.Event), e₁ e₂) :
      (t₁ : List es.Event), (t₂ : List es.Event), ¬TraceEquiv es (t₁ ++ t₂) (t₂ ++ t₁)

      If the concurrency relation is empty and there are at least two distinct events, then the monoid is not commutative.