Theory guide

Explore the axioms, inspect their scope, and read each property in the paper’s notation. Every formula comes from an executable literate theory.

Open the GitHub Pages explorer

This package was vibe-coded following prompts by Murdoch J. Gabbay.

t trueb brokenf false
Both t and b are designated (valid).

Read each theory’s formulas with their named definitions. Labels and declared scopes match the literate sources; the notation switch preserves every formula’s meaning.

Foundationsbasics.md

Three values and the meaning of uniqueness

Run python -m muql check examples/basics.md. Several properties deliberately fail. These are teaching examples of tempting classical assumptions, not claims made by either paper.

Our one-point, one-stage scope makes a countermodel a short truth assignment. The predicates P, Q, and R are unconstrained. Both choices are forced to the broken value by a crisp B test.

The examples use Unicode: ¬, ∧, and ∨ mean not, and, and or; → is weak implication, ⇀ is strong implication, and ≡ compares truth values exactly. ASCII works too: write !, &, |, ->, -\, and <=>. See the notation guide for the full side-by-side reference.

Read the complete literate source
1participants
2values
1stages · finite
1declared quorums
Inspect the declared frame
Participants
alice
Values
red, blue
Quorums
{alice}
Predicates
P/0, Q/0, R/0, choice/1
Time
Time ends at the final stage in the declared finite frame.

The checker takes the union closure of the declared quorums. See the semantics reference for the frame interpretation.

Axioms

1
ChoicesBroken
∀ v. B(choice(v))

Properties to check

12
BrokenIsDesignated
b
BrokenIsTrue
T(b)
ExcludedMiddle
P ∨ ¬P
CrispExcludedMiddle
T(P ∨ ¬P)
WeakDefinition
P → Q ≡ ¬P ∨ Q
StrongDefinition
P ⇀ Q ≡ ¬P ∨ T(Q)
WeakCurrying
P ∧ Q → R ≡ P → Q → R
StrongCurrying
P ∧ Q ⇀ R ≡ P ⇀ Q ⇀ R
DesignatedUnique
∃¹ v. choice(v)
UniqueIsCrisp
T(∃¹ v. choice(v))
TrueWitness
∃ v. T(choice(v))
AtMostOneActuallyTrue
∃⁰¹ v. T(choice(v))
Explore this theory

This page is an offline reader. Run either command from the package directory to check the formulas.

Check declared frame

python -m muql check examples/basics.md

Use exactly the participants, values, stages, and quorum generators declared above.

Search for countermodels

python -m muql search examples/basics.md

Vary finite frames automatically, keeping the named values and time convention. Defaults: up to 3 participants, 2 values, 3 stages, and 8 nonempty quorums.

Foundationssemitopology.md

Current quorums and a non-upward-closed semitopology

Run python -m muql check examples/semitopology.md. The nonempty opens are exactly {a} and {a,b,c}. The generator {a} and the whole point set are already closed under unions; {a,b} and {a,c} are not added. Every nonempty open contains a, so every finite collection of these opens has a nonempty intersection.

Here ◇ and □ range over points in the current quorum; ∃ꟴ and ∀ꟴ range over nonempty quorums. The combined symbols compose these operations: ∃ꟴ□(live) means some quorum is entirely live. See the notation guide for all four combinations and ASCII spellings.

The ASCII aliases somewhere and everywhere mean ◇ and □, respectively: they keep the current quorum. Use someQuorumSomePoint for ∃ꟴ◇ and everyQuorumEveryPoint for ∀ꟴ□ when the formula must also range over quorums.

Read the complete literate source
3participants
1values
1stages · finite
1declared quorums
Inspect the declared frame
Participants
a, b, c
Values
unit
Quorums
{a}
Predicates
live/0
Time
Time ends at the final stage in the declared finite frame.

The checker takes the union closure of the declared quorums. See the semantics reference for the frame interpretation.

Axioms

0

No axioms are declared; these properties explore the logic directly.

Properties to check

10
SomewhereDefinition
∃ꟴ◇live ≡ ∃ꟴ ◇live
EverywhereDefinition
∀ꟴ□live ≡ ∀ꟴ □live
QuorumDefinition
∃ꟴ□live ≡ ∃ꟴ □live
ContraDefinition
∀ꟴ◇live ≡ ∀ꟴ ◇live
LocalJoinBelowGlobalJoin
◇live ≤ ∃ꟴ◇live
GlobalMeetBelowLocalMeet
∀ꟴ□live ≤ □live
PairwiseIntersection
twined(2)
TripleIntersection
twined(3)
CurrentBoxIsGlobal
□live ≡ ∀ꟴ□live
SharedPointAgreement
∃ꟴ□live ≤ ∀ꟴ◇live
Explore this theory

This page is an offline reader. Run either command from the package directory to check the formulas.

