Skip to main content Svelte Highlight v7.23.1

TLA+ language preview

1. A counter's spec and invariant

MODULE banner, VARIABLE, and a THEOREM about the spec
horizon-dark
---- MODULE Counter ----
EXTENDS Naturals

VARIABLE count

TypeOK == count \in Nat

Init == count = 0

(* the next-state relation
   (* count only ever goes up *) *)
Next == count' = count + 1

Spec == Init /\ [][Next]_count

THEOREM Spec => [](TypeOK)
====
atom-one-dark
---- MODULE Counter ----
EXTENDS Naturals

VARIABLE count

TypeOK == count \in Nat

Init == count = 0

(* the next-state relation
   (* count only ever goes up *) *)
Next == count' = count + 1

Spec == Init /\ [][Next]_count

THEOREM Spec => [](TypeOK)
====
github-dark
---- MODULE Counter ----
EXTENDS Naturals

VARIABLE count

TypeOK == count \in Nat

Init == count = 0

(* the next-state relation
   (* count only ever goes up *) *)
Next == count' = count + 1

Spec == Init /\ [][Next]_count

THEOREM Spec => [](TypeOK)
====
dracula
---- MODULE Counter ----
EXTENDS Naturals

VARIABLE count

TypeOK == count \in Nat

Init == count = 0

(* the next-state relation
   (* count only ever goes up *) *)
Next == count' = count + 1

Spec == Init /\ [][Next]_count

THEOREM Spec => [](TypeOK)
====
nord
---- MODULE Counter ----
EXTENDS Naturals

VARIABLE count

TypeOK == count \in Nat

Init == count = 0

(* the next-state relation
   (* count only ever goes up *) *)
Next == count' = count + 1

Spec == Init /\ [][Next]_count

THEOREM Spec => [](TypeOK)
====
github
---- MODULE Counter ----
EXTENDS Naturals

VARIABLE count

TypeOK == count \in Nat

Init == count = 0

(* the next-state relation
   (* count only ever goes up *) *)
Next == count' = count + 1

Spec == Init /\ [][Next]_count

THEOREM Spec => [](TypeOK)
====

2. Two-phase commit

CONSTANT, a state machine over a set of resource managers
horizon-dark
---- MODULE TwoPhaseCommit ----
EXTENDS Naturals, FiniteSets

CONSTANT RM

VARIABLE rmState

Init == rmState = [rm \in RM |-> "working"]

canCommit == \A rm \in RM : rmState[rm] \in {"prepared", "committed"}

Prepare(rm) ==
  /\ rmState[rm] = "working"
  /\ rmState' = [rmState EXCEPT ![rm] = "prepared"]

Commit(rm) ==
  /\ canCommit
  /\ rmState' = [rmState EXCEPT ![rm] = "committed"]

Abort(rm) ==
  /\ rmState[rm] # "committed"
  /\ rmState' = [rmState EXCEPT ![rm] = "aborted"]
====
atom-one-dark
---- MODULE TwoPhaseCommit ----
EXTENDS Naturals, FiniteSets

CONSTANT RM

VARIABLE rmState

Init == rmState = [rm \in RM |-> "working"]

canCommit == \A rm \in RM : rmState[rm] \in {"prepared", "committed"}

Prepare(rm) ==
  /\ rmState[rm] = "working"
  /\ rmState' = [rmState EXCEPT ![rm] = "prepared"]

Commit(rm) ==
  /\ canCommit
  /\ rmState' = [rmState EXCEPT ![rm] = "committed"]

Abort(rm) ==
  /\ rmState[rm] # "committed"
  /\ rmState' = [rmState EXCEPT ![rm] = "aborted"]
====
github-dark
---- MODULE TwoPhaseCommit ----
EXTENDS Naturals, FiniteSets

CONSTANT RM

VARIABLE rmState

Init == rmState = [rm \in RM |-> "working"]

canCommit == \A rm \in RM : rmState[rm] \in {"prepared", "committed"}

Prepare(rm) ==
  /\ rmState[rm] = "working"
  /\ rmState' = [rmState EXCEPT ![rm] = "prepared"]

Commit(rm) ==
  /\ canCommit
  /\ rmState' = [rmState EXCEPT ![rm] = "committed"]

Abort(rm) ==
  /\ rmState[rm] # "committed"
  /\ rmState' = [rmState EXCEPT ![rm] = "aborted"]
