anchor.diff:        (WS)+
         ID
         {
  -         result.add(Main.get_variable_manager().get_variable(($ID.text)));
  +         if (($ID.text).equals("_"))
  +         {
  +            used_joker = true;
  +            result.add((Variable) null);
  +         }
  +         else
  +         {
  +            result.add(Main.get_variable_manager().get_variable(($ID.text)));
  +         }
         }
      )*
   
      {
         $list = result;
  +      $has_joker = used_joker;
      }
   ;
   
  
positive.code: ;
  
  id_list
     returns [List<Variable> list]
  
     @init
     {
        final List<Variable> result = new ArrayList<Variable>();
     }
  
     :
  
negative.code:    (WS)* R_PAREN
  
     {
        final Expression predicate;
        final List<Variable> ids;
  
  
        if (($id_list.has_joker))
        {
           final List<IntConstant> columns;
           final int params_length;
  
           ids = new ArrayList<Variable>();
           columns = new ArrayList<IntConstant>();
  
           params_length = ($id_list.list).size();
  
           for (int i = 0; i < params_length; ++i)
           {
              if (($id_list.list).get(i) != (Variable) null)
              {
                 columns.add(IntConstant.constant(i));
                 ids.add(($id_list.list).get(i));
              }
           }
  
           predicate =
              Main.get_model().get_predicate_as_relation
              (
                 ($ID.text)
              ).project
              (
                 (IntExpression[]) columns.toArray()
              );
        }
        else
        {
           predicate = Main.get_model().get_predicate_as_relation(($ID.text));
           ids = ($id_list.list);
        }
  
        $result = Expression.product(ids).in(predicate);
     }
  ;
  
  