Check declared frame

python -m muql check examples/semitopology.md

Use exactly the participants, values, stages, and quorum generators declared above.

Search for countermodels

python -m muql search examples/semitopology.md

Vary finite frames automatically, keeping the named values and time convention. Defaults: up to 3 participants, 2 values, 3 stages, and 8 nonempty quorums.

Foundationsfixedpoints.md

Fixed points on a finite context lattice

Run python -m muql check examples/fixedpoints.md. The scope has three stages and one point. Stutter mode makes the final stage its own future successor. pulse is unconstrained, so recurrence identities are tested against every three-valued pulse sequence in this scope.

Use μ for a least fixed point and ν for a greatest fixed point; ASCII mu and nu work identically. Temporal operators keep their readable word names. See the notation guide for every spelling.

Read the complete literate source
1participants
1values
3stages · stutter
1declared quorums
Inspect the declared frame
Participants
alice
Values
unit
Quorums
{alice}
Predicates
pulse/0
Time
The final stage repeats in the declared stuttering frame.

The checker takes the union closure of the declared quorums. See the semantics reference for the frame interpretation.

Axioms

0

No axioms are declared; these properties explore the logic directly.

Properties to check

8
InclusivePast
(μ X. pulse ∨ yesterday(X)) ≡ past(pulse)
StrictPast
(μ X. yesterday(pulse ∨ X)) ≡ once(pulse)
StrictFuture
(μ X. tomorrow(pulse ∨ X)) ≡ sometime(pulse)
FutureGreatest
(ν X. tomorrow(pulse ∧ X)) ≡ forever(pulse)
EmptyPastRecurrence
(μ X. yesterday(X)) ≡ f
NonmonotoneMeet
(μ X. F(X)) ≡ b
UnfoldingRequiresMonotonicity
(μ X. F(X)) ≡ F(μ X. F(X))
NegationMeet
(μ X. ¬X) ≡ b
Explore this theory

This page is an offline reader. Run either command from the package directory to check the formulas.

Check declared frame

python -m muql check examples/fixedpoints.md

Use exactly the participants, values, stages, and quorum generators declared above.

Search for countermodels

python -m muql search examples/fixedpoints.md

Vary finite frames automatically, keeping the named values and time convention. Defaults: up to 3 participants, 2 values, 3 stages, and 8 nonempty quorums.

Simple protocolssimple_reliable.md

Simple: reliable delivery, no crashes

The first Simple theory in §6.1 of the Paxos paper (p.46) abstracts a protocol in which anyone may propose, everyone accepts a proposal, and a proposer decides when someone accepts. There is only one unnamed value, so all three predicates are nullary. These are the five exact axioms. The two properties below are small tutorial consequences, not named theorems from the paper.

Notation: ⇀ is strong implication (-\ in ASCII), → is weak (->), and ∃ꟴ◇ means “some quorum, some point”. All symbols have ASCII equivalents; either style is accepted.

Read the complete literate source
3participants
1values
1stages · finite
3declared quorums
Inspect the declared frame
Participants
a, b, c
Values
unit
Quorums
{a, b} · {a, c} · {b, c}
Predicates
propose/0, accept/0, decide/0
Time
Time ends at the final stage in the declared finite frame.

The checker takes the union closure of the declared quorums. See the semantics reference for the frame interpretation.

Axioms

5
SimpAccept?
accept ⇀ ∃ꟴ◇propose
SimpDecide?
decide ⇀ propose ∧ ∃ꟴ◇accept
SimpAccept!
∃ꟴ◇propose ⇀ accept
SimpDecide!
propose ∧ ∃ꟴ◇accept ⇀ decide
Correct
TF(propose) ∧ TF(accept) ∧ TF(decide)

Properties to check

2
NoInventedDecision
decide ⇀ propose
ProposerDecides
propose ⇀ decide
Explore this theory

This page is an offline reader. Run either command from the package directory to check the formulas.

Check declared frame

python -m muql check examples/simple_reliable.md

Use exactly the participants, values, stages, and quorum generators declared above.

Search for countermodels

python -m muql search examples/simple_reliable.md

Vary finite frames automatically, keeping the named values and time convention. Defaults: up to 3 participants, 2 values, 3 stages, and 8 nonempty quorums.

Simple protocolssimple_crashes.md

Simple: reliable delivery, crashes allowed

This is the second Simple theory (§6.1, p.47). The backward implications remain strong; forward implications become weak so their conclusions may be b. Each predicate has a dense set of uncrashed participants. The paper's Uncrashed schema is written as three individually named axioms for easier experiments. The two properties are tutorial consequences.

Notation: ⇀ is strong implication (-\ in ASCII), → is weak (->), and ∃ꟴ◇ means “some quorum, some point”. All symbols have ASCII equivalents; either style is accepted.

