public Dictionary <string, Expr> PermissionExprs(Absy absy) { var domainNameToScope = new Dictionary <string, HashSet <Variable> >(); foreach (var domainName in linearTypeChecker.linearDomains.Keys) { domainNameToScope[domainName] = new HashSet <Variable>(); } var availableVars = AvailableLinearLocalVars(absy).Union(LinearGlobalVars()); foreach (var v in availableVars) { var domainName = linearTypeChecker.FindDomainName(v); domainNameToScope[domainName].Add(MapVariable(v)); } var domainNameToExpr = new Dictionary <string, Expr>(); foreach (var domainName in domainNameToScope.Keys) { var permissionExprs = linearTypeChecker.PermissionExprForEachVariable(domainName, domainNameToScope[domainName]); domainNameToExpr[domainName] = linearTypeChecker.UnionExprForPermissions(domainName, permissionExprs); } return(domainNameToExpr); }