====
dracula
---- MODULE TwoPhaseCommit ----
EXTENDS Naturals, FiniteSets

CONSTANT RM

VARIABLE rmState

Init == rmState = [rm \in RM |-> "working"]

canCommit == \A rm \in RM : rmState[rm] \in {"prepared", "committed"}

Prepare(rm) ==
  /\ rmState[rm] = "working"
  /\ rmState' = [rmState EXCEPT ![rm] = "prepared"]

Commit(rm) ==
  /\ canCommit
  /\ rmState' = [rmState EXCEPT ![rm] = "committed"]

Abort(rm) ==
  /\ rmState[rm] # "committed"
  /\ rmState' = [rmState EXCEPT ![rm] = "aborted"]
====
nord
---- MODULE TwoPhaseCommit ----
EXTENDS Naturals, FiniteSets

CONSTANT RM

VARIABLE rmState

Init == rmState = [rm \in RM |-> "working"]

canCommit == \A rm \in RM : rmState[rm] \in {"prepared", "committed"}

Prepare(rm) ==
  /\ rmState[rm] = "working"
  /\ rmState' = [rmState EXCEPT ![rm] = "prepared"]

Commit(rm) ==
  /\ canCommit
  /\ rmState' = [rmState EXCEPT ![rm] = "committed"]

Abort(rm) ==
  /\ rmState[rm] # "committed"
  /\ rmState' = [rmState EXCEPT ![rm] = "aborted"]
====
github
---- MODULE TwoPhaseCommit ----
EXTENDS Naturals, FiniteSets

CONSTANT RM

VARIABLE rmState

Init == rmState = [rm \in RM |-> "working"]

canCommit == \A rm \in RM : rmState[rm] \in {"prepared", "committed"}

Prepare(rm) ==
  /\ rmState[rm] = "working"
  /\ rmState' = [rmState EXCEPT ![rm] = "prepared"]

Commit(rm) ==
  /\ canCommit
  /\ rmState' = [rmState EXCEPT ![rm] = "committed"]

Abort(rm) ==
  /\ rmState[rm] # "committed"
  /\ rmState' = [rmState EXCEPT ![rm] = "aborted"]
====

3. Mutual exclusion with unicode operators

∀, ∈, and → in a safety property
horizon-dark
---- MODULE MutexSafety ----
EXTENDS Naturals

CONSTANT Procs

VARIABLE pc

MutualExclusion ==
  ∀ p1, p2 ∈ Procs :
    (p1 # p2) → ¬(pc[p1] = "critical" ∧ pc[p2] = "critical")

THEOREM Spec => [](MutualExclusion)
====
atom-one-dark
---- MODULE MutexSafety ----
EXTENDS Naturals

CONSTANT Procs

VARIABLE pc

MutualExclusion ==
  ∀ p1, p2 ∈ Procs :
    (p1 # p2) → ¬(pc[p1] = "critical" ∧ pc[p2] = "critical")

THEOREM Spec => [](MutualExclusion)
====
github-dark
---- MODULE MutexSafety ----
EXTENDS Naturals

CONSTANT Procs

VARIABLE pc

MutualExclusion ==
  ∀ p1, p2 ∈ Procs :
    (p1 # p2) → ¬(pc[p1] = "critical" ∧ pc[p2] = "critical")

THEOREM Spec => [](MutualExclusion)
====
dracula
---- MODULE MutexSafety ----
EXTENDS Naturals

CONSTANT Procs

VARIABLE pc

MutualExclusion ==
  ∀ p1, p2 ∈ Procs :
    (p1 # p2) → ¬(pc[p1] = "critical" ∧ pc[p2] = "critical")

THEOREM Spec => [](MutualExclusion)
====
nord
---- MODULE MutexSafety ----
EXTENDS Naturals

CONSTANT Procs

VARIABLE pc

MutualExclusion ==
  ∀ p1, p2 ∈ Procs :
    (p1 # p2) → ¬(pc[p1] = "critical" ∧ pc[p2] = "critical")

THEOREM Spec => [](MutualExclusion)
====
github
---- MODULE MutexSafety ----
EXTENDS Naturals

CONSTANT Procs

VARIABLE pc

MutualExclusion ==
  ∀ p1, p2 ∈ Procs :
    (p1 # p2) → ¬(pc[p1] = "critical" ∧ pc[p2] = "critical")

THEOREM Spec => [](MutualExclusion)
====