Read the complete literate source
3participants
1values
1stages · finite
3declared quorums
Inspect the declared frame
Participants
a, b, c
Values
unit
Quorums
{a, b} · {a, c} · {b, c}
Predicates
propose/0, accept/0, decide/0
Time
Time ends at the final stage in the declared finite frame.

The checker takes the union closure of the declared quorums. See the semantics reference for the frame interpretation.

Axioms

7
SimpAccept?
accept ⇀ ∃ꟴ◇propose
SimpDecide?
decide ⇀ propose ∧ ∃ꟴ◇accept
SimpAccept!
∃ꟴ◇propose → accept
SimpDecide!
propose ∧ ∃ꟴ◇accept → decide
Uncrashed_propose
∀ꟴ◇TF(propose)
Uncrashed_accept
∀ꟴ◇TF(accept)
Uncrashed_decide
∀ꟴ◇TF(decide)

Properties to check

2
NoInventedDecision
decide ⇀ propose
ProposerDecidesOrCrashes
propose → decide
Explore this theory

This page is an offline reader. Run either command from the package directory to check the formulas.

Check declared frame

python -m muql check examples/simple_crashes.md

Use exactly the participants, values, stages, and quorum generators declared above.

Search for countermodels

python -m muql search examples/simple_crashes.md

Vary finite frames automatically, keeping the named values and time convention. Defaults: up to 3 participants, 2 values, 3 stages, and 8 nonempty quorums.

Simple protocolssimple_eventual.md

Simple: eventual delivery, no crashes

This is the third Simple theory (§6.1, p.47). An initial period may lose messages; eventually the forward rules apply at every point in every quorum forever. The logical model has no explicit messages. ultimately expresses the network assumption.

The original theory is about infinite natural time. This literate input retains its temporal formulas in Unicode notation; finite checking must be interpreted according to the package's stated temporal support and boundaries. The added properties are tutorial consequences of the intended infinite theory.

Notation: ⇀ is strong implication (-\ in ASCII), → is weak (->), and ∃ꟴ◇ means “some quorum, some point”. All symbols have ASCII equivalents; either style is accepted.

Read the complete literate source
3participants
1values
3stages · stutter
3declared quorums
Inspect the declared frame
Participants
a, b, c
Values
unit
Quorums
{a, b} · {a, c} · {b, c}
Predicates
propose/0, accept/0, decide/0
Time
The final stage repeats in the declared stuttering frame.

The checker takes the union closure of the declared quorums. See the semantics reference for the frame interpretation.

Axioms

5
SimpAccept?
accept ⇀ ∃ꟴ◇propose
SimpDecide?
decide ⇀ propose ∧ ∃ꟴ◇accept
SimpAccept!
ultimately(∃ꟴ◇propose ⇀ accept)
SimpDecide!
ultimately(propose ∧ ∃ꟴ◇accept ⇀ decide)
Correct
TF(propose) ∧ TF(accept) ∧ TF(decide)

Properties to check

2
NoInventedDecision
decide ⇀ propose
EventualProgressRule
ultimately(propose ⇀ decide)
Explore this theory

This page is an offline reader. Run either command from the package directory to check the formulas.

Check declared frame

python -m muql check examples/simple_eventual.md

Use exactly the participants, values, stages, and quorum generators declared above.

Search for countermodels

python -m muql search examples/simple_eventual.md

Vary finite frames automatically, keeping the named values and time convention. Defaults: up to 3 participants, 2 values, 3 stages, and 8 nonempty quorums.

Simple protocolssimple_eventual_crashes.md

Simple: eventual delivery, crashes allowed

The fourth Simple theory (§6.1, pp.47–48) combines eventual synchrony with a dense set of uncrashed participants for each predicate. Strong backward rules justify true events; weak forward rules permit crashed outcomes. All source axioms are retained. Properties are tutorial consequences, and infinite-time formulas retain the package's documented finite-checking limitations.

Notation: ⇀ is strong implication (-\ in ASCII), → is weak (->), and ∃ꟴ◇ means “some quorum, some point”. All symbols have ASCII equivalents; either style is accepted.

Read the complete literate source
3participants
1values
3stages · stutter
3declared quorums
Inspect the declared frame
Participants
a, b, c
Values
unit
Quorums
{a, b} · {a, c} · {b, c}
Predicates
propose/0, accept/0, decide/0
Time
The final stage repeats in the declared stuttering frame.

The checker takes the union closure of the declared quorums. See the semantics reference for the frame interpretation.

Axioms

7
SimpAccept?
accept ⇀ ∃ꟴ◇propose
SimpDecide?
decide ⇀ propose ∧ ∃ꟴ◇accept
SimpAccept!
ultimately(∃ꟴ◇propose → accept)
SimpDecide!
ultimately(propose ∧ ∃ꟴ◇accept → decide)
Uncrashed_propose
∀ꟴ◇TF(propose)
Uncrashed_accept
∀ꟴ◇TF(accept)
Uncrashed_decide
∀ꟴ◇TF(decide)

