private List <Expr> DisjointnessExprs(IEnumerable <Variable> availableVars)
        {
            var domainNameToScope = new Dictionary <string, HashSet <Variable> >();

            foreach (var domainName in linearTypeChecker.linearDomains.Keys)
            {
                domainNameToScope[domainName] = new HashSet <Variable>();
            }
            foreach (var v in availableVars)
            {
                var domainName = linearTypeChecker.FindDomainName(v);
                domainNameToScope[domainName].Add(MapVariable(v));
            }
            var newExprs = new List <Expr>();

            foreach (var domainName in linearTypeChecker.linearDomains.Keys)
            {
                var permissionExprs =
                    linearTypeChecker
                    .PermissionExprForEachVariable(domainName, domainNameToScope[domainName])
                    .Union(
                        domainNameToHoleVar.ContainsKey(domainName)
                        ? new List <Expr> {
                    Expr.Ident(domainNameToHoleVar[domainName])
                }
                        : new List <Expr>());
                var expr = linearTypeChecker.DisjointnessExprForPermissions(domainName, permissionExprs);
                if (!expr.Equals(Expr.True))
                {
                    newExprs.Add(expr);
                }
            }
            return(newExprs);
        }