Concurrent language. For any language Λ, we define the corresponding thread-pool semantics. Machine syntax T ∈ ThreadPool , Exprn n T ; σ → T '; σ' Machine reduction e1, σ1 → e2, σ2, ef ef =/ ⊥ T ++ [e1] ++ T '; σ1 → T ++ [e2] ++ T ' ++ [ef]; σ2 e1, σ1 → e2, σ2 T ++ [e1] ++ T '; σ1 → T ++ [e2] ++ T '; σ2 5 Logic To instantiate Iris, you need to define the following parameters: • A language Λ, and • COF𝖲 → CMRA a locally contractive bifunctor Σ : defining the ghost state, such that for all COFEs A, the CMRA Σ(A) has a unit. (By Lemma 1, this means that the core of Σ(A) is a total function.) As usual for higher-order logics, you can furthermore pick a signature S = (𝓨 , F, A) to add more types, symbols and axioms to the language. You have to make sure that 𝓨 includes the base types: 𝓨 ⊇ {Val, Expr, State, M, InvName, InvMask, Prop} Elements of 𝓨 are ranged over by T . Each function symbol in F has an associated arity comprising a natural number n and an ordered list of n + 1 types τ (the grammar of τ is defined below, and depends only on 𝓨 ). We write F : τ1, . . . , τn → τn+1 ∈ F to express that F is a function symbol with the indicated arity. 𝓨 F A A A Furthermore, is a set of axioms, that is, terms t of type Prop. Again, the grammar of terms and their typing rules are defined below, and depends only on and , not on . Elements of are ranged over by A.