Properties to check

2
NoInventedDecision
decide ⇀ propose
EventualProgressRule
ultimately(propose → decide)
Explore this theory

This page is an offline reader. Run either command from the package directory to check the formulas.

Check declared frame

python -m muql check examples/simple_eventual_crashes.md

Use exactly the participants, values, stages, and quorum generators declared above.

Search for countermodels

python -m muql search examples/simple_eventual_crashes.md

Vary finite frames automatically, keeping the named values and time convention. Defaults: up to 3 participants, 2 values, 3 stages, and 8 nonempty quorums.

Quorums & agreementvoting.md

Voting

Four participants each cast one Boolean vote. A vote of b represents conflicting messages; an observation of b means that no result was observed. These are different interpretations of the same logical truth value.

This file transcribes Figure 3 and Proposition 2.5.7 of Gabbay, arXiv:2512.21137v3, with Unicode symbols for the connectives. Every axiom is checked at every participant. The quorum generators are the four three-person subsets; their unions are implicit.

The formulas use Unicode for readability. Every symbol also has an ASCII spelling, and the two styles can be mixed.

Read the complete literate source
4participants
1values
1stages · finite
4declared quorums
Inspect the declared frame
Participants
alice, bob, carol, dave
Values
unit
Quorums
{alice, bob, carol} · {alice, bob, dave} · {alice, carol, dave} · {bob, carol, dave}
Predicates
vote/0, observe/0
Time
Time ends at the final stage in the declared finite frame.

The checker takes the union closure of the declared quorums. See the semantics reference for the frame interpretation.

Axioms

6
Intersection
twined(3)
Observe?
observe → ∃ꟴ□vote
ObserveNot?
¬observe → ∃ꟴ□¬vote
Observe!
∃ꟴ□vote ⇀ observe
ObserveNot!
∃ꟴ□¬vote ⇀ ¬observe
Correct
∃ꟴ□TF(vote)

Properties to check

3
Agreement
¬(∃ꟴ◇T(observe) ∧ ∃ꟴ◇T(¬observe))
UnanimousTrueDelivery
∃ꟴ□vote ⇀ ∀ꟴ□observe
UnanimousFalseDelivery
∃ꟴ□¬vote ⇀ ∀ꟴ□¬observe
Explore this theory

This page is an offline reader. Run either command from the package directory to check the formulas.

Check declared frame

python -m muql check examples/voting.md

Use exactly the participants, values, stages, and quorum generators declared above.

Search for countermodels

python -m muql search examples/voting.md

Vary finite frames automatically, keeping the named values and time convention. Defaults: up to 3 participants, 2 values, 3 stages, and 8 nonempty quorums.

Quorums & agreementbracha.md

Bracha Broadcast

One sender broadcasts a payload. Participants may echo it, become ready, and deliver it. The four predicates record the declarative outcome, rather than a sequence of message arrivals.

The axioms below transcribe Figure 10 of Gabbay, arXiv:2512.21137v3. The properties are Figure 11. The three-way intersection assumption from Remark 4.2.1 is explicit. Backward rule names end in ?, forward rule names in !, and the ready relay is BrReady!!, following the paper's direction convention.

Read ∃ꟴ□ as “some quorum, every point”, ∃ꟴ◇ as “some quorum, some point”, and ∀ꟴ□ as “every quorum, every point”. The notation guide lists their ASCII spellings and explains the remaining symbols.

Read the complete literate source
4participants
2values
1stages · finite
4declared quorums
Inspect the declared frame
Participants
alice, bob, carol, dave
Values
red, blue
Quorums
{alice, bob, carol} · {alice, bob, dave} · {alice, carol, dave} · {bob, carol, dave}
Predicates
bcst/1, echo/1, ready/1, dlvr/1
Time
Time ends at the final stage in the declared finite frame.

The checker takes the union closure of the declared quorums. See the semantics reference for the frame interpretation.

Definitions

6

Named abbreviations used below. The checker expands each definition before checking the theory.

EchoCorrect()
∀ v. TF(echo(v))
ReadyCorrect()
∀ v. TF(ready(v))
BroadcastCorrect()
∀ v. TF(bcst(v))
EchoFaulty()
∀ v. B(echo(v))
ReadyFaulty()
∀ v. B(ready(v))
BroadcastFaulty()
∀ v. B(bcst(v))

Axioms

