The game tree of an interactive protocol #
⚠️ Unreviewed by Bolton
The value of a protocol on an input is the acceptance probability against an optimal prover — a maximum over strategies, which are functions on transcripts. This file replaces that maximum by a finite recursion over the transcript tree, which is the object a polynomial-space machine walks.
The tree is indexed by the transcript so far. At a node the coins still in play are those
consistent with the recorded verifier messages (Complexity.Protocol.consFinset); a round
splits them by the verifier's next message and the prover picks, for each such message, the reply
maximizing the count below. Everything is counted rather than averaged: Complexity.Protocol.gval
is the number of coin strings that end up accepting, so the value is that count over 2 ^ coins.
Main definitions #
Complexity.Protocol.runFrom— the interaction continued from a partial transcriptComplexity.Protocol.consFinset— the coins consistent with a transcriptComplexity.Protocol.sval— the accepting count of a fixed strategy, as a tree recursionComplexity.Protocol.gval— the same with the prover playing optimally
Main results #
Complexity.Protocol.transcript_eq_runFrom— the two ways of running agreeComplexity.Protocol.consFinset_append— a round filters the coins by the verifier's messageComplexity.Protocol.view_eq— the verifier's view, with the transcript encoding unfoldedComplexity.Protocol.gval_succ_strsLe— the sum ranges over every short stringComplexity.Protocol.consistent_iff_replay— consistency is a replay of the verifierComplexity.Protocol.gvalR_zero,Complexity.Protocol.gvalR_succ— the recursion a stack machine walks
The verifier's view, unfolded. The transcript reaches the verifier through the
concatenation Complexity.encBody, so extending the transcript only ever appends to it.
Running from a partial transcript #
The interaction continued for n more rounds from the transcript τ.
Equations
Instances For
The continuation appends its last round at the end, exactly as
Complexity.Protocol.transcript does.
The two ways of running agree.
The coins still in play #
A coin string is consistent with a transcript when every verifier message recorded in it is the one the verifier would have sent.
Equations
- prot.Consistent x r τ = ∀ (j : ℕ), 2 * j < List.length τ → τ[2 * j]! = prot.vmsg (Complexity.Protocol.view x r (List.take (2 * j) τ))
Instances For
Extending a transcript by one round adds exactly one condition: the verifier's message.
The coins consistent with a transcript.
Equations
- prot.consFinset x t τ = {r : Fin t → Bool | prot.Consistent x (Complexity.BitString.toList r) τ}
Instances For
A round filters the coins by the verifier's message. The reply the prover chooses plays no part: the coins in play below a node depend only on the verifier messages above it.
The tree recursion #
The verifier messages still possible at a node.
Equations
- prot.vset x t τ = Finset.image (fun (r : Complexity.BitString t) => prot.vmsg (Complexity.Protocol.view x r.toList τ)) (prot.consFinset x t τ)
Instances For
The coins consistent with τ that accept when the prover plays S for the remaining n
rounds, as a recursion down the tree.
Equations
Instances For
The same count with the prover playing optimally: at each node it picks, for every possible verifier message, the reply maximizing the count below.
Equations
Instances For
What the recursion counts.
The optimum is attained #
A bounded strategy cannot beat the optimum.
A reply attaining the maximum at a node whose depth says R rounds are planned.
Equations
- prot.optReply x t m R σ = Classical.choose ⋯
Instances For
The strategy that always plays a maximizing reply.
Equations
- prot.optStrategy x t m R = prot.optReply x t m R
Instances For
The optimum is attained.
The value decides the language #
The optimum is the largest accepting count a bounded strategy achieves.
And it is achieved: the maximizing strategy is bounded and attains it.
The tree value decides the language. Completeness puts the optimum above two thirds of the coin space and soundness below one third, so a comparison against a half separates them.
Every message in the tree is short #
Hence every message on a path down the tree does.
And the transcript never holds more than two messages per round.
The tree in the form a machine walks it #
A node no coin string reaches contributes nothing.
The sum may range over every short string. A verifier message no coin string would send
splits off an empty set of coins, so its whole subtree is zero; and Protocol.vmsg_len keeps the
messages that are sent inside Complexity.strsLe. The recursion is then a walk over a fixed
finite index set, which is what a machine can enumerate.
The leaf count, over bitstrings. The coin space is exactly the strings of the coin
length, so the count a machine has to make at a leaf is a scan over Complexity.strsOfLen.
Replaying the verifier #
Walk the rounds, checking that every message the verifier is recorded as having sent is the one it would have sent. The body of the transcript's encoding is carried along, so nothing is re-encoded.
Instances For
Consistency is a replay. Walking the rounds and re-deriving the verifier's messages decides whether a coin string could have produced the transcript.
The tree indexed by rounds #
The tree value, indexed by the rounds already played. This is the recursion a stack machine walks: one frame per round, a sum over the verifier's possible messages and a maximum over the prover's replies, bottoming out in a count over the coin strings.
Instances For
The recursion against the counters #
The value never exceeds the coin space #
The tree value never exceeds the number of coins still in play. The verifier's next message partitions those coins, so summing over the messages cannot double-count.
The containment, reduced to evaluating the tree #
IP ⊆ PSPACE, reduced to one computation. Membership in a language of IP is a
comparison of the game-tree value against half the coin space, so a polynomial-space evaluation
of that value settles the containment.