anchor.diff:           also, as opposed to 'cterm : LCURLY ckv* RCURLY'
            here we have 'csortkv+'
       */       
  -    | LCURLY csortassoc+ RCURLY                             /* Association map sort */
  -    ;
  -
  -/*
  -%MS: About naming:
  -     Maybe key-value (kv) is a too specialized name? 
  -     Because it can also be the whole map?
  -     Suggestion: "association" as in hacs core?
  -*/
  -csortassoc
  +    | LCURLY cmapsorts RCURLY                             /* Association map sort */
  +    ;
  +
  +cmapsorts
  +    : cmapsort (COMMA cmapsort)*                         /* List of association map sorts */
  +    ;
  +    
  +cmapsort
       /*
       %MS: What about the other cases in 'ckv'? 
            Could you give me an example sort for the cterm 'S({x})' or 'S({#X})'?
  
positive.code: 
         and change to 
         | boundvars cterm
      */
      | VARIABLE<binder=x> csort? DOT cterm<binds=x>
      ;
  
  cliteral
  
negative.code: 
          %MS: but ∀ x . S[x] :: x  
                   S[#X] → #X;
          would be a perfectly fine rule, no?
          %LV: yes but the grammar will still prevent #F(x.C(x))
               anyway I think removing cbound outweight the benefit of keeping it. As you said, anyhow not all constraints can be checked by the grammar     
  */
  
  cterm
  