14
Intersection
twined(3)
BrDeliver?
∀ v. dlvr(v) → ∃ꟴ□ready(v)
BrReady?
∀ v. ready(v) → ∃ꟴ□echo(v)
BrEcho?
∀ v. echo(v) → ∃ꟴ◇bcst(v)
BrEchoAffine
∃⁰¹ v. echo(v)
BrBroadcastUnique
∃¹ v. ∃ꟴ◇bcst(v)
BrDeliver!
∀ v. ∃ꟴ□ready(v) → dlvr(v)
BrReady!
∀ v. ∃ꟴ□echo(v) → ready(v)
BrEcho!
∀ v. ∃ꟴ◇bcst(v) → (∃ w. echo(w))
BrReady!!
∀ v. ∀ꟴ◇ready(v) → ready(v)
BrCorrect
∃ꟴ□ReadyCorrect ∧ ∃ꟴ□EchoCorrect
BrReadyUniform
ReadyCorrect ∨ ReadyFaulty
BrEchoUniform
EchoCorrect ∨ EchoFaulty
BrBroadcastUniform
∀ꟴ□BroadcastCorrect ∨ ∀ꟴ□BroadcastFaulty

Properties to check

5
BrValidity
∀ v. ∃ꟴ◇bcst(v) → ∀ꟴ□dlvr(v)
BrNoDup
∃⁰¹ v. dlvr(v)
BrIntegrity
∀ v. dlvr(v) → ∃ꟴ◇bcst(v)
BrConsistency
∃⁰¹ v. ∃ꟴ◇dlvr(v)
BrTotality
∀ v. ∃ꟴ◇dlvr(v) → ∀ꟴ□dlvr(v)
Explore this theory

This page is an offline reader. Run either command from the package directory to check the formulas.

Check declared frame

python -m muql check examples/bracha.md

Use exactly the participants, values, stages, and quorum generators declared above.

Search for countermodels

python -m muql search examples/bracha.md

Vary finite frames automatically, keeping the named values and time convention. Defaults: up to 3 participants, 2 values, 3 stages, and 8 nonempty quorums.

Quorums & agreementbracha_weakened.md

Bracha with existential delivery

Section 4.3 of the companion paper, v3 claims that BrDeliver! can be weakened to existential delivery and recovered from the other axioms. For Figure 10 as printed, the claim fails.

This file contains the same Bracha axioms, except for that one proposed replacement. A one-participant, two-payload scope already suffices. The singleton quorum is three-way intersecting, so the failure is unrelated to quorum geometry.

The notation guide gives an ASCII equivalent for each Unicode symbol below. In particular, → is weak implication (->).

Read the complete literate source
1participants
2values
1stages · finite
1declared quorums
Inspect the declared frame
Participants
alice
Values
red, blue
Quorums
{alice}
Predicates
bcst/1, echo/1, ready/1, dlvr/1
Time
Time ends at the final stage in the declared finite frame.

The checker takes the union closure of the declared quorums. See the semantics reference for the frame interpretation.

Definitions

6

Named abbreviations used below. The checker expands each definition before checking the theory.

EchoCorrect()
∀ v. TF(echo(v))
ReadyCorrect()
∀ v. TF(ready(v))
BroadcastCorrect()
∀ v. TF(bcst(v))
EchoFaulty()
∀ v. B(echo(v))
ReadyFaulty()
∀ v. B(ready(v))
BroadcastFaulty()
∀ v. B(bcst(v))

Axioms

14
Intersection
twined(3)
BrDeliver?
∀ v. dlvr(v) → ∃ꟴ□ready(v)
BrReady?
∀ v. ready(v) → ∃ꟴ□echo(v)
BrEcho?
∀ v. echo(v) → ∃ꟴ◇bcst(v)
BrEchoAffine
∃⁰¹ v. echo(v)
BrBroadcastUnique
∃¹ v. ∃ꟴ◇bcst(v)
BrDeliverExistential!
(∃ v. ∃ꟴ□ready(v)) → (∃ v. dlvr(v))
BrReady!
∀ v. ∃ꟴ□echo(v) → ready(v)
BrEcho!
∀ v. ∃ꟴ◇bcst(v) → (∃ w. echo(w))
BrReady!!
∀ v. ∀ꟴ◇ready(v) → ready(v)
BrCorrect
∃ꟴ□ReadyCorrect ∧ ∃ꟴ□EchoCorrect
BrReadyUniform
ReadyCorrect ∨ ReadyFaulty
BrEchoUniform
EchoCorrect ∨ EchoFaulty
BrBroadcastUniform
∀ꟴ□BroadcastCorrect ∨ ∀ꟴ□BroadcastFaulty

Properties to check

2
OriginalDeliverForward
∀ v. ∃ꟴ□ready(v) → dlvr(v)
BrValidity
∀ v. ∃ꟴ◇bcst(v) → ∀ꟴ□dlvr(v)
Explore this theory

This page is an offline reader. Run either command from the package directory to check the formulas.

Check declared frame

