anchor.diff:     (WS)* R_PAREN
   
      {
  -      $result =
  -         Expression.product
  -         (
  -            ($id_list.list)
  -         ).in
  -         (
  -            Main.get_model().get_predicate_as_relation(($ID.text))
  -         );
  +      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);
      }
   ;
   
  
positive.code:    (WS)* R_PAREN
  
     {
        $result =
           current_node.product
           (
              Expression.product
              (
                 ($id_list.list)
              )
           ).in
           (
              Main.get_model().get_predicate_as_relation(($ID.text))
           );
  
     }
  ;
  
  
negative.code: ;
  
  id_list
     returns [List<Variable> list, boolean has_joker]
  
     @init
     {
        final List<Variable> result = new ArrayList<Variable>();
        boolean used_joker = false;
     }
  
     :
  