can learn $v$ only by communicating with principals who know $v$. We therefore treat cryptographic primitives, and other computationally feasible algorithms, as principals. For example, suppose that, in practice, $p$ can compute $v$ by applying the algorithm ${\cal A}$ to inputs $i_1, i_2, \ldots, i_n$. We model ${\cal A}$ by adding the principal $A$ to $P$, the tuple $(A,v)$ to $k_0$, and the rule $(A,v,p,\{(p,i_1),(p,i_2), \ldots (p, i_n)\})$ to $R$.

Our treatment of primitives ensures that $Knowledge(k_0)=\{v: (p,v)\in k_0 \mbox{ for some } p\in P\}$ consists of [*all*]{} learnable values. Hence, $V$ is the same in the initial and the maximal state of knowledge, $$Knowledge(k_0) = Knowledge(f^*_R(k_0)), \label{v0}$$ which implies that we can safely restrict our analysis to the subset of $R$ applicable to $k_0$. Formally, $$(\ref{v0}) \implies f_R(k_0)=f_{R(k_0)}(k_0) \mbox{ and } f^*_R(k_0)=f^*_{R(k_0)}(k_0),$$ where $R(k_0) = \left\{ (p_b,x,p_a,k_a)\in R : \begin{array}{l}\{x\}\cup \{v:(p_a,v)\in k_a\} \\ \subseteq Knowledge(k_0) \end{array}\right\}.$

Adversaries’ Knowledge {#adversary}
----------------------

Let $O\subseteq P$ be a group of collaborating adversaries. We collapse $O$ into a single principal $o$ using the following merging function: $$\begin{array}{rcl}
Merge(p) &=& \left\{\begin{array}{l}o \mbox{ if } p\in O, \\ p \mbox{ if } p\not\in O
\end{array}\right.\\
Merge(k) &=& \{(Merge(p),v) : (p,v) \in k \}\\
Merge(r) &=& 