 So, welcome back. My pleasure to introduce Supratik. Supratik is a professor here at IIT Bombay, so he is technically one of your hosts. And Supratik is going to talk about knowledge compilation for Boolean functional synthesis. But Supratik is a person I think if those of you who are looking to do a PhD in the area, I think he should be one of your prime candidates to go and try to do a PhD with him, right? So, Pratik I have given you an open inventory, sort of open endorsement. Of course, if you want to do a, if you don't want to do it with Supratik, please come and do it with me. Yeah, thanks Sanjeeva for the introduction. So, I am going to talk about some recent work that we have been doing on Boolean functional synthesis that is also a poster on this outside. So, let me try to quickly sort of describe the problem and some of the results that we have. This is part of ongoing work and this is work with Akshay and Sheetal are certainly here. I don't know if Krishna is here and some of our students Jatin and Divya who have since graduated. So, what is Boolean functional synthesis? So, Boolean functions are of course very important if you all know that. Now, sometimes it is difficult to specify the behavior of a system as a function and sometimes it is easier to specify it relationally. So, here is a sort of simple example that everybody can relate to that suppose I want to describe an arbiter which has two inputs, request inputs and two grant outputs and I want to specify how the grant output should be, what is the behavior of the grant outputs in terms of the request inputs and it might be actually easier to specify it in this manner saying that as long as there is one, as long as there is at least one request at least one grant should be high. Both the grant should not be simultaneously high, this is trying to arbitrate between two requests to a specific resource let us say. And if grant 1 is high then request 1 should have been high and if grant 2 is high then request 2 should have been high. And so, if you look at the way I have described the behavior of the system over here, I am basically saying that I do not know what G1 is as a function of R1 and R2, I do not know what G2 as a function of R1 and R2, but I would like the system to behave in this way. So, that this is the relation between the inputs and outputs and so, this kind of specification is also called relational specification and this is convenient to specify, but once I give you the specification you still have to synthesize that arbiter. So, you have to get G1 and G2 in terms of R1 and R2 and that is the problem that we want to address. So, we want to synthesize Boolean functions from a relational specification, everything is Boolean here there is no temporal aspect and this problem we will call the Boolean functional synthesis problem. So, the formal definition is so, we are given some blue inputs and some red outputs and we are given a relation between the blue inputs and the red outputs and we want to synthesize some functions 1 fj for each output yj such that if you read this thing it is saying for every value of the inputs if there exists a way of assigning values to the outputs such that the specification can be met then these functions substituted for these outputs will also satisfy the specification. So, it would you know one would normally think that this implication should be in one direction because if there is an output then I want the functions, but the implication in the other direction comes for free. I mean if you already have f1 to fm which satisfies this then of course, there exists y1 to ym. So, it is an equivalence and these fj's are also called Scholem functions in the literature and this is when when an important point to note that it is possible that for some values of x1 to xn there may not be any values for y1 to ym such that phi can be satisfied. But even in that case even in you know such problem instances this makes sense because this is saying that for all those other values for which there exists y1 to ym f1 to fm should be such that it satisfies the specification for those x1 to xn for which there does not exist any y1 to ym there is nothing that can be done. So, even if for some x1 to xn there is not anything such that which satisfies this problem still makes sense as long as there are some x1 to xn for which it makes sense to talk about some outputs. So, I want to make this distinction clear because this does make a difference in some of the techniques and the technique that we are going to talk about actually works even in such cases. So, there are several applications of Boolean functional synthesis I will not go through all of them I have just you know for the sake of time I have just you know put up a long list and this is certainly not a comprehensive list there are several other things and there are kind of important applications like quantifier elimination certifying solvers basically if you give a quantified Boolean formula and if you want to know whether it is satisfiable or not then you also need a certificate to show you know I mean this morning we heard a lot about proofs. So, these certificates form part of the proof for QBF it is used for program synthesis repair of circuits programs tons of things and we are certainly not the only ones to work on this problem. In fact, it looks like Boole worked on it George Boole as early as 1847 and Lowenham you know several of you might have studied about Lowenham's Column theorem. So, you know so this has been basically looked at by stalwarts since long there are I mean of course, and they did come up with solutions which are very theoretical which if you try to implement them they do not scale in practice. There are people who have tried to say that ok let us look at this formula for all x x is y y x y and if this formula turns out to be valid which means that for every x there is indeed a y which is not always the case as I just mentioned. But if this formula turns out to be valid we can then look at the proof of validity of that formula and from there we can extract Scholem functions. So, people have worked on that templates we have heard about templates a lot yesterday that has also been used to generate Scholem functions. There are some function composition based approaches which Watt tried you know towards the beginning of the current resurgence and interest in this area. It turns out that this method is you know nice to learn nice to study but if you have large number of outputs to synthesize this tends to blow up. Using binary decision diagrams this has been tried and Rohr is here he is he has also worked in this and this scales for a class of benchmarks as long as we have good variable orders for BDDs that is always the problem if you do not have good variable orders then this performance degradation. Recently there has been work on incremental determinization Sanjit has worked on it and this also works well for a large class of inputs and in fact this restriction was there earlier but now it has been removed. So, it now works even if for some x is there are no y's and then there are quantifier instantiation techniques there is recently some work that we did along with Rohr and Moshe Varthy and Luca Tabahara on input output separation and some earlier work that we have done where we try to come up with a informed estimate of what the Scholem function should look like and then we try to fix them iteratively. So, the talk I am going to talk about today is none of these it is about a completely different approach and before we get into that let us try to understand what led us to you know even trying to get into this business of knowledge compilation. So, last year in some work that Akshay Shetil and I and a few students did we try to ask the question that how hard or easy is this problem and some results are you know fairly easy to see that if I give you a pi to p problem then if I could synthesize Scholem functions for these I could just substitute them back into the formula and then invoke a co-np oracle and I would be able to solve this. So, a co-np to the np problem or a pi to p problem can be solved if I had a solution if I had something which could solve the Boolean function synthesis problem. So, this is not really an oracle, but if it could give me the solution to this I could use that to solve this problem. So, at least we know that it is at least np hard cannot be simpler than that, but then we also ask that well this np hardness is really talking about the time how much time can it take, but suppose I gave you all the time that you needed how small can you get these Scholem functions, what is a lower bound on how small can these functions be. So, in particular we are asking does there exist compact Scholem functions although synthesizing may take any amount of time exponential or even beyond of course an exponential time we can synthesize. So, of course when we are talking about this the first thing that comes to mind is that aren't there already lower bound results on circuit sizes. So, it turns out that yes of course it is very seminal work on lower bound results on circuit sizes, but they refer to monotone circuits and we are not putting the restriction that the Scholem functions that we synthesize have to be monotone and therefore these arguments do not really carry over here. So, we have to use some other arguments to show to find lower bounds for the lower bounds of the Scholem functions you know as much time as you can take, but how small can we get these functions. So, this led us last year to sort of arrive at these results we were able to show that unless the polynomial hierarchy in complexity theory unless it collapses to the second level there will exist relational specifications for which one cannot get Scholem functions which are polynomial size they have to be super polynomial. Now, does the polynomial hierarchy collapse to the second level I certainly don't know that nobody knows that as of today it is unlikely it is one of the long standing open questions, but if we say that that is unlikely then it this is also unlikely that we will get polynomial size Scholem functions always. Then we were also able to show that this is another hypothesis in complexity theory the non-uniform exponential time hypothesis I will not go into the details of the hypothesis, but unless this long standing hypothesis fails there exist specifications for which Scholem functions must necessarily be exponential sized ok. So, that is the bad news which basically means that efficient algorithms that always give us the answer in polynomial size are unlikely, but then the good news that we also saw in that we were able to show in the same paper is that if the specification is given in some kind of normal forms and we identified this one form in that paper called weak decomposible negation normal form then it is indeed solvable in polynomial time and space. So, what is this weak decomposible negation normal form you know very at a very high level it means that if I can express the specification as a circuit such that if I take any literal and the negation of the literal and there are two paths meeting up at an AND gate then that is called weak decomposible negation normal form. It turns out that every Boolean function can always be expressed in this form in weak decomposible negation normal form, but there might be an exponential blow up in the size ok. So, this is what we had last year and this basically and you know we did a lot of experiments which showed that interestingly that efficient synthesis was possible not only when the specification was in this form, but even when the specification was not in this form and that led us to ask that something more interesting is going on I mean this is certainly not a strong characterization of when we can do efficient synthesis. So, that led us to ask this questions that is there a weaker representation form that guarantees poly time synthesis and we came up with a positive answer to that that yes there is something weaker which is which we call the synthesis negation normal form that guarantees poly time synthesis and not only that it actually subsumes and is exponentially more succinct than several other representation forms that are there in the literature. Then the next question we asked is that given a specification f is it possible to simplify that specification and still solve the original problem and this also we were able to answer affirmatively and using a notion of refinement that I will explain in the subsequent slides and finally, can be algorithmically compiled f compile f to a refined synonym f spec f prime synonym f would guarantee polynomial synthesis and refinement would ensure that whatever we are doing would still solve the original problem even though the problem I might be solving is for a new problem for a refinement of the and this also we were able to show affirmatively. But of course, given the lower bounds we know that there is no escaping this I mean this somewhere we have to there are no free lunches somewhere we have to be. Okay. So, this led us to ask that basically can we do this compilation given a specification f can we compile it to a specific form which has some properties because after that then we can do everything efficiently. So, in the literature this field of study is also called knowledge compilation and in particular this is Wikipedia's definition which says that it is a family of techniques for addressing the interactability of a number of artificial intelligence problems. This is the specific reference to artificial intelligence and a propositional model is compiled in an offline phase to support some difficult queries in poly time once it is compiled. And so, the only change that we do. So, essentially the picture is this that you take a propositional formula in whatever form you compile it to a specific form for these artificial intelligence problems and after that in poly time you can answer some difficult questions like how many solutions are there to the original formula was the original formula satisfiable, what are all the models of the original formula and so on. So, this part is guaranteed poly time this is the compiler and in the AI context a lot of work has happened to convert you know formulas for example, in CNF to formulas in DNNF, BTDs whatever there is a whole bunch of other things. So, in our context we just change the definition to say that well we are not talking about a specific artificial intelligence problem although it can be applied to some AI problems but we are talking about a synthesis problem. So, the picture looks something like this that you have given a specification in one of these forms and you are also told what are the inputs and outputs because that does matter just the Boolean formula is not sufficient I need to know I should synthesize what in terms of what and then can I compile it down to a normal form. So, this is our synthesis normal form so is that after that in poly time we can actually get the Scholem functions. So, the focus of the stock is really on this because after that everything is easy. So, here is a quick introduction and I will certainly not be able to do justice to all that went into proving the results but I hope to be able to at least convey the idea of what is going on. So, suppose I am given a specification phi on the inputs x and outputs y and suppose I represent it as a negation normal form circuit directed acyclic graph. So, what is negation normal form it is a circuit which has only AND and OR gates all the NOT gates are at the leaves. So, for example, if here if this is Boolean function then this is the negation normal form of this is already written negation normal form. So, that all the negations that appear are at the leaves beyond that there are only AND and OR gates. So, what we do is we say ok you give me a specification and I look at it in its negation normal form circuit or DAG and this is actually an easy translation. For example, if you give me any Boolean circuit I can use de Morgan's law to push the negations down and this can be done in poly time this is usually no problem. What we do next is we say that ok once I have this I am going to transform this a little bit and to get what we call a positive form of the specification. So, in this positive form of the specification I will have the inputs I will have the outputs and I will have some additional stuff over here which and as many of those as there are outputs and these additional stuff are basically obtained by replacing every negation y i leaf by a fresh variable y i bar. So, for example, this was the formula we had earlier. So, for every place where I have negation of an output I am going to introduce a y i bar negation of an output y i bar. So, in terms of the circuit it just means that at these two places I had some negation y 2 and negation y 1. So, I am going to put y 2 bar and y 1 bar ok. So, because the NNF circuit could be obtained easily this can also be obtained easily and this is called positive form of the formula and actually this is also not new this has been studied in the literature we found out later although we sort of reinvented the field here. Now, it turns out that this positive form has some nice properties and I think it is best represented through this picture. So, if I take the formula phi and if I look at its positive form and let us say I want to existentially quantify out one of the output variables y 1 ok. So, it turns out that if I take the positive form and set both y 1 and y 1 bar remember the negation y 1s have been replaced by fresh variables. So, now I can assign them values independently. So, if I replace both of them by 0 I always get an under approximation of this and if I replace both of them by 1 I always get an over approximation of this and this is not very deep I mean if you just look at how you know for this basically I have you know both are 0 then you know I am sort of saying that I might be even cases where it might become true because this was set to 1 I am going to disallow those and here because both are 1 even cases where this might become 0 because one of them has to be 0 I am sort of allowing those. So, this is not very hard to see that I can actually obtain over and under approximations of existentially quantifying out one of the output variables by just setting constants to chosen leaves of this positive form. Now, it turns out that we can do something more and in fact, for example, if I want to quantify out both the outputs I just set all of them to 0 and set all of them to 1 and I get upper and over approximations under and over approximations. Now, it turns out that if I start off with this positive form of the specification I can actually try to sort of see whether this is going to be good for synthesis purposes and towards that end what we will do is we will start off with the positive form of the specification and we will start off with a linear ordering of the outputs. How we get this linear ordering is you will get a flavor of it in you know the next slide itself, but let us not get into that you know that problem the optimal ordering finding the optimal ordering is indeed hard. So, what I am going to do is I am going to say let me take this positive form and let me fix y 1 till y i minus 1 and y 1 bar till y i minus 1 bar all to 1s. This is kind of the same trick that I showed in the earlier slide where I want to set a variable and its negation now renamed to the same value and these other things y i plus 1 to y m and y y i negation y i plus 1 to negation y m. So, these over line these bar variables I am just setting to the negation of this. So, if I take this positive form and if I do this transformation I will get a formula in terms of the x's in terms of y i y i bar and in terms of y i plus 1 to y m. So, now we ask that does there exist any value of x 1 to x n and y i plus 1 to y m which makes this positive form semantically equivalent to y i and y i bar. So, the reason why we are asking this question are all technical details in the paper, but as you can see this is just a query to a SAT solver nothing more than that. I am asking does there exist any assignment of these values which will make this positive form equivalent to y i and y i bar. Remember y i bar is not the same as negation y i it is a renamed variable whereas all the other things here I have kept the negation of these and these things here have assigned the same value to this. So, essentially we are asking can you know can this formula be made to behave like y i and y i bar and if the answer is no if we cannot make it behave like y i and y i bar for all i in 1 to n then we say that this formula is in syn-NNF. In fact, this phi hat then is good enough for poly-time synthesis and I will just show you how that happens. So, here is a simple example to sort of illustrate that complicated definition. So, here is a formula on some inputs and outputs here it is actually CNF formula here is the circuit representation and note that this is you know for those who are aware of what DNNF is this is not in DNNF because you have an AND gate and you have things like y 2 and negation y 2 going and meeting up there. It is not in weak DNNF also for the same reason y 2 and negation y 2 can go and meet up there. So, this is not one of the forms that you know we had studied earlier, but now let us say I fixed this output ordering. So, let us say you know this is a linear ordering I fixed this linear ordering and then I want to ask that well can I make this behave like y 1 and y 1 bar is there a way that I can assign values to the other things is that I can make it behave like y 1 and y 1 bar clearly no because there is no y 1 bar here at all right. So, the answer is I cannot make it behave like y 1 and y 1 bar. So, that is good news. So, then I ask that can I make it behave like y 2 and y 2 bar after changing this to y 2 bar, but before asking the question I am allowed to set y 1 and y 1 bar to 1s that is what we had said here I am allowed to set these two 1s. So, it is not the same as just asking can I make this behave like y 2 and y 2 bar I am asking that after I have set y 1 and there is no y 1 bar here after I have set it to 1 can I now make it behave like y 2 and y 2 bar and it turns out that I cannot because that 1 here blocks off this y 2 it does not let that y 2 reach that AND gate. So, therefore, this is in synNNF with respect to this ordering if I flip the ordering is it still in synNNF. So, here I am asking can I make it behave like y 2 and y 2 bar first and sure I can. So, it is not in synNNF with respect to this ordering. So, it is a fairly delicate notion the same structure for a certain ordering can be in synNNF may not be in synNNF and remember the result that I said earlier once we know it is in synNNF we have poly time synthesis. So, this ordering does matter when we are doing the synthesis. So, here are some relations to other data structures other representations we know for example, if this is a binary decision diagram then actually it can be converted in linear time to something which is synNNF basically every node in the BDD needs to be replaced by the structure and here you see y 1 bar do not ever go and meet a better AND gate they always go and meet a better OR gate. So, every BDD can be converted in linear time to a synNNF which means that if you can just construct a BDD for your specification that is it you are done you have poly time synthesis. It does not depend on the order of variables in the BDD for example, it could be a BDD with any arbitrary order, but once you have. So, you know for a BDD for every possible ordering of the variables it is in synNNF for every possible ordering of the variables in the synNNF definition, but of course when you are constructing the BDD you have to come up with some order. So, here you come up with any order does not have to be input first input last whatever any order which works I can immediately convert it to this and here you can see that no variable and its negation will ever go and meet up at an AND gate. So, it does not matter what order you chose for the synNNF definition they will for every possible order. So, if you start from a BDD and construct this circuit in linear time for every possible output ordering it is in synNNF. So, this relaxes the freedom of what ordering I can use to construct this BDD it does not have to be input first right. So, DNNF is of course you know it is very widely studied in the AI literature decomposable negation normal form. So, it says that for every AND gate that you have in the circuit representation the leaves here and the leaves on the the leaves at the bottom of the two sub trees rooted at the two children of that AND gate they must be completely disjoint right. So, if z appears here where z is either an input or output or whatever that neither z nor negation z can appear here. So, this is DNNF. So, of course, if it is in DNNF it is certainly in synNNF weak DNNF said that well ok if y appears here then y bar should not appear here. So, of course, if it is in weak DNNF then certainly in synNNF, but synNNF is even if y and y bar have you know I mean for example, if x and negation x have a path to something it does not matter I mean I showed that example where y2 and y2 bar actually go and meet up an AND gate, but still it is in synNNF because you are allowed to fix the values of some of the other variables earlier alright. So, DNNF, WDNNF are already in synNNF. So, so it looked like synNNF has kind of generalized a few of the earlier things and then we asked this question that did it really generalized or are these only a few cases could it be the case that in some case synNNF becomes larger than these other representations and then we had these results which basically said that there exist polynomial size synNNF specifications that can be expressed using BDDs only in exponential size using DDNNF only in exponential size super polynomial size unless once again some complexity theory conjecture gets falsified and so on, but it is also true that there are representations for which you can get NNF representations just plain vanilla NNF which are polynomial size, but the synNNF representation can be super polynomial and once again this is coming out from the lower bound that we have I mean we cannot escape this ok. So, this is kind of the ordering that we have NNFs are the most compact that we know then we have synNNF which are strictly more succinct than WDNNF which is strictly more succinct than DNNF this is deterministic decomposable negation normal form and then BDDs. So, BDDs are really at the far extreme end whereas, these are you know almost at the other end ok. So, how does synNNF helps column function synthesis? So, here is a template for once you have this thing in synNNF remember you will have some I think the colors got interchanged the output should be red and the input should have been blue, but once you have the specification in synNNF all you do is you know the first thing you do is you set all of them except the last one to ones. So, here in this case there are two outputs I will set y1 and y1 bar to 1 and y2 and y2 bar the last output to 1 0 and this guarantees that I will get a column function for y1 for y2 and once I have the column function for y2 I can then take another copy of this and now at y2 I can feed this already. So, this dotted line means feeding y2 this dotted line means feeding negation of y2 y2 and negation of y2 and then I do the same thing. So, for all output variables except the last one I am going to set the output and its bar both to 1 and the last output I will set it to 1 and 0 and then I get this column function for the next variable and I can just keep continuing doing this. So, it is not hard to see that if you do this you can basically now get all the column functions that you wanted in how much size as many outputs in the worst case you will have to replicate it that many times. So, m times the size of the specification and how many additional wires do you need. So, here you know this guy needs to go not only to the next one, but to the one after that to the one after that. So, it is like you know the output from this needs to go to m minus 1 the output from this needs to go to m and so on. So, there are order m squared additional wires. So, everything is poly time, poly time and poly space because that was the main question we were trying to ask that can we make it polynomial sized ok. Now, so that is good. So, that I think is the you know gist of what Sinin and F is and then there is this other question that we wanted to ask is that is it possible to simplify the specification and still get an answer to the original question. And so, here I have pictorially represented in this form. So, suppose I am given the specification phi of x y and let us say this blue region represents all those values of x for which actually there exists a y. So, that phi of x y is true. And let us say this represents the space of all scolium functions that I could have substituted. So, once again this x should have been blue the space of all scolium functions for y. So, every point within this space is a scolium function for y that I could use and every point within this space is a valuation of x for which there exists a y. So, if I am given a spec and if this is the view with respect to the valuations of x and the possible scolium functions we are saying that well can I get another spec phi tilde which may expand this it is not required to be the same as this, but can only shrink this. So, what is this saying? It is saying that every scolium function for phi tilde is also going to be a scolium function for phi. And the scolium function for phi tilde may actually this specification may be satisfiable in a larger range for a larger subset of inputs than the original specification. So, if I can find a phi tilde which does this you know expanding possibly expanding this and possibly shrinking this then I will call that a refinement with respect to synthesis of phi. And in this case we can just solve the problem for phi tilde and that will be a solution of the original problem. It turns out that if I do not allow this to expand beyond the set of x's and I say that well phi tilde must also evaluate to the values of x for which phi tilde xy can be made true is the same as the values of x for which phi could be made true, but this has possibly shrunk. So, that is called a stronger refinement and it turns out that these notions are very useful and in particular we have this lemma which says that if I have a specification which refines another specification then every scolium function that I synthesize for this specification is also a scolium function for the other specification and the same is true even for strong refinement. So, here is a simple example this might be by original specification looks quite big. This specification can be shown to satisfy the properties I just showed relative to this and so this is a refinement with respect to synthesis of this and so it is perfectly fine to synthesize the scolium functions from here and if you look at it you can just set y1 to 1 and y2 to 1 and you are done. So, setting y1 to 1 and y2 to 1 also implements this specification you can see that each clause turns out to be true. So, we put it all together in a tool which takes in a specification in CNF or an inverter graphs and it outputs a refined phi tilde which is already in CNNF. It uses some kind of branching I think Mate told a lot today about how branching is done you know similar techniques are used heuristics are used it aggressively tries to refine wherever possible because refinement can only simplify things for us and the details are in the paper and I will just maybe go to this last slide saying that you know we need not look at that. So, if you just look at these plots we tried to compare the time taken by C2SIN which is the tool that we have with a BDD compiler which takes a specification compile sit down to a BDD because once it is a BDD we know it is simple after that but C2SIN is not necessarily BDD. We tried to compare it with KDIT which is the incremental determination based tool which is I think the best tool that we have today and some earlier work that we did BFSS I know Kuldeep has recently come up with another work we did not have it when we did this comparison. So, but he has a comparison of that in the poster and so the picture here is and these are different kinds of benchmarks from the QBF eval suit and also from some factorization benchmarks. So, I think the story here is that I think no one method is better than the other methods and which is what is to be expected for hard problems, but you know there are clearly methods where there are clearly problem instances where the other methods seem to fail I mean they are timing out here whereas this going through the CINNNF compilation step works whereas going through the CINNNF compilation step also fails in some cases where the other things work. So, I think this is just to be thought of as another technique in the portfolio of techniques of Boolean functional synthesis the nice part about it is that we can now give some formal guarantees that it is polynomial time and size in terms of the CINNNF representation and anything that we can do to improve the compilation to CINNNF can only help in this process being fully cognizant of the fact that there are super polynomial lower bounds lurking in there. So, we will not be able to go polynomial unless some complexity conjectures has falsified I will stop there and take any questions. How do you order your why and what happens if you order it does not lead to anything? Do you backtrack try another one or? Do we backtrack and find another order? Yes. No, actually finding the best order is something that we have not solved so far but what we do is the following. So, the algorithm what it does is it takes a CINNF formula and then it says that these are the output variables which I have to eventually ensure that this property holds and then it asks which is the output variable that you would have split on if you are trying to solve let us say satisfiability question. So, we look at the VCID score for example for the output variables and then we say okay let us branch on this output variable because the moment we branch we basically have an if then else kind of structure and then we know that that variable is taken care of and the residues are themselves simplified and then we go ahead and ask can we so the first thing we do is we ask can we refine this to sort of simplify it further. Yeah, because you show an example depending of the order you find something or not. This one, this one. So, it happens that in your case you may use the wrong order and you will not succeed, right? No, no, no if I use the wrong order I will just become a bigger CINNNF. I will always succeed it is like I am branching, right? Okay. So, every time I choose a variable and branch on it I am basically creating an if then else structure and the moment you create an if then else structure it is yeah. So, it is basically this. So, this always satisfies CINNNF. The question is did I branch on the right variable first? Yeah, no because I think you add another example where you show that it the fact that you are a CINNF depends of the order. Yeah, this specific structure is not in CINNNF with respect to this order. Yes. But now if I want to convert it to CINNNF with respect to this order I will just split on y2 first. So, I will get a different structure that structure will be bigger than the structure and then that will be in CINNNF, right? And for example, if I split with respect to y2 I will get y2 and whatever something or negation y2 and something. So, that structure which is not the same as this, this does not have the form of y2 and something or negation y2 and something. That structure is already in CINNNF because of this that you know y and negation y can never go and meet up. So, any order will always give you a CINNNF. Is it giving you something which is small? So, this is the usual question how do you use a variable order. Okay. Thanks, Suprati. Okay.