python -m muql check examples/bracha_weakened.md

Use exactly the participants, values, stages, and quorum generators declared above.

Search for countermodels

python -m muql search examples/bracha_weakened.md

Vary finite frames automatically, keeping the named values and time convention. Defaults: up to 3 participants, 2 values, 3 stages, and 8 nonempty quorums.

Quorums & agreementcrusader.md

Crusader Agreement

Participants start with either zero or one. An output of half records a failure to choose one binary value. The payload half is distinct from the logical truth value b.

These are the Figure 13 axioms and Figure 14 properties of Gabbay, arXiv:2512.21137v3. The ambient three-way intersection condition in Remark 5.3.1 is explicit. The domain must contain exactly the three listed payloads for this transcription.

Here ⇀ is strong implication (-\ in ASCII), while → is weak (->). The notation guide explains the quantifiers and quorum symbols; Unicode and ASCII can be mixed in any formula.

Read the complete literate source
4participants
3values
1stages · finite
4declared quorums
Inspect the declared frame
Participants
alice, bob, carol, dave
Values
zero, half, one
Quorums
{alice, bob, carol} · {alice, bob, dave} · {alice, carol, dave} · {bob, carol, dave}
Predicates
input/1, echo1/1, echo2/1, output/1
Time
Time ends at the final stage in the declared finite frame.

The checker takes the union closure of the declared quorums. See the semantics reference for the frame interpretation.

Definitions

8

Named abbreviations used below. The checker expands each definition before checking the theory.

InputCorrect()
∀ v. TF(input(v))
Echo1Correct()
∀ v. TF(echo1(v))
Echo2Correct()
∀ v. TF(echo2(v))
OutputCorrect()
∀ v. TF(output(v))
InputFaulty()
∀ v. B(input(v))
Echo1Faulty()
∀ v. B(echo1(v))
Echo2Faulty()
∀ v. B(echo2(v))
OutputFaulty()
∀ v. B(output(v))

Axioms

16
Intersection
twined(3)
CaEcho1?
∀ v. echo1(v) ⇀ ∃ꟴ◇input(v)
CaEcho2?
∀ v. echo2(v) → ∃ꟴ□echo1(v)
CaOutput?
(output(zero) → ∃ꟴ□echo2(zero)) ∧ (output(one) → ∃ꟴ□echo2(one))
CaOutputHalf?
output(half) → ∃ꟴ□echo1(zero) ∧ ∃ꟴ□echo1(one)
CaEcho1!
∀ v. input(v) ∨ ∀ꟴ◇echo1(v) → echo1(v)
CaEcho2!
(∃ v. ∃ꟴ□echo1(v)) → (∃ v. echo2(v))
CaOutput!
∀ v. ∃ꟴ□echo2(v) → output(v)
CaOutputHalf!
∃ꟴ□echo1(zero) ∧ ∃ꟴ□echo1(one) → output(half)
CaCorrect
∃ꟴ□(InputCorrect ∧ Echo1Correct ∧ Echo2Correct ∧ OutputCorrect)
CaInputUniform
InputCorrect ∨ InputFaulty
CaEcho1Uniform
Echo1Correct ∨ Echo1Faulty
CaEcho2Uniform
Echo2Correct ∨ Echo2Faulty
CaOutputUniform
OutputCorrect ∨ OutputFaulty
CaInput
(input(zero) ∧ ¬input(one) ∨ ¬input(zero) ∧ input(one)) ∧ ¬input(half)
CaEcho2Affine
∃⁰¹ v. echo2(v)

Properties to check

4
CaAgree
∀ v. ∀ w. ∃ꟴ◇output(v) ∧ ∃ꟴ◇output(w) ⇀ v = w ∨ v = half ∨ w = half
CaValid1
∀ v. ∀ w. TB(∀ꟴ□input(v)) ∧ output(w) ⇀ v = w
CaValid2
∀ v. ∃ꟴ◇output(v) ⇀ ∃ꟴ◇input(v) ∨ v = half
CaLive
∀ꟴ□(∃ v. output(v))
Explore this theory

This page is an offline reader. Run either command from the package directory to check the formulas.

Check declared frame

python -m muql check examples/crusader.md

Use exactly the participants, values, stages, and quorum generators declared above.

Search for countermodels

python -m muql search examples/crusader.md

Vary finite frames automatically, keeping the named values and time convention. Defaults: up to 3 participants, 3 values, 3 stages, and 8 nonempty quorums.

Paxospaxos.md

Declarative Paxos (Figure 11)

This is a direct transcription of TyPax, Definition 6.3.1 and Figure 11 (pp.49–50) of the attached paper, *A declarative approach to specifying Paxos using three-valued modal fixpoint logic*, by Murdoch J. Gabbay and Luca Zanolini. It includes all 20 named axioms, including the send step and the nonpositive μ expression for leader uniqueness.

