A meta-probabilistic-programming language for bisimulation of probabilistic and non-well-founded type systems
Abstract
We introduce a formal meta-language for probabilistic programming, capable of expressing both programs and the type systems in which they are embedded. We are motivated here by the desire to allow an AGI to learn not only relevant knowledge (programs/proofs), but also appropriate ways of reasoning (logics/type systems). We draw on the frameworks of cubical type theory and dependent typed metagraphs to formalize our approach. In doing so, we show that specific constructions within the meta-language can be related via bisimulation (implying path equivalence) to the type systems they correspond. This allows our approach to provide a convenient means of deriving synthetic denotational semantics for various type systems. Particularly, we derive bisimulations for pure type systems (PTS), and probabilistic dependent type systems (PDTS). We discuss further the relationship of PTS to non-well-founded set theory, and demonstrate the feasibility of our approach with an implementation of a bisimulation proof in a Guarded Cubical Type Theory type checker.
1 Introduction
Probabilistic programming offers a fertile ground between logic-based and machine-learning-based approaches to A(G)I. Formalization within type theory offers a rigorous approach to deriving semantics for probabilistic languages [15], and formalization of dependently typed probabilistic languages offers the promise of drawing a tight connection with probabilistic logics of various kinds (e.g. Markov Logic [19], Probabilistic Paraconsistent Logic [7]).
While the exploration of such individual systems is highly important, we might consider more abstractly how to embody general principles for the formation of diverse probabilistic type systems, logics, and programming languages within a single meta-language. Such a language can be considered a meta-theoretical language or logical framework for expressing individual type systems and logics. However, previous frameworks (such as [9]) have not been designed with probabilistic type systems and logics specifically in mind. Here, we outline a formal language, , designed for such a purpose. This language is intended as a formal model of the MeTTa language, currently being developed as part of the OpenCog project [14, 8, 16]. The language allows for (probabilistic) reasoning not only about the knowledge embedded in a system, but also about the logic employed by the system itself.
Our approach may also be seen in relation to recent methods to derive synthetic denotational semantics for logical systems using guarded cubical type theory (GCTT) [18, 11]. Such approaches are particularly promising, offering as they do a unified approach to deriving semantics for recursive datatypes as final co-algebras of appropriate functors in the context of a formulation of univalent type theory with a fully computational semantics. We draw on methods from [10] to formalize our approach in this context. This allows us to rigorously define the relationship between an object-language and its expression in our meta-language as one of bisimulation, corresponding to path equivalence in GCTT. We further show how dependently typed metagraphs can be formalized in GCTT as the basis for our framework [6, 12], and how this leads to systems embedding natural type-theoretic equivalents of non-well-founded sets.
We begin by developing a general framework for representing metagraphs in GCTT, before outlining how the final co-algebra of a labeled transition system over this recursive datatype can be used to model our meta-language. We then derive bisimulations for various object-languages in our system, including simply typed (and untyped) lambda calulus, pure type systems, and probabilistic dependent type systems, hence deriving synthetic denotational semantics for these systems. Finally, we demonstrate the feasibility of our approach with an implementation of a bisimulation proof for a small-scale type system in a Guarded Cubical Type Theory type checker [4], before concluding with a discussion.
2 Labeled metagraphs as a guarded recursive datatype
We begin by defining a recursive datatype for typed metagraphs () using guarded cubical type theory. Here, are types of type-symbols and edge labels respectively, and is a partial order on type-symbols. The recursive datatype is defined as the final co-algebra of the functor , which when applied to type returns the following datatype (letting stand for the assumptions ; the and constructors used here follow the approach of [12] and [6]):
where is the type of vectors over of length , and is extended with and . We note that for notational convenience, we do not explicitly include target labels/indices in the definition of above (in contrast to [6], where refers to target indices and is used for edge values). If explicit indices are required to identify target ’levels’, these may be included by letting , so that each edge label is paired with a vector of target indices. is then defined as a final fixed-point of , such that a set of constraints are satisfied:
(2) |
where represents the constraints:
(3) | |||||
Here, represents a function, which for metagraph returns the type of its ’th edge or target. Specifically, when is of the form , is the type of the edge, and is the type of the ’th target, and when is of the form , is the type of the whole metagraph, while the types of the edges/targets of and are interleaved when evaluating for odd/even values of respectively. Further, the function is recursively defined on (via the function in the constructor of Eq. LABEL:eq:1) to indicate that the ’th target of is connected to the ’th edge/target of , whenever , with indicating that the target has no connection. thus provides a set of constraints that ensure the connections in a metagraph respect the relation; further constraints are needed to ensure for instance that targets receive input from only one other target (as may be appropriate for some metagraphs). Further, is the guarded fixed-point operator [10]. By [10], Prop. 3.2, is both a subset of the initial algebra and final coalgebra of . Finally, we note that our constructor corresponds to in [6], and the Union constructor is simply with for all (meaning that no new connections are added).
We briefly give some examples of typed metagraphs. For convenience, we set , and , with the identity relation along with for all . In our first example, we can construct metagraphs , and . Then, a combined graph can be constructed as , , , . The entire metagraph is shown in Fig. 1A. We note that, in general, any metagraph with a finite number of edges and targets can be represented by a term in the initial algebra of (as is ). Some graphs, however, may be conveniently be represented also by terms in the final coalgebra. Consider for instance Fig. 1B. Here, we may define and , representing by a term in the initial algebra (suppressing visualization of the subgraph). Alternatively, we may define , which implicitly determines a term in the coalgebra as a solution to the recursive equation.