A point is a participant. A stage is a ballot or logical round, not a message or machine instruction. b means a computation has crashed; both b and t count as valid. Consequently, P → Q permits a crashed conclusion, while P ⇀ Q requires a true conclusion whenever P is true.

The finite scope below chooses three participants, two ordinary values and the special value undef. The three pair quorums generate the usual majority semitopology. The checker reports results for its documented finite temporal semantics; these are not proofs of the paper's infinite-time theorems.

Notation: ⇀ is strong implication (-\ in ASCII), → is weak (->), and ∃ꟴ◇ means “some quorum, some point”. All symbols have ASCII equivalents; either style is accepted.

Read the complete literate source
3participants
3values
3stages · stutter
3declared quorums
Inspect the declared frame
Participants
a, b, c
Values
red, blue, undef
Quorums
{a, b} · {a, c} · {b, c}
Predicates
leader/0, propose/1, send/1, write/1, accept/1, decide/1
Time
The final stage repeats in the declared stuttering frame.

The checker takes the union closure of the declared quorums. See the semantics reference for the frame interpretation.

Axioms

20
PaxPropose?
∀ v. propose(v) ⇀ leader ∧ v ≠ undef
PaxSend?
∀ v. send(v) ⇀ ∃ꟴ◇(∃ x. propose(x)) ∧ ((latest x = v. accept(x)) ∨ ¬T(once(∃ x. accept(x))) ∧ v = undef)
PaxWrite?
∀ v. write(v) ⇀ leader ∧ ∃ꟴ (□(∃ x. send(x)) ∧ ((latest x = v. ◇accept(x)) ∨ propose(v) ∧ ¬T(once(∃ x. ◇accept(x)))))
PaxAccept?
∀ v. accept(v) ⇀ ∃ꟴ◇write(v)
PaxDecideL?
∀ v. leader ⇀ decide(v) ⇀ ∃ꟴ□accept(v)
PaxDecide-not-L?
∀ v. ¬leader ⇀ decide(v) ⇀ ∃ꟴ◇(leader ∧ decide(v))
PaxPropose!
leader → (∃ v. propose(v))
PaxSend!
ultimately(∃ꟴ◇(∃ v. propose(v)) → (∃ v. send(v)))
PaxWrite!
ultimately(leader ∧ ∃ꟴ□(∃ v. send(v)) ∧ (∃ v. propose(v)) → (∃ v. write(v)))
PaxAccept!
ultimately((∃ v. ∃ꟴ◇write(v)) → (∃ v. accept(v)))
PaxDecideL!
ultimately(leader ∧ (∃ v. ∃ꟴ□accept(v)) → (∃ v. decide(v)))
PaxDecide-not-L!
ultimately(¬leader ∧ ∃ꟴ◇(leader ∧ (∃ v. decide(v))) → (∃ v. decide(v)))
LdrExist
TF(leader) ∧ T(∃ꟴ◇leader)
LdrUniq
◇(μ X. ¬◇(leader ∧ X))
LdrCorrect
infinitely(∃ꟴ◇(leader ∧ (∀ v. TF(propose(v))) ∧ (∀ v. TF(write(v))) ∧ (∀ v. TF(decide(v)))))
PaxPCorrect
∃ꟴ□(∀ v. TF(propose(v))) ∧ ∃ꟴ□(∀ v. TF(send(v))) ∧ ∃ꟴ□(∀ v. TF(accept(v))) ∧ ∃ꟴ□(∀ v. TF(write(v))) ∧ ∃ꟴ□(∀ v. TF(decide(v)))
PaxPropose01
∃⁰¹ v. propose(v)
PaxWrite01
∃⁰¹ v. write(v)
Pax2Twined
∀ v. ∃ꟴ□accept(v) ⇀ ∀ꟴ◇accept(v)
PaxNontriv
∃ v. v ≠ undef

Properties to check

4
Validity
∀ v. decide(v) ⇀ past(∃ꟴ◇(leader ∧ propose(v)))
Agreement
∀ v. ∀ w. past(∃ꟴ◇decide(v)) ∧ ∃ꟴ◇decide(w) ⇀ v = w
Termination
infinitely(∀ꟴ□(∃ v. decide(v)))
DecidingQuorum
infinitely(∃ꟴ□T(∃ v. decide(v)))
Explore this theory

This page is an offline reader. Run either command from the package directory to check the formulas.

Check declared frame

python -m muql check examples/paxos.md

Use exactly the participants, values, stages, and quorum generators declared above.

Search for countermodels

python -m muql search examples/paxos.md

Vary finite frames automatically, keeping the named values and time convention. Defaults: up to 3 participants, 3 values, 3 stages, and 8 nonempty quorums.

Paxospaxos_simpler.md

Simpler Declarative Paxos (Figure 12)

This is TySPax, Definition 8.2.1 and Figure 12 (pp.67–68) of the attached Paxos paper. All 12 axioms are present. This is the paper's own abstraction: send and undef disappear, leaders need not be unique, and all writes at a stage must agree globally. The forward write rule is also changed, so this theory is not obtained merely by deleting some TyPax axioms.

The scope is finite. The safety formulas include history from time zero, while infinite-time liveness remains subject to the checker limitations documented in the main README. A finite result does not establish Theorem 8.2.2 unboundedly.

Notation: ⇀ is strong implication (-\ in ASCII), → is weak (->), and ∃ꟴ◇ means “some quorum, some point”. All symbols have ASCII equivalents; either style is accepted.

Read the complete literate source
3participants
2values
3stages · stutter
3declared quorums
Inspect the declared frame
Participants
a, b, c
Values
red, blue
Quorums
{a, b} · {a, c} · {b, c}
Predicates
leader/0, propose/1, write/1, accept/1, decide/1
Time
The final stage repeats in the declared stuttering frame.

The checker takes the union closure of the declared quorums. See the semantics reference for the frame interpretation.

Axioms

12
SPaxPropose?
∀ v. propose(v) ⇀ leader
SPaxWrite?
∀ v. write(v) ⇀ leader ∧ ∃ꟴ ((latest x = v. ◇accept(x)) ∨ propose(v) ∧ ¬T(once(∃ x. ◇accept(x))))
SPaxAccept?
∀ v. accept(v) ⇀ ∃ꟴ◇write(v)
SPaxDecide?
∀ v. decide(v) ⇀ ∃ꟴ□accept(v)
SPaxWrite!
ultimately(leader → (∃ v. write(v)))
SPaxAccept!
ultimately((∃ v. ∃ꟴ◇write(v)) → (∃ v. accept(v)))
SPaxDecide!
ultimately((∃ v. ∃ꟴ□accept(v)) → (∃ v. decide(v)))
SLdrExist
TF(leader) ∧ T(∃ꟴ◇leader)
SLdrCorrect
infinitely(∃ꟴ◇(leader ∧ (∀ v. TF(propose(v))) ∧ (∀ v. TF(write(v))) ∧ (∀ v. TF(decide(v)))))
SPaxPCorrect
∃ꟴ□(∀ v. TF(accept(v)))
SPaxWrite01
∃⁰¹ v. ∃ꟴ◇write(v)
SPax2Twined
∀ v. ∃ꟴ□accept(v) ⇀ ∀ꟴ◇accept(v)

Properties to check

3
Validity
∀ v. decide(v) ⇀ past(∃ꟴ◇(leader ∧ propose(v)))
Agreement
∀ v. ∀ w. past(∃ꟴ◇decide(v)) ∧ ∃ꟴ◇decide(w) ⇀ v = w
Termination
infinitely(∀ꟴ□(∃ v. decide(v)))
Explore this theory

This page is an offline reader. Run either command from the package directory to check the formulas.

Check declared frame

python -m muql check examples/paxos_simpler.md

Use exactly the participants, values, stages, and quorum generators declared above.

Search for countermodels

python -m muql search examples/paxos_simpler.md

Vary finite frames automatically, keeping the named values and time convention. Defaults: up to 3 participants, 2 values, 3 stages, and 8 nonempty quorums.

Symbol reference

Unicode and ASCII may be freely mixed in a theory. Strong implication is ⇀ or -\; weak implication is → or ->. Temporal operators and truth-value tests retain their readable names.

UnicodeASCIIMeaning
¬!Negation
∧&Conjunction
∨|Disjunction
⊕xorExclusive or
→->Weak implication
⇀-\Strong implication
≡<=>Equivalence
≤<=Truth order
= / ≠== / !=Value equality / inequality
∀ / ∃forall / existsValue quantification
∃⁰¹ / ∃¹affine / uniqueAffine / unique quantification
μ / νmu / nuFixed-point binders
◇diamond / somewhereSome point in the current quorum
□box / everywhereEvery point in the current quorum
∃ꟴ / ∀ꟴexistsQ / forallQQuorum quantification
∃ꟴ□quorum / someQuorumEveryPointSome quorum, every point
∀ꟴ◇contra / everyQuorumSomePointEvery quorum, some point
∃ꟴ◇someQuorumSomePointSome quorum, some point
∀ꟴ□everyQuorumEveryPointEvery quorum, every point

See the full syntax reference for precedence, binding, truth tests, and temporal operators.

Read the scope with the result. check uses the declared finite frame; search varies frames within the selected bounds. Both retain the stated finite or stuttering time convention. A successful finite check or completed bounded search is not an unbounded theorem. A search that stops at a resource limit may be incomplete, and the guide does not assert that every listed property holds.