3 as the final coalgebra of a labeled transition system
We define the formal meta-probabilistic-programming language, , as a labeled transition system over typed metagraphs. Here, we are interested in typed metagraphs with a particular form. Specifically, we begin by defining by the abstract syntax:
(4) | |||||
These syntactic constructions represent base-level types, function types, dependent types, equality types, type unions and intersections, a base universe of small types, the union of all small types, the union of all types, judgments and execution states respectively. Notice also that in Eq. 4, is defined by mutual recursion with the type , defined in Eq. 6. We then define as . Notice that includes , so that types may simultaneously serve as labels. Further, and denote collections of symbols and variables respectively, and is a special set of keywords/key-symbols:
(5) |
Further, includes an edge-specific identifier to deduplicate edges which are identical in other respects.
The state of an program is represented by a typed metagraph in the following space:
(6) |
Hence, this is the space of all metagraphs over and , with a varying relation, where represents a set of ’-specific constraints’ on the structure of the metagraph (to be outlined below). This state represents the Atomspace of the program, and the subgraphs of the Atomspace are the individual atoms (as in MeTTa, see [14, 8]). We note that, since serves both as a language for defining programs and type-systems within which these programs are embedded, the atoms may represent base-level propositions and programs (expressions), as well as judgments and computational state information, as reflected by their types. The -specific constraints, , determine the interaction of the keywords/key-symbols with the type system:
(7) |
where the notation denotes the ’th target of subgraph in metagraph , and denote the type and label of metagraph respectively, and we write as shorthand for ’there exits an -edge in connecting and ’. We note that, for convenience, the above formulation does not include some constructions that may be appropriate in a full implementation, but can be derived from others. For instance, tuples can be constructed by introducing a dependent function . The left and right projection functions are then defined by and . Dependent sums can likewise be defined as dependent tuples, .
3.1 Labeled transition system based on metagraph rewriting
In guarded cubical type theory, a guarded labeled transition system (GLTS) may be defined via a state-space , a space of actions , and a function mapping states to sets of (action,state) pairs, , where is the finite powerset functor. The space of all processes, or runs of the GLTS may the be defined as the final coalgebra of the following functor: (see [10]). In order to characterize the process of evaluation in , we characterize the computational dynamics of via a GLTS. Here, the state space is the space of all metgraphs, . The actions are specified by single pushout (SPO) rewriting rules, or sequences of such rules. We therefore introduce the type, , whose values consist of a metagraph whose label set is , i.e. identical to above, but with and labels added to each edge to indicate its membership of the left or right-hand side of the rule (notice that these may overlap), * and ** to indicate the input and output nodes of the rule (see below), and , a partial metagraph homomorphism between the and metagraphs of (defining a partial metagraph homomorphism as in [8]). Since we wish to allow sequences of rewrite rules as actions, we define the full action space to be , and write the members of as , where . The dynamics are then defined (via ) by mapping a given metagraph state to the set of all pairs such that results from an application of action to . For individual rewrite rules , their action is determined via a partial homomorphism between and . We note that, when there are no partial homomorphisms between and , or when the rewrite rule produces an invalid graph, we set . Further, we note that the update may change the relation, for instance by introducing an edge of the form .
3.2 -interpretation as metagraph dynamics

We can now describe interpretation in via the GLTS defined above. To do so, we map specific symbols/edges in the metagraph to actions in (corresponding to the grounding domain in [8]). Specifically, edges carrying symbols of a function type, , dependent product type, , or the symbol, are mapped to specific forms of rewrite rule, as specified below. All other edges are mapped to the transform. Fig. 2 specifies the general forms of the rewrite rules for function application, and transform rules (we note the is equivalent to the 2-argument keyword/function in the current version of the MeTTa language, see [16]). The dependent product rule is identical to Fig. 2a, with replaced with For explicitness, we give these below also in equational form. We note that, for convenience variable names are denoted using , although these should be ultimately mapped to the names .
(8) |
(9) |
In Eq. 3.2, and denote metagraphs isomorphic to and , using a disjoint set of variables, while and are defined similarly, with variables disjoint to the previous subsets. The rule in Eq. 3.2 is defined so as to return a 2-tuple of matches; in general, the size of the tuple returned should be large enough to allow for any number of matches (i.e the number of nodes in ), and if the number of matches is less than this, it will be padded with values.
fun-app nodes. For a given annotated node, i.e. , where and is a graph consisting of a target node and its two arguments, the full rewrite rule is found by forming a metagraph homomorphism between (labeled by as the input of the rule), and , replacing the variables in by their values in . The resulting graph is denoted . The rule is then defined by the subgraphs , , where is the graph of all nodes in targeting , is the index of the node in , is the index of the output node in , and is defined by the partial homomorphism consisting of the identity map on all nodes labeled .
transform nodes. For a given annotated node, the full rewrite rule is defined similarly. Hence, for , where and is a graph consisting of a target node and its two arguments, the full rewrite rule is found by forming a metagraph homomorphism between (labeled by as the input of the rule), and , replacing the variables in by their values in . The resulting graph is denoted . The rule is then defined by the subgraphs , , where is the graph of all nodes in targeting , is the index of the node in , is the index of the output node in , and is defined by the partial homomorphism consisting of the identity map on all nodes labeled .
-evaluation. The above provides groundings for activated nodes in a metagraph; as noted, nodes not of the form above result in a update. Evaluation in involves repeatedly updating the current pointed metgraph according to the grounding of the node currently pointed to. The conditions in Eq. 3 imply there will be at most one edge labeled with in a metagraph, whose target specifies the rule by which the graph is updated. This is expressed via the single partial function, . The action of is determined by the form of . If is not an activated subgraph, i.e. it is not the target of an -edge, the action cannot be applied (i.e. evaluation halts). If however is the target of an -edge, first checks if itself has any activated targets. If so, then simply applies a graph rewrite which moves the pointer to the first such activated target (in the ordering of the edge). If not, applies , which automatically ensures that the update will finish with pointing to the output subgraph, labeled . These dynamics define a reduced GLTS, with , , and . Note that there may be multiple ’s for which if for a node is non-deterministic. Processes are defined by the fixed point . Normal forms of are metagraphs for which cannot be applied (i.e. their grounding is ). Processes which reach a normal form are said to be terminating, and the initial expression of the process is said to evaluate to the normal form reached. Alternatively, certain expressions may not reach a normal form, resulting instead in a non-terminating computation.
4 Bisimulation of type systems in
As described in [10], in guarded cubical type theory, a bisimulation for the GLTS may be defined via the following dependent type:
(10) |
As shown in [10], this type is equivalent to the path type over the recursive data type of processes defined by the GLTS, . We may further define a bisimulation between two GLTS’s over a common action space, and via a bisimulation over their coproduct (see [1]):
(11) | |||||
where , when , otherwise, and defined similarly. Since contains at least one matching element for each and , we may extract functions and as subsets of , where an element in the codomain of each is chosen arbitrarily when there are multiple matches in . Since bisimulation corresponds to path-equivalence for elements of each type, and , we can choose and such that and , where and are the identity on and respectively, and , . Hence, is an equivalence between the recursive process types and of the two GLTS’s, meaning that is inhabited by univalence.
For a given type system, its computational content may be modeled by a GLTS by setting to be the type of expressions in the system, to contain an action along with ‘actions’ corresponding to the judgmental and syntactic relations between expressions (e.g. is-of-type, is-of-subtype, is-a-body-of-lambda-term, and their opposite relations), and to be the relation over expressions corresponding to the reduction relation in the system for the action (for instance -reduction). To show that can be used as a metalanguage for a given type system, we thus show that there is a bisimulation between with a specific form of Atomspace (i.e. containing specific atoms and/or additional constraints to those of Eq. 3), along with an expanded action space to incorporate the typing and syntactic relations relevant to the specific system, and the GLTS corresponding to computation in the target type system; hence the process spaces induced by the two systems are equivalent. Below, we sketch how this can be achieved for three type systems of interest, focusing on the how the computational dynamics of the rule correspond to reduction in the target system (the typing and syntactic relations in each system straightforwardly correspond in to the inbuilt typing relation and relationships definable in terms of submetagraph composition respectively).
4.1 Simply typed lambda calculus
The syntax for the simply typed lambda calculus may be defined via mutually recursive definitions of variable, type and expression datatypes:
(12) |
We refrain from explicitly stating the rules for type assignment as can be found in [2], which determine a typing relation between and given a context , which can be modeled as a partial map from to . Together, these determine a set of valid expressions, , and the computational dynamics is defined by the -reduction relation over this type:
(13) |
where denotes substitution of for in , where any bound variables in are renamed so as not to clash with bound variables in .
To simulate the simply typed lambda calculus in , we restrict the atomspace to include only metagraphs labeled with types using the restricted type syntax of Eq. 4.1, and including only keywords/symbols . Then, we add the following constraint to those of Eq. 3:
(14) |
Hence, all typing relations are between symbols or variables (representing global and local variables respectively) and types. The context is then represented by an atomspace consisting of a set of edges between symbols and types. A given lambda expression , where is then simulated by choosing an unused symbol, , and introducing the following atoms to atomspace:
(15) |
where is the metagraph corresponding to expression (we note that Eq. 4.1 defines a combinator corresponding to the lambda term ). With the atomspace so specified, reduction of an expression in context in the simply typed lambda calculus corresponds to repeated application of to the pointed atomspace containing and , with edges attached to all function application nodes, and the pointing to . The computation terminates with pointing to the normal form of . The required bisimulation thus involves pairing tuples in the simply typed lambda calculus with their corresponding pointed atomspaces in . We note further that the untyped lambda calculus can be defined by simply removing from the syntax in Eq. 4.1, and letting lambda expressions take the form . All members of . are considered legal expressions, and the bisimulation is achieved by converting all type symbols to , hence treating as a Scott domain.
4.2 Pure Type Systems
In a pure type system (PTS, [2]), types and terms are not distinguished syntactically. PTS expressions follow the syntax:
(16) |
Here, is a set of constant symbols, which in a PTS are used to represent sorts. The typing relation for a PTS is defined via a set of axioms and rules. The former consist of a set of judgements , and the latter a set of triplets . The typing rules for a PTS are identical to the typed lambda calculus, except for the introduction rule for dependent products, which takes the form:
The legal expressions then consist of the sorts, and any expression that can be typed in a context , consisting of multiple typing judgments . The -reduction relation is established identically to the simple lambda calculus above. Notice that there is no restriction on the form of and ; hence the typing relation may be arbitrary between sorts (and hence may contain cycles), while the dependent product (i.e. dependent function types) may live in arbitrary sorts with respect to their inputs.
To simulate a PTS in , we select a collection of fixed types to represent the sorts. We then add edges of the following forms to atomspace:
As above, lambda expressions are simulated by adding atoms of the form in Eq. 4.1 to the atomspace, and a context is simulated by adding atoms corresponding to the typing relations it contains. Reduction of expression in context is simulated as previously by applying to the pointed atomspace consisting of and the above constructions, along with pointing to . Further, we note that we can use PTS’s can be regarded as a type-theoretic analogue of non-well-founded sets; from this viewpoint, a cyclical relation corresponds to an accessible pointed graph (apg) underlying a non-well-founded set. For instance, including the axiom in defines as a type-theoretic analogue of a Quine atom. We note, however, that in the type-theoretic context, a cyclic PTS carries more structure than a non-well-founded set, since the rules () carry information about how the constructor interacts with the relation. An interesting conjecture though would be that appropriately defined PTS’s provide bisimulations of systems of non-well-founded sets definable within a recursive datatype (via a coalgebra on the powerset functor, definable in GCTT), as a general system of set equations ([3]) involving both and relations.
4.3 Probabilistic dependent types
Finally, we outline a version of the probabilistic dependent type system introduced in [19], and its bisimulation in . The syntax is a variation on the dependently typed lambda calculus:
Further, we allow the judgments (typing), (subtyping), and (weighted -reduction), where . The typing rules are as for the dependent typed lambda calculus for expressions not involving subtypes or probabilistic terms. The typing rules for subtypes include the standard , , , . These interact with the probabilistic terms via the following special rules:
where, we note that denotes the type of distributions over (so, for instance, if , then ). For all expressions not involving probabilistic terms, in the dependent typed lambda calculus implies in the PDTS above. For probabilistic terms, we have the following computational rules:
(19) |
Computationally, evaluation may proceed by stochastic -reduction (i.e. sampling a reduction according to the weights ), or a ’full evaluation’ may be made, by returning the set of all possible reduction sequences from a term, annotated with the total probability of each. We note that in any given reduction sequence, for implies where .
For the formulation in , we constrain the typing relation and encode lambda terms as in Eqs. 14 and 4.1; further, as above we encode contexts by fixing atoms of the form in atomspace. To encode the probabilistic terms, we choose fixed symbols to correspond to . Then, we fix the following atoms in atomspace:
(20) |
Application of to the pointed atomspace so defined, with pointing to (corresponding to expression ), results in a simulation of a probabilistic reduction of in the PDTS above. As defined, will simulate the ’full evaluation’ of all possible paths, and hence a bisimulation exists between full evaluation dynamics in the PDTS GLTS using -reduction and the GLTS defined by with the restricted atomspace above. We note that, in both cases, the weights on particular paths are lost, since the values are not explicitly recorded; however. it is straightforward to define a GLTS over the extended system, , where denotes that action on results in with probability , with probability , and so on.
5 Implementation of Bisimulation proof in a Guarded Cubical Type Theory type checker
We briefly give an example to show the feasibility of our approach with an implementation of a bisimulation proof for a small-scale type system in a Guarded Cubical Type Theory type checker [4]. Here, we model a minimal type system, which has one type constant with two constructors ; one function constant , where and ; and includes the and constructs, which are combined following the syntax of Eq. 4.3. Our implementation models a fragment of this system where expressions are restricted to include at most three subexpressions. Hence, valid expressions of the language include: , , , . Our implementation in a Haskell-based Guarded Cubical Type Theory type checker [4] is given in Appendix A. Here, we implement evaluation in this system via (i) a pattern matcher over an atomspace (’update’), and (ii) direct implementation of -reduction via case analysis over the expression space (’beta3’). We define GLTS’s using both forms of evaluation (’str1’ and ’str2’), and finally derive a proof that these GLTS’s are bisimilar (’bisim’). The code for this example is also provided at: https://github.com/jwarrell/metta_bisimulation
6 Discussion
In the above, we have introduced a formal meta-probabilistic programming language, formalized in GCTT, and proposed that bisimutations link the specific object-languages (or domain specific languages) outlined above with their simulations in . Specifically, we have proposed that the restricted forms of outlined in Secs. 4.1 and 4.2 and 4.3 form bisimulations of the simply typed lambda calculus, arbitrary PTS’s, and the target PDTS, respectively.
Finally, we mention some of the areas of investigation opened up by the formal model outlined. First, we note that, while we have focused on ‘full’ probabilistic programming evaluation, other possibilities include investigation of sampling based evaluation which performs only one meta-graph update at each step, stochastically chosen from the possible graph rewriting locations. Second, we intend to derive further bisimulations for other kinds of probabilistic logic, particularly, probabilistic paraconsistent logic [7], and probabilistic analogues of pure type systems [2], which may be suitable for models involving infinite-order probabilities [5]. Lastly, we intend to expand our implementation of aspects of this framework in Guarded Cubical Agda [17] to provide more complete implementations of the metalanguage and type systems explored here.
References
- [1] Baier, C. and Katoen, J.P., 2008. Principles of model checking. MIT press.
- [2] Barendregt, Henk, and Lennart Augustsson, 1992. "Lambda Calculi with Types." Handbook of Logic in Computer Science 34: 239-250.
- [3] Barwise, J. and Moss, L., 1996. Vicious circles: on the mathematics of non-wellfounded phenomena.
- [4] Birkedal, L., Bizjak, A., Clouston, R., Grathwohl, H.B., Spitters, B. and Vezzosi, A., 2016. Guarded cubical type theory: Path equality for guarded recursion. arXiv preprint arXiv:1606.05223.
- [5] Goertzel, B., 2008. Modeling Uncertain Self-Referential Semantics with Infinite-Order Probabilities.
- [6] Goertzel, B., 2020. Folding and Unfolding on Metagraphs. arXiv preprint arXiv:2012.01759.
- [7] Goertzel, B., 2020. Paraconsistent Foundations for Probabilistic Reasoning, Programming and Concept Formation. arXiv preprint arXiv:2012.14474.
- [8] Goertzel, B., 2021. Reflective Metagraph Rewriting as a Foundation for an AGI ‘Language of Thought’. arXiv preprint arXiv:2112.08272.
- [9] Harper, R., 2012. Notes on logical frameworks. Lecture notes, Institute for Advanced Study, Nov, 29, p.34.
- [10] Møgelberg, R.E. and Veltri, N., 2019. Bisimulation as path type for guarded recursive types. Proceedings of the ACM on Programming Languages, 3(POPL), pp.1-29.
- [11] Møgelberg, R.E. and Paviotti, M., 2019. Denotational semantics of recursive types in synthetic guarded domain theory. Mathematical Structures in Computer Science, 29(3), pp.465-510.
- [12] Mokhov, A., 2017. Algebraic graphs with class (functional pearl). ACM SIGPLAN Notices, 52(10), pp.2-13.
- [13] Paviotti, M., Møgelberg, R.E. and Birkedal, L., 2015. A model of PCF in guarded type theory. Electronic Notes in Theoretical Computer Science, 319, pp.333-349.
- [14] Potapov, A., 2021. MeTTa language specification. https://wiki.opencog.org/w/Hyperon.
- [15] Staton, S., Wood, F., Yang, H., Heunen, C. and Kammar, O., 2016, July. Semantics for probabilistic programming: higher-order functions, continuous distributions, and soft constraints. In 2016 31st annual acm/ieee symposium on logic in computer science (lics) (pp. 1-10).
- [16] TrueAGI, 2021. Hyperon-experimental repository. https://github.com/trueagi-io/hyperon-experimental.
- [17] Veltri, N. and Vezzosi, A., 2020, January. Formalizing -calculus in guarded cubical Agda. In Proceedings of the 9th ACM SIGPLAN International Conference on Certified Programs and Proofs (pp. 270-283).
- [18] Vezzosi, A., Mörtberg, A. and Abel, A., 2021. Cubical Agda: A dependently typed programming language with univalence and higher inductive types. Journal of Functional Programming, 31.
- [19] Warrell, J. and Gerstein, M., 2018. Dependent Type Networks: A Probabilistic Logic via the Curry-Howard Correspondence in a System of Probabilistic Dependent Types. In Uncertainty in Artificial Intelligence, Workshop on Uncertainty in Deep Learning. http://www.gatsby.ucl.ac.uk/~balaji/udl-camera-ready/UDL-19.pdf.
Appendices
Appendix 0.A Proof of Bisimulation for Small-scale Type System in a Guarded Cubical Type Theory type checker
Below, we provide the code for the example discussed in Sec. 5, which uses a Haskell-based GCTT type checker [4]. The code for this example is also provided at: https://github.com/jwarrell/metta_bisimulation
![[Uncaptioned image]](https://cdn.awesomepapers.org/papers/4f248cf0-c309-45b2-ad26-50b36535446c/x3.png)
![[Uncaptioned image]](https://cdn.awesomepapers.org/papers/4f248cf0-c309-45b2-ad26-50b36535446c/x4.png)
![[Uncaptioned image]](https://cdn.awesomepapers.org/papers/4f248cf0-c309-45b2-ad26-50b36535446c/x5.png)
![[Uncaptioned image]](https://cdn.awesomepapers.org/papers/4f248cf0-c309-45b2-ad26-50b36535446c/x6.png)
![[Uncaptioned image]](https://cdn.awesomepapers.org/papers/4f248cf0-c309-45b2-ad26-50b36535446c/x7.png)